github.com/secure-build/gitlab-runner@v12.5.0+incompatible/helpers/gitlab_ci_yaml_parser/parser_test.go (about) 1 package gitlab_ci_yaml_parser 2 3 import ( 4 "io/ioutil" 5 "os" 6 "testing" 7 8 "github.com/stretchr/testify/assert" 9 "github.com/stretchr/testify/require" 10 11 "gitlab.com/gitlab-org/gitlab-runner/common" 12 ) 13 14 var testFile1 = ` 15 image: global:image 16 17 job1: 18 stage: test 19 script: 20 - line 1 21 - line 2 22 image: job1:image 23 services: 24 - service:1 25 - service:2 26 27 job2: 28 script: test 29 30 job3: 31 stage: a 32 33 job4: 34 script: job4 35 image: 36 name: alpine 37 entrypoint: ["/bin/sh"] 38 services: 39 - name: service:1 40 command: ["sleep", "30"] 41 alias: service-1 42 - name: service:2 43 entrypoint: ["/bin/sh"] 44 alias: service-2 45 ` 46 47 var testFile2 = ` 48 image: 49 name: global:image 50 entrypoint: [/bin/sh] 51 52 services: 53 - name: service:1 54 command: ["sleep", "30"] 55 alias: service-1 56 - name: service:2 57 entrypoint: [/bin/sh] 58 alias: service-2 59 60 job1: 61 script: job1 62 63 job2: 64 script: job1 65 image: job2:image 66 services: 67 - service:1 68 - service:2 69 ` 70 71 func prepareTestFile(t *testing.T, fileContent string) string { 72 file, err := ioutil.TempFile("", "gitlab-ci-yml") 73 require.NoError(t, err) 74 defer file.Close() 75 76 file.WriteString(fileContent) 77 return file.Name() 78 } 79 80 func getJobResponse(t *testing.T, fileContent, jobName string, expectingError bool) *common.JobResponse { 81 file := prepareTestFile(t, fileContent) 82 defer os.Remove(file) 83 84 parser := &GitLabCiYamlParser{ 85 filename: file, 86 jobName: jobName, 87 } 88 89 jobResponse := &common.JobResponse{} 90 err := parser.ParseYaml(jobResponse) 91 if expectingError { 92 assert.Error(t, err) 93 } else { 94 assert.NoError(t, err) 95 } 96 97 return jobResponse 98 } 99 100 func TestFileParsing(t *testing.T) { 101 // file1 - job1 102 jobResponse := getJobResponse(t, testFile1, "job1", false) 103 require.Len(t, jobResponse.Steps, 2) 104 assert.Contains(t, jobResponse.Steps[0].Script, "line 1") 105 assert.Contains(t, jobResponse.Steps[0].Script, "line 2") 106 assert.Equal(t, "test", jobResponse.JobInfo.Stage) 107 assert.Equal(t, "job1:image", jobResponse.Image.Name) 108 require.Len(t, jobResponse.Services, 2) 109 assert.Equal(t, "service:1", jobResponse.Services[0].Name) 110 assert.Empty(t, jobResponse.Services[0].Alias) 111 assert.Empty(t, jobResponse.Services[0].Command) 112 assert.Empty(t, jobResponse.Services[0].Entrypoint) 113 assert.Equal(t, "service:2", jobResponse.Services[1].Name) 114 assert.Empty(t, jobResponse.Services[1].Alias) 115 assert.Empty(t, jobResponse.Services[1].Command) 116 assert.Empty(t, jobResponse.Services[1].Entrypoint) 117 118 // file1 - job2 119 jobResponse = getJobResponse(t, testFile1, "job2", false) 120 require.Len(t, jobResponse.Steps, 2) 121 assert.Contains(t, jobResponse.Steps[0].Script, "test") 122 assert.Equal(t, "global:image", jobResponse.Image.Name) 123 124 // file1 - job3 125 jobResponse = getJobResponse(t, testFile1, "job3", true) 126 127 // file1 - job4 128 jobResponse = getJobResponse(t, testFile1, "job4", false) 129 assert.Equal(t, "alpine", jobResponse.Image.Name) 130 assert.Equal(t, []string{"/bin/sh"}, jobResponse.Image.Entrypoint) 131 require.Len(t, jobResponse.Services, 2) 132 assert.Equal(t, "service:1", jobResponse.Services[0].Name) 133 assert.Equal(t, "service-1", jobResponse.Services[0].Alias) 134 assert.Equal(t, []string{"sleep", "30"}, jobResponse.Services[0].Command) 135 assert.Empty(t, jobResponse.Services[0].Entrypoint) 136 assert.Equal(t, "service:2", jobResponse.Services[1].Name) 137 assert.Equal(t, "service-2", jobResponse.Services[1].Alias) 138 assert.Empty(t, jobResponse.Services[1].Command) 139 assert.Equal(t, []string{"/bin/sh"}, jobResponse.Services[1].Entrypoint) 140 141 // file2 - job1 142 jobResponse = getJobResponse(t, testFile2, "job1", false) 143 assert.Equal(t, "global:image", jobResponse.Image.Name) 144 assert.Equal(t, []string{"/bin/sh"}, jobResponse.Image.Entrypoint) 145 require.Len(t, jobResponse.Services, 2) 146 assert.Equal(t, "service:1", jobResponse.Services[0].Name) 147 assert.Equal(t, "service-1", jobResponse.Services[0].Alias) 148 assert.Equal(t, []string{"sleep", "30"}, jobResponse.Services[0].Command) 149 assert.Empty(t, jobResponse.Services[0].Entrypoint) 150 assert.Equal(t, "service:2", jobResponse.Services[1].Name) 151 assert.Equal(t, "service-2", jobResponse.Services[1].Alias) 152 assert.Empty(t, jobResponse.Services[1].Command) 153 assert.Equal(t, []string{"/bin/sh"}, jobResponse.Services[1].Entrypoint) 154 155 // file2 - job2 156 jobResponse = getJobResponse(t, testFile2, "job2", false) 157 assert.Equal(t, "job2:image", jobResponse.Image.Name) 158 assert.Empty(t, jobResponse.Image.Entrypoint) 159 require.Len(t, jobResponse.Services, 2) 160 assert.Equal(t, "service:1", jobResponse.Services[0].Name) 161 assert.Empty(t, jobResponse.Services[0].Alias) 162 assert.Empty(t, jobResponse.Services[0].Command) 163 assert.Empty(t, jobResponse.Services[0].Entrypoint) 164 assert.Equal(t, "service:2", jobResponse.Services[1].Name) 165 assert.Empty(t, jobResponse.Services[1].Alias) 166 assert.Empty(t, jobResponse.Services[1].Command) 167 assert.Empty(t, jobResponse.Services[1].Entrypoint) 168 }