| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- package logger
- import (
- "io"
- "log"
- "os"
- "strings"
- "testing"
- )
- func TestInferStdLogLevel(t *testing.T) {
- cases := []struct {
- msg string
- want Level
- }{
- {msg: "Warning: queue full", want: LevelWarn},
- {msg: "Forward request failed: timeout", want: LevelError},
- {msg: "[ERROR] upstream unavailable", want: LevelError},
- {msg: "[OpenAI WS Mode] reconnect_retry account_id=22 retry=1 max_retries=5", want: LevelInfo},
- {msg: "service started", want: LevelInfo},
- {msg: "debug: cache miss", want: LevelDebug},
- }
- for _, tc := range cases {
- got := inferStdLogLevel(tc.msg)
- if got != tc.want {
- t.Fatalf("inferStdLogLevel(%q)=%v want=%v", tc.msg, got, tc.want)
- }
- }
- }
- func TestNormalizeStdLogMessage(t *testing.T) {
- raw := " [TokenRefresh] cycle complete \n total=1 failed=0 \n"
- got := normalizeStdLogMessage(raw)
- want := "[TokenRefresh] cycle complete total=1 failed=0"
- if got != want {
- t.Fatalf("normalizeStdLogMessage()=%q want=%q", got, want)
- }
- }
- func TestStdLogBridgeRoutesLevels(t *testing.T) {
- origStdout := os.Stdout
- origStderr := os.Stderr
- stdoutR, stdoutW, err := os.Pipe()
- if err != nil {
- t.Fatalf("create stdout pipe: %v", err)
- }
- stderrR, stderrW, err := os.Pipe()
- if err != nil {
- t.Fatalf("create stderr pipe: %v", err)
- }
- os.Stdout = stdoutW
- os.Stderr = stderrW
- t.Cleanup(func() {
- os.Stdout = origStdout
- os.Stderr = origStderr
- _ = stdoutR.Close()
- _ = stdoutW.Close()
- _ = stderrR.Close()
- _ = stderrW.Close()
- })
- if err := Init(InitOptions{
- Level: "debug",
- Format: "json",
- ServiceName: "sub2api",
- Environment: "test",
- Output: OutputOptions{
- ToStdout: true,
- ToFile: false,
- },
- Sampling: SamplingOptions{Enabled: false},
- }); err != nil {
- t.Fatalf("Init() error: %v", err)
- }
- log.Printf("service started")
- log.Printf("Warning: queue full")
- log.Printf("Forward request failed: timeout")
- // Skip Sync() — on Windows, fsync on pipes deadlocks (FlushFileBuffers).
- _ = stdoutW.Close()
- _ = stderrW.Close()
- stdoutBytes, _ := io.ReadAll(stdoutR)
- stderrBytes, _ := io.ReadAll(stderrR)
- stdoutText := string(stdoutBytes)
- stderrText := string(stderrBytes)
- if !strings.Contains(stdoutText, "service started") {
- t.Fatalf("stdout missing info log: %s", stdoutText)
- }
- if !strings.Contains(stderrText, "Warning: queue full") {
- t.Fatalf("stderr missing warn log: %s", stderrText)
- }
- if !strings.Contains(stderrText, "Forward request failed: timeout") {
- t.Fatalf("stderr missing error log: %s", stderrText)
- }
- if !strings.Contains(stderrText, "\"legacy_stdlog\":true") {
- t.Fatalf("stderr missing legacy_stdlog marker: %s", stderrText)
- }
- }
- func TestLegacyPrintfRoutesLevels(t *testing.T) {
- origStdout := os.Stdout
- origStderr := os.Stderr
- stdoutR, stdoutW, err := os.Pipe()
- if err != nil {
- t.Fatalf("create stdout pipe: %v", err)
- }
- stderrR, stderrW, err := os.Pipe()
- if err != nil {
- t.Fatalf("create stderr pipe: %v", err)
- }
- os.Stdout = stdoutW
- os.Stderr = stderrW
- t.Cleanup(func() {
- os.Stdout = origStdout
- os.Stderr = origStderr
- _ = stdoutR.Close()
- _ = stdoutW.Close()
- _ = stderrR.Close()
- _ = stderrW.Close()
- })
- if err := Init(InitOptions{
- Level: "debug",
- Format: "json",
- ServiceName: "sub2api",
- Environment: "test",
- Output: OutputOptions{
- ToStdout: true,
- ToFile: false,
- },
- Sampling: SamplingOptions{Enabled: false},
- }); err != nil {
- t.Fatalf("Init() error: %v", err)
- }
- LegacyPrintf("service.test", "request started")
- LegacyPrintf("service.test", "Warning: queue full")
- LegacyPrintf("service.test", "forward failed: timeout")
- // Skip Sync() — on Windows, fsync on pipes deadlocks (FlushFileBuffers).
- _ = stdoutW.Close()
- _ = stderrW.Close()
- stdoutBytes, _ := io.ReadAll(stdoutR)
- stderrBytes, _ := io.ReadAll(stderrR)
- stdoutText := string(stdoutBytes)
- stderrText := string(stderrBytes)
- if !strings.Contains(stdoutText, "request started") {
- t.Fatalf("stdout missing info log: %s", stdoutText)
- }
- if !strings.Contains(stderrText, "Warning: queue full") {
- t.Fatalf("stderr missing warn log: %s", stderrText)
- }
- if !strings.Contains(stderrText, "forward failed: timeout") {
- t.Fatalf("stderr missing error log: %s", stderrText)
- }
- if !strings.Contains(stderrText, "\"legacy_printf\":true") {
- t.Fatalf("stderr missing legacy_printf marker: %s", stderrText)
- }
- if !strings.Contains(stderrText, "\"component\":\"service.test\"") {
- t.Fatalf("stderr missing component field: %s", stderrText)
- }
- }
|