-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathshell_test.go
More file actions
98 lines (91 loc) · 2.94 KB
/
shell_test.go
File metadata and controls
98 lines (91 loc) · 2.94 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
package parse
import (
"testing"
"github.com/stretchr/testify/require"
)
func TestParseSHELL(t *testing.T) {
tests := []struct {
name string
dockerfileContent string
expectedRules []string // Rule codes expected to be present
}{
// Valid SHELL instructions
{
name: "default Linux shell",
dockerfileContent: `SHELL ["/bin/sh", "-c"]`,
expectedRules: []string{},
},
{
name: "default Windows shell",
dockerfileContent: `SHELL ["cmd", "/S", "/C"]`,
expectedRules: []string{},
},
{
name: "PowerShell configuration",
dockerfileContent: `SHELL ["powershell", "-command"]`,
expectedRules: []string{},
},
{
name: "single executable",
dockerfileContent: `SHELL ["sh"]`,
expectedRules: []string{},
},
// Invalid SHELL instructions
{
name: "invalid JSON - empty array",
dockerfileContent: "SHELL []",
expectedRules: []string{"InvalidInstruction"},
},
{
name: "invalid JSON - single quotes",
dockerfileContent: `SHELL ['/bin/sh', '-c']`,
expectedRules: []string{"ShellInvalidJsonForm"},
},
{
name: "invalid JSON - shell form (not JSON)",
dockerfileContent: "SHELL /bin/bash -c",
expectedRules: []string{"ShellRequiresJsonForm"},
},
{
name: "invalid JSON - not valid JSON",
dockerfileContent: `SHELL [/bin/sh, -c]`,
expectedRules: []string{"ShellInvalidJsonForm"},
},
{
name: "invalid JSON - missing closing bracket",
dockerfileContent: `SHELL ["/bin/sh", "-c"`,
expectedRules: []string{"ShellInvalidJsonForm"},
},
{
name: "invalid JSON - mixed quotes",
dockerfileContent: `SHELL ["/bin/sh", '-c']`,
expectedRules: []string{"ShellInvalidJsonForm"},
},
{
name: "no arguments",
dockerfileContent: "SHELL",
expectedRules: []string{"InvalidInstruction"},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
result, err := ParseDockerfile(tt.dockerfileContent)
require.NoError(t, err, "ParseDockerfile should not return an error for valid Dockerfile")
require.NotNil(t, result, "ParseDockerfile should return a non-nil result")
// Check that we don't have extra unexpected rules
if len(tt.expectedRules) == 0 {
require.Empty(t, result.Rules, "Expected no rules but got: %v", result.Rules)
} else {
require.Equal(t, len(tt.expectedRules), len(result.Rules), "Number of rules doesn't match expected. Got: %v", result.Rules)
// Check that expected rules are present
actualRuleCodes := make(map[string]bool)
for _, rule := range result.Rules {
actualRuleCodes[rule.Code] = true
}
for _, expectedCode := range tt.expectedRules {
require.True(t, actualRuleCodes[expectedCode], "Expected rule code %q not found in results. Got rules: %v", expectedCode, result.Rules)
}
}
})
}
}