package predictor import ( diff "0dev.org/diff" "bytes" "io/ioutil" "testing" ) // 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(nil) if err != nil { t.Error(err) } result := buf.Bytes() 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) } compressed := buf.Bytes() decompressed, err := ioutil.ReadAll(Decompressor(bytes.NewReader(compressed))) 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 decompressed output", delta) t.Errorf("%#x", input) t.Errorf("%#x", decompressed) } }