Browse code

fix some faulty defers in tests

Calling "defer assert.NilError(t, someCommand())" executes "someCommand()"
immediately, but doesn't assert the error until the defer.
https://go.dev/play/p/EO--y7OYerg

package main

import (
"errors"
"testing"

"gotest.tools/v3/assert"
)

func TestDefer(t *testing.T) {
doSomething := func() error {
t.Log("doSomething failed with an error!")
return errors.New("foo error")
}

defer assert.NilError(t, doSomething())

t.Log("running test")
t.Log("running test")
t.Log("running test")
}

Produces:

=== RUN TestDefer
prog_test.go:12: doSomething failed with an error!
prog_test.go:18: running test
prog_test.go:19: running test
prog_test.go:20: running test
prog_test.go:21: assertion failed: error is not nil: foo error
--- FAIL: TestDefer (0.00s)
FAIL

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>

Sebastiaan van Stijn authored on 2025/10/27 20:33:11
Showing 5 changed files
... ...
@@ -78,7 +78,9 @@ func TestImageImport(t *testing.T) {
78 78
 				SourceName: "image_source",
79 79
 			}, "repository_name:imported", tc.options)
80 80
 			assert.NilError(t, err)
81
-			defer assert.NilError(t, result.Close())
81
+			defer func() {
82
+				assert.NilError(t, result.Close())
83
+			}()
82 84
 
83 85
 			body, err := io.ReadAll(result)
84 86
 			assert.NilError(t, err)
... ...
@@ -71,7 +71,9 @@ func TestImageSave(t *testing.T) {
71 71
 			assert.NilError(t, err)
72 72
 			resp, err := client.ImageSave(context.Background(), []string{"image_id1", "image_id2"}, tc.options...)
73 73
 			assert.NilError(t, err)
74
-			defer assert.NilError(t, resp.Close())
74
+			defer func() {
75
+				assert.NilError(t, resp.Close())
76
+			}()
75 77
 
76 78
 			body, err := io.ReadAll(resp)
77 79
 			assert.NilError(t, err)
... ...
@@ -292,7 +292,9 @@ func (tr Reader) TestFollow(t *testing.T) {
292 292
 		}()
293 293
 
294 294
 		expected := logMessages(t, l, mm)[:2]
295
-		defer assert.NilError(t, l.Close()) // Reading should end before the logger is closed.
295
+		defer func() {
296
+			assert.NilError(t, l.Close()) // Reading should end before the logger is closed.
297
+		}()
296 298
 		<-doneReading
297 299
 		assert.DeepEqual(t, logs, expected, compareLog)
298 300
 	})
... ...
@@ -317,7 +319,9 @@ func (tr Reader) TestFollow(t *testing.T) {
317 317
 		}()
318 318
 
319 319
 		expected := logMessages(t, l, mm)[1:2]
320
-		defer assert.NilError(t, l.Close()) // Reading should end before the logger is closed.
320
+		defer func() {
321
+			assert.NilError(t, l.Close()) // Reading should end before the logger is closed.
322
+		}()
321 323
 		<-doneReading
322 324
 		assert.DeepEqual(t, logs, expected, compareLog)
323 325
 	})
... ...
@@ -235,13 +235,15 @@ func TestVolCreateValidation(t *testing.T) {
235 235
 			}
236 236
 			v, err := r.Create(tc.name, tc.opts)
237 237
 			if v != nil {
238
-				defer assert.Check(t, r.Remove(v))
238
+				defer func() {
239
+					assert.Check(t, r.Remove(v))
240
+				}()
239 241
 			}
240 242
 			if tc.expectedErr == "" {
241 243
 				assert.NilError(t, err)
242 244
 			} else {
243 245
 				assert.Check(t, cerrdefs.IsInvalidArgument(err), "got: %T", err)
244
-				assert.ErrorContains(t, err, tc.expectedErr)
246
+				assert.Check(t, is.ErrorContains(err, tc.expectedErr))
245 247
 			}
246 248
 		})
247 249
 	}
... ...
@@ -322,7 +322,9 @@ func TestAccessPublishedPortFromHost(t *testing.T) {
322 322
 	revertIPv6OnAll := enableIPv6OnAll(t)
323 323
 	defer revertIPv6OnAll()
324 324
 	assert.NilError(t, exec.Command("ip", "addr", "add", "fdfb:5cbb:29bf::2/64", "dev", "eth0", "nodad").Run())
325
-	defer assert.NilError(t, exec.Command("ip", "addr", "del", "fdfb:5cbb:29bf::2/64", "dev", "eth0").Run())
325
+	defer func() {
326
+		assert.NilError(t, exec.Command("ip", "addr", "del", "fdfb:5cbb:29bf::2/64", "dev", "eth0").Run())
327
+	}()
326 328
 
327 329
 	testcases := []struct {
328 330
 		ulpEnabled bool