11package memory
22
33import (
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
1312type MemoryTest struct {}
1413
1514func New () * MemoryTest {
16- return & MemoryTest {}
15+ return & MemoryTest {}
1716}
1817
1918func (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