package collector

import "testing"

// 누적 카운터 두 시점의 델타를 초당 속도(B/s)로 환산한다.
func TestRateBps(t *testing.T) {
	cases := []struct {
		name      string
		cur, prev int64
		seconds   float64
		want      int64
	}{
		{"정상 델타", 10_000, 4_000, 3.0, 2_000},
		{"카운터 리셋(음수 델타)은 0", 100, 5_000, 3.0, 0},
		{"경과 시간 0이면 0", 10_000, 4_000, 0, 0},
		{"변화 없음", 4_000, 4_000, 5.0, 0},
	}
	for _, c := range cases {
		if got := rateBps(c.cur, c.prev, c.seconds); got != c.want {
			t.Errorf("%s: rateBps(%d,%d,%.1f) = %d, want %d", c.name, c.cur, c.prev, c.seconds, got, c.want)
		}
	}
}

// 업타임/프로세스 수/메모리·디스크 용량은 실제 호스트에서 항상 0보다 커야 한다.
func TestCollectHostBasics(t *testing.T) {
	m := NewSystem().Collect()
	if m.UptimeSec <= 0 {
		t.Errorf("UptimeSec = %d, 0보다 커야 함", m.UptimeSec)
	}
	if m.ProcsTotal <= 0 {
		t.Errorf("ProcsTotal = %d, 0보다 커야 함", m.ProcsTotal)
	}
	if m.MemTotal <= 0 || m.MemUsed <= 0 {
		t.Errorf("MemTotal/MemUsed = %d/%d, 0보다 커야 함", m.MemTotal, m.MemUsed)
	}
	if m.DiskTotal <= 0 || m.DiskUsed <= 0 {
		t.Errorf("DiskTotal/DiskUsed = %d/%d, 0보다 커야 함", m.DiskTotal, m.DiskUsed)
	}
}

// 파티션/가상 디바이스를 제외한 물리 디스크만 합산해 이중 집계를 막는다.
func TestIsPhysicalDisk(t *testing.T) {
	physical := []string{"sda", "sdb", "vda", "xvda", "hda", "nvme0n1", "nvme1n1", "mmcblk0", "md0", "dm-0", "disk0"}
	for _, n := range physical {
		if !isPhysicalDisk(n) {
			t.Errorf("%s는 물리 디스크로 판정되어야 함", n)
		}
	}
	virtual := []string{"sda1", "vda2", "nvme0n1p1", "mmcblk0p2", "loop0", "ram0", "sr0", "disk0s1"}
	for _, n := range virtual {
		if isPhysicalDisk(n) {
			t.Errorf("%s는 제외되어야 함(파티션/가상)", n)
		}
	}
}
