aboutsummaryrefslogtreecommitdiffstats
path: root/prog/encoding_test.go
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2017-12-13 19:18:07 +0100
committerDmitry Vyukov <dvyukov@google.com>2017-12-17 11:39:14 +0100
commit41799debdcc19d65fb6e0499cbbb74a489a822ea (patch)
tree8b7107794ac883476fb0f79717e405cb58669c3e /prog/encoding_test.go
parent286edfb78e2e77c644b32d161e8e1b188406a5c5 (diff)
prog: introduce more readable format for data args
Fixes #460 File names, crypto algorithm names, etc in programs are completely unreadable: bind$alg(r0, &(0x7f0000408000)={0x26, "6861736800000000000000000000", 0x0, 0x0, "6d6435000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000 00000000000"}, 0x58) Introduce another format for printable strings. New args are denoted by '' ("" for old args). New format is enabled for printable chars, \x00 and \t, \r, \n. Example: `serialize(&(0x7f0000408000)={"6861736800000000000000000000", "4849000000"})`, vs: `serialize(&(0x7f0000408000)={'hash\x00', 'HI\x00'})`,
Diffstat (limited to 'prog/encoding_test.go')
-rw-r--r--prog/encoding_test.go47
1 files changed, 47 insertions, 0 deletions
diff --git a/prog/encoding_test.go b/prog/encoding_test.go
index a46428526..39063a055 100644
--- a/prog/encoding_test.go
+++ b/prog/encoding_test.go
@@ -4,7 +4,9 @@
package prog
import (
+ "bytes"
"fmt"
+ "math/rand"
"reflect"
"regexp"
"sort"
@@ -20,6 +22,30 @@ func setToArray(s map[string]struct{}) []string {
return a
}
+func TestSerializeData(t *testing.T) {
+ t.Parallel()
+ r := rand.New(rand.NewSource(0))
+ for i := 0; i < 1e4; i++ {
+ data := make([]byte, r.Intn(4))
+ for i := range data {
+ data[i] = byte(r.Intn(256))
+ }
+ buf := new(bytes.Buffer)
+ serializeData(buf, data)
+ p := newParser(buf.Bytes())
+ if !p.Scan() {
+ t.Fatalf("parser does not scan")
+ }
+ data1, err := deserializeData(p)
+ if err != nil {
+ t.Fatalf("failed to deserialize %q -> %s: %v", data, buf.Bytes(), err)
+ }
+ if !bytes.Equal(data, data1) {
+ t.Fatalf("corrupted data %q -> %s -> %q", data, buf.Bytes(), data1)
+ }
+ }
+}
+
func TestCallSet(t *testing.T) {
tests := []struct {
prog string
@@ -137,3 +163,24 @@ func TestDeserialize(t *testing.T) {
}
}
}
+
+func TestSerializeDeserialize(t *testing.T) {
+ target := initTargetTest(t, "test", "64")
+ tests := [][2]string{
+ {
+ `serialize(&(0x7f0000408000)={"6861736800000000000000000000", "4849000000"})`,
+ `serialize(&(0x7f0000408000)={'hash\x00', 'HI\x00'})`,
+ },
+ }
+ for _, test := range tests {
+ p, err := target.Deserialize([]byte(test[0]))
+ if err != nil {
+ t.Fatal(err)
+ }
+ data := p.Serialize()
+ test[1] += "\n"
+ if string(data) != test[1] {
+ t.Fatalf("\ngot : %s\nwant: %s", data, test[1])
+ }
+ }
+}