Skip to content

Commit cd83cd2

Browse files
Merge pull request #975 from jhadvig/junit2
CONSOLE-4481: Add additional CSP test
2 parents 66fbbb1 + b79f52a commit cd83cd2

2 files changed

Lines changed: 146 additions & 8 deletions

File tree

test-e2e.sh

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ echo "Running tests..."
1111
if [ "$OPENSHIFT_CI" = true ]; then
1212
KUBERNETES_CONFIG=${KUBECONFIG} go test -timeout 30m -v ./test/e2e/ 2>&1 | tee "$ARTIFACT_DIR/test.out"
1313
RESULT="${PIPESTATUS[0]}"
14+
# This is a hack for add prefix to the TestPluginsCSP* test names, so sippy can read them.
15+
# Remove once the Featuregate is lifted.
16+
sed -i 's/TestPluginsCSP/[OCPFeatureGate:ConsolePluginContentSecurityPolicy]&/g' "$ARTIFACT_DIR/test.out"
17+
1418
go-junit-report < "$ARTIFACT_DIR/test.out" > "$ARTIFACT_DIR/junit.xml"
1519
if [ "$RESULT" -ne 0 ]; then
1620
exit 255

test/e2e/plugins_test.go

Lines changed: 142 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,51 @@ const (
2626
)
2727

2828
var (
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"}},
@@ -43,6 +81,36 @@ var (
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.
83217
func TestAddPlugins(t *testing.T) {
84218
expectedPlugins := map[string]string{availablePluginName: expectedPluginServiceEndpoint}
85219
expectedI18nNamespaces := []string{expectedPluginNamespace}

0 commit comments

Comments
 (0)