@@ -19,6 +19,7 @@ limitations under the License.
1919package server
2020
2121import (
22+ "strings"
2223 "testing"
2324
2425 "github.com/opencontainers/selinux/go-selinux"
@@ -35,6 +36,7 @@ func TestInitSelinuxOpts(t *testing.T) {
3536 selinuxOpt * runtime.SELinuxOption
3637 processLabel string
3738 mountLabels []string
39+ expectErr bool
3840 }{
3941 "Should return empty strings for processLabel and mountLabel when selinuxOpt is nil" : {
4042 selinuxOpt : nil ,
@@ -61,12 +63,108 @@ func TestInitSelinuxOpts(t *testing.T) {
6163 processLabel : "user_u:user_r:user_t:s0:c1,c2" ,
6264 mountLabels : []string {"user_u:object_r:container_file_t:s0:c1,c2" , "user_u:object_r:svirt_sandbox_file_t:s0:c1,c2" },
6365 },
66+ "Should be resolved correctly when selinuxOpt has been initialized with level=''" : {
67+ selinuxOpt : & runtime.SELinuxOption {
68+ User : "user_u" ,
69+ Role : "user_r" ,
70+ Type : "user_t" ,
71+ Level : "" ,
72+ },
73+ processLabel : "user_u:user_r:user_t:s0" ,
74+ mountLabels : []string {"user_u:object_r:container_file_t:s0" , "user_u:object_r:svirt_sandbox_file_t:s0" },
75+ },
76+ "Should return error when the format of 'level' is not correct" : {
77+ selinuxOpt : & runtime.SELinuxOption {
78+ User : "user_u" ,
79+ Role : "user_r" ,
80+ Type : "user_t" ,
81+ Level : "s0,c1,c2" ,
82+ },
83+ expectErr : true ,
84+ },
6485 } {
6586 t .Run (desc , func (t * testing.T ) {
6687 processLabel , mountLabel , err := initSelinuxOpts (test .selinuxOpt )
67- assert .NoError (t , err )
68- assert .Equal (t , test .processLabel , processLabel )
69- assert .Contains (t , test .mountLabels , mountLabel )
88+ if test .expectErr {
89+ assert .Error (t , err )
90+ } else {
91+ assert .NoError (t , err )
92+ if test .selinuxOpt == nil || test .selinuxOpt .Level != "" {
93+ assert .Equal (t , test .processLabel , processLabel )
94+ assert .Contains (t , test .mountLabels , mountLabel )
95+ } else {
96+ assert .Equal (t , 0 , strings .LastIndex (processLabel , test .processLabel ))
97+ contain := strings .LastIndex (mountLabel , test .mountLabels [0 ]) == 0 ||
98+ strings .LastIndex (mountLabel , test .mountLabels [1 ]) == 0
99+ assert .True (t , contain )
100+ }
101+ }
102+ })
103+ }
104+ }
105+
106+ func TestCheckSelinuxLevel (t * testing.T ) {
107+ for desc , test := range map [string ]struct {
108+ level string
109+ expectErr bool
110+ }{
111+ "s0" : {
112+ level : "s0" ,
113+ },
114+ "s0-s0" : {
115+ level : "s0-s0" ,
116+ },
117+ "s0:c0" : {
118+ level : "s0:c0" ,
119+ },
120+ "s0:c0.c3" : {
121+ level : "s0:c0.c3" ,
122+ },
123+ "s0:c0,c3" : {
124+ level : "s0:c0,c3" ,
125+ },
126+ "s0-s0:c0,c3" : {
127+ level : "s0-s0:c0,c3" ,
128+ },
129+ "s0-s0:c0,c3.c6" : {
130+ level : "s0-s0:c0,c3.c6" ,
131+ },
132+ "s0-s0:c0,c3.c6,c8.c10" : {
133+ level : "s0-s0:c0,c3.c6,c8.c10" ,
134+ },
135+ "s0-s0:c0,c3.c6,c8,c10" : {
136+ level : "s0-s0:c0,c3.c6" ,
137+ },
138+ "s0,c0,c3" : {
139+ level : "s0,c0,c3" ,
140+ expectErr : true ,
141+ },
142+ "s0:c0.c3.c6" : {
143+ level : "s0:c0.c3.c6" ,
144+ expectErr : true ,
145+ },
146+ "s0-s0,c0,c3" : {
147+ level : "s0-s0,c0,c3" ,
148+ expectErr : true ,
149+ },
150+ "s0-s0:c0.c3.c6" : {
151+ level : "s0-s0:c0.c3.c6" ,
152+ expectErr : true ,
153+ },
154+ "s0-s0:c0,c3.c6.c8" : {
155+ level : "s0-s0:c0,c3.c6.c8" ,
156+ expectErr : true ,
157+ },
158+ } {
159+ t .Run (desc , func (t * testing.T ) {
160+ ok , err := checkSelinuxLevel (test .level )
161+ if test .expectErr {
162+ assert .Error (t , err )
163+ assert .False (t , ok )
164+ } else {
165+ assert .NoError (t , err )
166+ assert .True (t , ok )
167+ }
70168 })
71169 }
72170}
0 commit comments