package guestd

import (
	"os"
	"path/filepath"
	"testing"

	"github.com/openeuler/Conch/internal/netstack"
)

func TestInstallResolverConfig(t *testing.T) {
	target := filepath.Join(t.TempDir(), "resolv.conf")
	if err := os.WriteFile(target, []byte("old\n"), 0o644); err != nil {
		t.Fatal(err)
	}
	oldTarget := resolverTargetPath
	resolverTargetPath = target
	t.Cleanup(func() { resolverTargetPath = oldTarget })

	if err := installResolverConfig(netstack.DNSConfig{
		Nameservers: []string{"10.0.0.53", "8.8.8.8"},
		Search:      []string{"example.test", "svc.test"},
		Options:     []string{"timeout:2"},
	}); err != nil {
		t.Fatalf("installResolverConfig() error = %v", err)
	}
	content, err := os.ReadFile(target)
	if err != nil {
		t.Fatal(err)
	}
	want := "# Generated by Conch\nnameserver 10.0.0.53\nnameserver 8.8.8.8\nsearch example.test svc.test\noptions timeout:2\n"
	if string(content) != want {
		t.Fatalf("resolver target = %q, want %q", content, want)
	}
}

func TestInstallResolverConfigReplacesDanglingSymlink(t *testing.T) {
	dir := t.TempDir()
	target := filepath.Join(dir, "resolv.conf")
	if err := os.Symlink(filepath.Join(dir, "missing", "resolv.conf"), target); err != nil {
		t.Fatal(err)
	}
	oldTarget := resolverTargetPath
	resolverTargetPath = target
	t.Cleanup(func() { resolverTargetPath = oldTarget })

	if err := installResolverConfig(netstack.DNSConfig{
		Nameservers: []string{"10.0.0.53"},
	}); err != nil {
		t.Fatalf("installResolverConfig() error = %v", err)
	}
	info, err := os.Lstat(target)
	if err != nil {
		t.Fatal(err)
	}
	if info.Mode()&os.ModeSymlink != 0 {
		t.Fatal("resolver target is still a symbolic link")
	}
	content, err := os.ReadFile(target)
	if err != nil {
		t.Fatal(err)
	}
	want := "# Generated by Conch\nnameserver 10.0.0.53\n"
	if string(content) != want {
		t.Fatalf("resolver target = %q, want %q", content, want)
	}
}