// Copyright (c) Huawei Technologies Co., Ltd. 2020. All rights reserved.
// isula-build licensed under the Mulan PSL v2.
// You can use this software according to the terms and conditions of the Mulan PSL v2.
// You may obtain a copy of Mulan PSL v2 at:
//     http://license.coscl.org.cn/MulanPSL2
// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
// PURPOSE.
// See the Mulan PSL v2 for more details.
// Author: Xiang Li
// Create: 2020-8-29
// Description: Fuzz file for daemon

package daemon

import (
	"bufio"
	"bytes"
	"context"
	"io/ioutil"
	"os"
	"strings"

	"github.com/containers/storage/pkg/reexec"
	"github.com/sirupsen/logrus"

	pb "isula.org/isula-build/api/services"
	"isula.org/isula-build/store"
)

func Fuzz(data []byte) int {
	if reexec.Init() {
		return 0
	}
	logrus.SetLevel(logrus.DebugLevel)
	data = append([]byte("FROM alpine\n"), data...)
	logrus.Infof("===============Testing with: \n%s", data)
	scanner := bufio.NewScanner(bytes.NewReader(data))
	for scanner.Scan() {
		line := scanner.Text()
		if strings.Contains(line, "FROM scrath") {
			return -1
		}
	}

	dir, err := ioutil.TempDir("/tmp", "fuzzBuilder")
	if err != nil {
		logrus.Errorf("Fuzz creating TempDir failed: %v", err)
		return 0
	}
	defer os.RemoveAll(dir)
	req := pb.BuildRequest{
		ContextDir:  dir,
		FileContent: string(data),
	}
	daemonOpts := Options{
		Debug:    false,
		DataRoot: "/var/lib/isula-build",
		RunRoot:  "/var/run/isula-build",
	}

	store, err := store.GetStore()
	if err != nil {
		return 0
	}
	daemon, err := NewDaemon(daemonOpts, &store)
	if err != nil {
		return 0
	}

	exec, err := daemon.NewBuilder(context.Background(), &req)
	if err != nil {
		return 0
	}

	if _, err = exec.Build(); err != nil {
		return -1
	}
	if err = daemon.Cleanup(); err != nil {
		return 0
	}
	return 1
}
