Skip to content

Commit 23460a6

Browse files
committed
containerized-testing-tool: Modify the CPU and memory test to accept variables for expected values
Signed-off-by: Ankita Pareek <ankitapareek@microsoft.com>
1 parent 96260e9 commit 23460a6

File tree

4 files changed

+79
-107
lines changed

4 files changed

+79
-107
lines changed

tests/kata-containerized-test-tool/go.mod

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ require (
88
github.com/go-ole/go-ole v1.2.6 // indirect
99
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect
1010
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect
11-
github.com/shoenig/go-m1cpu v0.1.6 // indirect
1211
github.com/tklauser/go-sysconf v0.3.12 // indirect
1312
github.com/tklauser/numcpus v0.6.1 // indirect
1413
github.com/yusufpapurcu/wmi v1.2.4 // indirect

tests/kata-containerized-test-tool/go.sum

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,6 @@ github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF
1313
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE=
1414
github.com/shirou/gopsutil/v3 v3.24.5 h1:i0t8kL+kQTvpAYToeuiVk3TgDeKOFioZO3Ztz/iZ9pI=
1515
github.com/shirou/gopsutil/v3 v3.24.5/go.mod h1:bsoOS1aStSs9ErQ1WWfxllSeS1K5D+U30r2NfcubMVk=
16-
github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM=
17-
github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ=
18-
github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU=
19-
github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k=
2016
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
2117
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
2218
github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU=
Lines changed: 34 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,47 @@
11
package cpu
22

33
import (
4-
"context"
5-
"runtime"
6-
"time"
7-
"fmt"
8-
9-
"github.com/shirou/gopsutil/v3/cpu"
10-
"github.com/kata-containers/tests/kata-containerized-test-tool/internal/core"
4+
"context"
5+
"fmt"
6+
"runtime"
7+
"time"
8+
9+
"github.com/kata-containers/tests/kata-containerized-test-tool/internal/core"
1110
)
1211

1312
type CPUTest struct{}
1413

1514
func New() *CPUTest {
16-
return &CPUTest{}
15+
return &CPUTest{}
1716
}
1817

1918
func (t *CPUTest) Name() string {
20-
return "CPU Count Test"
19+
return "cpu"
2120
}
2221

23-
func (t *CPUTest) Run(ctx context.Context) core.TestResult {
24-
result := core.TestResult{
25-
Name: t.Name(),
26-
StartTime: time.Now(),
27-
Metrics: make(map[string]interface{}),
28-
}
29-
30-
// Get CPU count using different methods
31-
result.Metrics["runtime_cpu_count"] = runtime.NumCPU()
32-
33-
if cpuInfo, err := cpu.Info(); err == nil {
34-
result.Metrics["physical_cpu_count"] = len(cpuInfo)
35-
result.Success = true
36-
} else {
37-
result.Error = fmt.Sprintf("Failed to get CPU info: %v", err)
38-
result.Success = false
39-
}
40-
41-
result.EndTime = time.Now()
42-
return result
43-
}
22+
func (t *CPUTest) Run(ctx context.Context, expectedValues map[string]interface{}) core.TestResult {
23+
result := core.TestResult{
24+
Name: t.Name(),
25+
StartTime: time.Now(),
26+
Metrics: make(map[string]interface{}),
27+
ExpectedValues: expectedValues,
28+
Success: true, // Default to success if no expected values
29+
}
30+
31+
// Get actual CPU count
32+
cpuCount := runtime.NumCPU()
33+
result.Metrics["vcpu_count"] = cpuCount
34+
35+
// Check against expected values if provided
36+
if expectedCPU, exists := expectedValues["expected_vcpu_count"]; exists {
37+
if expectedCount, ok := expectedCPU.(float64); ok {
38+
if int(expectedCount) != cpuCount {
39+
result.Success = false
40+
result.Error = fmt.Sprintf("Expected %d vCPUs, found %d", int(expectedCount), cpuCount)
41+
}
42+
}
43+
}
44+
45+
result.EndTime = time.Now()
46+
return result
47+
}
Lines changed: 45 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -1,86 +1,59 @@
11
package memory
22

33
import (
4-
"context"
5-
"fmt"
6-
"time"
7-
"os"
8-
9-
"github.com/shirou/gopsutil/v3/mem"
10-
"github.com/kata-containers/tests/kata-containerized-test-tool/internal/core"
4+
"context"
5+
"fmt"
6+
"time"
7+
8+
"github.com/kata-containers/tests/kata-containerized-test-tool/internal/core"
9+
"github.com/shirou/gopsutil/v3/mem"
1110
)
1211

1312
type MemoryTest struct{}
1413

1514
func New() *MemoryTest {
16-
return &MemoryTest{}
15+
return &MemoryTest{}
1716
}
1817

1918
func (t *MemoryTest) Name() string {
20-
return "Memory Allocation Test"
19+
return "memory"
2120
}
2221

23-
func (t *MemoryTest) Run(ctx context.Context) core.TestResult {
24-
result := core.TestResult{
25-
Name: t.Name(),
26-
StartTime: time.Now(),
27-
Metrics: make(map[string]interface{}),
28-
}
29-
30-
// Get virtual memory stats
31-
vmStats, err := mem.VirtualMemory()
32-
if err != nil {
33-
result.Error = fmt.Sprintf("Failed to get virtual memory stats: %v", err)
34-
result.Success = false
35-
result.EndTime = time.Now()
36-
return result
37-
}
38-
39-
// Get swap memory stats
40-
swapStats, err := mem.SwapMemory()
41-
if err != nil {
42-
result.Error = fmt.Sprintf("Failed to get swap memory stats: %v", err)
43-
result.Success = false
44-
result.EndTime = time.Now()
45-
return result
46-
}
47-
48-
// Store memory metrics
49-
result.Metrics["total_memory"] = vmStats.Total
50-
result.Metrics["available_memory"] = vmStats.Available
51-
result.Metrics["used_memory"] = vmStats.Used
52-
result.Metrics["free_memory"] = vmStats.Free
53-
result.Metrics["memory_usage_percent"] = vmStats.UsedPercent
54-
55-
// Swap metrics
56-
result.Metrics["total_swap"] = swapStats.Total
57-
result.Metrics["used_swap"] = swapStats.Used
58-
result.Metrics["free_swap"] = swapStats.Free
59-
result.Metrics["swap_usage_percent"] = swapStats.UsedPercent
60-
61-
// Check cgroup memory limits if available
62-
cgroupMemory, err := t.getCgroupMemoryLimit()
63-
if err == nil {
64-
result.Metrics["cgroup_memory_limit"] = cgroupMemory
65-
}
66-
67-
result.Success = true
68-
result.EndTime = time.Now()
69-
return result
22+
func (t *MemoryTest) Run(ctx context.Context, expectedValues map[string]interface{}) core.TestResult {
23+
result := core.TestResult{
24+
Name: t.Name(),
25+
StartTime: time.Now(),
26+
Metrics: make(map[string]interface{}),
27+
ExpectedValues: expectedValues,
28+
Success: true, // Default to success if no expected values
29+
}
30+
31+
// Get memory metrics
32+
vm, err := mem.VirtualMemory()
33+
if err != nil {
34+
result.Success = false
35+
result.Error = fmt.Sprintf("Failed to get memory info: %v", err)
36+
result.EndTime = time.Now()
37+
return result
38+
}
39+
40+
totalMemoryMB := vm.Total / (1024 * 1024)
41+
result.Metrics["total_memory_mb"] = totalMemoryMB
42+
43+
// Check against expected values if provided
44+
if expectedMem, exists := expectedValues["expected_memory_mb"]; exists {
45+
if expectedMemMB, ok := expectedMem.(float64); ok {
46+
// Allow 5% tolerance
47+
tolerance := float64(totalMemoryMB) * 0.05
48+
if float64(totalMemoryMB) < (expectedMemMB-tolerance) ||
49+
float64(totalMemoryMB) > (expectedMemMB+tolerance) {
50+
result.Success = false
51+
result.Error = fmt.Sprintf("Expected %d MB memory (±5%%), found %d MB",
52+
int(expectedMemMB), totalMemoryMB)
53+
}
54+
}
55+
}
56+
57+
result.EndTime = time.Now()
58+
return result
7059
}
71-
72-
func (t *MemoryTest) getCgroupMemoryLimit() (uint64, error) {
73-
// Try to read cgroup memory limit
74-
data, err := os.ReadFile("/sys/fs/cgroup/memory/memory.limit_in_bytes")
75-
if err != nil {
76-
return 0, err
77-
}
78-
79-
var limit uint64
80-
_, err = fmt.Sscanf(string(data), "%d", &limit)
81-
if err != nil {
82-
return 0, err
83-
}
84-
85-
return limit, nil
86-
}

0 commit comments

Comments
 (0)