@@ -11,60 +11,199 @@ import (
1111)
1212
1313type mockMapper struct {
14+ t * testing.T
15+ expectedRoutes []preLoadRouteDescriptor
16+ mapToReturn map [int ][]preLoadRouteDescriptor
1417}
1518
16- func (m mockMapper ) Map (context context.Context , gw * gwv1.Gateway , routes []preLoadRouteDescriptor ) (map [int ][]preLoadRouteDescriptor , error ) {
17- return map [int ][]preLoadRouteDescriptor {}, nil
19+ func (m * mockMapper ) Map (context context.Context , gw * gwv1.Gateway , routes []preLoadRouteDescriptor ) (map [int ][]preLoadRouteDescriptor , error ) {
20+ assert .ElementsMatch (m .t , m .expectedRoutes , routes )
21+ return m .mapToReturn , nil
22+ }
23+
24+ var _ RouteDescriptor = & mockRoute {}
25+
26+ type mockRoute struct {
27+ namespacedName types.NamespacedName
28+ routeKind string
29+ }
30+
31+ func (m * mockRoute ) loadAttachedRules (context context.Context , k8sClient client.Client ) (RouteDescriptor , error ) {
32+ return m , nil
33+ }
34+
35+ func (m * mockRoute ) GetRouteNamespacedName () types.NamespacedName {
36+ return m .namespacedName
37+ }
38+
39+ func (m * mockRoute ) GetRouteKind () string {
40+ return m .routeKind
41+ }
42+
43+ func (m * mockRoute ) GetHostnames () []gwv1.Hostname {
44+ //TODO implement me
45+ panic ("implement me" )
46+ }
47+
48+ func (m * mockRoute ) GetParentRefs () []gwv1.ParentReference {
49+ //TODO implement me
50+ panic ("implement me" )
51+ }
52+
53+ func (m * mockRoute ) GetRawRoute () interface {} {
54+ //TODO implement me
55+ panic ("implement me" )
56+ }
57+
58+ func (m * mockRoute ) GetAttachedRules () []RouteRule {
59+ //TODO implement me
60+ panic ("implement me" )
1861}
1962
2063func TestLoadRoutesForGateway (t * testing.T ) {
64+ preLoadHTTPRoutes := []preLoadRouteDescriptor {
65+ & mockRoute {
66+ namespacedName : types.NamespacedName {
67+ Namespace : "http1-ns" ,
68+ Name : "http1" ,
69+ },
70+ routeKind : HTTPRouteKind ,
71+ },
72+ & mockRoute {
73+ namespacedName : types.NamespacedName {
74+ Namespace : "http2-ns" ,
75+ Name : "http2" ,
76+ },
77+ routeKind : HTTPRouteKind ,
78+ },
79+ & mockRoute {
80+ namespacedName : types.NamespacedName {
81+ Namespace : "http3-ns" ,
82+ Name : "http3" ,
83+ },
84+ routeKind : HTTPRouteKind ,
85+ },
86+ }
87+
88+ loadedHTTPRoutes := make ([]RouteDescriptor , 0 )
89+ for _ , preload := range preLoadHTTPRoutes {
90+ r , _ := preload .loadAttachedRules (nil , nil )
91+ loadedHTTPRoutes = append (loadedHTTPRoutes , r )
92+ }
93+
94+ preLoadTCPRoutes := []preLoadRouteDescriptor {
95+ & mockRoute {
96+ namespacedName : types.NamespacedName {
97+ Namespace : "tcp1-ns" ,
98+ Name : "tcp1" ,
99+ },
100+ routeKind : TCPRouteKind ,
101+ },
102+ & mockRoute {
103+ namespacedName : types.NamespacedName {
104+ Namespace : "tcp2-ns" ,
105+ Name : "tcp2" ,
106+ },
107+ routeKind : TCPRouteKind ,
108+ },
109+ & mockRoute {
110+ namespacedName : types.NamespacedName {
111+ Namespace : "tcp3-ns" ,
112+ Name : "tcp3" ,
113+ },
114+ routeKind : TCPRouteKind ,
115+ },
116+ }
21117
22- noOpLoader := func (ctx context.Context , k8sClient client.Client , typeSpecificBackend interface {}, backendRef gwv1.BackendRef , routeIdentifier types.NamespacedName , routeKind string ) (* Backend , error ) {
23- return & Backend {}, nil
118+ loadedTCPRoutes := make ([]RouteDescriptor , 0 )
119+ for _ , preload := range preLoadTCPRoutes {
120+ r , _ := preload .loadAttachedRules (nil , nil )
121+ loadedTCPRoutes = append (loadedTCPRoutes , r )
24122 }
25123
26124 allRouteLoaders := map [string ]func (ctx context.Context , k8sClient client.Client ) ([]preLoadRouteDescriptor , error ){
27125 HTTPRouteKind : func (ctx context.Context , k8sClient client.Client ) ([]preLoadRouteDescriptor , error ) {
28- return []preLoadRouteDescriptor {
29- & httpRouteDescription {backendLoader : noOpLoader },
30- & httpRouteDescription {backendLoader : noOpLoader },
31- & httpRouteDescription {backendLoader : noOpLoader },
32- }, nil
126+ return preLoadHTTPRoutes , nil
33127 },
34128 TCPRouteKind : func (ctx context.Context , k8sClient client.Client ) ([]preLoadRouteDescriptor , error ) {
35- return []preLoadRouteDescriptor {
36- & tcpRouteDescription {backendLoader : noOpLoader },
37- & tcpRouteDescription {backendLoader : noOpLoader },
38- & tcpRouteDescription {backendLoader : noOpLoader },
39- }, nil
129+ return preLoadTCPRoutes , nil
40130 },
41131 }
42132
43- loader := loaderImpl {
44- mapper : & mockMapper {},
45- allRouteLoaders : allRouteLoaders ,
46- }
47-
48133 testCases := []struct {
49- name string
50- acceptedKinds sets.Set [string ]
51- expectedMap map [int ][]RouteDescriptor
52- expectError bool
134+ name string
135+ acceptedKinds sets.Set [string ]
136+ expectedMap map [int ][]RouteDescriptor
137+ expectedPreloadMap map [int ][]preLoadRouteDescriptor
138+ expectedPreMappedRoutes []preLoadRouteDescriptor
139+ expectError bool
53140 }{
54141 {
55- name : "filter allows no routes" ,
56- acceptedKinds : make (sets.Set [string ]),
57- expectedMap : make (map [int ][]RouteDescriptor ),
142+ name : "filter allows no routes" ,
143+ acceptedKinds : make (sets.Set [string ]),
144+ expectedPreMappedRoutes : make ([]preLoadRouteDescriptor , 0 ),
145+ expectedMap : make (map [int ][]RouteDescriptor ),
58146 },
59147 {
60- name : "filter only allows http route" ,
61- acceptedKinds : sets.New [string ](HTTPRouteKind ),
62- expectedMap : make (map [int ][]RouteDescriptor ),
148+ name : "filter only allows http route" ,
149+ acceptedKinds : sets.New [string ](HTTPRouteKind ),
150+ expectedPreMappedRoutes : preLoadHTTPRoutes ,
151+ expectedPreloadMap : map [int ][]preLoadRouteDescriptor {
152+ 80 : preLoadHTTPRoutes ,
153+ },
154+ expectedMap : map [int ][]RouteDescriptor {
155+ 80 : loadedHTTPRoutes ,
156+ },
157+ },
158+ {
159+ name : "filter only allows http route, multiple ports" ,
160+ acceptedKinds : sets.New [string ](HTTPRouteKind ),
161+ expectedPreMappedRoutes : preLoadHTTPRoutes ,
162+ expectedPreloadMap : map [int ][]preLoadRouteDescriptor {
163+ 80 : preLoadHTTPRoutes ,
164+ 443 : preLoadHTTPRoutes ,
165+ },
166+ expectedMap : map [int ][]RouteDescriptor {
167+ 80 : loadedHTTPRoutes ,
168+ 443 : loadedHTTPRoutes ,
169+ },
170+ },
171+ {
172+ name : "filter only allows tcp route" ,
173+ acceptedKinds : sets.New [string ](TCPRouteKind ),
174+ expectedPreMappedRoutes : preLoadTCPRoutes ,
175+ expectedPreloadMap : map [int ][]preLoadRouteDescriptor {
176+ 80 : preLoadTCPRoutes ,
177+ },
178+ expectedMap : map [int ][]RouteDescriptor {
179+ 80 : loadedTCPRoutes ,
180+ },
181+ },
182+ {
183+ name : "filter allows both route kinds" ,
184+ acceptedKinds : sets .New [string ](TCPRouteKind , HTTPRouteKind ),
185+ expectedPreMappedRoutes : append (preLoadHTTPRoutes , preLoadTCPRoutes ... ),
186+ expectedPreloadMap : map [int ][]preLoadRouteDescriptor {
187+ 80 : preLoadTCPRoutes ,
188+ 443 : preLoadHTTPRoutes ,
189+ },
190+ expectedMap : map [int ][]RouteDescriptor {
191+ 80 : loadedTCPRoutes ,
192+ 443 : loadedHTTPRoutes ,
193+ },
63194 },
64195 }
65196
66197 for _ , tc := range testCases {
67198 t .Run (tc .name , func (t * testing.T ) {
199+ loader := loaderImpl {
200+ mapper : & mockMapper {
201+ t : t ,
202+ expectedRoutes : tc .expectedPreMappedRoutes ,
203+ mapToReturn : tc .expectedPreloadMap ,
204+ },
205+ allRouteLoaders : allRouteLoaders ,
206+ }
68207
69208 filter := & routeFilterImpl {acceptedKinds : tc .acceptedKinds }
70209 result , err := loader .LoadRoutesForGateway (context .Background (), & gwv1.Gateway {}, filter )
0 commit comments