@@ -5,35 +5,39 @@ "bytes" "io/ioutil" "testing" ) -func TestRFC(t *testing.T) { - input := []byte{0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x0a, - 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x0a, - 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x0a, - 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x0a, - 0x41, 0x42, 0x41, 0x42, 0x41, 0x42, 0x41, 0x0a, - 0x42, 0x41, 0x42, 0x41, 0x42, 0x41, 0x42, 0x0a, - 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x0a} - - output := []byte{0x60, 0x41, 0x41, 0x41, 0x41, 0x41, 0x0a, 0x60, - 0x41, 0x41, 0x41, 0x41, 0x41, 0x0a, 0x6f, 0x41, - 0x0a, 0x6f, 0x41, 0x0a, 0x41, 0x42, 0x41, 0x42, - 0x41, 0x42, 0x0a, 0x60, 0x42, 0x41, 0x42, 0x41, - 0x42, 0x0a, 0x60, 0x78, 0x78, 0x78, 0x78, 0x78, 0x0a} - - var buf bytes.Buffer - var err error +// Sample input from RFC1978 - PPP Predictor Compression Protocol +var input = []byte{0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x0a, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x0a, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x0a, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x0a, + 0x41, 0x42, 0x41, 0x42, 0x41, 0x42, 0x41, 0x0a, + 0x42, 0x41, 0x42, 0x41, 0x42, 0x41, 0x42, 0x0a, + 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x0a} + +// Sample output from RFC1978 - PPP Predictor Compression Protocol +var output = []byte{0x60, 0x41, 0x41, 0x41, 0x41, 0x41, 0x0a, 0x60, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x0a, 0x6f, 0x41, + 0x0a, 0x6f, 0x41, 0x0a, 0x41, 0x42, 0x41, 0x42, + 0x41, 0x42, 0x0a, 0x60, 0x42, 0x41, 0x42, 0x41, + 0x42, 0x0a, 0x60, 0x78, 0x78, 0x78, 0x78, 0x78, 0x0a} + +func TestCompressor(t *testing.T) { + var ( + buf bytes.Buffer + err error + ) out := Compressor(&buf) err = out(input) if err != nil { t.Error(err) } - err = out([]byte{}) + err = out(nil) if err != nil { t.Error(err) } result := buf.Bytes() @@ -40,16 +44,52 @@ delta := diff.Diff(diff.D{len(result), len(output), func(i, j int) bool { return result[i] == output[j] }}) if len(delta.Added) > 0 || len(delta.Removed) > 0 { t.Error("Unexpected compressed output", delta) } +} + +func TestDecompressor(t *testing.T) { + in := Decompressor(bytes.NewReader(output)) + result, err := ioutil.ReadAll(in) + if err != nil { + t.Error("Unexpected error while decompressing", err) + } + + delta := diff.Diff(diff.D{len(result), len(input), + func(i, j int) bool { return result[i] == input[j] }}) + + if len(delta.Added) > 0 || len(delta.Removed) > 0 { + t.Error("Unexpected decompressed output", delta) + } +} + +func TestPartial(t *testing.T) { + var ( + input []byte = []byte{0, 1, 2, 3, 4, 5, 6} + buf bytes.Buffer + err error + ) + + out := Compressor(&buf) + err = out(input) + if err != nil { + t.Error(err) + } + + err = out(nil) + if err != nil { + t.Error(err) + } - data := bytes.NewBuffer(result) - in := Decompressor(data) + compressed := buf.Bytes() + decompressed, err := ioutil.ReadAll(Decompressor(bytes.NewReader(compressed))) - result, err = ioutil.ReadAll(in) - delta = diff.Diff(diff.D{len(result), len(input), func(i, j int) bool { return result[i] == input[j] }}) + delta := diff.Diff(diff.D{len(input), len(decompressed), + func(i, j int) bool { return input[i] == decompressed[j] }}) if len(delta.Added) > 0 || len(delta.Removed) > 0 { - t.Error("Unexpected compressed output", delta) + t.Error("Unexpected decompressed output", delta) + t.Errorf("%#x", input) + t.Errorf("%#x", decompressed) } }