diff options
Diffstat (limited to 'system/dbus_test.go')
| -rw-r--r-- | system/dbus_test.go | 674 |
1 files changed, 0 insertions, 674 deletions
diff --git a/system/dbus_test.go b/system/dbus_test.go deleted file mode 100644 index eedb2335..00000000 --- a/system/dbus_test.go +++ /dev/null @@ -1,674 +0,0 @@ -package system - -import ( - "context" - "reflect" - "slices" - "strconv" - "strings" - "syscall" - "testing" - - "hakurei.app/container/stub" - "hakurei.app/hst" - "hakurei.app/internal/helper" - "hakurei.app/system/dbus" -) - -func TestDBusProxyOp(t *testing.T) { - t.Parallel() - - checkOpBehaviour(t, []opBehaviourTestCase{ - {"dbusProxyStart", 0xdead, 0xff, &dbusProxyOp{ - final: dbusNewFinalSample(4), - out: new(linePrefixWriter), // panics on write - system: true, - }, []stub.Call{ - call("verbosef", stub.ExpectArgs{"session bus proxy on %q for upstream %q", []any{"/tmp/hakurei.0/99dd71ee2146369514e0d10783368f8f/bus", "unix:path=/run/user/1000/bus"}}, nil, nil), - call("verbosef", stub.ExpectArgs{"system bus proxy on %q for upstream %q", []any{"/tmp/hakurei.0/99dd71ee2146369514e0d10783368f8f/system_bus_socket", "unix:path=/run/dbus/system_bus_socket"}}, nil, nil), - call("dbusProxyStart", stub.ExpectArgs{dbusNewFinalSample(4)}, nil, stub.UniqueError(2)), - }, &OpError{ - Op: "dbus", Err: stub.UniqueError(2), - Msg: "cannot start message bus proxy: unique error 2 injected by the test suite", - }, nil, nil}, - - {"dbusProxyWait", 0xdead, 0xff, &dbusProxyOp{ - final: dbusNewFinalSample(3), - }, []stub.Call{ - call("verbosef", stub.ExpectArgs{"session bus proxy on %q for upstream %q", []any{"/tmp/hakurei.0/99dd71ee2146369514e0d10783368f8f/bus", "unix:path=/run/user/1000/bus"}}, nil, nil), - call("dbusProxyStart", stub.ExpectArgs{dbusNewFinalSample(3)}, nil, nil), - call("verbose", stub.ExpectArgs{[]any{"starting message bus proxy", ignoreValue{}}}, nil, nil), - }, nil, []stub.Call{ - call("verbose", stub.ExpectArgs{[]any{"terminating message bus proxy"}}, nil, nil), - call("dbusProxyClose", stub.ExpectArgs{dbusNewFinalSample(3)}, nil, nil), - call("dbusProxyWait", stub.ExpectArgs{dbusNewFinalSample(3)}, nil, stub.UniqueError(1)), - call("verbose", stub.ExpectArgs{[]any{"message bus proxy exit"}}, nil, nil), - }, &OpError{ - Op: "dbus", Err: stub.UniqueError(1), Revert: true, - Msg: "message bus proxy error: unique error 1 injected by the test suite", - }}, - - {"success dbusProxyWait cancel", 0xdead, 0xff, &dbusProxyOp{ - final: dbusNewFinalSample(2), - system: true, - }, []stub.Call{ - call("verbosef", stub.ExpectArgs{"session bus proxy on %q for upstream %q", []any{"/tmp/hakurei.0/99dd71ee2146369514e0d10783368f8f/bus", "unix:path=/run/user/1000/bus"}}, nil, nil), - call("verbosef", stub.ExpectArgs{"system bus proxy on %q for upstream %q", []any{"/tmp/hakurei.0/99dd71ee2146369514e0d10783368f8f/system_bus_socket", "unix:path=/run/dbus/system_bus_socket"}}, nil, nil), - call("dbusProxyStart", stub.ExpectArgs{dbusNewFinalSample(2)}, nil, nil), - call("verbose", stub.ExpectArgs{[]any{"starting message bus proxy", ignoreValue{}}}, nil, nil), - }, nil, []stub.Call{ - call("verbose", stub.ExpectArgs{[]any{"terminating message bus proxy"}}, nil, nil), - call("dbusProxyClose", stub.ExpectArgs{dbusNewFinalSample(2)}, nil, nil), - call("dbusProxyWait", stub.ExpectArgs{dbusNewFinalSample(2)}, nil, context.Canceled), - call("verbose", stub.ExpectArgs{[]any{"message bus proxy canceled upstream"}}, nil, nil), - }, nil}, - - {"success", 0xdead, 0xff, &dbusProxyOp{ - final: dbusNewFinalSample(1), - system: true, - }, []stub.Call{ - call("verbosef", stub.ExpectArgs{"session bus proxy on %q for upstream %q", []any{"/tmp/hakurei.0/99dd71ee2146369514e0d10783368f8f/bus", "unix:path=/run/user/1000/bus"}}, nil, nil), - call("verbosef", stub.ExpectArgs{"system bus proxy on %q for upstream %q", []any{"/tmp/hakurei.0/99dd71ee2146369514e0d10783368f8f/system_bus_socket", "unix:path=/run/dbus/system_bus_socket"}}, nil, nil), - call("dbusProxyStart", stub.ExpectArgs{dbusNewFinalSample(1)}, nil, nil), - call("verbose", stub.ExpectArgs{[]any{"starting message bus proxy", ignoreValue{}}}, nil, nil), - }, nil, []stub.Call{ - call("verbose", stub.ExpectArgs{[]any{"terminating message bus proxy"}}, nil, nil), - call("dbusProxyClose", stub.ExpectArgs{dbusNewFinalSample(1)}, nil, nil), - call("dbusProxyWait", stub.ExpectArgs{dbusNewFinalSample(1)}, nil, nil), - call("verbose", stub.ExpectArgs{[]any{"message bus proxy exit"}}, nil, nil), - }, nil}, - }) - - checkOpsBuilder(t, "ProxyDBus", []opsBuilderTestCase{ - {"nil session", 0xcafe, func(t *testing.T, sys *I) { - wantErr := &OpError{ - Op: "dbus", Err: ErrDBusConfig, - Msg: "attempted to create message bus proxy args without session bus config", - } - if err := sys.ProxyDBus(nil, new(hst.BusConfig), dbus.ProxyPair{}, dbus.ProxyPair{}); !reflect.DeepEqual(err, wantErr) { - t.Errorf("ProxyDBus: error = %v, want %v", err, wantErr) - } - }, nil, stub.Expect{}}, - - {"dbusFinalise NUL", 0xcafe, func(_ *testing.T, sys *I) { - defer func() { - want := "message bus proxy configuration contains NUL byte" - if r := recover(); r != want { - t.Errorf("MustProxyDBus: panic = %v, want %v", r, want) - } - }() - - sys.MustProxyDBus( - &hst.BusConfig{ - // use impossible value here as an implicit assert that it goes through the stub - Talk: []string{"session\x00"}, Filter: true, - }, &hst.BusConfig{ - // use impossible value here as an implicit assert that it goes through the stub - Talk: []string{"system\x00"}, Filter: true, - }, dbus.ProxyPair{ - "unix:path=/run/user/1000/bus", - "/tmp/hakurei.0/99dd71ee2146369514e0d10783368f8f/bus", - }, dbus.ProxyPair{ - "unix:path=/run/dbus/system_bus_socket", - "/tmp/hakurei.0/99dd71ee2146369514e0d10783368f8f/system_bus_socket", - }) - }, nil, stub.Expect{Calls: []stub.Call{ - call("dbusFinalise", stub.ExpectArgs{ - dbus.ProxyPair{"unix:path=/run/user/1000/bus", "/tmp/hakurei.0/99dd71ee2146369514e0d10783368f8f/bus"}, - dbus.ProxyPair{"unix:path=/run/dbus/system_bus_socket", "/tmp/hakurei.0/99dd71ee2146369514e0d10783368f8f/system_bus_socket"}, - &hst.BusConfig{Talk: []string{"session\x00"}, Filter: true}, - &hst.BusConfig{Talk: []string{"system\x00"}, Filter: true}, - }, (*dbus.Final)(nil), syscall.EINVAL), - }}}, - - {"dbusFinalise", 0xcafe, func(_ *testing.T, sys *I) { - wantErr := &OpError{ - Op: "dbus", Err: stub.UniqueError(0), - Msg: "cannot finalise message bus proxy: unique error 0 injected by the test suite", - } - if err := sys.ProxyDBus( - &hst.BusConfig{ - // use impossible value here as an implicit assert that it goes through the stub - Talk: []string{"session\x00"}, Filter: true, - }, &hst.BusConfig{ - // use impossible value here as an implicit assert that it goes through the stub - Talk: []string{"system\x00"}, Filter: true, - }, dbus.ProxyPair{ - "unix:path=/run/user/1000/bus", - "/tmp/hakurei.0/99dd71ee2146369514e0d10783368f8f/bus", - }, dbus.ProxyPair{ - "unix:path=/run/dbus/system_bus_socket", - "/tmp/hakurei.0/99dd71ee2146369514e0d10783368f8f/system_bus_socket", - }); !reflect.DeepEqual(err, wantErr) { - t.Errorf("ProxyDBus: error = %v", err) - } - }, nil, stub.Expect{Calls: []stub.Call{ - call("dbusFinalise", stub.ExpectArgs{ - dbus.ProxyPair{"unix:path=/run/user/1000/bus", "/tmp/hakurei.0/99dd71ee2146369514e0d10783368f8f/bus"}, - dbus.ProxyPair{"unix:path=/run/dbus/system_bus_socket", "/tmp/hakurei.0/99dd71ee2146369514e0d10783368f8f/system_bus_socket"}, - &hst.BusConfig{Talk: []string{"session\x00"}, Filter: true}, - &hst.BusConfig{Talk: []string{"system\x00"}, Filter: true}, - }, (*dbus.Final)(nil), stub.UniqueError(0)), - }}}, - - {"full", 0xcafe, func(_ *testing.T, sys *I) { - sys.MustProxyDBus( - &hst.BusConfig{ - // use impossible value here as an implicit assert that it goes through the stub - Talk: []string{"session\x00"}, Filter: true, - }, &hst.BusConfig{ - // use impossible value here as an implicit assert that it goes through the stub - Talk: []string{"system\x00"}, Filter: true, - }, dbus.ProxyPair{ - "unix:path=/run/user/1000/bus", - "/tmp/hakurei.0/99dd71ee2146369514e0d10783368f8f/bus", - }, dbus.ProxyPair{ - "unix:path=/run/dbus/system_bus_socket", - "/tmp/hakurei.0/99dd71ee2146369514e0d10783368f8f/system_bus_socket", - }) - }, []Op{ - &dbusProxyOp{ - final: dbusNewFinalSample(0), - system: true, - }, - }, stub.Expect{Calls: []stub.Call{ - call("dbusFinalise", stub.ExpectArgs{ - dbus.ProxyPair{"unix:path=/run/user/1000/bus", "/tmp/hakurei.0/99dd71ee2146369514e0d10783368f8f/bus"}, - dbus.ProxyPair{"unix:path=/run/dbus/system_bus_socket", "/tmp/hakurei.0/99dd71ee2146369514e0d10783368f8f/system_bus_socket"}, - &hst.BusConfig{Talk: []string{"session\x00"}, Filter: true}, - &hst.BusConfig{Talk: []string{"system\x00"}, Filter: true}, - }, dbusNewFinalSample(0), nil), - call("isVerbose", stub.ExpectArgs{}, true, nil), - call("verbose", stub.ExpectArgs{[]any{"session bus proxy:", []string{"unix:path=/run/user/1000/bus", "/tmp/hakurei.0/99dd71ee2146369514e0d10783368f8f/bus", "--filter", "--talk=session\x00"}}}, nil, nil), - call("verbose", stub.ExpectArgs{[]any{"system bus proxy:", []string{"unix:path=/run/dbus/system_bus_socket", "/tmp/hakurei.0/99dd71ee2146369514e0d10783368f8f/system_bus_socket", "--filter", "--talk=system\x00"}}}, nil, nil), - call("verbose", stub.ExpectArgs{[]any{"message bus proxy final args:", helper.MustNewCheckedArgs("unique", "value", "0", "injected", "by", "the", "test", "suite")}}, nil, nil), - }}}, - }) - - checkOpIs(t, []opIsTestCase{ - {"nil", (*dbusProxyOp)(nil), (*dbusProxyOp)(nil), false}, - {"zero", new(dbusProxyOp), new(dbusProxyOp), false}, - - {"system differs", &dbusProxyOp{final: &dbus.Final{ - Session: dbus.ProxyPair{"unix:path=/run/user/1000/bus", "/tmp/hakurei.0/b186c281d9e83a39afdc66d964ef99c6/bus"}, - System: dbus.ProxyPair{"unix:path=/run/dbus/system_bus_socket", "/tmp/hakurei.0/b186c281d9e83a39afdc66d964ef99c6/system_bus_socket"}, - - SessionUpstream: []dbus.AddrEntry{{Method: "unix", Values: [][2]string{{"path", "/run/user/1000/bus"}}}}, - SystemUpstream: []dbus.AddrEntry{{Method: "unix", Values: [][2]string{{"unix", "/run/dbus/system_bus_socket"}}}}, - - WriterTo: helper.MustNewCheckedArgs( - "--filter", "unix:path=/run/user/1000/bus", "/tmp/hakurei.0/b186c281d9e83a39afdc66d964ef99c6/bus", - "--filter", "unix:path=/run/dbus/system_bus_socket", "/tmp/hakurei.0/b186c281d9e83a39afdc66d964ef99c6/system_bus_socket", - ), - }, system: false, - }, &dbusProxyOp{final: &dbus.Final{ - Session: dbus.ProxyPair{"unix:path=/run/user/1000/bus", "/tmp/hakurei.0/b186c281d9e83a39afdc66d964ef99c6/bus"}, - System: dbus.ProxyPair{"unix:path=/run/dbus/system_bus_socket", "/tmp/hakurei.0/b186c281d9e83a39afdc66d964ef99c6/system_bus_socket"}, - - SessionUpstream: []dbus.AddrEntry{{Method: "unix", Values: [][2]string{{"path", "/run/user/1000/bus"}}}}, - SystemUpstream: []dbus.AddrEntry{{Method: "unix", Values: [][2]string{{"unix", "/run/dbus/system_bus_socket"}}}}, - - WriterTo: helper.MustNewCheckedArgs( - "--filter", "unix:path=/run/user/1000/bus", "/tmp/hakurei.0/b186c281d9e83a39afdc66d964ef99c6/bus", - "--filter", "unix:path=/run/dbus/system_bus_socket", "/tmp/hakurei.0/b186c281d9e83a39afdc66d964ef99c6/system_bus_socket", - ), - }, system: true, - }, false}, - - {"wt differs", &dbusProxyOp{final: &dbus.Final{ - Session: dbus.ProxyPair{"unix:path=/run/user/1000/bus", "/tmp/hakurei.0/b186c281d9e83a39afdc66d964ef99c6/bus"}, - System: dbus.ProxyPair{"unix:path=/run/dbus/system_bus_socket", "/tmp/hakurei.0/b186c281d9e83a39afdc66d964ef99c6/system_bus_socket"}, - - SessionUpstream: []dbus.AddrEntry{{Method: "unix", Values: [][2]string{{"path", "/run/user/1000/bus"}}}}, - SystemUpstream: []dbus.AddrEntry{{Method: "unix", Values: [][2]string{{"unix", "/run/dbus/system_bus_socket"}}}}, - - WriterTo: helper.MustNewCheckedArgs( - "--filter", "unix:path=/run/user/1001/bus", "/tmp/hakurei.0/b186c281d9e83a39afdc66d964ef99c6/bus", - "--filter", "unix:path=/run/dbus/system_bus_socket", "/tmp/hakurei.0/b186c281d9e83a39afdc66d964ef99c6/system_bus_socket", - ), - }, system: true, - }, &dbusProxyOp{final: &dbus.Final{ - Session: dbus.ProxyPair{"unix:path=/run/user/1000/bus", "/tmp/hakurei.0/b186c281d9e83a39afdc66d964ef99c6/bus"}, - System: dbus.ProxyPair{"unix:path=/run/dbus/system_bus_socket", "/tmp/hakurei.0/b186c281d9e83a39afdc66d964ef99c6/system_bus_socket"}, - - SessionUpstream: []dbus.AddrEntry{{Method: "unix", Values: [][2]string{{"path", "/run/user/1000/bus"}}}}, - SystemUpstream: []dbus.AddrEntry{{Method: "unix", Values: [][2]string{{"unix", "/run/dbus/system_bus_socket"}}}}, - - WriterTo: helper.MustNewCheckedArgs( - "--filter", "unix:path=/run/user/1000/bus", "/tmp/hakurei.0/b186c281d9e83a39afdc66d964ef99c6/bus", - "--filter", "unix:path=/run/dbus/system_bus_socket", "/tmp/hakurei.0/b186c281d9e83a39afdc66d964ef99c6/system_bus_socket", - ), - }, system: true, - }, false}, - - {"final system upstream differs", &dbusProxyOp{final: &dbus.Final{ - Session: dbus.ProxyPair{"unix:path=/run/user/1000/bus", "/tmp/hakurei.0/b186c281d9e83a39afdc66d964ef99c6/bus"}, - System: dbus.ProxyPair{"unix:path=/run/dbus/system_bus_socket", "/tmp/hakurei.0/b186c281d9e83a39afdc66d964ef99c6/system_bus_socket"}, - - SessionUpstream: []dbus.AddrEntry{{Method: "unix", Values: [][2]string{{"path", "/run/user/1000/bus"}}}}, - SystemUpstream: []dbus.AddrEntry{{Method: "unix", Values: [][2]string{{"unix", "/run/dbus/system_bus_socket\x00"}}}}, - - WriterTo: helper.MustNewCheckedArgs( - "--filter", "unix:path=/run/user/1000/bus", "/tmp/hakurei.0/b186c281d9e83a39afdc66d964ef99c6/bus", - "--filter", "unix:path=/run/dbus/system_bus_socket", "/tmp/hakurei.0/b186c281d9e83a39afdc66d964ef99c6/system_bus_socket", - ), - }, system: true, - }, &dbusProxyOp{final: &dbus.Final{ - Session: dbus.ProxyPair{"unix:path=/run/user/1000/bus", "/tmp/hakurei.0/b186c281d9e83a39afdc66d964ef99c6/bus"}, - System: dbus.ProxyPair{"unix:path=/run/dbus/system_bus_socket", "/tmp/hakurei.0/b186c281d9e83a39afdc66d964ef99c6/system_bus_socket"}, - - SessionUpstream: []dbus.AddrEntry{{Method: "unix", Values: [][2]string{{"path", "/run/user/1000/bus"}}}}, - SystemUpstream: []dbus.AddrEntry{{Method: "unix", Values: [][2]string{{"unix", "/run/dbus/system_bus_socket"}}}}, - - WriterTo: helper.MustNewCheckedArgs( - "--filter", "unix:path=/run/user/1000/bus", "/tmp/hakurei.0/b186c281d9e83a39afdc66d964ef99c6/bus", - "--filter", "unix:path=/run/dbus/system_bus_socket", "/tmp/hakurei.0/b186c281d9e83a39afdc66d964ef99c6/system_bus_socket", - ), - }, system: true, - }, false}, - - {"final session upstream differs", &dbusProxyOp{final: &dbus.Final{ - Session: dbus.ProxyPair{"unix:path=/run/user/1000/bus", "/tmp/hakurei.0/b186c281d9e83a39afdc66d964ef99c6/bus"}, - System: dbus.ProxyPair{"unix:path=/run/dbus/system_bus_socket", "/tmp/hakurei.0/b186c281d9e83a39afdc66d964ef99c6/system_bus_socket"}, - - SessionUpstream: []dbus.AddrEntry{{Method: "unix", Values: [][2]string{{"path", "/run/user/1001/bus"}}}}, - SystemUpstream: []dbus.AddrEntry{{Method: "unix", Values: [][2]string{{"unix", "/run/dbus/system_bus_socket"}}}}, - - WriterTo: helper.MustNewCheckedArgs( - "--filter", "unix:path=/run/user/1000/bus", "/tmp/hakurei.0/b186c281d9e83a39afdc66d964ef99c6/bus", - "--filter", "unix:path=/run/dbus/system_bus_socket", "/tmp/hakurei.0/b186c281d9e83a39afdc66d964ef99c6/system_bus_socket", - ), - }, system: true, - }, &dbusProxyOp{final: &dbus.Final{ - Session: dbus.ProxyPair{"unix:path=/run/user/1000/bus", "/tmp/hakurei.0/b186c281d9e83a39afdc66d964ef99c6/bus"}, - System: dbus.ProxyPair{"unix:path=/run/dbus/system_bus_socket", "/tmp/hakurei.0/b186c281d9e83a39afdc66d964ef99c6/system_bus_socket"}, - - SessionUpstream: []dbus.AddrEntry{{Method: "unix", Values: [][2]string{{"path", "/run/user/1000/bus"}}}}, - SystemUpstream: []dbus.AddrEntry{{Method: "unix", Values: [][2]string{{"unix", "/run/dbus/system_bus_socket"}}}}, - - WriterTo: helper.MustNewCheckedArgs( - "--filter", "unix:path=/run/user/1000/bus", "/tmp/hakurei.0/b186c281d9e83a39afdc66d964ef99c6/bus", - "--filter", "unix:path=/run/dbus/system_bus_socket", "/tmp/hakurei.0/b186c281d9e83a39afdc66d964ef99c6/system_bus_socket", - ), - }, system: true, - }, false}, - - {"final system differs", &dbusProxyOp{final: &dbus.Final{ - Session: dbus.ProxyPair{"unix:path=/run/user/1000/bus", "/tmp/hakurei.0/b186c281d9e83a39afdc66d964ef99c6/bus"}, - System: dbus.ProxyPair{"unix:path=/run/dbus/system_bus_socket", "/tmp/hakurei.1/b186c281d9e83a39afdc66d964ef99c6/system_bus_socket"}, - - SessionUpstream: []dbus.AddrEntry{{Method: "unix", Values: [][2]string{{"path", "/run/user/1000/bus"}}}}, - SystemUpstream: []dbus.AddrEntry{{Method: "unix", Values: [][2]string{{"unix", "/run/dbus/system_bus_socket"}}}}, - - WriterTo: helper.MustNewCheckedArgs( - "--filter", "unix:path=/run/user/1000/bus", "/tmp/hakurei.0/b186c281d9e83a39afdc66d964ef99c6/bus", - "--filter", "unix:path=/run/dbus/system_bus_socket", "/tmp/hakurei.0/b186c281d9e83a39afdc66d964ef99c6/system_bus_socket", - ), - }, system: true, - }, &dbusProxyOp{final: &dbus.Final{ - Session: dbus.ProxyPair{"unix:path=/run/user/1000/bus", "/tmp/hakurei.0/b186c281d9e83a39afdc66d964ef99c6/bus"}, - System: dbus.ProxyPair{"unix:path=/run/dbus/system_bus_socket", "/tmp/hakurei.0/b186c281d9e83a39afdc66d964ef99c6/system_bus_socket"}, - - SessionUpstream: []dbus.AddrEntry{{Method: "unix", Values: [][2]string{{"path", "/run/user/1000/bus"}}}}, - SystemUpstream: []dbus.AddrEntry{{Method: "unix", Values: [][2]string{{"unix", "/run/dbus/system_bus_socket"}}}}, - - WriterTo: helper.MustNewCheckedArgs( - "--filter", "unix:path=/run/user/1000/bus", "/tmp/hakurei.0/b186c281d9e83a39afdc66d964ef99c6/bus", - "--filter", "unix:path=/run/dbus/system_bus_socket", "/tmp/hakurei.0/b186c281d9e83a39afdc66d964ef99c6/system_bus_socket", - ), - }, system: true, - }, false}, - - {"final session differs", &dbusProxyOp{final: &dbus.Final{ - Session: dbus.ProxyPair{"unix:path=/run/user/1001/bus", "/tmp/hakurei.0/b186c281d9e83a39afdc66d964ef99c6/bus"}, - System: dbus.ProxyPair{"unix:path=/run/dbus/system_bus_socket", "/tmp/hakurei.0/b186c281d9e83a39afdc66d964ef99c6/system_bus_socket"}, - - SessionUpstream: []dbus.AddrEntry{{Method: "unix", Values: [][2]string{{"path", "/run/user/1000/bus"}}}}, - SystemUpstream: []dbus.AddrEntry{{Method: "unix", Values: [][2]string{{"unix", "/run/dbus/system_bus_socket"}}}}, - - WriterTo: helper.MustNewCheckedArgs( - "--filter", "unix:path=/run/user/1000/bus", "/tmp/hakurei.0/b186c281d9e83a39afdc66d964ef99c6/bus", - "--filter", "unix:path=/run/dbus/system_bus_socket", "/tmp/hakurei.0/b186c281d9e83a39afdc66d964ef99c6/system_bus_socket", - ), - }, system: true, - }, &dbusProxyOp{final: &dbus.Final{ - Session: dbus.ProxyPair{"unix:path=/run/user/1000/bus", "/tmp/hakurei.0/b186c281d9e83a39afdc66d964ef99c6/bus"}, - System: dbus.ProxyPair{"unix:path=/run/dbus/system_bus_socket", "/tmp/hakurei.0/b186c281d9e83a39afdc66d964ef99c6/system_bus_socket"}, - - SessionUpstream: []dbus.AddrEntry{{Method: "unix", Values: [][2]string{{"path", "/run/user/1000/bus"}}}}, - SystemUpstream: []dbus.AddrEntry{{Method: "unix", Values: [][2]string{{"unix", "/run/dbus/system_bus_socket"}}}}, - - WriterTo: helper.MustNewCheckedArgs( - "--filter", "unix:path=/run/user/1000/bus", "/tmp/hakurei.0/b186c281d9e83a39afdc66d964ef99c6/bus", - "--filter", "unix:path=/run/dbus/system_bus_socket", "/tmp/hakurei.0/b186c281d9e83a39afdc66d964ef99c6/system_bus_socket", - ), - }, system: true, - }, false}, - - {"equals", &dbusProxyOp{final: &dbus.Final{ - Session: dbus.ProxyPair{"unix:path=/run/user/1000/bus", "/tmp/hakurei.0/b186c281d9e83a39afdc66d964ef99c6/bus"}, - System: dbus.ProxyPair{"unix:path=/run/dbus/system_bus_socket", "/tmp/hakurei.0/b186c281d9e83a39afdc66d964ef99c6/system_bus_socket"}, - - SessionUpstream: []dbus.AddrEntry{{Method: "unix", Values: [][2]string{{"path", "/run/user/1000/bus"}}}}, - SystemUpstream: []dbus.AddrEntry{{Method: "unix", Values: [][2]string{{"unix", "/run/dbus/system_bus_socket"}}}}, - - WriterTo: helper.MustNewCheckedArgs( - "--filter", "unix:path=/run/user/1000/bus", "/tmp/hakurei.0/b186c281d9e83a39afdc66d964ef99c6/bus", - "--filter", "unix:path=/run/dbus/system_bus_socket", "/tmp/hakurei.0/b186c281d9e83a39afdc66d964ef99c6/system_bus_socket", - ), - }, system: true, - }, &dbusProxyOp{final: &dbus.Final{ - Session: dbus.ProxyPair{"unix:path=/run/user/1000/bus", "/tmp/hakurei.0/b186c281d9e83a39afdc66d964ef99c6/bus"}, - System: dbus.ProxyPair{"unix:path=/run/dbus/system_bus_socket", "/tmp/hakurei.0/b186c281d9e83a39afdc66d964ef99c6/system_bus_socket"}, - - SessionUpstream: []dbus.AddrEntry{{Method: "unix", Values: [][2]string{{"path", "/run/user/1000/bus"}}}}, - SystemUpstream: []dbus.AddrEntry{{Method: "unix", Values: [][2]string{{"unix", "/run/dbus/system_bus_socket"}}}}, - - WriterTo: helper.MustNewCheckedArgs( - "--filter", "unix:path=/run/user/1000/bus", "/tmp/hakurei.0/b186c281d9e83a39afdc66d964ef99c6/bus", - "--filter", "unix:path=/run/dbus/system_bus_socket", "/tmp/hakurei.0/b186c281d9e83a39afdc66d964ef99c6/system_bus_socket", - ), - }, system: true, - }, true}, - }) - - checkOpMeta(t, []opMetaTestCase{ - {"dbus", new(dbusProxyOp), - Process, "/proc/nonexistent", - "(invalid dbus proxy)"}, - }) -} - -func dbusNewFinalSample(v int) *dbus.Final { - return &dbus.Final{ - Session: dbus.ProxyPair{"unix:path=/run/user/1000/bus", "/tmp/hakurei.0/99dd71ee2146369514e0d10783368f8f/bus"}, - System: dbus.ProxyPair{"unix:path=/run/dbus/system_bus_socket", "/tmp/hakurei.0/99dd71ee2146369514e0d10783368f8f/system_bus_socket"}, - - SessionUpstream: []dbus.AddrEntry{{Method: "unix", Values: [][2]string{{"path", "/run/user/1000/bus"}}}}, - SystemUpstream: []dbus.AddrEntry{{Method: "unix", Values: [][2]string{{"path", "/run/dbus/system_bus_socket"}}}}, - - WriterTo: helper.MustNewCheckedArgs("unique", "value", strconv.Itoa(v), "injected", "by", "the", "test", "suite"), - } -} - -func TestLinePrefixWriter(t *testing.T) { - t.Parallel() - - testCases := []struct { - name string - prefix string - f func(w func(s string)) - wantErr []error - wantPt []string - want []string - wantExt []string - wantBuf string - }{ - {"nop", "(nop) ", func(func(string)) {}, nil, nil, nil, nil, ""}, - - {"partial", "(partial) ", func(w func(string)) { - w("C-65533: -> ") - }, nil, nil, nil, []string{ - "*(partial) C-65533: -> ", - }, "C-65533: -> "}, - - {"break", "(break) ", func(w func(string)) { - w("C-65533: -> ") - w("org.freedesktop.DBus fake ListNames\n") - }, nil, nil, []string{ - "C-65533: -> org.freedesktop.DBus fake ListNames", - }, nil, ""}, - - {"break pt", "(break pt) ", func(w func(string)) { - w("init: ") - w("received setup parameters\n") - }, nil, []string{ - "init: received setup parameters", - }, nil, nil, ""}, - - {"threshold", "(threshold) ", func(w func(s string)) { - w(string(make([]byte, lpwSizeThreshold))) - w("\n") - }, []error{nil, syscall.ENOMEM}, nil, nil, []string{ - "*(threshold) " + string(make([]byte, lpwSizeThreshold)), - "+(threshold) write threshold reached, output may be incomplete", - }, string(make([]byte, lpwSizeThreshold))}, - - {"threshold multi", "(threshold multi) ", func(w func(s string)) { - w(":3\n") - w(string(make([]byte, lpwSizeThreshold-3))) - w("\n") - }, []error{nil, nil, syscall.ENOMEM}, nil, []string{ - ":3", - }, []string{ - "*(threshold multi) " + string(make([]byte, lpwSizeThreshold-3)), - "+(threshold multi) write threshold reached, output may be incomplete", - }, string(make([]byte, lpwSizeThreshold-3))}, - - {"threshold multi partial", "(threshold multi partial) ", func(w func(s string)) { - w(":3\n") - w(string(make([]byte, lpwSizeThreshold-2))) - w("dropped\n") - }, []error{nil, nil, syscall.ENOMEM}, nil, []string{ - ":3", - }, []string{ - "*(threshold multi partial) " + string(make([]byte, lpwSizeThreshold-2)), - "+(threshold multi partial) write threshold reached, output may be incomplete", - }, string(make([]byte, lpwSizeThreshold-2))}, - - {"threshold exact", "(threshold exact) ", func(w func(s string)) { - w(string(make([]byte, lpwSizeThreshold-1))) - w("\n") - }, nil, nil, []string{ - string(make([]byte, lpwSizeThreshold-1)), - }, []string{ - "+(threshold exact) write threshold reached, output may be incomplete", - }, ""}, - - {"sample", "(dbus) ", func(w func(s string)) { - w("init: received setup parameters\n") - w(`init: mounting "/nix/store/5gml2l2cj28yvyfyzblzjy1laqpxmyzd-libselinux-3.8.1/lib" flags 0x0` + "\n") - w(`init: resolved "/host/nix/store/5gml2l2cj28yvyfyzblzjy1laqpxmyzd-libselinux-3.8.1/lib" on "/sysroot/nix/store/5gml2l2cj28yvyfyzblzjy1laqpxmyzd-libselinux-3.8.1/lib" flags 0x4005` + "\n") - w(`init: mounting "/nix/store/bcs094l67dlbqf7idxxbljp293zms9mh-util-linux-minimal-2.41-lib/lib" flags 0x0` + "\n") - w(`init: resolved "/host/nix/store/bcs094l67dlbqf7idxxbljp293zms9mh-util-linux-minimal-2.41-lib/lib" on "/sysroot/nix/store/bcs094l67dlbqf7idxxbljp293zms9mh-util-linux-minimal-2.41-lib/lib" flags 0x4005` + "\n") - w(`init: mounting "/nix/store/jl19fdc7gdxqz9a1s368r9d15vpirnqy-zlib-1.3.1/lib" flags 0x0` + "\n") - w(`init: resolved "/host/nix/store/jl19fdc7gdxqz9a1s368r9d15vpirnqy-zlib-1.3.1/lib" on "/sysroot/nix/store/jl19fdc7gdxqz9a1s368r9d15vpirnqy-zlib-1.3.1/lib" flags 0x4005` + "\n") - w(`init: mounting "/nix/store/rnn29mhynsa4ncmk0fkcrdr29n0j20l4-libffi-3.4.8/lib" flags 0x0` + "\n") - w(`init: resolved "/host/nix/store/rnn29mhynsa4ncmk0fkcrdr29n0j20l4-libffi-3.4.8/lib" on "/sysroot/nix/store/rnn29mhynsa4ncmk0fkcrdr29n0j20l4-libffi-3.4.8/lib" flags 0x4005` + "\n") - w(`init: mounting "/nix/store/vvp8hlss3d5q6hn0cifq04jrpnp6bini-pcre2-10.44/lib" flags 0x0` + "\n") - w(`init: resolved "/host/nix/store/vvp8hlss3d5q6hn0cifq04jrpnp6bini-pcre2-10.44/lib" on "/sysroot/nix/store/vvp8hlss3d5q6hn0cifq04jrpnp6bini-pcre2-10.44/lib" flags 0x4005` + "\n") - w(`init: mounting "/nix/store/y3nxdc2x8hwivppzgx5hkrhacsh87l21-glib-2.84.3/lib" flags 0x0` + "\n") - w(`init: resolved "/host/nix/store/y3nxdc2x8hwivppzgx5hkrhacsh87l21-glib-2.84.3/lib" on "/sysroot/nix/store/y3nxdc2x8hwivppzgx5hkrhacsh87l21-glib-2.84.3/lib" flags 0x4005` + "\n") - w(`init: mounting "/nix/store/zdpby3l6azi78sl83cpad2qjpfj25aqx-glibc-2.40-66/lib" flags 0x0` + "\n") - w(`init: resolved "/host/nix/store/zdpby3l6azi78sl83cpad2qjpfj25aqx-glibc-2.40-66/lib" on "/sysroot/nix/store/zdpby3l6azi78sl83cpad2qjpfj25aqx-glibc-2.40-66/lib" flags 0x4005` + "\n") - w(`init: mounting "/nix/store/zdpby3l6azi78sl83cpad2qjpfj25aqx-glibc-2.40-66/lib64" flags 0x0` + "\n") - w(`init: resolved "/host/nix/store/zdpby3l6azi78sl83cpad2qjpfj25aqx-glibc-2.40-66/lib" on "/sysroot/nix/store/zdpby3l6azi78sl83cpad2qjpfj25aqx-glibc-2.40-66/lib64" flags 0x4005` + "\n") - w(`init: mounting "/run/user/1000" flags 0x0` + "\n") - w(`init: resolved "/host/run/user/1000" on "/sysroot/run/user/1000" flags 0x4005` + "\n") - w(`init: mounting "/tmp/hakurei.0/99dd71ee2146369514e0d10783368f8f" flags 0x2` + "\n") - w(`init: resolved "/host/tmp/hakurei.0/99dd71ee2146369514e0d10783368f8f" on "/sysroot/tmp/hakurei.0/99dd71ee2146369514e0d10783368f8f" flags 0x4004` + "\n") - w(`init: mounting "/nix/store/d2divmq2d897amikcwpdx7zrbpddxxcl-xdg-dbus-proxy-0.1.6/bin" flags 0x0` + "\n") - w(`init: resolved "/host/nix/store/d2divmq2d897amikcwpdx7zrbpddxxcl-xdg-dbus-proxy-0.1.6/bin" on "/sysroot/nix/store/d2divmq2d897amikcwpdx7zrbpddxxcl-xdg-dbus-proxy-0.1.6/bin" flags 0x4005` + "\n") - w("init: resolving presets 0xf\n") - w("init: 68 filter rules loaded\n") - w("init: starting initial program /nix/store/d2divmq2d897amikcwpdx7zrbpddxxcl-xdg-dbus-proxy-0.1.6/bin/xdg-dbus-proxy\n") - w("C1: -> org.freedesktop.DBus call org.freedesktop.DBus.Hello at /org/freedesktop/DBus\n") - w("C-65536: -> org.freedesktop.DBus fake wildcarded AddMatch for org.freedesktop.portal\n") - w("C-65535: -> org.freedesktop.DBus fake AddMatch for org.freedesktop.Notifications\n") - w("C-65534: -> org.freedesktop.DBus fake GetNameOwner for org.freedesktop.Notifications\n") - w("C-65533: -> org.freedesktop.DBus fake ListNames\n") - w("B1: <- org.freedesktop.DBus return from C1\n") - w("B2: <- org.freedesktop.DBus signal org.freedesktop.DBus.NameAcquired at /org/freedesktop/DBus\n") - w("B3: <- org.freedesktop.DBus return from C-65536\n") - w("*SKIPPED*\n") - w("B4: <- org.freedesktop.DBus return from C-65535\n") - w("*SKIPPED*\n") - w("B5: <- org.freedesktop.DBus return error org.freedesktop.DBus.Error.NameHasNoOwner from C-65534\n") - w("*SKIPPED*\n") - w("B6: <- org.freedesktop.DBus return from C-65533\n") - w("C-65532: -> org.freedesktop.DBus fake GetNameOwner for org.freedesktop.DBus\n") - w("*SKIPPED*\n") - w("B7: <- org.freedesktop.DBus return from C-65532\n") - w("*SKIPPED*\n") - w("C2: -> org.freedesktop.DBus call org.freedesktop.DBus.AddMatch at /org/freedesktop/DBus\n") - w("C3: -> org.freedesktop.DBus call org.freedesktop.DBus.GetNameOwner at /org/freedesktop/DBus\n") - w("C4: -> org.freedesktop.DBus call org.freedesktop.DBus.AddMatch at /org/freedesktop/DBus\n") - w("C5: -> org.freedesktop.DBus call org.freedesktop.DBus.StartServiceByName at /org/freedesktop/DBus\n") - w("B8: <- org.freedesktop.DBus return from C2\n") - w("B9: <- org.freedesktop.DBus return error org.freedesktop.DBus.Error.NameHasNoOwner from C3\n") - w("B10: <- org.freedesktop.DBus return from C4\n") - w("B12: <- org.freedesktop.DBus signal org.freedesktop.DBus.NameOwnerChanged at /org/freedesktop/DBus\n") - w("B11: <- org.freedesktop.DBus return from C5\n") - w("C6: -> org.freedesktop.DBus call org.freedesktop.DBus.GetNameOwner at /org/freedesktop/DBus\n") - w("B13: <- org.freedesktop.DBus return from C6\n") - w("C7: -> :1.4 call org.freedesktop.Notifications.GetServerInformation at /org/freedesktop/Notifications\n") - w("B4: <- :1.4 return from C7\n") - w("C8: -> :1.4 call org.freedesktop.Notifications.GetServerInformation at /org/freedesktop/Notifications\n") - w("B5: <- :1.4 return from C8\n") - w("C9: -> :1.4 call org.freedesktop.Notifications.Notify at /org/freedesktop/Notifications\n") - w("B6: <- :1.4 return from C9\n") - w("C10: -> org.freedesktop.DBus call org.freedesktop.DBus.RemoveMatch at /org/freedesktop/DBus\n") - w("C11: -> org.freedesktop.DBus call org.freedesktop.DBus.RemoveMatch at /org/freedesktop/DBus\n") - w("B14: <- org.freedesktop.DBus return from C10\n") - w("B15: <- org.freedesktop.DBus return from C11\n") - w("init: initial process exited with code 0\n") - }, nil, []string{ - "init: received setup parameters", - `init: mounting "/nix/store/5gml2l2cj28yvyfyzblzjy1laqpxmyzd-libselinux-3.8.1/lib" flags 0x0`, - `init: resolved "/host/nix/store/5gml2l2cj28yvyfyzblzjy1laqpxmyzd-libselinux-3.8.1/lib" on "/sysroot/nix/store/5gml2l2cj28yvyfyzblzjy1laqpxmyzd-libselinux-3.8.1/lib" flags 0x4005`, - `init: mounting "/nix/store/bcs094l67dlbqf7idxxbljp293zms9mh-util-linux-minimal-2.41-lib/lib" flags 0x0`, - `init: resolved "/host/nix/store/bcs094l67dlbqf7idxxbljp293zms9mh-util-linux-minimal-2.41-lib/lib" on "/sysroot/nix/store/bcs094l67dlbqf7idxxbljp293zms9mh-util-linux-minimal-2.41-lib/lib" flags 0x4005`, - `init: mounting "/nix/store/jl19fdc7gdxqz9a1s368r9d15vpirnqy-zlib-1.3.1/lib" flags 0x0`, - `init: resolved "/host/nix/store/jl19fdc7gdxqz9a1s368r9d15vpirnqy-zlib-1.3.1/lib" on "/sysroot/nix/store/jl19fdc7gdxqz9a1s368r9d15vpirnqy-zlib-1.3.1/lib" flags 0x4005`, - `init: mounting "/nix/store/rnn29mhynsa4ncmk0fkcrdr29n0j20l4-libffi-3.4.8/lib" flags 0x0`, - `init: resolved "/host/nix/store/rnn29mhynsa4ncmk0fkcrdr29n0j20l4-libffi-3.4.8/lib" on "/sysroot/nix/store/rnn29mhynsa4ncmk0fkcrdr29n0j20l4-libffi-3.4.8/lib" flags 0x4005`, - `init: mounting "/nix/store/vvp8hlss3d5q6hn0cifq04jrpnp6bini-pcre2-10.44/lib" flags 0x0`, - `init: resolved "/host/nix/store/vvp8hlss3d5q6hn0cifq04jrpnp6bini-pcre2-10.44/lib" on "/sysroot/nix/store/vvp8hlss3d5q6hn0cifq04jrpnp6bini-pcre2-10.44/lib" flags 0x4005`, - `init: mounting "/nix/store/y3nxdc2x8hwivppzgx5hkrhacsh87l21-glib-2.84.3/lib" flags 0x0`, - `init: resolved "/host/nix/store/y3nxdc2x8hwivppzgx5hkrhacsh87l21-glib-2.84.3/lib" on "/sysroot/nix/store/y3nxdc2x8hwivppzgx5hkrhacsh87l21-glib-2.84.3/lib" flags 0x4005`, - `init: mounting "/nix/store/zdpby3l6azi78sl83cpad2qjpfj25aqx-glibc-2.40-66/lib" flags 0x0`, - `init: resolved "/host/nix/store/zdpby3l6azi78sl83cpad2qjpfj25aqx-glibc-2.40-66/lib" on "/sysroot/nix/store/zdpby3l6azi78sl83cpad2qjpfj25aqx-glibc-2.40-66/lib" flags 0x4005`, - `init: mounting "/nix/store/zdpby3l6azi78sl83cpad2qjpfj25aqx-glibc-2.40-66/lib64" flags 0x0`, - `init: resolved "/host/nix/store/zdpby3l6azi78sl83cpad2qjpfj25aqx-glibc-2.40-66/lib" on "/sysroot/nix/store/zdpby3l6azi78sl83cpad2qjpfj25aqx-glibc-2.40-66/lib64" flags 0x4005`, - `init: mounting "/run/user/1000" flags 0x0`, - `init: resolved "/host/run/user/1000" on "/sysroot/run/user/1000" flags 0x4005`, - `init: mounting "/tmp/hakurei.0/99dd71ee2146369514e0d10783368f8f" flags 0x2`, - `init: resolved "/host/tmp/hakurei.0/99dd71ee2146369514e0d10783368f8f" on "/sysroot/tmp/hakurei.0/99dd71ee2146369514e0d10783368f8f" flags 0x4004`, - `init: mounting "/nix/store/d2divmq2d897amikcwpdx7zrbpddxxcl-xdg-dbus-proxy-0.1.6/bin" flags 0x0`, - `init: resolved "/host/nix/store/d2divmq2d897amikcwpdx7zrbpddxxcl-xdg-dbus-proxy-0.1.6/bin" on "/sysroot/nix/store/d2divmq2d897amikcwpdx7zrbpddxxcl-xdg-dbus-proxy-0.1.6/bin" flags 0x4005`, - "init: resolving presets 0xf", - "init: 68 filter rules loaded", - "init: starting initial program /nix/store/d2divmq2d897amikcwpdx7zrbpddxxcl-xdg-dbus-proxy-0.1.6/bin/xdg-dbus-proxy", - - "init: initial process exited with code 0", - }, []string{ - "C1: -> org.freedesktop.DBus call org.freedesktop.DBus.Hello at /org/freedesktop/DBus", - "C-65536: -> org.freedesktop.DBus fake wildcarded AddMatch for org.freedesktop.portal", - "C-65535: -> org.freedesktop.DBus fake AddMatch for org.freedesktop.Notifications", - "C-65534: -> org.freedesktop.DBus fake GetNameOwner for org.freedesktop.Notifications", - "C-65533: -> org.freedesktop.DBus fake ListNames", - "B1: <- org.freedesktop.DBus return from C1", - "B2: <- org.freedesktop.DBus signal org.freedesktop.DBus.NameAcquired at /org/freedesktop/DBus", - "B3: <- org.freedesktop.DBus return from C-65536", - "*SKIPPED*", - "B4: <- org.freedesktop.DBus return from C-65535", - "*SKIPPED*", - "B5: <- org.freedesktop.DBus return error org.freedesktop.DBus.Error.NameHasNoOwner from C-65534", - "*SKIPPED*", - "B6: <- org.freedesktop.DBus return from C-65533", - "C-65532: -> org.freedesktop.DBus fake GetNameOwner for org.freedesktop.DBus", - "*SKIPPED*", - "B7: <- org.freedesktop.DBus return from C-65532", - "*SKIPPED*", - "C2: -> org.freedesktop.DBus call org.freedesktop.DBus.AddMatch at /org/freedesktop/DBus", - "C3: -> org.freedesktop.DBus call org.freedesktop.DBus.GetNameOwner at /org/freedesktop/DBus", - "C4: -> org.freedesktop.DBus call org.freedesktop.DBus.AddMatch at /org/freedesktop/DBus", - "C5: -> org.freedesktop.DBus call org.freedesktop.DBus.StartServiceByName at /org/freedesktop/DBus", - "B8: <- org.freedesktop.DBus return from C2", - "B9: <- org.freedesktop.DBus return error org.freedesktop.DBus.Error.NameHasNoOwner from C3", - "B10: <- org.freedesktop.DBus return from C4", - "B12: <- org.freedesktop.DBus signal org.freedesktop.DBus.NameOwnerChanged at /org/freedesktop/DBus", - "B11: <- org.freedesktop.DBus return from C5", - "C6: -> org.freedesktop.DBus call org.freedesktop.DBus.GetNameOwner at /org/freedesktop/DBus", - "B13: <- org.freedesktop.DBus return from C6", - "C7: -> :1.4 call org.freedesktop.Notifications.GetServerInformation at /org/freedesktop/Notifications", - "B4: <- :1.4 return from C7", - "C8: -> :1.4 call org.freedesktop.Notifications.GetServerInformation at /org/freedesktop/Notifications", - "B5: <- :1.4 return from C8", - "C9: -> :1.4 call org.freedesktop.Notifications.Notify at /org/freedesktop/Notifications", - "B6: <- :1.4 return from C9", - "C10: -> org.freedesktop.DBus call org.freedesktop.DBus.RemoveMatch at /org/freedesktop/DBus", - "C11: -> org.freedesktop.DBus call org.freedesktop.DBus.RemoveMatch at /org/freedesktop/DBus", - "B14: <- org.freedesktop.DBus return from C10", - "B15: <- org.freedesktop.DBus return from C11", - }, nil, ""}, - } - for _, tc := range testCases { - t.Run(tc.name, func(t *testing.T) { - t.Parallel() - gotPt := make([]string, 0, len(tc.wantPt)) - out := &linePrefixWriter{ - prefix: tc.prefix, - println: func(v ...any) { - if len(v) != 1 { - t.Fatalf("invalid call to println: %#v", v) - } - gotPt = append(gotPt, v[0].(string)) - }, - buf: new(strings.Builder), - } - - var pos int - tc.f(func(s string) { - _, err := out.Write([]byte(s)) - if tc.wantErr != nil { - if !reflect.DeepEqual(err, tc.wantErr[pos]) { - t.Fatalf("Write: error = %v, want %v", err, tc.wantErr[pos]) - } - } else if err != nil { - t.Fatalf("Write: unexpected error: %v", err) - return - } - pos++ - }) - - if !slices.Equal(out.msg, tc.want) { - t.Errorf("msg: %#v, want %#v", out.msg, tc.want) - } - - if out.buf.String() != tc.wantBuf { - t.Errorf("buf: %q, want %q", out.buf, tc.wantBuf) - } - - wantPt := make([]string, len(tc.wantPt)) - for i, m := range tc.wantPt { - wantPt[i] = tc.prefix + m - } - if !slices.Equal(gotPt, wantPt) { - t.Errorf("passthrough: %#v, want %#v", gotPt, wantPt) - } - - wantDump := make([]string, len(tc.want)+len(tc.wantExt)) - for i, want := range tc.want { - wantDump[i] = tc.prefix + want - } - for i, want := range tc.wantExt { - wantDump[len(tc.want)+i] = want - } - t.Run("dump", func(t *testing.T) { - got := make([]string, 0, len(wantDump)) - out.println = func(v ...any) { - if len(v) != 1 { - t.Fatalf("Dump: invalid call to println: %#v", v) - } - got = append(got, v[0].(string)) - } - out.Dump() - - if !slices.Equal(got, wantDump) { - t.Errorf("Dump: %#v, want %#v", got, wantDump) - } - }) - }) - } -} |
