Skip to content

Commit 20129e0

Browse files
[v18] Deflake TestEventHandler (#60365)
* Refactor TestEventHeandler without `testify/suite` version Signed-off-by: Yong-Han Chen <[email protected]> Signed-off-by: Tim Ross <[email protected]> * Cleanup TestEventHandler --------- Signed-off-by: Yong-Han Chen <[email protected]> Signed-off-by: Tim Ross <[email protected]> Co-authored-by: Yong-Han Chen <[email protected]>
1 parent a2575da commit 20129e0

File tree

1 file changed

+49
-94
lines changed

1 file changed

+49
-94
lines changed

integrations/event-handler/event_handler_test.go

Lines changed: 49 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -25,42 +25,23 @@ import (
2525

2626
"github.com/google/uuid"
2727
"github.com/stretchr/testify/require"
28-
"github.com/stretchr/testify/suite"
2928

3029
"github.com/gravitational/teleport/api/client"
3130
"github.com/gravitational/teleport/api/types"
32-
"github.com/gravitational/teleport/integrations/lib"
3331
"github.com/gravitational/teleport/integrations/lib/logger"
3432
"github.com/gravitational/teleport/integrations/lib/testing/integration"
3533
)
3634

37-
type EventHandlerSuite struct {
38-
suite.Suite
39-
AuthHelper integration.AuthHelper
40-
appConfig StartCmdConfig
41-
fakeFluentd *FakeFluentd
42-
43-
client *client.Client
44-
teleportConfig lib.TeleportConfig
45-
}
46-
4735
func TestEventHandler(t *testing.T) {
48-
suite.Run(t, &EventHandlerSuite{
49-
AuthHelper: &integration.MinimalAuthHelper{},
50-
})
51-
}
52-
53-
// SetupSuite starts a Teleport auth service and creates the event forwarder
54-
// user and role. This runs a once for the whole suite.
55-
func (s *EventHandlerSuite) SetupSuite() {
56-
var err error
57-
ctx, cancel := context.WithCancel(context.Background())
58-
s.T().Cleanup(cancel)
36+
authHelper := &integration.MinimalAuthHelper{}
5937

38+
// starts a Teleport auth service and creates the event forwarder
39+
// user and role.
6040
// Start the Teleport Auth server and get the admin client.
61-
s.client = s.AuthHelper.StartServer(s.T())
62-
_, err = s.client.Ping(ctx)
63-
require.NoError(s.T(), err)
41+
adminClient := authHelper.StartServer(t)
42+
t.Cleanup(func() { require.NoError(t, authHelper.Auth().Close()) })
43+
_, err := adminClient.Ping(t.Context())
44+
require.NoError(t, err)
6445

6546
eventHandlerRole, err := types.NewRole("teleport-event-handler", types.RoleSpecV6{
6647
Allow: types.RoleConditions{
@@ -73,43 +54,38 @@ func (s *EventHandlerSuite) SetupSuite() {
7354
},
7455
Deny: types.RoleConditions{},
7556
})
76-
require.NoError(s.T(), err)
57+
require.NoError(t, err)
7758

78-
eventHandlerRole, err = s.client.CreateRole(ctx, eventHandlerRole)
79-
require.NoError(s.T(), err)
59+
eventHandlerRole, err = adminClient.CreateRole(t.Context(), eventHandlerRole)
60+
require.NoError(t, err)
8061

8162
eventHandlerUser, err := types.NewUser("teleport-event-handler")
82-
require.NoError(s.T(), err)
63+
require.NoError(t, err)
8364

8465
eventHandlerUser.SetRoles([]string{eventHandlerRole.GetName()})
85-
eventHandlerUser, err = s.client.CreateUser(ctx, eventHandlerUser)
86-
require.NoError(s.T(), err)
87-
88-
s.teleportConfig.Addr = s.AuthHelper.ServerAddr()
89-
s.teleportConfig.Identity = s.AuthHelper.SignIdentityForUser(s.T(), ctx, eventHandlerUser)
90-
}
91-
92-
// SetupTest starts a fake fluentd server.
93-
// This runs before every test from the suite.
94-
func (s *EventHandlerSuite) SetupTest() {
95-
t := s.T()
66+
eventHandlerUser, err = adminClient.CreateUser(t.Context(), eventHandlerUser)
67+
require.NoError(t, err)
9668

97-
// Start fake fluentd
98-
err := logger.Setup(logger.Config{Severity: "debug"})
69+
// Starts a fake fluentd server.
70+
err = logger.Setup(logger.Config{Severity: "debug"})
9971
require.NoError(t, err)
10072

101-
s.fakeFluentd = NewFakeFluentd(t)
102-
s.fakeFluentd.Start()
103-
t.Cleanup(s.fakeFluentd.Close)
73+
fakeFluentd := NewFakeFluentd(t)
74+
fakeFluentd.Start()
75+
t.Cleanup(fakeFluentd.Close)
10476

10577
startTime := time.Now().Add(-time.Minute)
10678

107-
conf := StartCmdConfig{
79+
fluentdConfig := fakeFluentd.GetClientConfig()
80+
fluentdConfig.FluentdURL = fakeFluentd.GetURL()
81+
fluentdConfig.FluentdSessionURL = fluentdConfig.FluentdURL + "/session"
82+
83+
appConfig := StartCmdConfig{
10884
TeleportConfig: TeleportConfig{
109-
TeleportAddr: s.teleportConfig.Addr,
110-
TeleportIdentityFile: s.teleportConfig.Identity,
85+
TeleportAddr: authHelper.ServerAddr(),
86+
TeleportIdentityFile: authHelper.SignIdentityForUser(t, t.Context(), eventHandlerUser),
11187
},
112-
FluentdConfig: s.fakeFluentd.GetClientConfig(),
88+
FluentdConfig: fluentdConfig,
11389
IngestConfig: IngestConfig{
11490
StorageDir: t.TempDir(),
11591
Timeout: time.Second,
@@ -121,88 +97,67 @@ func (s *EventHandlerSuite) SetupTest() {
12197
},
12298
}
12399

124-
conf.FluentdURL = s.fakeFluentd.GetURL()
125-
conf.FluentdSessionURL = conf.FluentdURL + "/session"
126-
127-
s.appConfig = conf
128-
}
129-
130-
func (s *EventHandlerSuite) startApp() {
131-
s.T().Helper()
132-
t := s.T()
133-
t.Helper()
134-
135-
app, err := NewApp(&s.appConfig, slog.Default())
136-
require.NoError(t, err)
137-
138-
integration.RunAndWaitReady(s.T(), app)
139-
}
140-
141-
// nonce is data produced to uniquely identify an event.
142-
// The nonce is propagated from the event generator to the event checker.
143-
// All events not matching the nonce are skipped.
144-
type nonce any
145-
146-
func (s *EventHandlerSuite) TestEvent() {
147-
ctx, cancel := context.WithCancel(context.Background())
148-
s.T().Cleanup(cancel)
149-
100+
// Original TestEvent
150101
tests := []struct {
151102
name string
152-
generateEvent func(*testing.T, *client.Client) nonce
153-
checkEvent func(*testing.T, string, nonce) bool
103+
generateEvent func(*testing.T, *client.Client) any
104+
checkEvent func(*testing.T, string, any) bool
154105
}{
155106
{
156107
name: "new role",
157-
generateEvent: func(t *testing.T, c *client.Client) nonce {
108+
generateEvent: func(t *testing.T, c *client.Client) any {
158109
roleName := uuid.New().String()
159110
role, err := types.NewRole(roleName, types.RoleSpecV6{
160111
Options: types.RoleOptions{},
161112
Allow: types.RoleConditions{},
162113
Deny: types.RoleConditions{},
163114
})
164115
require.NoError(t, err)
165-
role, err = c.CreateRole(ctx, role)
116+
role, err = c.CreateRole(t.Context(), role)
166117
require.NoError(t, err)
167118
return role.GetName()
168119
},
169-
checkEvent: func(t *testing.T, event string, n nonce) bool {
120+
checkEvent: func(t *testing.T, event string, n any) bool {
170121
roleName, ok := n.(string)
171122
require.True(t, ok)
172123
return strings.Contains(event, roleName)
173124
},
174125
},
175126
{
176127
name: "new token",
177-
generateEvent: func(t *testing.T, c *client.Client) nonce {
128+
generateEvent: func(t *testing.T, c *client.Client) any {
178129
tokenName := uuid.New().String()
179130
token, err := types.NewProvisionToken(tokenName, types.SystemRoles{types.RoleNode}, time.Time{})
180131
require.NoError(t, err)
181-
err = c.CreateToken(ctx, token)
132+
err = c.CreateToken(t.Context(), token)
182133
require.NoError(t, err)
183134
return nil
184135
},
185-
checkEvent: func(t *testing.T, event string, _ nonce) bool {
136+
checkEvent: func(t *testing.T, event string, _ any) bool {
186137
return strings.Contains(event, "join_token.create")
187138
},
188139
},
189140
}
190141

191142
// Start the event forwarder
192-
s.startApp()
143+
app, err := NewApp(&appConfig, slog.Default())
144+
require.NoError(t, err)
145+
146+
t.Cleanup(app.Close)
147+
148+
integration.RunAndWaitReady(t, app)
193149

194150
for _, tt := range tests {
195-
s.T().Run(tt.name, func(t *testing.T) {
196-
nonce := tt.generateEvent(t, s.client)
151+
t.Run(tt.name, func(t *testing.T) {
152+
any := tt.generateEvent(t, adminClient)
197153

198-
waitCtx, cancel := context.WithTimeout(ctx, 5*time.Second)
199-
s.T().Cleanup(cancel)
154+
waitCtx, cancel := context.WithTimeout(t.Context(), 5*time.Second)
155+
t.Cleanup(cancel)
200156

201-
eventFound := false
202-
for !eventFound {
203-
event, err := s.fakeFluentd.GetMessage(waitCtx)
204-
require.NoError(s.T(), err, "did not receive the event after 5 seconds")
205-
if tt.checkEvent(t, event, nonce) {
157+
for eventFound := false; !eventFound; {
158+
event, err := fakeFluentd.GetMessage(waitCtx)
159+
require.NoError(t, err, "did not receive the event after 5 seconds")
160+
if tt.checkEvent(t, event, any) {
206161
t.Logf("Event matched: %s", event)
207162
eventFound = true
208163
} else {

0 commit comments

Comments
 (0)