github.com/hanks177/podman/v4@v4.1.3-0.20220613032544-16d90015bc83/pkg/util/utils_test.go (about) 1 package util 2 3 import ( 4 "fmt" 5 "testing" 6 "time" 7 8 "github.com/stretchr/testify/assert" 9 "github.com/stretchr/testify/require" 10 ) 11 12 var ( 13 sliceData = []string{"one", "two", "three", "four"} 14 ) 15 16 func TestStringInSlice(t *testing.T) { 17 // string is in the slice 18 assert.True(t, StringInSlice("one", sliceData)) 19 // string is not in the slice 20 assert.False(t, StringInSlice("five", sliceData)) 21 // string is not in empty slice 22 assert.False(t, StringInSlice("one", []string{})) 23 } 24 25 func TestGetImageConfigUser(t *testing.T) { 26 validUser, err := GetImageConfig([]string{"USER valid"}) 27 require.Nil(t, err) 28 assert.Equal(t, validUser.User, "valid") 29 30 validUser2, err := GetImageConfig([]string{"USER test_user_2"}) 31 require.Nil(t, err) 32 assert.Equal(t, validUser2.User, "test_user_2") 33 34 _, err = GetImageConfig([]string{"USER "}) 35 assert.NotNil(t, err) 36 } 37 38 func TestGetImageConfigExpose(t *testing.T) { 39 validPortNoProto, err := GetImageConfig([]string{"EXPOSE 80"}) 40 require.Nil(t, err) 41 _, exists := validPortNoProto.ExposedPorts["80/tcp"] 42 assert.True(t, exists) 43 44 validPortTCP, err := GetImageConfig([]string{"EXPOSE 80/tcp"}) 45 require.Nil(t, err) 46 _, exists = validPortTCP.ExposedPorts["80/tcp"] 47 assert.True(t, exists) 48 49 validPortUDP, err := GetImageConfig([]string{"EXPOSE 80/udp"}) 50 require.Nil(t, err) 51 _, exists = validPortUDP.ExposedPorts["80/udp"] 52 assert.True(t, exists) 53 54 _, err = GetImageConfig([]string{"EXPOSE 99999"}) 55 assert.NotNil(t, err) 56 57 _, err = GetImageConfig([]string{"EXPOSE 80/notaproto"}) 58 assert.NotNil(t, err) 59 60 _, err = GetImageConfig([]string{"EXPOSE "}) 61 assert.NotNil(t, err) 62 63 _, err = GetImageConfig([]string{"EXPOSE thisisnotanumber"}) 64 assert.NotNil(t, err) 65 } 66 67 func TestGetImageConfigEnv(t *testing.T) { 68 validEnvNoValue, err := GetImageConfig([]string{"ENV key"}) 69 require.Nil(t, err) 70 assert.True(t, StringInSlice("key=", validEnvNoValue.Env)) 71 72 validEnvBareEquals, err := GetImageConfig([]string{"ENV key="}) 73 require.Nil(t, err) 74 assert.True(t, StringInSlice("key=", validEnvBareEquals.Env)) 75 76 validEnvKeyValue, err := GetImageConfig([]string{"ENV key=value"}) 77 require.Nil(t, err) 78 assert.True(t, StringInSlice("key=value", validEnvKeyValue.Env)) 79 80 validEnvKeyMultiEntryValue, err := GetImageConfig([]string{`ENV key="value1 value2"`}) 81 require.Nil(t, err) 82 assert.True(t, StringInSlice("key=value1 value2", validEnvKeyMultiEntryValue.Env)) 83 84 _, err = GetImageConfig([]string{"ENV "}) 85 assert.NotNil(t, err) 86 } 87 88 func TestGetImageConfigEntrypoint(t *testing.T) { 89 binShEntrypoint, err := GetImageConfig([]string{"ENTRYPOINT /bin/bash"}) 90 require.Nil(t, err) 91 require.Equal(t, 3, len(binShEntrypoint.Entrypoint)) 92 assert.Equal(t, binShEntrypoint.Entrypoint[0], "/bin/sh") 93 assert.Equal(t, binShEntrypoint.Entrypoint[1], "-c") 94 assert.Equal(t, binShEntrypoint.Entrypoint[2], "/bin/bash") 95 96 entrypointWithSpaces, err := GetImageConfig([]string{"ENTRYPOINT ls -al"}) 97 require.Nil(t, err) 98 require.Equal(t, 3, len(entrypointWithSpaces.Entrypoint)) 99 assert.Equal(t, entrypointWithSpaces.Entrypoint[0], "/bin/sh") 100 assert.Equal(t, entrypointWithSpaces.Entrypoint[1], "-c") 101 assert.Equal(t, entrypointWithSpaces.Entrypoint[2], "ls -al") 102 103 jsonArrayEntrypoint, err := GetImageConfig([]string{`ENTRYPOINT ["ls", "-al"]`}) 104 require.Nil(t, err) 105 require.Equal(t, 2, len(jsonArrayEntrypoint.Entrypoint)) 106 assert.Equal(t, jsonArrayEntrypoint.Entrypoint[0], "ls") 107 assert.Equal(t, jsonArrayEntrypoint.Entrypoint[1], "-al") 108 109 emptyEntrypoint, err := GetImageConfig([]string{"ENTRYPOINT "}) 110 require.Nil(t, err) 111 assert.Equal(t, 0, len(emptyEntrypoint.Entrypoint)) 112 113 emptyEntrypointArray, err := GetImageConfig([]string{"ENTRYPOINT []"}) 114 require.Nil(t, err) 115 assert.Equal(t, 0, len(emptyEntrypointArray.Entrypoint)) 116 } 117 118 func TestGetImageConfigCmd(t *testing.T) { 119 binShCmd, err := GetImageConfig([]string{"CMD /bin/bash"}) 120 require.Nil(t, err) 121 require.Equal(t, 3, len(binShCmd.Cmd)) 122 assert.Equal(t, binShCmd.Cmd[0], "/bin/sh") 123 assert.Equal(t, binShCmd.Cmd[1], "-c") 124 assert.Equal(t, binShCmd.Cmd[2], "/bin/bash") 125 126 cmdWithSpaces, err := GetImageConfig([]string{"CMD ls -al"}) 127 require.Nil(t, err) 128 require.Equal(t, 3, len(cmdWithSpaces.Cmd)) 129 assert.Equal(t, cmdWithSpaces.Cmd[0], "/bin/sh") 130 assert.Equal(t, cmdWithSpaces.Cmd[1], "-c") 131 assert.Equal(t, cmdWithSpaces.Cmd[2], "ls -al") 132 133 jsonArrayCmd, err := GetImageConfig([]string{`CMD ["ls", "-al"]`}) 134 require.Nil(t, err) 135 require.Equal(t, 2, len(jsonArrayCmd.Cmd)) 136 assert.Equal(t, jsonArrayCmd.Cmd[0], "ls") 137 assert.Equal(t, jsonArrayCmd.Cmd[1], "-al") 138 139 emptyCmd, err := GetImageConfig([]string{"CMD "}) 140 require.Nil(t, err) 141 require.Equal(t, 2, len(emptyCmd.Cmd)) 142 assert.Equal(t, emptyCmd.Cmd[0], "/bin/sh") 143 assert.Equal(t, emptyCmd.Cmd[1], "-c") 144 145 blankCmd, err := GetImageConfig([]string{"CMD []"}) 146 require.Nil(t, err) 147 assert.Equal(t, 0, len(blankCmd.Cmd)) 148 } 149 150 func TestGetImageConfigVolume(t *testing.T) { 151 oneLenJSONArrayVol, err := GetImageConfig([]string{`VOLUME ["/test1"]`}) 152 require.Nil(t, err) 153 _, exists := oneLenJSONArrayVol.Volumes["/test1"] 154 assert.True(t, exists) 155 assert.Equal(t, 1, len(oneLenJSONArrayVol.Volumes)) 156 157 twoLenJSONArrayVol, err := GetImageConfig([]string{`VOLUME ["/test1", "/test2"]`}) 158 require.Nil(t, err) 159 assert.Equal(t, 2, len(twoLenJSONArrayVol.Volumes)) 160 _, exists = twoLenJSONArrayVol.Volumes["/test1"] 161 assert.True(t, exists) 162 _, exists = twoLenJSONArrayVol.Volumes["/test2"] 163 assert.True(t, exists) 164 165 oneLenVol, err := GetImageConfig([]string{"VOLUME /test1"}) 166 require.Nil(t, err) 167 _, exists = oneLenVol.Volumes["/test1"] 168 assert.True(t, exists) 169 assert.Equal(t, 1, len(oneLenVol.Volumes)) 170 171 twoLenVol, err := GetImageConfig([]string{"VOLUME /test1 /test2"}) 172 require.Nil(t, err) 173 assert.Equal(t, 2, len(twoLenVol.Volumes)) 174 _, exists = twoLenVol.Volumes["/test1"] 175 assert.True(t, exists) 176 _, exists = twoLenVol.Volumes["/test2"] 177 assert.True(t, exists) 178 179 _, err = GetImageConfig([]string{"VOLUME []"}) 180 assert.NotNil(t, err) 181 182 _, err = GetImageConfig([]string{"VOLUME "}) 183 assert.NotNil(t, err) 184 185 _, err = GetImageConfig([]string{`VOLUME [""]`}) 186 assert.NotNil(t, err) 187 } 188 189 func TestGetImageConfigWorkdir(t *testing.T) { 190 singleWorkdir, err := GetImageConfig([]string{"WORKDIR /testdir"}) 191 require.Nil(t, err) 192 assert.Equal(t, singleWorkdir.WorkingDir, "/testdir") 193 194 twoWorkdirs, err := GetImageConfig([]string{"WORKDIR /testdir", "WORKDIR a"}) 195 require.Nil(t, err) 196 assert.Equal(t, twoWorkdirs.WorkingDir, "/testdir/a") 197 198 _, err = GetImageConfig([]string{"WORKDIR "}) 199 assert.NotNil(t, err) 200 } 201 202 func TestGetImageConfigLabel(t *testing.T) { 203 labelNoQuotes, err := GetImageConfig([]string{"LABEL key1=value1"}) 204 require.Nil(t, err) 205 assert.Equal(t, labelNoQuotes.Labels["key1"], "value1") 206 207 labelWithQuotes, err := GetImageConfig([]string{`LABEL "key 1"="value 2"`}) 208 require.Nil(t, err) 209 assert.Equal(t, labelWithQuotes.Labels["key 1"], "value 2") 210 211 labelNoValue, err := GetImageConfig([]string{"LABEL key="}) 212 require.Nil(t, err) 213 contents, exists := labelNoValue.Labels["key"] 214 assert.True(t, exists) 215 assert.Equal(t, contents, "") 216 217 _, err = GetImageConfig([]string{"LABEL key"}) 218 assert.NotNil(t, err) 219 220 _, err = GetImageConfig([]string{"LABEL "}) 221 assert.NotNil(t, err) 222 } 223 224 func TestGetImageConfigOnBuild(t *testing.T) { 225 onBuildOne, err := GetImageConfig([]string{"ONBUILD ADD /testdir1"}) 226 require.Nil(t, err) 227 require.Equal(t, 1, len(onBuildOne.OnBuild)) 228 assert.Equal(t, onBuildOne.OnBuild[0], "ADD /testdir1") 229 230 onBuildTwo, err := GetImageConfig([]string{"ONBUILD ADD /testdir1", "ONBUILD ADD /testdir2"}) 231 require.Nil(t, err) 232 require.Equal(t, 2, len(onBuildTwo.OnBuild)) 233 assert.Equal(t, onBuildTwo.OnBuild[0], "ADD /testdir1") 234 assert.Equal(t, onBuildTwo.OnBuild[1], "ADD /testdir2") 235 236 _, err = GetImageConfig([]string{"ONBUILD "}) 237 assert.NotNil(t, err) 238 } 239 240 func TestGetImageConfigMisc(t *testing.T) { 241 _, err := GetImageConfig([]string{""}) 242 assert.NotNil(t, err) 243 244 _, err = GetImageConfig([]string{"USER"}) 245 assert.NotNil(t, err) 246 247 _, err = GetImageConfig([]string{"BADINST testvalue"}) 248 assert.NotNil(t, err) 249 } 250 251 func TestValidateSysctls(t *testing.T) { 252 strSlice := []string{"net.core.test1=4", "kernel.msgmax=2"} 253 result, _ := ValidateSysctls(strSlice) 254 assert.Equal(t, result["net.core.test1"], "4") 255 } 256 257 func TestValidateSysctlBadSysctl(t *testing.T) { 258 strSlice := []string{"BLAU=BLUE", "GELB^YELLOW"} 259 _, err := ValidateSysctls(strSlice) 260 assert.Error(t, err) 261 } 262 263 func TestValidateSysctlBadSysctlWithExtraSpaces(t *testing.T) { 264 expectedError := "'%s' is invalid, extra spaces found" 265 266 // should fail fast on first sysctl 267 strSlice1 := []string{ 268 "net.ipv4.ping_group_range = 0 0", 269 "net.ipv4.ping_group_range=0 0 ", 270 } 271 _, err := ValidateSysctls(strSlice1) 272 assert.Error(t, err) 273 assert.Equal(t, err.Error(), fmt.Sprintf(expectedError, strSlice1[0])) 274 275 // should fail on second sysctl 276 strSlice2 := []string{ 277 "net.ipv4.ping_group_range=0 0", 278 "net.ipv4.ping_group_range=0 0 ", 279 } 280 _, err = ValidateSysctls(strSlice2) 281 assert.Error(t, err) 282 assert.Equal(t, err.Error(), fmt.Sprintf(expectedError, strSlice2[1])) 283 } 284 285 func TestCoresToPeriodAndQuota(t *testing.T) { 286 cores := 1.0 287 expectedPeriod := DefaultCPUPeriod 288 expectedQuota := int64(DefaultCPUPeriod) 289 290 actualPeriod, actualQuota := CoresToPeriodAndQuota(cores) 291 assert.Equal(t, actualPeriod, expectedPeriod, "Period does not match") 292 assert.Equal(t, actualQuota, expectedQuota, "Quota does not match") 293 } 294 295 func TestPeriodAndQuotaToCores(t *testing.T) { 296 var ( 297 period uint64 = 100000 298 quota int64 = 50000 299 expectedCores = 0.5 300 ) 301 302 assert.Equal(t, PeriodAndQuotaToCores(period, quota), expectedCores) 303 } 304 305 func TestParseInputTime(t *testing.T) { 306 tm, err := ParseInputTime("1.5", true) 307 if err != nil { 308 t.Errorf("expected error to be nil but was: %v", err) 309 } 310 311 expected, err := time.ParseInLocation(time.RFC3339Nano, "1970-01-01T00:00:01.500000000Z", time.UTC) 312 if err != nil { 313 t.Fatal(err) 314 } 315 316 assert.Equal(t, expected, tm) 317 }