// 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 main

import (
	"net"

	"github.com/google/syzkaller/pkg/host"
	"github.com/google/syzkaller/pkg/ipc"
	. "github.com/google/syzkaller/pkg/log"
	"github.com/google/syzkaller/pkg/osutil"
	"github.com/google/syzkaller/prog"
)

func testImage(hostAddr string, target *prog.Target) {
	Logf(0, "connecting to host at %v", hostAddr)
	conn, err := net.Dial("tcp", hostAddr)
	if err != nil {
		Fatalf("failed to connect: %v", err)
	}
	conn.Close()

	Logf(0, "checking config...")
	config, err := ipc.DefaultConfig()
	if err != nil {
		Fatalf("failed to create ipc config: %v", err)
	}
	if kcov, _ := checkCompsSupported(); !kcov && config.Flags&ipc.FlagSignal != 0 {
		Fatalf("coverage is not supported by kernel")
	}
	if config.Flags&ipc.FlagSandboxNamespace != 0 && !osutil.IsExist("/proc/self/ns/user") {
		Fatalf("/proc/self/ns/user is not present for namespace sandbox")
	}
	calls, err := host.DetectSupportedSyscalls(target)
	if err != nil {
		Fatalf("failed to detect supported syscalls: %v", err)
	}
	calls = target.TransitivelyEnabledCalls(calls)
	Logf(0, "enabled syscalls: %v", len(calls))
	if calls[target.SyscallMap["syz_emit_ethernet"]] ||
		calls[target.SyscallMap["syz_extract_tcp_res"]] {
		config.Flags |= ipc.FlagEnableTun
	}

	Logf(0, "testing simple program...")
	env, err := ipc.MakeEnv(*flagExecutor, 0, config)
	if err != nil {
		Fatalf("failed to create ipc env: %v", err)
	}
	p := target.GenerateSimpleProg()
	opts := &ipc.ExecOpts{}
	output, info, failed, hanged, err := env.Exec(opts, p)
	if err != nil {
		Fatalf("execution failed: %v\n%s", err, output)
	}
	if hanged {
		Fatalf("program hanged:\n%s", output)
	}
	if failed {
		Fatalf("program failed:\n%s", output)
	}
	if len(info) == 0 {
		Fatalf("no calls executed:\n%s", output)
	}
	if info[0].Errno != 0 {
		Fatalf("simple call failed: %v\n%s", info[0].Errno, output)
	}
	if config.Flags&ipc.FlagSignal != 0 && len(info[0].Signal) == 0 {
		Fatalf("got no coverage:\n%s", output)
	}
}
