// Copyright 2015 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.

// +build linux

package host

import (
	"runtime"
	"syscall"
	"testing"

	"github.com/google/syzkaller/prog"
	_ "github.com/google/syzkaller/sys"
)

func TestLog(t *testing.T) {
	t.Parallel()
	target, err := prog.GetTarget("linux", runtime.GOARCH)
	if err != nil {
		t.Fatal(err)
	}
	// Dump for manual inspection.
	supp, err := DetectSupportedSyscalls(target)
	if err != nil {
		t.Skipf("skipping: %v", err)
	}
	t.Logf("unsupported:")
	for _, c := range target.Syscalls {
		s, ok := supp[c]
		if ok && !s {
			t.Fatalf("map contains false value")
		}
		if !s {
			t.Logf("\t%v", c.Name)
		}
	}
	trans := target.TransitivelyEnabledCalls(supp)
	t.Logf("transitively unsupported:")
	for _, c := range target.Syscalls {
		s, ok := trans[c]
		if ok && !s {
			t.Fatalf("map contains false value")
		}
		if !s && supp[c] {
			t.Logf("\t%v", c.Name)
		}
	}
}

func TestSupportedSyscalls(t *testing.T) {
	t.Parallel()
	target, err := prog.GetTarget("linux", runtime.GOARCH)
	if err != nil {
		t.Fatal(err)
	}
	supp, err := DetectSupportedSyscalls(target)
	if err != nil {
		t.Skipf("skipping: %v", err)
	}
	// These are safe to execute with invalid arguments.
	safe := []string{
		"memfd_create",
		"sendfile",
		"bpf$MAP_CREATE",
		"open",
		"openat",
		"read",
		"write",
		"stat",
	}
	for _, name := range safe {
		c := target.SyscallMap[name]
		if c == nil {
			t.Fatalf("can't find syscall '%v'", name)
		}
		a := ^uintptr(0) - 4097 // hopefully invalid
		_, _, err := syscall.Syscall6(uintptr(c.NR), a, a, a, a, a, a)
		if err == 0 {
			t.Fatalf("%v did not fail", name)
		}
		if ok := err != syscall.ENOSYS; ok != supp[c] {
			t.Fatalf("syscall %v: perse=%v kallsyms=%v", name, ok, supp[c])
		}
	}
}
