package hostutil

import (
	"context"
	"strings"
	"testing"

	"github.com/hashicorp/errwrap"
)

func TestCollectHostInfo(t *testing.T) {
	info, err := CollectHostInfo(context.Background())
	if err != nil && !errwrap.ContainsType(err, new(HostInfoError)) {
		t.Fatal(err)
	}

	// Get all the possible HostInfoError errors and check for the resulting
	// stat if the package is able to fetch it for the platform we're testing
	// on.
	errs := errwrap.GetAllType(err, new(HostInfoError))

	if info.Timestamp.IsZero() {
		t.Fatal("expected non-zero Timestamp")
	}
	if !checkErrTypeExists(errs, "cpu") && info.CPU == nil {
		t.Fatal("expected non-nil CPU value")
	}
	if !checkErrTypeExists(errs, "cpu_times") && info.CPUTimes == nil {
		t.Fatal("expected non-nil CPUTimes value")
	}
	if !checkErrTypeExists(errs, "disk") && info.Disk == nil {
		t.Fatal("expected non-nil Disk value")
	}
	if !checkErrTypeExists(errs, "host") && info.Host == nil {
		t.Fatal("expected non-nil Host value")
	}
	if !checkErrTypeExists(errs, "memory") && info.Memory == nil {
		t.Fatal("expected non-nil Memory value")
	}
}

// checkErrTypeExists is a helper that checks whether an particular
// HostInfoError.Type exists within a set of errors.
func checkErrTypeExists(errs []error, errType string) bool {
	for _, e := range errs {
		err, ok := e.(*HostInfoError)
		if !ok {
			return false
		}

		// This is mainly for disk error since the type string can contain an
		// index for the disk.
		parts := strings.SplitN(err.Type, ".", 2)

		if parts[0] == errType {
			return true
		}
	}
	return false
}
