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  }