Skip to content

Commit cdd3ac7

Browse files
yuval-ksam-heilbronnfuden
authored
test fix: allow test scenarios run more than one time (#10395)
Co-authored-by: Sam Heilbron <[email protected]> Co-authored-by: Nathan Fudenberg <[email protected]>
1 parent 0d40c8e commit cdd3ac7

File tree

1 file changed

+41
-15
lines changed

1 file changed

+41
-15
lines changed

projects/gateway2/setup/ggv2setup_test.go

+41-15
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"sort"
1212
"strings"
1313
"sync"
14+
"sync/atomic"
1415
"testing"
1516
"time"
1617

@@ -73,22 +74,30 @@ func getAssetsDir(t *testing.T) string {
7374

7475
// testingWriter is a WriteSyncer that writes logs to testing.T.
7576
type testingWriter struct {
76-
t *testing.T
77+
t atomic.Value
7778
}
7879

7980
func (w *testingWriter) Write(p []byte) (n int, err error) {
80-
w.t.Log(string(p)) // Write the log to testing.T
81+
w.t.Load().(*testing.T).Log(string(p)) // Write the log to testing.T
8182
return len(p), nil
8283
}
8384

8485
func (w *testingWriter) Sync() error {
8586
return nil
8687
}
8788

88-
// NewTestLogger creates a zap.Logger that writes to testing.T.
89-
func NewTestLogger(t *testing.T) *zap.Logger {
90-
writer := &testingWriter{t: t}
89+
func (w *testingWriter) set(t *testing.T) {
90+
w.t.Store(t)
91+
}
92+
93+
var (
94+
writer = &testingWriter{}
95+
logger = NewTestLogger()
96+
)
9197

98+
// NewTestLogger creates a zap.Logger which can be used to write to *testing.T
99+
// on each test, set the *testing.T on the writer.
100+
func NewTestLogger() *zap.Logger {
92101
core := zapcore.NewCore(
93102
zapcore.NewConsoleEncoder(zap.NewDevelopmentEncoderConfig()),
94103
zapcore.AddSync(writer),
@@ -100,7 +109,13 @@ func NewTestLogger(t *testing.T) *zap.Logger {
100109
return zap.New(core, zap.AddCaller())
101110
}
102111

112+
func init() {
113+
log.SetLogger(zapr.NewLogger(logger))
114+
115+
}
116+
103117
func TestScenarios(t *testing.T) {
118+
writer.set(t)
104119
os.Setenv("POD_NAMESPACE", "gwtest")
105120
testEnv := &envtest.Environment{
106121
CRDDirectoryPaths: []string{
@@ -118,11 +133,6 @@ func TestScenarios(t *testing.T) {
118133

119134
ctx, cancel := context.WithCancel(context.Background())
120135
t.Cleanup(cancel)
121-
logger := NewTestLogger(t)
122-
t.Cleanup(func() { logger.Sync() })
123-
// t.Cleanup(func() { _ = logger.Sync() })
124-
log.SetLogger(zapr.NewLogger(logger))
125-
126136
ctx = contextutils.WithExistingLogger(ctx, logger.Sugar())
127137

128138
cfg, err := testEnv.Start()
@@ -212,9 +222,20 @@ func TestScenarios(t *testing.T) {
212222
}
213223
for _, f := range files {
214224
// run tests with the yaml files (but not -out.yaml files)/s
225+
parentT := t
215226
if strings.HasSuffix(f.Name(), ".yaml") && !strings.HasSuffix(f.Name(), "-out.yaml") {
216227
fullpath := filepath.Join("testdata", f.Name())
217228
t.Run(strings.TrimSuffix(f.Name(), ".yaml"), func(t *testing.T) {
229+
writer.set(t)
230+
t.Cleanup(func() {
231+
writer.set(parentT)
232+
})
233+
t.Cleanup(func() {
234+
if t.Failed() {
235+
j, _ := setupOpts.KrtDebugger.MarshalJSON()
236+
t.Logf("krt state for failed test: %s %s", t.Name(), string(j))
237+
}
238+
})
218239
//sadly tests can't run yet in parallel, as ggv2 will add all the k8s services as clusters. this means
219240
// that we get test pollution.
220241
// once we change it to only include the ones in the proxy, we can re-enable this
@@ -224,8 +245,6 @@ func TestScenarios(t *testing.T) {
224245
})
225246
}
226247
}
227-
228-
t.Log("DONE")
229248
}
230249

231250
func testScenario(t *testing.T, ctx context.Context, client istiokube.CLIClient, xdsPort int, f string) {
@@ -363,6 +382,7 @@ func (x *xdsDump) Compare(t *testing.T, other xdsDump) {
363382
otherc := clusterset[c.Name]
364383
if otherc == nil {
365384
t.Errorf("cluster %v not found", c.Name)
385+
continue
366386
}
367387
if !proto.Equal(c, otherc) {
368388
t.Errorf("cluster %v not equal", c.Name)
@@ -376,6 +396,7 @@ func (x *xdsDump) Compare(t *testing.T, other xdsDump) {
376396
otherc := listenerset[c.Name]
377397
if otherc == nil {
378398
t.Errorf("listener %v not found", c.Name)
399+
continue
379400
}
380401
if !proto.Equal(c, otherc) {
381402
t.Errorf("listener %v not equal", c.Name)
@@ -389,6 +410,7 @@ func (x *xdsDump) Compare(t *testing.T, other xdsDump) {
389410
otherc := routeset[c.Name]
390411
if otherc == nil {
391412
t.Errorf("route %v not found", c.Name)
413+
continue
392414
}
393415
if !proto.Equal(c, otherc) {
394416
t.Errorf("route %v not equal: %v vs %v", c.Name, c, otherc)
@@ -590,14 +612,15 @@ func (x *xdsFetcher) getclusters(t *testing.T, ctx context.Context) []*envoyclus
590612

591613
epcli, err := cds.StreamClusters(ctx)
592614
if err != nil {
593-
t.Fatalf("failed to get eds client: %v", err)
615+
t.Fatalf("failed to get cds client: %v", err)
594616
}
595617
defer epcli.CloseSend()
596618
epcli.Send(x.dr)
597619
dresp, err := epcli.Recv()
598620
if err != nil {
599621
t.Fatalf("failed to get response from xds server: %v", err)
600622
}
623+
t.Logf("got cds response. nonce, version: %s %s", dresp.GetNonce(), dresp.GetVersionInfo())
601624
var clusters []*envoycluster.Cluster
602625
for _, anyCluster := range dresp.GetResources() {
603626

@@ -644,14 +667,15 @@ func (x *xdsFetcher) getlisteners(t *testing.T, ctx context.Context) []*envoylis
644667

645668
epcli, err := ds.StreamListeners(ctx)
646669
if err != nil {
647-
t.Fatalf("failed to get eds client: %v", err)
670+
t.Fatalf("failed to get lds client: %v", err)
648671
}
649672
defer epcli.CloseSend()
650673
epcli.Send(x.dr)
651674
dresp, err := epcli.Recv()
652675
if err != nil {
653676
t.Fatalf("failed to get response from xds server: %v", err)
654677
}
678+
t.Logf("got lds response. nonce, version: %s %s", dresp.GetNonce(), dresp.GetVersionInfo())
655679
var resources []*envoylistener.Listener
656680
for _, anyResource := range dresp.GetResources() {
657681

@@ -682,6 +706,7 @@ func (x *xdsFetcher) getendpoints(t *testing.T, ctx context.Context, clusterServ
682706
if err != nil {
683707
t.Fatalf("failed to get response from xds server: %v", err)
684708
}
709+
t.Logf("got eds response. nonce, version: %s %s", dresp.GetNonce(), dresp.GetVersionInfo())
685710
var clas []*envoyendpoint.ClusterLoadAssignment
686711
for _, anyCluster := range dresp.GetResources() {
687712

@@ -705,7 +730,7 @@ func (x *xdsFetcher) getroutes(t *testing.T, ctx context.Context, rosourceNames
705730

706731
epcli, err := eds.StreamRoutes(ctx)
707732
if err != nil {
708-
t.Fatalf("failed to get eds client: %v", err)
733+
t.Fatalf("failed to get rds client: %v", err)
709734
}
710735
defer epcli.CloseSend()
711736
dr := proto.Clone(x.dr).(*discovery_v3.DiscoveryRequest)
@@ -715,6 +740,7 @@ func (x *xdsFetcher) getroutes(t *testing.T, ctx context.Context, rosourceNames
715740
if err != nil {
716741
t.Fatalf("failed to get response from xds server: %v", err)
717742
}
743+
t.Logf("got rds response. nonce, version: %s %s", dresp.GetNonce(), dresp.GetVersionInfo())
718744
var clas []*envoy_config_route_v3.RouteConfiguration
719745
for _, anyCluster := range dresp.GetResources() {
720746

0 commit comments

Comments
 (0)