Skip to content

Commit 42fdcdf

Browse files
chmouelclaude
andcommitted
fix: Prevent panic in EventEmitter when logger is nil
* Added nil checks for the logger before use in EmitMessage. * Prevented a potential panic if the EventEmitter was initialized without a logger. * Added a test case to ensure the function does not panic with a nil logger. Co-authored-by: Claude <[email protected]> Signed-off-by: Chmouel Boudjnah <[email protected]>
1 parent c5b32f0 commit 42fdcdf

File tree

2 files changed

+64
-32
lines changed

2 files changed

+64
-32
lines changed

pkg/events/emit.go

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -34,20 +34,24 @@ func (e *EventEmitter) EmitMessage(repo *v1alpha1.Repository, loggerLevel zapcor
3434
if repo != nil {
3535
event := makeEvent(repo, loggerLevel, reason, message)
3636
if _, err := e.client.CoreV1().Events(event.Namespace).Create(context.Background(), event, metav1.CreateOptions{}); err != nil {
37-
e.logger.Infof("Cannot create event: %s", err.Error())
37+
if e.logger != nil {
38+
e.logger.Infof("Cannot create event: %s", err.Error())
39+
}
3840
}
3941
}
4042

41-
//nolint
42-
switch loggerLevel {
43-
case zapcore.DebugLevel:
44-
e.logger.Debug(message)
45-
case zapcore.ErrorLevel:
46-
e.logger.Error(message)
47-
case zapcore.InfoLevel:
48-
e.logger.Info(message)
49-
case zapcore.WarnLevel:
50-
e.logger.Warn(message)
43+
if e.logger != nil {
44+
//nolint
45+
switch loggerLevel {
46+
case zapcore.DebugLevel:
47+
e.logger.Debug(message)
48+
case zapcore.ErrorLevel:
49+
e.logger.Error(message)
50+
case zapcore.InfoLevel:
51+
e.logger.Info(message)
52+
case zapcore.WarnLevel:
53+
e.logger.Warn(message)
54+
}
5155
}
5256
}
5357

pkg/events/emit_test.go

Lines changed: 49 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,14 @@ func TestEventEmitter_EmitMessage(t *testing.T) {
2020
observer, _ := zapobserver.New(zap.InfoLevel)
2121
fakelogger := zap.New(observer).Sugar()
2222
tests := []struct {
23-
name string
24-
repo *v1alpha1.Repository
25-
message string
26-
reason string
27-
logLevel zapcore.Level
28-
expectEvent bool
23+
name string
24+
repo *v1alpha1.Repository
25+
message string
26+
reason string
27+
logLevel zapcore.Level
28+
expectEvent bool
29+
expectedType string
30+
useNilLogger bool
2931
}{
3032
{
3133
name: "repo exists",
@@ -36,9 +38,10 @@ func TestEventEmitter_EmitMessage(t *testing.T) {
3638
},
3739
Spec: v1alpha1.RepositorySpec{},
3840
},
39-
message: "info-message",
40-
logLevel: zap.InfoLevel,
41-
expectEvent: true,
41+
message: "info-message",
42+
logLevel: zap.InfoLevel,
43+
expectEvent: true,
44+
expectedType: v1.EventTypeNormal,
4245
},
4346
{
4447
name: "event with a reason",
@@ -50,17 +53,34 @@ func TestEventEmitter_EmitMessage(t *testing.T) {
5053
},
5154
Spec: v1alpha1.RepositorySpec{},
5255
},
53-
message: "info-message",
54-
logLevel: zap.InfoLevel,
55-
expectEvent: true,
56-
reason: "aintnosunshine",
56+
message: "info-message",
57+
logLevel: zap.InfoLevel,
58+
expectEvent: true,
59+
expectedType: v1.EventTypeNormal,
60+
reason: "aintnosunshine",
5761
},
5862
{
59-
name: "repo doesn't exists",
60-
repo: nil,
61-
message: "error-message",
62-
logLevel: zap.ErrorLevel,
63-
expectEvent: false,
63+
name: "repo doesn't exists",
64+
repo: nil,
65+
message: "error-message",
66+
logLevel: zap.ErrorLevel,
67+
expectEvent: false,
68+
expectedType: v1.EventTypeWarning,
69+
},
70+
{
71+
name: "nil logger doesn't cause panic",
72+
repo: &v1alpha1.Repository{
73+
ObjectMeta: metav1.ObjectMeta{
74+
Name: "test-repo",
75+
Namespace: "test-ns",
76+
},
77+
Spec: v1alpha1.RepositorySpec{},
78+
},
79+
message: "error-message",
80+
logLevel: zap.ErrorLevel,
81+
expectEvent: true,
82+
expectedType: v1.EventTypeWarning,
83+
useNilLogger: true,
6484
},
6585
}
6686

@@ -69,14 +89,22 @@ func TestEventEmitter_EmitMessage(t *testing.T) {
6989
ctx, _ := rtesting.SetupFakeContext(t)
7090
stdata, _ := testclient.SeedTestData(t, ctx, testclient.Data{})
7191

72-
// emit event
73-
NewEventEmitter(stdata.Kube, fakelogger).EmitMessage(tt.repo, tt.logLevel, tt.reason, tt.message)
92+
// Use nil logger for specific test case
93+
var logger *zap.SugaredLogger
94+
if tt.useNilLogger {
95+
logger = nil
96+
} else {
97+
logger = fakelogger
98+
}
99+
100+
// emit event - this should not panic even with nil logger
101+
NewEventEmitter(stdata.Kube, logger).EmitMessage(tt.repo, tt.logLevel, tt.reason, tt.message)
74102

75103
if tt.expectEvent {
76104
events, err := stdata.Kube.CoreV1().Events(tt.repo.Namespace).List(context.Background(), metav1.ListOptions{})
77105
assert.NilError(t, err)
78106
assert.Equal(t, events.Items[0].Message, tt.message)
79-
assert.Equal(t, events.Items[0].Type, v1.EventTypeNormal)
107+
assert.Equal(t, events.Items[0].Type, tt.expectedType)
80108
assert.Equal(t, events.Items[0].Reason, tt.reason)
81109
assert.Equal(t, events.Items[0].InvolvedObject.Name, tt.repo.Name)
82110
assert.Equal(t, events.Items[0].InvolvedObject.Namespace, tt.repo.Namespace)

0 commit comments

Comments
 (0)