From f250e46e8334c49a523cd2f9b107c0f5094d5831 Mon Sep 17 00:00:00 2001 From: Aaron Jacobs Date: Mon, 19 Dec 2016 12:16:51 +1100 Subject: [PATCH 1/7] buffer_test: add TODOs where more test coverage is necessary. --- internal/buffer/out_message_test.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/internal/buffer/out_message_test.go b/internal/buffer/out_message_test.go index 81b0192..d6afd19 100644 --- a/internal/buffer/out_message_test.go +++ b/internal/buffer/out_message_test.go @@ -86,6 +86,22 @@ func TestMemclr(t *testing.T) { } } +func TestOutMessageAppend(t *testing.T) { + t.Fatal("TODO") +} + +func TestOutMessageAppendString(t *testing.T) { + t.Fatal("TODO") +} + +func TestOutMessageShrinkTo(t *testing.T) { + t.Fatal("TODO") +} + +func TestOutMessageHeader(t *testing.T) { + t.Fatal("TODO") +} + func TestOutMessageReset(t *testing.T) { var om OutMessage h := om.OutHeader() From 02e3f7895cdaa4e5b004f7bb325b250ff9c13dd2 Mon Sep 17 00:00:00 2001 From: Aaron Jacobs Date: Mon, 19 Dec 2016 12:20:27 +1100 Subject: [PATCH 2/7] buffer_test: expand the coverage of TestOutMessageReset. --- internal/buffer/out_message_test.go | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/internal/buffer/out_message_test.go b/internal/buffer/out_message_test.go index d6afd19..f795d5c 100644 --- a/internal/buffer/out_message_test.go +++ b/internal/buffer/out_message_test.go @@ -106,14 +106,28 @@ func TestOutMessageReset(t *testing.T) { var om OutMessage h := om.OutHeader() - const trials = 100 + const trials = 10 for i := 0; i < trials; i++ { + // Fill the header with garbage. err := fillWithGarbage(unsafe.Pointer(h), int(unsafe.Sizeof(*h))) if err != nil { t.Fatalf("fillWithGarbage: %v", err) } + // Ensure a non-zero payload length. + if p := om.GrowNoZero(128); p == nil { + t.Fatal("GrowNoZero failed") + } + + // Reset. om.Reset() + + // Check that the length was updated. + if got, want := int(om.Len()), int(OutMessageInitialSize); got != want { + t.Fatalf("om.Len() = %d, want %d", got, want) + } + + // Check that the header was zeroed. if h.Len != 0 { t.Fatalf("non-zero Len %v", h.Len) } From e7b9860f41a03dd45d0f6c27842a3246e83b142a Mon Sep 17 00:00:00 2001 From: Aaron Jacobs Date: Mon, 19 Dec 2016 12:26:59 +1100 Subject: [PATCH 3/7] buffer_test: expand the coverage of TestOutMessageGrow. --- internal/buffer/out_message_test.go | 46 ++++++++++++++++++++--------- 1 file changed, 32 insertions(+), 14 deletions(-) diff --git a/internal/buffer/out_message_test.go b/internal/buffer/out_message_test.go index f795d5c..5e6c4f3 100644 --- a/internal/buffer/out_message_test.go +++ b/internal/buffer/out_message_test.go @@ -144,26 +144,44 @@ func TestOutMessageReset(t *testing.T) { func TestOutMessageGrow(t *testing.T) { var om OutMessage - - // Overwrite with garbage. - err := fillWithGarbage(unsafe.Pointer(&om), int(unsafe.Sizeof(om))) - if err != nil { - t.Fatalf("fillWithGarbage: %v", err) - } - - // Zero the header. om.Reset() - // Grow to the max size. This should zero the message. - if p := om.Grow(MaxReadSize); p == nil { - t.Fatal("Grow returned nil") + // Set up garbage where the payload will soon be. + const payloadSize = 1234 + { + p := om.GrowNoZero(payloadSize) + if p == nil { + t.Fatal("GrowNoZero failed") + } + + err := fillWithGarbage(p, payloadSize) + if err != nil { + t.Fatalf("fillWithGarbage: %v", err) + } + + om.ShrinkTo(OutMessageInitialSize) + } + + // Call Grow. + if p := om.Grow(payloadSize); p == nil { + t.Fatal("Grow failed") + } + + // Check the resulting length in two ways. + const wantLen = int(payloadSize + OutMessageInitialSize) + if got, want := om.Len(), wantLen; got != want { + t.Errorf("om.Len() = %d, want %d", got) } - // Check that everything has been zeroed. b := om.Bytes() - for i, x := range b { + if got, want := len(b), wantLen; got != want { + t.Fatalf("len(om.Len()) = %d, want %d", got) + } + + // Check that the payload was zeroed. + for i, x := range b[OutMessageInitialSize:] { if x != 0 { - t.Fatalf("non-zero byte 0x%02x at offset %d", x, i) + t.Fatalf("non-zero byte 0x%02x at payload offset %d", x, i) } } } From c1af0dbdeef84231544251d986db3db85f57c460 Mon Sep 17 00:00:00 2001 From: Aaron Jacobs Date: Mon, 19 Dec 2016 12:30:42 +1100 Subject: [PATCH 4/7] TestOutMessageAppend --- internal/buffer/out_message_test.go | 30 ++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/internal/buffer/out_message_test.go b/internal/buffer/out_message_test.go index 5e6c4f3..4adce97 100644 --- a/internal/buffer/out_message_test.go +++ b/internal/buffer/out_message_test.go @@ -1,6 +1,7 @@ package buffer import ( + "bytes" "crypto/rand" "fmt" "io" @@ -87,7 +88,34 @@ func TestMemclr(t *testing.T) { } func TestOutMessageAppend(t *testing.T) { - t.Fatal("TODO") + var om OutMessage + om.Reset() + + // Append some payload. + const wantPayloadStr = "tacoburrito" + wantPayload := []byte(wantPayloadStr) + om.Append(wantPayload[:4]) + om.Append(wantPayload[4:]) + + // The result should be a zeroed header followed by the desired payload. + const wantLen = int(OutMessageInitialSize) + len(wantPayloadStr) + + if got, want := om.Len(), wantLen; got != want { + t.Errorf("om.Len() = %d, want %d", got, want) + } + + b := om.Bytes() + if got, want := len(b), wantLen; got != want { + t.Fatalf("len(om.Bytes()) = %d, want %d", got, want) + } + + want := append( + make([]byte, OutMessageInitialSize), + wantPayload...) + + if !bytes.Equal(b, want) { + t.Error("messages differ") + } } func TestOutMessageAppendString(t *testing.T) { From 39f1f7c4890e64389bccbca8fd3b5968ca38d607 Mon Sep 17 00:00:00 2001 From: Aaron Jacobs Date: Mon, 19 Dec 2016 12:31:08 +1100 Subject: [PATCH 5/7] TestOutMessageAppendString --- internal/buffer/out_message_test.go | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/internal/buffer/out_message_test.go b/internal/buffer/out_message_test.go index 4adce97..44bde53 100644 --- a/internal/buffer/out_message_test.go +++ b/internal/buffer/out_message_test.go @@ -119,7 +119,33 @@ func TestOutMessageAppend(t *testing.T) { } func TestOutMessageAppendString(t *testing.T) { - t.Fatal("TODO") + var om OutMessage + om.Reset() + + // Append some payload. + const wantPayload = "tacoburrito" + om.AppendString(wantPayload[:4]) + om.AppendString(wantPayload[4:]) + + // The result should be a zeroed header followed by the desired payload. + const wantLen = int(OutMessageInitialSize) + len(wantPayload) + + if got, want := om.Len(), wantLen; got != want { + t.Errorf("om.Len() = %d, want %d", got, want) + } + + b := om.Bytes() + if got, want := len(b), wantLen; got != want { + t.Fatalf("len(om.Bytes()) = %d, want %d", got, want) + } + + want := append( + make([]byte, OutMessageInitialSize), + wantPayload...) + + if !bytes.Equal(b, want) { + t.Error("messages differ") + } } func TestOutMessageShrinkTo(t *testing.T) { From 78a1450a7795d409c88cdd80cd02e49135507356 Mon Sep 17 00:00:00 2001 From: Aaron Jacobs Date: Mon, 19 Dec 2016 12:32:22 +1100 Subject: [PATCH 6/7] TestOutMessageShrinkTo --- internal/buffer/out_message_test.go | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/internal/buffer/out_message_test.go b/internal/buffer/out_message_test.go index 44bde53..d6be39a 100644 --- a/internal/buffer/out_message_test.go +++ b/internal/buffer/out_message_test.go @@ -149,7 +149,34 @@ func TestOutMessageAppendString(t *testing.T) { } func TestOutMessageShrinkTo(t *testing.T) { - t.Fatal("TODO") + // Set up a buffer with some payload. + var om OutMessage + om.Reset() + om.AppendString("taco") + om.AppendString("burrito") + + // Shrink it. + om.ShrinkTo(OutMessageInitialSize + uintptr(len("taco"))) + + // The result should be a zeroed header followed by "taco". + const wantLen = int(OutMessageInitialSize) + len("taco") + + if got, want := om.Len(), wantLen; got != want { + t.Errorf("om.Len() = %d, want %d", got, want) + } + + b := om.Bytes() + if got, want := len(b), wantLen; got != want { + t.Fatalf("len(om.Bytes()) = %d, want %d", got, want) + } + + want := append( + make([]byte, OutMessageInitialSize), + "taco"...) + + if !bytes.Equal(b, want) { + t.Error("messages differ") + } } func TestOutMessageHeader(t *testing.T) { From 06b9c19b5e5b1a553e8a370ea19689d2007d4445 Mon Sep 17 00:00:00 2001 From: Aaron Jacobs Date: Mon, 19 Dec 2016 12:38:58 +1100 Subject: [PATCH 7/7] TestOutMessageHeader --- internal/buffer/out_message_test.go | 31 ++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/internal/buffer/out_message_test.go b/internal/buffer/out_message_test.go index d6be39a..f647f22 100644 --- a/internal/buffer/out_message_test.go +++ b/internal/buffer/out_message_test.go @@ -8,6 +8,9 @@ import ( "reflect" "testing" "unsafe" + + "github.com/jacobsa/fuse/internal/fusekernel" + "github.com/kylelemons/godebug/pretty" ) func toByteSlice(p unsafe.Pointer, n int) []byte { @@ -180,7 +183,33 @@ func TestOutMessageShrinkTo(t *testing.T) { } func TestOutMessageHeader(t *testing.T) { - t.Fatal("TODO") + var om OutMessage + om.Reset() + + // Fill in the header. + want := fusekernel.OutHeader{ + Len: 0xdeadbeef, + Error: -31231917, + Unique: 0xcafebabeba5eba11, + } + + h := om.OutHeader() + if h == nil { + t.Fatal("OutHeader returned nil") + } + + *h = want + + // Check that the result is as expected. + b := om.Bytes() + if len(b) != int(unsafe.Sizeof(want)) { + t.Fatalf("unexpected length %d; want %d", len(b), unsafe.Sizeof(want)) + } + + got := *(*fusekernel.OutHeader)(unsafe.Pointer(&b[0])) + if diff := pretty.Compare(got, want); diff != "" { + t.Errorf("diff -got +want:\n%s", diff) + } } func TestOutMessageReset(t *testing.T) {