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  }