diff --git a/fuzz_test.go b/fuzz_test.go index 272d491..f797fd1 100644 --- a/fuzz_test.go +++ b/fuzz_test.go @@ -408,7 +408,7 @@ func TestCrashers_OCF_e2e(t *testing.T) { if err != nil { t.Fatalf("GOT: %v; WANT: %v", err, nil) } - if err := ocfw.Append(datums); err != nil { + if _, err := ocfw.Append(datums); err != nil { t.Fatalf("GOT: %v; WANT: %v", err, nil) } }) diff --git a/ocf_test.go b/ocf_test.go index 3d4d4bd..1e47b98 100644 --- a/ocf_test.go +++ b/ocf_test.go @@ -39,7 +39,7 @@ func testOCFRoundTripWithHeaders(t *testing.T, compressionName string, headers m valuesToWrite := []int64{13, 42, -12, -1234} - if err = ocfw.Append(valuesToWrite); err != nil { + if _, err = ocfw.Append(valuesToWrite); err != nil { t.Fatal(err) } diff --git a/ocf_writer.go b/ocf_writer.go index 820af5c..c72a90c 100644 --- a/ocf_writer.go +++ b/ocf_writer.go @@ -158,30 +158,30 @@ func (ocfw *OCFWriter) quickScanToTail(ior io.Reader) error { // more data items in the slice than MaxBlockCount allows, the data slice will // be chunked into multiple blocks, each not having more than MaxBlockCount // items. -func (ocfw *OCFWriter) Append(data interface{}) error { +func (ocfw *OCFWriter) Append(data interface{}) (int, error) { arrayValues, err := convertArray(data) if err != nil { - return err + return 0, err } // Chunk data so no block has more than MaxBlockCount items. for int64(len(arrayValues)) > MaxBlockCount { - if err := ocfw.appendDataIntoBlock(arrayValues[:MaxBlockCount]); err != nil { - return err + if _, err := ocfw.appendDataIntoBlock(arrayValues[:MaxBlockCount]); err != nil { + return 0, err } arrayValues = arrayValues[MaxBlockCount:] } return ocfw.appendDataIntoBlock(arrayValues) } -func (ocfw *OCFWriter) appendDataIntoBlock(data []interface{}) error { +func (ocfw *OCFWriter) appendDataIntoBlock(data []interface{}) (int, error) { var block []byte // working buffer for encoding data values var err error // Encode and concatenate each data item into the block for _, datum := range data { if block, err = ocfw.header.codec.BinaryFromNative(block, datum); err != nil { - return fmt.Errorf("cannot translate datum to binary: %v; %s", datum, err) + return 0, fmt.Errorf("cannot translate datum to binary: %v; %s", datum, err) } } @@ -196,10 +196,10 @@ func (ocfw *OCFWriter) appendDataIntoBlock(data []interface{}) error { cw, _ := flate.NewWriter(bb, flate.DefaultCompression) // writing bytes to cw will compress bytes and send to bb. if _, err := cw.Write(block); err != nil { - return err + return 0, err } if err := cw.Close(); err != nil { - return err + return 0, err } block = bb.Bytes() @@ -213,7 +213,7 @@ func (ocfw *OCFWriter) appendDataIntoBlock(data []interface{}) error { block = compressed default: - return fmt.Errorf("should not get here: cannot compress block using unrecognized compression: %d", ocfw.header.compressionID) + return 0, fmt.Errorf("should not get here: cannot compress block using unrecognized compression: %d", ocfw.header.compressionID) } @@ -224,8 +224,8 @@ func (ocfw *OCFWriter) appendDataIntoBlock(data []interface{}) error { buf = append(buf, block...) // serialized objects buf = append(buf, ocfw.header.syncMarker[:]...) // sync marker - _, err = ocfw.iow.Write(buf) - return err + n, err := ocfw.iow.Write(buf) + return n, err } // Codec returns the codec used by OCFWriter. This function provided because diff --git a/ocf_writer_test.go b/ocf_writer_test.go index 1d334b4..194b466 100644 --- a/ocf_writer_test.go +++ b/ocf_writer_test.go @@ -164,7 +164,7 @@ func TestOCFWriterAppendWhenCannotWrite(t *testing.T) { t.Fatal(err) } - err = ocfw.Append([]interface{}{13, 42}) + _, err = ocfw.Append([]interface{}{13, 42}) ensureError(t, err, testPathname) } @@ -186,7 +186,8 @@ func TestOCFWriterAppendSomeItemsToNothing(t *testing.T) { t.Fatal(err) } - if err = ocfw.Append([]interface{}{13, 42}); err != nil { + bytesWritten, err := ocfw.Append([]interface{}{13, 42}) + if err != nil { t.Fatal(err) } @@ -227,6 +228,9 @@ func TestOCFWriterAppendSomeItemsToNothing(t *testing.T) { if actual, expected := values[1], int64(42); actual != expected { t.Errorf("GOT: %v; WANT: %v", actual, expected) } + if actual, expected := bytesWritten, 20; actual != expected { + t.Errorf("GOT: %v; WANT: %v", actual, expected) + } } func TestOCFWriterAppendSomeItemsToSomeItems(t *testing.T) { @@ -247,7 +251,8 @@ func TestOCFWriterAppendSomeItemsToSomeItems(t *testing.T) { t.Fatal(err) } - if err = ocfw.Append([]interface{}{-10, -100}); err != nil { + bytesWritten, err := ocfw.Append([]interface{}{-10, -100}) + if err != nil { t.Fatal(err) } @@ -294,4 +299,7 @@ func TestOCFWriterAppendSomeItemsToSomeItems(t *testing.T) { if actual, expected := values[3], int64(-100); actual != expected { t.Errorf("GOT: %v; WANT: %v", actual, expected) } + if actual, expected := bytesWritten, 21; actual != expected { + t.Errorf("GOT: %v; WANT: %v", actual, expected) + } }