myxce/src/frontend/apiserver/backend/convert_test.go

199 lines
4.8 KiB
Go

package backend
import (
"testing"
"time"
)
func TestRawJobToModel_BasicFields(t *testing.T) {
r := rawJobData{
jobID: 123,
state: 2, // JOB_STAT_RUN
runTime: 42,
submit: &rawSubmitData{
queue: "normal",
user: "alice",
jobName: "myjob",
minTasks: 1,
maxTasks: 4,
startInfo: &rawStartInfo{
cmdline: "sleep 60",
},
},
}
info := rawJobToModel(r)
if info.Unique_JobID != 123 {
t.Errorf("Unique_JobID: got %d, want 123", info.Unique_JobID)
}
if info.JobID != 123 {
t.Errorf("JobID: got %d, want 123", info.JobID)
}
if info.QueueName != "normal" {
t.Errorf("QueueName: got %q, want %q", info.QueueName, "normal")
}
if info.SubmitUser != "alice" {
t.Errorf("SubmitUser: got %q, want %q", info.SubmitUser, "alice")
}
if info.JobName != "myjob" {
t.Errorf("JobName: got %q, want %q", info.JobName, "myjob")
}
if info.Command != "sleep 60" {
t.Errorf("Command: got %q, want %q", info.Command, "sleep 60")
}
if info.JobStatus != 2 {
t.Errorf("JobStatus: got %d, want 2", info.JobStatus)
}
if info.NumProcessors != 1 {
t.Errorf("NumProcessors: got %d, want 1", info.NumProcessors)
}
if info.MaxNumProcessors != 4 {
t.Errorf("MaxNumProcessors: got %d, want 4", info.MaxNumProcessors)
}
if info.RunTime != 42 {
t.Errorf("RunTime: got %d, want 42", info.RunTime)
}
}
func TestRawJobToModel_NilSubmit(t *testing.T) {
r := rawJobData{jobID: 99, state: 1 /* JOB_STAT_PEND */}
info := rawJobToModel(r)
if info.Unique_JobID != 99 {
t.Errorf("Unique_JobID: got %d, want 99", info.Unique_JobID)
}
if info.QueueName != "" {
t.Errorf("QueueName should be empty for nil submit, got %q", info.QueueName)
}
}
func TestRawJobToModel_Timestamps(t *testing.T) {
r := rawJobData{
jobID: 1,
subTime: 1700000000,
queueTime: 1700000010,
startTime: 1700000020,
finishTime: 1700000030,
}
info := rawJobToModel(r)
if info.SubmitTime != time.Unix(1700000000, 0) {
t.Errorf("SubmitTime mismatch")
}
if info.QueueTime != time.Unix(1700000010, 0) {
t.Errorf("QueueTime mismatch")
}
if info.StartTime != time.Unix(1700000020, 0) {
t.Errorf("StartTime mismatch")
}
if info.EndTime != time.Unix(1700000030, 0) {
t.Errorf("EndTime mismatch")
}
}
func TestRawWorkerToModel_BasicFields(t *testing.T) {
r := rawWorkerData{
name: "node01",
status: 3, // XCE_WORKER_UNAVAIL
hasAttrs: true,
hostType: "linux",
hostModel: "x86_64",
cpuFactor: 1.5,
maxCPUs: 16,
maxMem: 65536,
maxSwap: 32768,
maxTmp: 1024,
nDisks: 2,
}
info := rawWorkerToModel(r)
if info.HostName != "node01" {
t.Errorf("HostName: got %q, want %q", info.HostName, "node01")
}
if info.HostType != "linux" {
t.Errorf("HostType: got %q, want %q", info.HostType, "linux")
}
if info.HostModel != "x86_64" {
t.Errorf("HostModel: got %q, want %q", info.HostModel, "x86_64")
}
if info.NumCPUs != 16 {
t.Errorf("NumCPUs: got %d, want 16", info.NumCPUs)
}
if info.MaxMem != 65536 {
t.Errorf("MaxMem: got %d, want 65536", info.MaxMem)
}
if info.NumDisk != 2 {
t.Errorf("NumDisk: got %d, want 2", info.NumDisk)
}
if info.HostStatus != 3 {
t.Errorf("HostStatus: got %d, want 3", info.HostStatus)
}
}
func TestRawWorkerToModel_NoAttrs(t *testing.T) {
r := rawWorkerData{name: "node02", status: 1, hasAttrs: false}
info := rawWorkerToModel(r)
if info.HostName != "node02" {
t.Errorf("HostName: got %q, want node02", info.HostName)
}
if info.HostType != "" {
t.Errorf("HostType should be empty when hasAttrs=false, got %q", info.HostType)
}
if info.NumCPUs != 0 {
t.Errorf("NumCPUs should be 0 when hasAttrs=false, got %d", info.NumCPUs)
}
}
func TestRawQueueToModel_BasicFields(t *testing.T) {
r := rawQueueData{
name: "normal",
status: 1, // QUEUE_STAT_OPEN
priority: 30,
}
info := rawQueueToModel(r)
if info.QueueName != "normal" {
t.Errorf("QueueName: got %q, want %q", info.QueueName, "normal")
}
if info.Priority != 30 {
t.Errorf("Priority: got %d, want 30", info.Priority)
}
if info.QueueStatus != 1 {
t.Errorf("QueueStatus: got %d, want 1", info.QueueStatus)
}
}
func TestRawResourceToModel_BasicFields(t *testing.T) {
r := rawResourceData{
name: "mem",
desc: "memory resource",
valType: 1, // XCE_VAL_NUMERIC
flags: 4, // XCE_RESF_CONSUMABLE
interval: 60,
}
info := rawResourceToModel(r)
if info.ResourceName != "mem" {
t.Errorf("ResourceName: got %q, want %q", info.ResourceName, "mem")
}
if info.Description != "memory resource" {
t.Errorf("Description: got %q, want %q", info.Description, "memory resource")
}
if info.ValueType != 1 {
t.Errorf("ValueType: got %d, want 1", info.ValueType)
}
if info.Flag != 4 {
t.Errorf("Flag: got %d, want 4", info.Flag)
}
if info.Interval != 60 {
t.Errorf("Interval: got %d, want 60", info.Interval)
}
}