diff options
Diffstat (limited to 'container/output_test.go')
| -rw-r--r-- | container/output_test.go | 173 |
1 files changed, 0 insertions, 173 deletions
diff --git a/container/output_test.go b/container/output_test.go deleted file mode 100644 index b6dedf16..00000000 --- a/container/output_test.go +++ /dev/null @@ -1,173 +0,0 @@ -package container_test - -import ( - "bytes" - "errors" - "reflect" - "strconv" - "syscall" - "testing" - - "hakurei.app/container" - "hakurei.app/container/stub" -) - -func TestSuspendable(t *testing.T) { - // copied from output.go - const suspendBufMax = 1 << 24 - - const ( - // equivalent to len(want.pt) - nSpecialPtEquiv = -iota - 1 - // equivalent to len(want.w) - nSpecialWEquiv - // suspends writer before executing test case, implies nSpecialWEquiv - nSpecialSuspend - // offset: resume writer and measure against dump instead, implies nSpecialPtEquiv - nSpecialDump - ) - - // shares the same writer - steps := []struct { - name string - w, pt []byte - err error - wantErr error - n int - }{ - {"simple", []byte{0xde, 0xad, 0xbe, 0xef}, []byte{0xde, 0xad, 0xbe, 0xef}, - nil, nil, nSpecialPtEquiv}, - - {"error", []byte{0xb, 0xad}, []byte{0xb, 0xad}, - stub.UniqueError(0), stub.UniqueError(0), nSpecialPtEquiv}, - - {"suspend short", []byte{0}, nil, - nil, nil, nSpecialSuspend}, - {"sw short 0", []byte{0xca, 0xfe, 0xba, 0xbe}, nil, - nil, nil, nSpecialWEquiv}, - {"sw short 1", []byte{0xff}, nil, - nil, nil, nSpecialWEquiv}, - {"resume short", nil, []byte{0, 0xca, 0xfe, 0xba, 0xbe, 0xff}, nil, nil, - nSpecialDump}, - - {"long pt", bytes.Repeat([]byte{0xff}, suspendBufMax+1), bytes.Repeat([]byte{0xff}, suspendBufMax+1), - nil, nil, nSpecialPtEquiv}, - - {"suspend fill", bytes.Repeat([]byte{0xfe}, suspendBufMax), nil, - nil, nil, nSpecialSuspend}, - {"drop", []byte{0}, nil, - nil, syscall.ENOMEM, 0}, - {"drop error", []byte{0}, nil, - stub.UniqueError(1), syscall.ENOMEM, 0}, - {"resume fill", nil, bytes.Repeat([]byte{0xfe}, suspendBufMax), - nil, nil, nSpecialDump - 2}, - - {"suspend fill partial", bytes.Repeat([]byte{0xfd}, suspendBufMax-0xf), nil, - nil, nil, nSpecialSuspend}, - {"partial write", bytes.Repeat([]byte{0xad}, 0x1f), nil, - nil, syscall.ENOMEM, 0xf}, - {"full drop", []byte{0}, nil, - nil, syscall.ENOMEM, 0}, - {"resume fill partial", nil, append(bytes.Repeat([]byte{0xfd}, suspendBufMax-0xf), bytes.Repeat([]byte{0xad}, 0xf)...), - nil, nil, nSpecialDump - 0x10 - 1}, - } - - var dw expectWriter - - w := container.Suspendable{Downstream: &dw} - for _, step := range steps { - // these share the same writer, so cannot be subtests - t.Logf("writing step %q", step.name) - dw.expect, dw.err = step.pt, step.err - - var ( - gotN int - gotErr error - ) - - wantN := step.n - switch wantN { - case nSpecialPtEquiv: - wantN = len(step.pt) - gotN, gotErr = w.Write(step.w) - - case nSpecialWEquiv: - wantN = len(step.w) - gotN, gotErr = w.Write(step.w) - - case nSpecialSuspend: - s := w.IsSuspended() - if ok := w.Suspend(); s && ok { - t.Fatal("Suspend: unexpected success") - } - - wantN = len(step.w) - gotN, gotErr = w.Write(step.w) - - default: - if wantN <= nSpecialDump { - if !w.IsSuspended() { - t.Fatal("IsSuspended unexpected false") - } - - resumed, dropped, n, err := w.Resume() - if !resumed { - t.Fatal("Resume: resumed = false") - } - if wantDropped := nSpecialDump - wantN; int(dropped) != wantDropped { - t.Errorf("Resume: dropped = %d, want %d", dropped, wantDropped) - } - - wantN = len(step.pt) - gotN, gotErr = int(n), err - } else { - gotN, gotErr = w.Write(step.w) - } - } - - if gotN != wantN { - t.Errorf("Write: n = %d, want %d", gotN, wantN) - } - - if !reflect.DeepEqual(gotErr, step.wantErr) { - t.Errorf("Write: %v", gotErr) - } - - if dw.expect != nil { - t.Errorf("expect: %q", string(dw.expect)) - } - } -} - -// expectWriter compares Write calls to expect. -type expectWriter struct { - expect []byte - err error - - // optional consecutive write - next []byte - - // optional, calls Error on failure if not nil - t *testing.T -} - -func (w *expectWriter) Write(p []byte) (n int, err error) { - defer func() { w.expect = w.next; w.next = nil }() - - n, err = len(p), w.err - if w.expect == nil { - n, err = 0, errors.New("unexpected call to Write: "+strconv.Quote(string(p))) - if w.t != nil { - w.t.Error(err.Error()) - } - return - } - if string(p) != string(w.expect) { - n, err = 0, errors.New("p = "+strconv.Quote(string(p))+", want "+strconv.Quote(string(w.expect))) - if w.t != nil { - w.t.Error(err.Error()) - } - return - } - return -} |
