Skip to content

Commit 23cef2a

Browse files
authored
Merge pull request #866 from l1b0k/ut
test: add ut
2 parents 6abd178 + 94d77cc commit 23cef2a

File tree

14 files changed

+2450
-31
lines changed

14 files changed

+2450
-31
lines changed

cmd/terway-cli/cni_linux_test.go

Lines changed: 235 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
package main
22

33
import (
4+
"os"
45
"testing"
56

7+
"github.com/AliyunContainerService/terway/pkg/utils/nodecap"
8+
"github.com/Jeffail/gabs/v2"
69
"github.com/stretchr/testify/assert"
710
)
811

@@ -39,3 +42,235 @@ func Test_parseRelease(t *testing.T) {
3942
})
4043
}
4144
}
45+
46+
func Test_storeRuntimeConfig_with_cilium_plugin(t *testing.T) {
47+
// Create a temporary file for node capabilities
48+
tempFile, err := os.CreateTemp("", "test_node_capabilities")
49+
assert.NoError(t, err)
50+
defer os.Remove(tempFile.Name())
51+
52+
// Create JSON with cilium-cni plugin
53+
container, err := gabs.ParseJSON([]byte(`{
54+
"plugins": [
55+
{
56+
"type": "cilium-cni"
57+
}
58+
]
59+
}`))
60+
assert.NoError(t, err)
61+
62+
err = storeRuntimeConfig(tempFile.Name(), container)
63+
assert.NoError(t, err)
64+
65+
// Verify capabilities were stored correctly
66+
store := nodecap.NewFileNodeCapabilities(tempFile.Name())
67+
err = store.Load()
68+
assert.NoError(t, err)
69+
assert.Equal(t, True, store.Get(nodecap.NodeCapabilityHasCiliumChainer))
70+
}
71+
72+
func Test_storeRuntimeConfig_with_terway_plugin_network_policy(t *testing.T) {
73+
tempFile, err := os.CreateTemp("", "test_node_capabilities")
74+
assert.NoError(t, err)
75+
defer os.Remove(tempFile.Name())
76+
77+
container, err := gabs.ParseJSON([]byte(`{
78+
"plugins": [
79+
{
80+
"type": "terway",
81+
"network_policy_provider": "ebpf"
82+
}
83+
]
84+
}`))
85+
assert.NoError(t, err)
86+
87+
err = storeRuntimeConfig(tempFile.Name(), container)
88+
assert.NoError(t, err)
89+
90+
store := nodecap.NewFileNodeCapabilities(tempFile.Name())
91+
err = store.Load()
92+
assert.NoError(t, err)
93+
assert.Equal(t, "ebpf", store.Get(nodecap.NodeCapabilityNetworkPolicyProvider))
94+
assert.Equal(t, False, store.Get(nodecap.NodeCapabilityHasCiliumChainer))
95+
}
96+
97+
func Test_storeRuntimeConfig_with_terway_plugin_datapath(t *testing.T) {
98+
tempFile, err := os.CreateTemp("", "test_node_capabilities")
99+
assert.NoError(t, err)
100+
defer os.Remove(tempFile.Name())
101+
102+
container, err := gabs.ParseJSON([]byte(`{
103+
"plugins": [
104+
{
105+
"type": "terway",
106+
"eniip_virtual_type": "datapathv2"
107+
}
108+
]
109+
}`))
110+
assert.NoError(t, err)
111+
112+
err = storeRuntimeConfig(tempFile.Name(), container)
113+
assert.NoError(t, err)
114+
115+
store := nodecap.NewFileNodeCapabilities(tempFile.Name())
116+
err = store.Load()
117+
assert.NoError(t, err)
118+
assert.Equal(t, "datapathv2", store.Get(nodecap.NodeCapabilityDataPath))
119+
assert.Equal(t, False, store.Get(nodecap.NodeCapabilityHasCiliumChainer))
120+
}
121+
122+
func Test_storeRuntimeConfig_with_both_plugins(t *testing.T) {
123+
tempFile, err := os.CreateTemp("", "test_node_capabilities")
124+
assert.NoError(t, err)
125+
defer os.Remove(tempFile.Name())
126+
127+
container, err := gabs.ParseJSON([]byte(`{
128+
"plugins": [
129+
{
130+
"type": "terway",
131+
"network_policy_provider": "iptables",
132+
"eniip_virtual_type": "veth"
133+
},
134+
{
135+
"type": "cilium-cni"
136+
}
137+
]
138+
}`))
139+
assert.NoError(t, err)
140+
141+
err = storeRuntimeConfig(tempFile.Name(), container)
142+
assert.NoError(t, err)
143+
144+
store := nodecap.NewFileNodeCapabilities(tempFile.Name())
145+
err = store.Load()
146+
assert.NoError(t, err)
147+
assert.Equal(t, "iptables", store.Get(nodecap.NodeCapabilityNetworkPolicyProvider))
148+
assert.Equal(t, "veth", store.Get(nodecap.NodeCapabilityDataPath))
149+
assert.Equal(t, True, store.Get(nodecap.NodeCapabilityHasCiliumChainer))
150+
}
151+
152+
func Test_storeRuntimeConfig_with_no_relevant_plugins(t *testing.T) {
153+
tempFile, err := os.CreateTemp("", "test_node_capabilities")
154+
assert.NoError(t, err)
155+
defer os.Remove(tempFile.Name())
156+
157+
container, err := gabs.ParseJSON([]byte(`{
158+
"plugins": [
159+
{
160+
"type": "portmap"
161+
}
162+
]
163+
}`))
164+
assert.NoError(t, err)
165+
166+
err = storeRuntimeConfig(tempFile.Name(), container)
167+
assert.NoError(t, err)
168+
169+
store := nodecap.NewFileNodeCapabilities(tempFile.Name())
170+
err = store.Load()
171+
assert.NoError(t, err)
172+
assert.Equal(t, False, store.Get(nodecap.NodeCapabilityHasCiliumChainer))
173+
}
174+
175+
func Test_storeRuntimeConfig_invalid_plugin_type(t *testing.T) {
176+
tempFile, err := os.CreateTemp("", "test_node_capabilities")
177+
assert.NoError(t, err)
178+
defer os.Remove(tempFile.Name())
179+
180+
container, err := gabs.ParseJSON([]byte(`{
181+
"plugins": [
182+
{
183+
"type": 123
184+
}
185+
]
186+
}`))
187+
assert.NoError(t, err)
188+
189+
err = storeRuntimeConfig(tempFile.Name(), container)
190+
assert.Error(t, err)
191+
assert.Contains(t, err.Error(), "type must be string")
192+
}
193+
194+
func Test_storeRuntimeConfig_missing_type(t *testing.T) {
195+
tempFile, err := os.CreateTemp("", "test_node_capabilities")
196+
assert.NoError(t, err)
197+
defer os.Remove(tempFile.Name())
198+
199+
container, err := gabs.ParseJSON([]byte(`{
200+
"plugins": [
201+
{
202+
"name": "test"
203+
}
204+
]
205+
}`))
206+
assert.NoError(t, err)
207+
208+
err = storeRuntimeConfig(tempFile.Name(), container)
209+
assert.Error(t, err)
210+
assert.Contains(t, err.Error(), "type must be string")
211+
}
212+
213+
func Test_storeRuntimeConfig_empty_plugins(t *testing.T) {
214+
tempFile, err := os.CreateTemp("", "test_node_capabilities")
215+
assert.NoError(t, err)
216+
defer os.Remove(tempFile.Name())
217+
218+
container, err := gabs.ParseJSON([]byte(`{
219+
"plugins": []
220+
}`))
221+
assert.NoError(t, err)
222+
223+
err = storeRuntimeConfig(tempFile.Name(), container)
224+
assert.NoError(t, err)
225+
226+
store := nodecap.NewFileNodeCapabilities(tempFile.Name())
227+
err = store.Load()
228+
assert.NoError(t, err)
229+
assert.Equal(t, False, store.Get(nodecap.NodeCapabilityHasCiliumChainer))
230+
}
231+
232+
func Test_storeRuntimeConfig_terway_without_optional_fields(t *testing.T) {
233+
tempFile, err := os.CreateTemp("", "test_node_capabilities")
234+
assert.NoError(t, err)
235+
defer os.Remove(tempFile.Name())
236+
237+
container, err := gabs.ParseJSON([]byte(`{
238+
"plugins": [
239+
{
240+
"type": "terway"
241+
}
242+
]
243+
}`))
244+
assert.NoError(t, err)
245+
246+
err = storeRuntimeConfig(tempFile.Name(), container)
247+
assert.NoError(t, err)
248+
249+
store := nodecap.NewFileNodeCapabilities(tempFile.Name())
250+
err = store.Load()
251+
assert.NoError(t, err)
252+
assert.Equal(t, "", store.Get(nodecap.NodeCapabilityNetworkPolicyProvider))
253+
assert.Equal(t, "", store.Get(nodecap.NodeCapabilityDataPath))
254+
assert.Equal(t, False, store.Get(nodecap.NodeCapabilityHasCiliumChainer))
255+
}
256+
257+
func Test_storeRuntimeConfig_store_load_error(t *testing.T) {
258+
// Use an invalid file path to trigger load error
259+
container, err := gabs.ParseJSON([]byte(`{
260+
"plugins": [
261+
{
262+
"type": "terway"
263+
}
264+
]
265+
}`))
266+
assert.NoError(t, err)
267+
268+
// Use a directory path instead of file path to cause save error
269+
err = storeRuntimeConfig("/", container)
270+
assert.Error(t, err)
271+
}
272+
273+
func Test_isMounted(t *testing.T) {
274+
_, err := isMounted("/sys/fs/cgroup")
275+
assert.NoError(t, err)
276+
}

cmd/terway-cli/net_test.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package main
2+
3+
import (
4+
"testing"
5+
6+
"github.com/stretchr/testify/assert"
7+
)
8+
9+
func Test_GetNetInterfaces(t *testing.T) {
10+
_, err := getNetInterfaces()
11+
assert.NoError(t, err)
12+
}
13+
14+
func Test_GetInterfaceByMAC(t *testing.T) {
15+
_, err := getInterfaceByMAC("aa")
16+
assert.Error(t, err)
17+
}

daemon/daemon_linux.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package daemon
33
import (
44
"context"
55
"encoding/binary"
6+
"errors"
67
"net"
78

89
"github.com/samber/lo"
@@ -18,7 +19,7 @@ import (
1819
func gcPolicyRoutes(ctx context.Context, mac string, containerIPNet *types.IPNetSet, namespace, name string) error {
1920
index, err := link.GetDeviceNumber(mac)
2021
if err != nil {
21-
if _, ok := err.(netlink.LinkNotFoundError); ok {
22+
if errors.Is(err, link.ErrNotFound) {
2223
return nil
2324
}
2425
return err

0 commit comments

Comments
 (0)