aboutsummaryrefslogtreecommitdiffhomepage
path: root/container/output_test.go
blob: 3fb2ac74d8f973dd951768889b3d45696142a89c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
package container

import (
	"reflect"
	"syscall"
	"testing"
)

func TestGetSetOutput(t *testing.T) {
	{
		out := GetOutput()
		t.Cleanup(func() { SetOutput(out) })
	}

	t.Run("default", func(t *testing.T) {
		SetOutput(new(stubOutput))
		if v, ok := GetOutput().(*DefaultMsg); ok {
			t.Fatalf("SetOutput: got unexpected output %#v", v)
		}
		SetOutput(nil)
		if _, ok := GetOutput().(*DefaultMsg); !ok {
			t.Fatalf("SetOutput: got unexpected output %#v", GetOutput())
		}
	})

	t.Run("stub", func(t *testing.T) {
		SetOutput(new(stubOutput))
		if _, ok := GetOutput().(*stubOutput); !ok {
			t.Fatalf("SetOutput: got unexpected output %#v", GetOutput())
		}
	})
}

func TestWrapErr(t *testing.T) {
	{
		out := GetOutput()
		t.Cleanup(func() { SetOutput(out) })
	}

	var wrapFp *func(error, ...any) error
	s := new(stubOutput)
	SetOutput(s)
	wrapFp = &s.wrapF

	testCases := []struct {
		name    string
		f       func(t *testing.T)
		wantErr error
		wantA   []any
	}{
		{"suffix nil", func(t *testing.T) {
			if err := wrapErrSuffix(nil, "\x00"); err != nil {
				t.Errorf("wrapErrSuffix: %v", err)
			}
		}, nil, nil},
		{"suffix val", func(t *testing.T) {
			if err := wrapErrSuffix(syscall.ENOTRECOVERABLE, "\x00\x00"); err != syscall.ENOTRECOVERABLE {
				t.Errorf("wrapErrSuffix: %v", err)
			}
		}, syscall.ENOTRECOVERABLE, []any{"\x00\x00", syscall.ENOTRECOVERABLE}},
		{"self nil", func(t *testing.T) {
			if err := wrapErrSelf(nil); err != nil {
				t.Errorf("wrapErrSelf: %v", err)
			}
		}, nil, nil},
		{"self val", func(t *testing.T) {
			if err := wrapErrSelf(syscall.ENOTRECOVERABLE); err != syscall.ENOTRECOVERABLE {
				t.Errorf("wrapErrSelf: %v", err)
			}
		}, syscall.ENOTRECOVERABLE, []any{"state not recoverable"}},
	}

	for _, tc := range testCases {
		t.Run(tc.name, func(t *testing.T) {
			var (
				gotErr error
				gotA   []any
			)
			*wrapFp = func(err error, a ...any) error { gotErr = err; gotA = a; return err }

			tc.f(t)
			if gotErr != tc.wantErr {
				t.Errorf("WrapErr: err = %v, want %v", gotErr, tc.wantErr)
			}

			if !reflect.DeepEqual(gotA, tc.wantA) {
				t.Errorf("WrapErr: a = %v, want %v", gotA, tc.wantA)
			}
		})
	}
}

type stubOutput struct {
	wrapF func(error, ...any) error
}

func (*stubOutput) IsVerbose() bool            { panic("unreachable") }
func (*stubOutput) Verbose(...any)             { panic("unreachable") }
func (*stubOutput) Verbosef(string, ...any)    { panic("unreachable") }
func (*stubOutput) PrintBaseErr(error, string) { panic("unreachable") }
func (*stubOutput) Suspend()                   { panic("unreachable") }
func (*stubOutput) Resume() bool               { panic("unreachable") }
func (*stubOutput) BeforeExit()                { panic("unreachable") }

func (s *stubOutput) WrapErr(err error, v ...any) error {
	if s.wrapF == nil {
		panic("unreachable")
	}
	return s.wrapF(err, v...)
}