package hddtemp

import (
	"net"
	"testing"

	"github.com/stretchr/testify/require"
)

func TestFetch(t *testing.T) {
	l := serve(t, []byte("|/dev/sda|foobar|36|C|"))
	defer l.Close()

	disks, err := New().Fetch(l.Addr().String())
	require.NoError(t, err)

	expected := []Disk{
		{
			DeviceName:  "sda",
			Model:       "foobar",
			Temperature: 36,
			Unit:        "C",
		},
	}
	require.Equal(t, expected, disks, "disks' slice is different from expected")
}

func TestFetchWrongAddress(t *testing.T) {
	_, err := New().Fetch("127.0.0.1:1")
	require.Error(t, err)
}

func TestFetchStatus(t *testing.T) {
	l := serve(t, []byte("|/dev/sda|foobar|SLP|C|"))
	defer l.Close()

	disks, err := New().Fetch(l.Addr().String())
	require.NoError(t, err)

	expected := []Disk{
		{
			DeviceName:  "sda",
			Model:       "foobar",
			Temperature: 0,
			Unit:        "C",
			Status:      "SLP",
		},
	}
	require.Equal(t, expected, disks, "disks' slice is different from expected")
}

func TestFetchTwoDisks(t *testing.T) {
	l := serve(t, []byte("|/dev/hda|ST380011A|46|C||/dev/hdd|ST340016A|SLP|*|"))
	defer l.Close()

	disks, err := New().Fetch(l.Addr().String())
	require.NoError(t, err)

	expected := []Disk{
		{
			DeviceName:  "hda",
			Model:       "ST380011A",
			Temperature: 46,
			Unit:        "C",
		},
		{
			DeviceName:  "hdd",
			Model:       "ST340016A",
			Temperature: 0,
			Unit:        "*",
			Status:      "SLP",
		},
	}
	require.Equal(t, expected, disks, "disks' slice is different from expected")
}

func serve(t *testing.T, data []byte) net.Listener {
	l, err := net.Listen("tcp", "127.0.0.1:0")
	require.NoError(t, err)

	go func(t *testing.T) {
		conn, err := l.Accept()
		if err != nil {
			t.Error(err)
			return
		}

		if _, err = conn.Write(data); err != nil {
			t.Error(err)
			return
		}
		if err = conn.Close(); err != nil {
			t.Error(err)
			return
		}
	}(t)

	return l
}
