Skip to content

Commit adb77cb

Browse files
feat: Add memory converter and validator utility functions with comprehensive tests
1 parent f7483cd commit adb77cb

File tree

2 files changed

+208
-0
lines changed

2 files changed

+208
-0
lines changed

minikube/state_utils/memory.go

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
package state_utils
22

33
import (
4+
"errors"
5+
6+
"github.com/hashicorp/go-cty/cty"
7+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
8+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
49
"github.com/scott-the-programmer/terraform-provider-minikube/minikube/lib"
510
pkgutil "k8s.io/minikube/pkg/util"
611
)
@@ -36,3 +41,49 @@ func GetMemory(memoryStr string) (int, error) {
3641

3742
return memoryMb, err
3843
}
44+
45+
func MemoryConverter() schema.SchemaStateFunc {
46+
return func(val interface{}) string {
47+
result, err := MemoryConverterImpl(val)
48+
if err != nil {
49+
panic(err)
50+
}
51+
return result
52+
}
53+
}
54+
55+
func MemoryConverterImpl(val interface{}) (string, error) {
56+
memoryStr, ok := val.(string)
57+
if !ok {
58+
return "", errors.New("memory value is not a string")
59+
}
60+
61+
if memoryStr == lib.Max || memoryStr == lib.NoLimit {
62+
return memoryStr, nil
63+
}
64+
65+
return ResourceSizeConverterImpl(memoryStr)
66+
}
67+
68+
func MemoryValidator() schema.SchemaValidateDiagFunc {
69+
return schema.SchemaValidateDiagFunc(func(val interface{}, path cty.Path) diag.Diagnostics {
70+
err := MemoryValidatorImpl(val)
71+
if err != nil {
72+
return diag.FromErr(err)
73+
}
74+
return nil
75+
})
76+
}
77+
78+
func MemoryValidatorImpl(val interface{}) error {
79+
memoryStr, ok := val.(string)
80+
if !ok {
81+
return errors.New("memory value is not a string")
82+
}
83+
84+
if memoryStr == lib.Max || memoryStr == lib.NoLimit {
85+
return nil
86+
}
87+
88+
return ResourceSizeValidatorImpl(memoryStr)
89+
}

minikube/state_utils/memory_test.go

Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,3 +65,160 @@ func TestGetMemory(t *testing.T) {
6565
})
6666
}
6767
}
68+
69+
func TestMemoryConverterImpl(t *testing.T) {
70+
tests := []struct {
71+
name string
72+
input interface{}
73+
expected string
74+
expectError bool
75+
}{
76+
{
77+
name: "valid memory size - 2G",
78+
input: "2G",
79+
expected: "2048mb",
80+
expectError: false,
81+
},
82+
{
83+
name: "valid memory size - 1024mb",
84+
input: "1024mb",
85+
expected: "1024mb",
86+
expectError: false,
87+
},
88+
{
89+
name: "max case",
90+
input: lib.Max,
91+
expected: lib.Max,
92+
expectError: false,
93+
},
94+
{
95+
name: "no limit case",
96+
input: lib.NoLimit,
97+
expected: lib.NoLimit,
98+
expectError: false,
99+
},
100+
{
101+
name: "non-string input",
102+
input: 123,
103+
expected: "",
104+
expectError: true,
105+
},
106+
{
107+
name: "invalid memory size",
108+
input: "invalid",
109+
expected: "",
110+
expectError: true,
111+
},
112+
{
113+
name: "empty string",
114+
input: "",
115+
expected: "",
116+
expectError: true,
117+
},
118+
}
119+
120+
for _, tt := range tests {
121+
t.Run(tt.name, func(t *testing.T) {
122+
result, err := MemoryConverterImpl(tt.input)
123+
124+
if tt.expectError {
125+
assert.Error(t, err)
126+
} else {
127+
assert.NoError(t, err)
128+
assert.Equal(t, tt.expected, result)
129+
}
130+
})
131+
}
132+
}
133+
134+
func TestMemoryValidatorImpl(t *testing.T) {
135+
tests := []struct {
136+
name string
137+
input interface{}
138+
expectError bool
139+
}{
140+
{
141+
name: "valid memory size - 2G",
142+
input: "2G",
143+
expectError: false,
144+
},
145+
{
146+
name: "valid memory size - 1024mb",
147+
input: "1024mb",
148+
expectError: false,
149+
},
150+
{
151+
name: "max case",
152+
input: lib.Max,
153+
expectError: false,
154+
},
155+
{
156+
name: "no limit case",
157+
input: lib.NoLimit,
158+
expectError: false,
159+
},
160+
{
161+
name: "non-string input",
162+
input: 123,
163+
expectError: true,
164+
},
165+
{
166+
name: "invalid memory size",
167+
input: "invalid",
168+
expectError: true,
169+
},
170+
{
171+
name: "negative memory size",
172+
input: "-1G",
173+
expectError: true,
174+
},
175+
{
176+
name: "empty string",
177+
input: "",
178+
expectError: true,
179+
},
180+
}
181+
182+
for _, tt := range tests {
183+
t.Run(tt.name, func(t *testing.T) {
184+
err := MemoryValidatorImpl(tt.input)
185+
186+
if tt.expectError {
187+
assert.Error(t, err)
188+
} else {
189+
assert.NoError(t, err)
190+
}
191+
})
192+
}
193+
}
194+
195+
func TestMemoryConverter(t *testing.T) {
196+
converter := MemoryConverter()
197+
198+
// Test normal case
199+
result := converter("2G")
200+
assert.Equal(t, "2048mb", result)
201+
202+
// Test special cases
203+
assert.Equal(t, lib.Max, converter(lib.Max))
204+
assert.Equal(t, lib.NoLimit, converter(lib.NoLimit))
205+
206+
// Test panic case
207+
assert.Panics(t, func() {
208+
converter(123) // non-string input should panic
209+
})
210+
}
211+
212+
func TestMemoryValidator(t *testing.T) {
213+
validator := MemoryValidator()
214+
215+
// Test valid cases
216+
assert.Nil(t, validator("2G", nil))
217+
assert.Nil(t, validator(lib.Max, nil))
218+
assert.Nil(t, validator(lib.NoLimit, nil))
219+
220+
// Test invalid cases
221+
assert.NotNil(t, validator(123, nil)) // non-string input
222+
assert.NotNil(t, validator("invalid", nil)) // invalid memory size
223+
assert.NotNil(t, validator("", nil)) // empty string
224+
}

0 commit comments

Comments
 (0)