package main

import (
	"io/ioutil"
	"os"
	"syscall"
	"testing"

	"github.com/stretchr/testify/assert"

	"tiup-log-collector/config"
)

func createTempConfig(t *testing.T, port string) (*config.Config, func()) {
	cfgFile, _ := ioutil.TempFile("", "config.*.json")

	_, err := cfgFile.WriteString(`{"log":{"event-file":"event.log","app-file":"app.log","sentry-dsn":""},"web":{"host":"127.0.0.1","port":"` + port + `"}}`)
	if err != nil {
		t.Fatal(err)
	}

	cfg, err := config.ParseArgs([]string{"-c", cfgFile.Name()})
	if err != nil {
		t.Fatal(err)
	}

	return cfg, func() {
		if err := os.Remove(cfgFile.Name()); err != nil {
			t.Fatal(err)
		}
	}
}

func TestStartApp(t *testing.T) {
	t.Run("should start and shutdown gracefully", func(t *testing.T) {
		cfg, removeCfg := createTempConfig(t, "40001")
		defer removeCfg()

		go func() {
			waitServerStart(t)
			mockSignal(t, syscall.SIGINT)
		}()
		assert.NoError(t, StartApp(cfg))
	})

	t.Run("should start and shutdown gracefully in debug mode", func(t *testing.T) {
		cfg, removeCfg := createTempConfig(t, "40001")
		defer removeCfg()

		cfg.Debug = true

		go func() {
			waitServerStart(t)
			mockSignal(t, syscall.SIGINT)
		}()
		assert.NoError(t, StartApp(cfg))
	})

	t.Run("should stop if cannot listen the port", func(t *testing.T) {
		cfg, removeCfg := createTempConfig(t, "1")
		defer removeCfg()

		assert.Error(t, StartApp(cfg))
	})
}
