@@ -26,13 +26,51 @@ const (
2626)
2727
2828var (
29- expectedCSP = map [consolev1.DirectiveType ][]string {
29+ expectedCSPSinglePlugin = map [consolev1.DirectiveType ][]string {
30+ consolev1 .ConnectSrc : {"connect1" },
31+ consolev1 .DefaultSrc : {"source1" , "source2" },
32+ consolev1 .ImgSrc : {"image1" },
33+ }
34+
35+ pluginCSPSinglePlugin = map [string ][]consolev1.ConsolePluginCSP {
36+ fmt .Sprintf ("%s-1" , availablePluginName ): {
37+ {Directive : consolev1 .ConnectSrc , Values : []consolev1.CSPDirectiveValue {"connect1" }},
38+ {Directive : consolev1 .DefaultSrc , Values : []consolev1.CSPDirectiveValue {"source1" , "source2" }},
39+ {Directive : consolev1 .ImgSrc , Values : []consolev1.CSPDirectiveValue {"image1" }},
40+ },
41+ }
42+
43+ expectedCSPMultiplePluginsWithoutCSP = map [consolev1.DirectiveType ][]string {
44+ consolev1 .DefaultSrc : {"source1" , "source2" },
45+ }
46+
47+ pluginCSPMultiplePluginsWithoutCSP = map [string ][]consolev1.ConsolePluginCSP {
48+ fmt .Sprintf ("%s-1" , availablePluginName ): {
49+ {Directive : consolev1 .DefaultSrc , Values : []consolev1.CSPDirectiveValue {"source1" , "source2" }},
50+ },
51+ fmt .Sprintf ("%s-2" , availablePluginName ): {},
52+ }
53+
54+ expectedCSPMultiplePlugins = map [consolev1.DirectiveType ][]string {
55+ consolev1 .DefaultSrc : {"source1" , "source2" , "source3" , "source4" },
56+ }
57+
58+ pluginCSPMultiplePlugins = map [string ][]consolev1.ConsolePluginCSP {
59+ fmt .Sprintf ("%s-1" , availablePluginName ): {
60+ {Directive : consolev1 .DefaultSrc , Values : []consolev1.CSPDirectiveValue {"source1" , "source2" }},
61+ },
62+ fmt .Sprintf ("%s-2" , availablePluginName ): {
63+ {Directive : consolev1 .DefaultSrc , Values : []consolev1.CSPDirectiveValue {"source3" , "source4" }},
64+ },
65+ }
66+
67+ expectedCSPMultiplePluginsWithDuplicates = map [consolev1.DirectiveType ][]string {
3068 consolev1 .DefaultSrc : {"source1" , "source2" , "source3" },
3169 consolev1 .StyleSrc : {"style1" , "style2" },
3270 consolev1 .ImgSrc : {"image1" },
3371 }
3472
35- pluginCSPs = map [string ][]consolev1.ConsolePluginCSP {
73+ pluginCSPMultiplePluginsWithDuplicates = map [string ][]consolev1.ConsolePluginCSP {
3674 fmt .Sprintf ("%s-1" , availablePluginName ): {
3775 {Directive : consolev1 .DefaultSrc , Values : []consolev1.CSPDirectiveValue {"source1" , "source2" }},
3876 {Directive : consolev1 .StyleSrc , Values : []consolev1.CSPDirectiveValue {"style1" , "style2" }},
4381 {Directive : consolev1 .ImgSrc , Values : []consolev1.CSPDirectiveValue {"image1" }},
4482 },
4583 }
84+
85+ expectedCSPMultiplePluginsWithMutualExclusion = map [consolev1.DirectiveType ][]string {
86+ consolev1 .ConnectSrc : {"connect1" },
87+ consolev1 .DefaultSrc : {"source1" },
88+ consolev1 .FontSrc : {"font1" },
89+ consolev1 .ImgSrc : {"image1" },
90+ consolev1 .ScriptSrc : {"script1" },
91+ consolev1 .StyleSrc : {"style1" },
92+ }
93+
94+ pluginCSPMultiplePluginsWithMutualExclusion = map [string ][]consolev1.ConsolePluginCSP {
95+ fmt .Sprintf ("%s-1" , availablePluginName ): {
96+ {Directive : consolev1 .ConnectSrc , Values : []consolev1.CSPDirectiveValue {"connect1" }},
97+ },
98+ fmt .Sprintf ("%s-2" , availablePluginName ): {
99+ {Directive : consolev1 .DefaultSrc , Values : []consolev1.CSPDirectiveValue {"source1" }},
100+ },
101+ fmt .Sprintf ("%s-3" , availablePluginName ): {
102+ {Directive : consolev1 .FontSrc , Values : []consolev1.CSPDirectiveValue {"font1" }},
103+ },
104+ fmt .Sprintf ("%s-4" , availablePluginName ): {
105+ {Directive : consolev1 .ImgSrc , Values : []consolev1.CSPDirectiveValue {"image1" }},
106+ },
107+ fmt .Sprintf ("%s-5" , availablePluginName ): {
108+ {Directive : consolev1 .ScriptSrc , Values : []consolev1.CSPDirectiveValue {"script1" }},
109+ },
110+ fmt .Sprintf ("%s-6" , availablePluginName ): {
111+ {Directive : consolev1 .StyleSrc , Values : []consolev1.CSPDirectiveValue {"style1" }},
112+ },
113+ }
46114)
47115
48116// setupTestCase initializes test case dependencies and returns a client and list of default plugins.
@@ -62,24 +130,90 @@ func cleanupTestCase(t *testing.T, client *framework.ClientSet, defaultPlugins,
62130}
63131
64132// TestPluginsCSPAggregation verifies correct CSP aggregation from multiple plugins.
65- func TestPluginsCSPAggregation (t * testing.T ) {
133+ func TestPluginsCSPSinglePlugin (t * testing.T ) {
134+ client , defaultPlugins := setupTestCase (t )
135+
136+ isFeatureGateSet := framework .IsFeatureGateSet (t , client )
137+ if ! isFeatureGateSet {
138+ t .Skip ("Feature gate not set, skipping test" )
139+ }
140+
141+ defer cleanupTestCase (t , client , defaultPlugins , maps .Keys (pluginCSPSinglePlugin ))
142+
143+ for name , csp := range pluginCSPSinglePlugin {
144+ createConsolePlugin (t , client , getPlugin (name , csp ))
145+ }
146+ setOperatorConfigPlugins (t , client , maps .Keys (pluginCSPSinglePlugin ))
147+ verifyConsoleConfigCSP (t , client , expectedCSPSinglePlugin )
148+ }
149+
150+ func TestPluginsCSPMultiplePluginsWithoutCSP (t * testing.T ) {
151+ client , defaultPlugins := setupTestCase (t )
152+
153+ isFeatureGateSet := framework .IsFeatureGateSet (t , client )
154+ if ! isFeatureGateSet {
155+ t .Skip ("Feature gate not set, skipping test" )
156+ }
157+
158+ defer cleanupTestCase (t , client , defaultPlugins , maps .Keys (pluginCSPMultiplePluginsWithoutCSP ))
159+
160+ for name , csp := range pluginCSPMultiplePluginsWithoutCSP {
161+ createConsolePlugin (t , client , getPlugin (name , csp ))
162+ }
163+ setOperatorConfigPlugins (t , client , maps .Keys (pluginCSPMultiplePluginsWithoutCSP ))
164+ verifyConsoleConfigCSP (t , client , expectedCSPMultiplePluginsWithoutCSP )
165+ }
166+
167+ func TestPluginsCSPMultiplePlugins (t * testing.T ) {
168+ client , defaultPlugins := setupTestCase (t )
169+
170+ isFeatureGateSet := framework .IsFeatureGateSet (t , client )
171+ if ! isFeatureGateSet {
172+ t .Skip ("Feature gate not set, skipping test" )
173+ }
174+
175+ defer cleanupTestCase (t , client , defaultPlugins , maps .Keys (pluginCSPMultiplePlugins ))
176+
177+ for name , csp := range pluginCSPMultiplePlugins {
178+ createConsolePlugin (t , client , getPlugin (name , csp ))
179+ }
180+ setOperatorConfigPlugins (t , client , maps .Keys (pluginCSPMultiplePlugins ))
181+ verifyConsoleConfigCSP (t , client , expectedCSPMultiplePlugins )
182+ }
183+
184+ func TestPluginsCSPMultiplePluginsWithDuplicates (t * testing.T ) {
185+ client , defaultPlugins := setupTestCase (t )
186+
187+ isFeatureGateSet := framework .IsFeatureGateSet (t , client )
188+ if ! isFeatureGateSet {
189+ t .Skip ("Feature gate not set, skipping test" )
190+ }
191+
192+ defer cleanupTestCase (t , client , defaultPlugins , maps .Keys (pluginCSPMultiplePluginsWithDuplicates ))
193+
194+ for name , csp := range pluginCSPMultiplePluginsWithDuplicates {
195+ createConsolePlugin (t , client , getPlugin (name , csp ))
196+ }
197+ setOperatorConfigPlugins (t , client , maps .Keys (pluginCSPMultiplePluginsWithDuplicates ))
198+ verifyConsoleConfigCSP (t , client , expectedCSPMultiplePluginsWithDuplicates )
199+ }
200+ func TestPluginsCSPMultiplePluginsWithMutualExclusion (t * testing.T ) {
66201 client , defaultPlugins := setupTestCase (t )
67202
68203 isFeatureGateSet := framework .IsFeatureGateSet (t , client )
69204 if ! isFeatureGateSet {
70205 t .Skip ("Feature gate not set, skipping test" )
71206 }
72207
73- defer cleanupTestCase (t , client , defaultPlugins , defaultPlugins )
208+ defer cleanupTestCase (t , client , defaultPlugins , maps . Keys ( pluginCSPMultiplePluginsWithMutualExclusion ) )
74209
75- for name , csp := range pluginCSPs {
210+ for name , csp := range pluginCSPMultiplePluginsWithMutualExclusion {
76211 createConsolePlugin (t , client , getPlugin (name , csp ))
77212 }
78- setOperatorConfigPlugins (t , client , maps .Keys (pluginCSPs ))
79- verifyConsoleConfigCSP (t , client , expectedCSP )
213+ setOperatorConfigPlugins (t , client , maps .Keys (pluginCSPMultiplePluginsWithMutualExclusion ))
214+ verifyConsoleConfigCSP (t , client , expectedCSPMultiplePluginsWithMutualExclusion )
80215}
81216
82- // TestAddPlugins tests addition of available and unavailable plugins.
83217func TestAddPlugins (t * testing.T ) {
84218 expectedPlugins := map [string ]string {availablePluginName : expectedPluginServiceEndpoint }
85219 expectedI18nNamespaces := []string {expectedPluginNamespace }
0 commit comments