1
2
3
4 package graph
5
6 import (
7 "sort"
8 "testing"
9
10 "github.com/stretchr/testify/assert"
11 "k8s.io/apimachinery/pkg/runtime/schema"
12 "sigs.k8s.io/cli-utils/pkg/object"
13 )
14
15 func TestEdgeSort(t *testing.T) {
16 testCases := map[string]struct {
17 edges []Edge
18 expected []Edge
19 }{
20 "one edge": {
21 edges: []Edge{
22 {
23 From: object.ObjMetadata{Name: "obj1"},
24 To: object.ObjMetadata{Name: "obj2"},
25 },
26 },
27 expected: []Edge{
28 {
29 From: object.ObjMetadata{Name: "obj1"},
30 To: object.ObjMetadata{Name: "obj2"},
31 },
32 },
33 },
34 "two edges no change": {
35 edges: []Edge{
36 {
37 From: object.ObjMetadata{Name: "obj1"},
38 To: object.ObjMetadata{Name: "obj2"},
39 },
40 {
41 From: object.ObjMetadata{Name: "obj2"},
42 To: object.ObjMetadata{Name: "obj3"},
43 },
44 },
45 expected: []Edge{
46 {
47 From: object.ObjMetadata{Name: "obj1"},
48 To: object.ObjMetadata{Name: "obj2"},
49 },
50 {
51 From: object.ObjMetadata{Name: "obj2"},
52 To: object.ObjMetadata{Name: "obj3"},
53 },
54 },
55 },
56 "two edges same from": {
57 edges: []Edge{
58 {
59 From: object.ObjMetadata{Name: "obj1"},
60 To: object.ObjMetadata{Name: "obj3"},
61 },
62 {
63 From: object.ObjMetadata{Name: "obj1"},
64 To: object.ObjMetadata{Name: "obj2"},
65 },
66 },
67 expected: []Edge{
68 {
69 From: object.ObjMetadata{Name: "obj1"},
70 To: object.ObjMetadata{Name: "obj2"},
71 },
72 {
73 From: object.ObjMetadata{Name: "obj1"},
74 To: object.ObjMetadata{Name: "obj3"},
75 },
76 },
77 },
78 "two edges": {
79 edges: []Edge{
80 {
81 From: object.ObjMetadata{Name: "obj2"},
82 To: object.ObjMetadata{Name: "obj3"},
83 },
84 {
85 From: object.ObjMetadata{Name: "obj1"},
86 To: object.ObjMetadata{Name: "obj2"},
87 },
88 },
89 expected: []Edge{
90 {
91 From: object.ObjMetadata{Name: "obj1"},
92 To: object.ObjMetadata{Name: "obj2"},
93 },
94 {
95 From: object.ObjMetadata{Name: "obj2"},
96 To: object.ObjMetadata{Name: "obj3"},
97 },
98 },
99 },
100 "two edges by name": {
101 edges: []Edge{
102 {
103 From: object.ObjMetadata{Name: "obj2", Namespace: "ns1", GroupKind: schema.GroupKind{Kind: "Pod"}},
104 To: object.ObjMetadata{Name: "obj3", Namespace: "ns1", GroupKind: schema.GroupKind{Kind: "Pod"}},
105 },
106 {
107 From: object.ObjMetadata{Name: "obj1", Namespace: "ns1", GroupKind: schema.GroupKind{Kind: "Pod"}},
108 To: object.ObjMetadata{Name: "obj2", Namespace: "ns1", GroupKind: schema.GroupKind{Kind: "Pod"}},
109 },
110 },
111 expected: []Edge{
112 {
113 From: object.ObjMetadata{Name: "obj1", Namespace: "ns1", GroupKind: schema.GroupKind{Kind: "Pod"}},
114 To: object.ObjMetadata{Name: "obj2", Namespace: "ns1", GroupKind: schema.GroupKind{Kind: "Pod"}},
115 },
116 {
117 From: object.ObjMetadata{Name: "obj2", Namespace: "ns1", GroupKind: schema.GroupKind{Kind: "Pod"}},
118 To: object.ObjMetadata{Name: "obj3", Namespace: "ns1", GroupKind: schema.GroupKind{Kind: "Pod"}},
119 },
120 },
121 },
122 "three edges": {
123 edges: []Edge{
124 {
125 From: object.ObjMetadata{Name: "obj3"},
126 To: object.ObjMetadata{Name: "obj4"},
127 },
128 {
129 From: object.ObjMetadata{Name: "obj2"},
130 To: object.ObjMetadata{Name: "obj3"},
131 },
132 {
133 From: object.ObjMetadata{Name: "obj1"},
134 To: object.ObjMetadata{Name: "obj2"},
135 },
136 },
137 expected: []Edge{
138 {
139 From: object.ObjMetadata{Name: "obj1"},
140 To: object.ObjMetadata{Name: "obj2"},
141 },
142 {
143 From: object.ObjMetadata{Name: "obj2"},
144 To: object.ObjMetadata{Name: "obj3"},
145 },
146 {
147 From: object.ObjMetadata{Name: "obj3"},
148 To: object.ObjMetadata{Name: "obj4"},
149 },
150 },
151 },
152 "two edges cycle": {
153 edges: []Edge{
154 {
155 From: object.ObjMetadata{Name: "obj2", Namespace: "ns1", GroupKind: schema.GroupKind{Kind: "Pod"}},
156 To: object.ObjMetadata{Name: "obj1", Namespace: "ns1", GroupKind: schema.GroupKind{Kind: "Pod"}},
157 },
158 {
159 From: object.ObjMetadata{Name: "obj1", Namespace: "ns1", GroupKind: schema.GroupKind{Kind: "Pod"}},
160 To: object.ObjMetadata{Name: "obj2", Namespace: "ns1", GroupKind: schema.GroupKind{Kind: "Pod"}},
161 },
162 },
163 expected: []Edge{
164 {
165 From: object.ObjMetadata{Name: "obj1", Namespace: "ns1", GroupKind: schema.GroupKind{Kind: "Pod"}},
166 To: object.ObjMetadata{Name: "obj2", Namespace: "ns1", GroupKind: schema.GroupKind{Kind: "Pod"}},
167 },
168 {
169 From: object.ObjMetadata{Name: "obj2", Namespace: "ns1", GroupKind: schema.GroupKind{Kind: "Pod"}},
170 To: object.ObjMetadata{Name: "obj1", Namespace: "ns1", GroupKind: schema.GroupKind{Kind: "Pod"}},
171 },
172 },
173 },
174 "three edges cycle": {
175 edges: []Edge{
176 {
177 From: object.ObjMetadata{Name: "obj3"},
178 To: object.ObjMetadata{Name: "obj1"},
179 },
180 {
181 From: object.ObjMetadata{Name: "obj2"},
182 To: object.ObjMetadata{Name: "obj3"},
183 },
184 {
185 From: object.ObjMetadata{Name: "obj1"},
186 To: object.ObjMetadata{Name: "obj2"},
187 },
188 },
189 expected: []Edge{
190 {
191 From: object.ObjMetadata{Name: "obj1"},
192 To: object.ObjMetadata{Name: "obj2"},
193 },
194 {
195 From: object.ObjMetadata{Name: "obj2"},
196 To: object.ObjMetadata{Name: "obj3"},
197 },
198 {
199 From: object.ObjMetadata{Name: "obj3"},
200 To: object.ObjMetadata{Name: "obj1"},
201 },
202 },
203 },
204 }
205
206 for tn, tc := range testCases {
207 t.Run(tn, func(t *testing.T) {
208 sort.Sort(SortableEdges(tc.edges))
209 assert.Equal(t, tc.expected, tc.edges)
210 })
211 }
212 }
213
View as plain text