package main

import (
	"bufio"
	"fmt"
	"os"
	"testing"
	"time"
)

// TestYardimciSurec: calistirici testlerinin alt sureci. Normal testlerde hicbir sey yapmaz.
func TestYardimciSurec(t *testing.T) {
	if os.Getenv("FIKOYT_YARDIMCI") != "1" {
		return
	}
	if os.Getenv("FIKOYT_MOD") == "uzun" {
		time.Sleep(time.Minute)
		os.Exit(0)
	}
	bufio.NewReader(os.Stdin).ReadBytes('\n')
	fmt.Println(`{"tamam":true,"veri":{"durum":"tamam"}}`)
	os.Exit(0)
}

func yardimciCalistir(t *testing.T, mod string, sure time.Duration) (eklentiCikti, error) {
	t.Helper()
	os.Setenv("FIKOYT_YARDIMCI", "1")
	os.Setenv("FIKOYT_MOD", mod)
	defer os.Unsetenv("FIKOYT_YARDIMCI")
	defer os.Unsetenv("FIKOYT_MOD")
	return eklentiCalistir(os.Args[0], []string{"-test.run=TestYardimciSurec", "-test.count=1"}, eklentiGirdi{Islem: "ping"}, sure)
}

func TestEklentiCalistirYanit(t *testing.T) {
	cikti, err := yardimciCalistir(t, "normal", 15*time.Second)
	if err != nil {
		t.Fatalf("beklenmeyen hata: %v", err)
	}
	if !cikti.Tamam {
		t.Fatalf("tamam false dondu: %+v", cikti)
	}
}

func TestEklentiZamanAsimi(t *testing.T) {
	baslangic := time.Now()
	_, err := yardimciCalistir(t, "uzun", 1*time.Second)
	if err == nil {
		t.Fatal("zaman asimi hatasi bekleniyordu")
	}
	if time.Since(baslangic) > 15*time.Second {
		t.Fatalf("surec zamaninda olduruulmedi: %v", time.Since(baslangic))
	}
}

func TestEklentiYoluGuvenligi(t *testing.T) {
	if err := eklentiYoluGecerliMi(`C:\Windows\System32\cmd.exe`); err != errEklentiYolu {
		t.Fatalf("sistem yolu kabul edildi: %v", err)
	}
}
