@@ -2,8 +2,10 @@ package remotelogger
22
33import (
44 "encoding/json"
5+ "fmt"
56 "net/http"
67 "net/http/httptest"
8+ "strings"
79 "sync"
810 "sync/atomic"
911 "testing"
@@ -12,43 +14,58 @@ import (
1214 "gofr.dev/pkg/gofr/logging"
1315)
1416
15- // Mock Logger (implements logging.Logger)
17+ // Mock Logger (implements logging.Logger).
1618type mockLogger struct {
1719 mu sync.Mutex
1820 messages []string
1921 level logging.Level
2022 changeCnt int32
2123}
2224
23- func (m * mockLogger ) record (prefix string , _ ... any ) {
25+ func (m * mockLogger ) record (prefix string , parts ... any ) {
2426 m .mu .Lock ()
2527 defer m .mu .Unlock ()
26- m .messages = append (m .messages , prefix )
27- }
28-
29- func (m * mockLogger ) Debug (args ... any ) { m .record ("Debug" , args ... ) }
30- func (m * mockLogger ) Debugf (format string , args ... any ) { m .record ("Debugf" , args ... ) }
31- func (m * mockLogger ) Log (args ... any ) { m .record ("Log" , args ... ) }
32- func (m * mockLogger ) Logf (format string , args ... any ) { m .record ("Logf" , args ... ) }
33- func (m * mockLogger ) Info (args ... any ) { m .record ("Info" , args ... ) }
34- func (m * mockLogger ) Infof (format string , args ... any ) { m .record ("Infof" , args ... ) }
35- func (m * mockLogger ) Notice (args ... any ) { m .record ("Notice" , args ... ) }
36- func (m * mockLogger ) Noticef (format string , args ... any ) { m .record ("Noticef" , args ... ) }
37- func (m * mockLogger ) Warn (args ... any ) { m .record ("Warn" , args ... ) }
38- func (m * mockLogger ) Warnf (format string , args ... any ) { m .record ("Warnf" , args ... ) }
39- func (m * mockLogger ) Error (args ... any ) { m .record ("Error" , args ... ) }
40- func (m * mockLogger ) Errorf (format string , args ... any ) { m .record ("Errorf" , args ... ) }
41- func (m * mockLogger ) Fatal (args ... any ) { m .record ("Fatal" , args ... ) }
42- func (m * mockLogger ) Fatalf (format string , args ... any ) { m .record ("Fatalf" , args ... ) }
28+
29+ msg := fmt .Sprint (append ([]any {prefix , ":" }, parts ... )... )
30+ m .messages = append (m .messages , msg )
31+ }
32+
33+ func (m * mockLogger ) Debug (args ... any ) { m .record ("Debug" , args ... ) }
34+ func (m * mockLogger ) Debugf (format string , args ... any ) {
35+ m .record ("Debugf" , fmt .Sprintf (format , args ... ))
36+ }
37+ func (m * mockLogger ) Log (args ... any ) { m .record ("Log" , args ... ) }
38+ func (m * mockLogger ) Logf (format string , args ... any ) { m .record ("Logf" , fmt .Sprintf (format , args ... )) }
39+ func (m * mockLogger ) Info (args ... any ) { m .record ("Info" , args ... ) }
40+ func (m * mockLogger ) Infof (format string , args ... any ) {
41+ m .record ("Infof" , fmt .Sprintf (format , args ... ))
42+ }
43+ func (m * mockLogger ) Notice (args ... any ) { m .record ("Notice" , args ... ) }
44+ func (m * mockLogger ) Noticef (format string , args ... any ) {
45+ m .record ("Noticef" , fmt .Sprintf (format , args ... ))
46+ }
47+ func (m * mockLogger ) Warn (args ... any ) { m .record ("Warn" , args ... ) }
48+ func (m * mockLogger ) Warnf (format string , args ... any ) {
49+ m .record ("Warnf" , fmt .Sprintf (format , args ... ))
50+ }
51+ func (m * mockLogger ) Error (args ... any ) { m .record ("Error" , args ... ) }
52+ func (m * mockLogger ) Errorf (format string , args ... any ) {
53+ m .record ("Errorf" , fmt .Sprintf (format , args ... ))
54+ }
55+ func (m * mockLogger ) Fatal (args ... any ) { m .record ("Fatal" , args ... ) }
56+ func (m * mockLogger ) Fatalf (format string , args ... any ) {
57+ m .record ("Fatalf" , fmt .Sprintf (format , args ... ))
58+ }
4359
4460func (m * mockLogger ) ChangeLevel (level logging.Level ) {
4561 m .mu .Lock ()
4662 defer m .mu .Unlock ()
63+
4764 m .level = level
4865 atomic .AddInt32 (& m .changeCnt , 1 )
4966}
5067
51- // Mock RemoteConfigurable Client
68+ // Mock RemoteConfigurable Client.
5269type mockClient struct {
5370 updateCalled int32
5471 lastConfig map [string ]any
@@ -59,10 +76,10 @@ func (m *mockClient) UpdateConfig(cfg map[string]any) {
5976 m .lastConfig = cfg
6077}
6178
62- // Tests for httpRemoteConfig
79+ // Tests for httpRemoteConfig.
6380func TestHttpRemoteConfig_RegisterAndStart (t * testing.T ) {
6481 // mock HTTP server returning valid JSON
65- handler := http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
82+ handler := http .HandlerFunc (func (w http.ResponseWriter , _ * http.Request ) {
6683 resp := map [string ]any {
6784 "data" : map [string ]string {
6885 "serviceName" : "test-service" ,
@@ -71,6 +88,7 @@ func TestHttpRemoteConfig_RegisterAndStart(t *testing.T) {
7188 }
7289 _ = json .NewEncoder (w ).Encode (resp )
7390 })
91+
7492 server := httptest .NewServer (handler )
7593 defer server .Close ()
7694
@@ -94,27 +112,51 @@ func TestHttpRemoteConfig_RegisterAndStart(t *testing.T) {
94112}
95113
96114func TestHttpRemoteConfig_InvalidJSON (t * testing.T ) {
115+ t .Parallel ()
116+
97117 // mock server returning invalid JSON
98- handler := http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
99- w .Write ([]byte (`invalid-json` ))
118+ handler := http .HandlerFunc (func (w http.ResponseWriter , _ * http.Request ) {
119+ _ , _ = w .Write ([]byte (`invalid-json` ))
100120 })
121+
101122 server := httptest .NewServer (handler )
102123 defer server .Close ()
103124
104125 logger := & mockLogger {}
105126 cfg := NewHTTPRemoteConfig (server .URL , 50 * time .Millisecond , logger ).(* httpRemoteConfig )
106127 client := & mockClient {}
107- cfg .Register (client )
108128
129+ cfg .Register (client )
109130 cfg .Start ()
110- time .Sleep (120 * time .Millisecond )
111131
112- if atomic .LoadInt32 (& client .updateCalled ) == 0 {
113- t .Errorf ("expected UpdateConfig to be called at least once even if response invalid" )
132+ // Wait for a couple of polling intervals
133+ time .Sleep (200 * time .Millisecond )
134+
135+ updateCount := atomic .LoadInt32 (& client .updateCalled )
136+
137+ if updateCount != 0 {
138+ t .Errorf ("expected UpdateConfig not to be called on invalid JSON, but got %d calls" , updateCount )
139+ }
140+
141+ // Check that an error log was recorded for invalid JSON
142+ logger .mu .Lock ()
143+ defer logger .mu .Unlock ()
144+
145+ foundErrorLog := false
146+
147+ for _ , msg := range logger .messages {
148+ if strings .Contains (msg , "invalid" ) || strings .Contains (strings .ToLower (msg ), "error" ) {
149+ foundErrorLog = true
150+ break
151+ }
152+ }
153+
154+ if ! foundErrorLog {
155+ t .Errorf ("expected error log message for invalid JSON response, got logs: %v" , logger .messages )
114156 }
115157}
116158
117- // Tests for remoteLogger (RemoteConfigurable)
159+ // Tests for remoteLogger (RemoteConfigurable).
118160func TestRemoteLogger_UpdateConfig_ChangesLevel (t * testing.T ) {
119161 logger := & mockLogger {}
120162 r := & remoteLogger {
0 commit comments