diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2017-12-13 19:18:07 +0100 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2017-12-17 11:39:14 +0100 |
| commit | 41799debdcc19d65fb6e0499cbbb74a489a822ea (patch) | |
| tree | 8b7107794ac883476fb0f79717e405cb58669c3e /prog/encoding_test.go | |
| parent | 286edfb78e2e77c644b32d161e8e1b188406a5c5 (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.go | 47 |
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]) + } + } +} |
