// Copyright 2017 syzkaller project authors. All rights reserved.
// Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file.
package ifuzz_test
import (
"encoding/hex"
"math/rand"
"testing"
"time"
. "github.com/google/syzkaller/pkg/ifuzz"
_ "github.com/google/syzkaller/pkg/ifuzz/generated"
)
func TestMode(t *testing.T) {
all := make(map[*Insn]bool)
for mode := 0; mode < ModeLast; mode++ {
for priv := 0; priv < 2; priv++ {
for exec := 0; exec < 2; exec++ {
cfg := &Config{
Mode: mode,
Priv: priv != 0,
Exec: exec != 0,
}
insns := ModeInsns(cfg)
t.Logf("mode=%v priv=%v exec=%v: %v instructions", mode, priv, exec, len(insns))
for _, insn := range insns {
all[insn] = true
}
}
}
}
t.Logf("total: %v instructions", len(all))
}
func TestDecode(t *testing.T) {
seed := int64(time.Now().UnixNano())
t.Logf("seed=%v", seed)
r := rand.New(rand.NewSource(seed))
for repeat := 0; repeat < 10; repeat++ {
for mode := 0; mode < ModeLast; mode++ {
cfg := &Config{
Mode: mode,
Priv: true,
Exec: true,
}
failed := false
for _, insn := range ModeInsns(cfg) {
text0 := insn.Encode(cfg, r)
text := text0
repeat:
size, err := Decode(mode, text)
if err != nil {
t.Errorf("decoding %v %v failed (mode=%v): %v", insn.Name, hex.EncodeToString(text), mode, err)
if len(text) != len(text0) {
t.Errorf("whole: %v", hex.EncodeToString(text0))
}
failed = true
continue
}
if XedDecode != nil {
xedSize, xedErr := XedDecode(mode, text)
if xedErr != nil {
t.Errorf("xed decoding %v %v failed (mode=%v): %v", insn.Name, hex.EncodeToString(text), mode, xedErr)
if len(text) != len(text0) {
t.Errorf("whole: %v", hex.EncodeToString(text0))
}
failed = true
continue
}
if size != xedSize {
t.Errorf("decoding %v %v failed (mode=%v): decoded %v/%v, xed decoded %v/%v",
insn.Name, hex.EncodeToString(text), mode, size, xedSize, size, len(text))
if len(text) != len(text0) {
t.Errorf("whole: %v", hex.EncodeToString(text0))
}
failed = true
continue
}
}
if insn.Pseudo && size >= 0 && size < len(text) {
text = text[size:]
goto repeat
}
if size != len(text) {
t.Errorf("decoding %v %v failed (mode=%v): decoded %v/%v",
insn.Name, hex.EncodeToString(text), mode, size, len(text))
if len(text) != len(text0) {
t.Errorf("whole: %v", hex.EncodeToString(text0))
}
failed = true
}
}
if failed {
return
}
}
}
}