package main

import (
	"sync"
	"testing"
)

// TestCihazKimlikEsZamaniTekUretilir: yeni bir profilin kimligi ayni anda bircok
// goroutine'den istense de tek kimlik uretilir (okuma/uretim/yazma zinciri atomik olmali).
// Aksinde ayni profil icin iki farkli kimlik uretilip sunucuya iki cihaz kaydi gider.
func TestCihazKimlikEsZamaniTekUretilir(t *testing.T) {
	t.Setenv("APPDATA", t.TempDir())

	if _, err := profilKlasoru("essiz"); err != nil {
		t.Fatal(err)
	}
	const calisan = 16
	sonuclar := make([]string, calisan)
	var bekle sync.WaitGroup
	for i := 0; i < calisan; i++ {
		bekle.Add(1)
		go func(n int) {
			defer bekle.Done()
			k, err := cihazKimligiProfil("essiz")
			if err != nil {
				t.Errorf("kimlik okunamadi: %v", err)
				return
			}
			sonuclar[n] = k
		}(i)
	}
	bekle.Wait()
	for i, k := range sonuclar {
		if k == "" || k != sonuclar[0] {
			t.Fatalf("tek kimlik beklenirdi, goroutine %d: %q (ilk: %q)", i, k, sonuclar[0])
		}
	}
}
