package proxmox

import "testing"

func TestParseUPID(t *testing.T) {
	// Captured live from demo-felhom.
	const raw = "UPID:demo-felhom:00026454:004E3431:6A265E53:vzdestroy:9021:root@pam:"
	u, err := ParseUPID(raw)
	if err != nil {
		t.Fatalf("ParseUPID: %v", err)
	}
	if u.Node != "demo-felhom" {
		t.Errorf("node = %q", u.Node)
	}
	if u.Worker != "vzdestroy" {
		t.Errorf("worker = %q", u.Worker)
	}
	if u.ID != "9021" {
		t.Errorf("id = %q", u.ID)
	}
	if u.User != "root@pam" {
		t.Errorf("user = %q", u.User)
	}
	if u.PID != 0x00026454 {
		t.Errorf("pid = %#x, want 0x26454", u.PID)
	}
	if u.StartTime != 0x6A265E53 {
		t.Errorf("starttime = %#x", u.StartTime)
	}
	if u.String() != raw {
		t.Errorf("String() round-trip = %q", u.String())
	}
}

func TestParseUPID_PrivsepTokenUser(t *testing.T) {
	// The user field can contain '@' and '!' (a privsep token) but never ':'.
	const raw = "UPID:demo-felhom:00001234:00005678:6A265E53:vzdump:9001:felhom-agent@pve!agent:"
	u, err := ParseUPID(raw)
	if err != nil {
		t.Fatalf("ParseUPID: %v", err)
	}
	if u.User != "felhom-agent@pve!agent" {
		t.Errorf("user = %q", u.User)
	}
}

func TestParseUPID_Invalid(t *testing.T) {
	cases := []string{
		"",
		"not-a-upid",
		"UPID:node:nothex:00:00:t:1:u:", // bad pid hex
		"UPID:node:00:00",               // too few fields
	}
	for _, c := range cases {
		if _, err := ParseUPID(c); err == nil {
			t.Errorf("ParseUPID(%q) = nil error, want error", c)
		}
	}
}
