github.com/ouraigua/jenkins-library@v0.0.0-20231028010029-fbeaf2f3aa9b/pkg/gradle/gradle_test.go (about) 1 //go:build unit 2 // +build unit 3 4 package gradle 5 6 import ( 7 "errors" 8 "os" 9 10 "github.com/SAP/jenkins-library/pkg/mock" 11 12 "testing" 13 14 "github.com/stretchr/testify/assert" 15 ) 16 17 type MockUtils struct { 18 existingFiles []string 19 writtenFiles []string 20 removedFiles []string 21 *mock.FilesMock 22 *mock.ExecMockRunner 23 } 24 25 func (m *MockUtils) FileExists(filePath string) (bool, error) { 26 for _, filename := range m.existingFiles { 27 if filename == filePath { 28 return true, nil 29 } 30 } 31 return false, nil 32 } 33 34 func (m *MockUtils) FileWrite(path string, content []byte, perm os.FileMode) error { 35 m.writtenFiles = append(m.writtenFiles, path) 36 return nil 37 } 38 39 func (m *MockUtils) FileRemove(path string) error { 40 m.removedFiles = append(m.removedFiles, path) 41 return nil 42 } 43 44 func TestExecute(t *testing.T) { 45 t.Run("success - run command use gradle tool", func(t *testing.T) { 46 utils := &MockUtils{ 47 FilesMock: &mock.FilesMock{}, 48 ExecMockRunner: &mock.ExecMockRunner{}, 49 existingFiles: []string{"path/to/build.gradle"}, 50 } 51 opts := ExecuteOptions{ 52 BuildGradlePath: "path/to", 53 Task: "build", 54 InitScriptContent: "", 55 UseWrapper: false, 56 ProjectProperties: map[string]string{"propName": "propValue"}, 57 } 58 59 _, err := Execute(&opts, utils) 60 assert.NoError(t, err) 61 assert.Equal(t, 1, len(utils.Calls)) 62 assert.Equal(t, mock.ExecCall{Exec: "gradle", Params: []string{"build", "-p", "path/to", "-PpropName=propValue"}}, utils.Calls[0]) 63 assert.Equal(t, []string(nil), utils.writtenFiles) 64 assert.Equal(t, []string(nil), utils.removedFiles) 65 }) 66 67 t.Run("success - run command use gradlew tool", func(t *testing.T) { 68 utils := &MockUtils{ 69 FilesMock: &mock.FilesMock{}, 70 ExecMockRunner: &mock.ExecMockRunner{}, 71 existingFiles: []string{"path/to/build.gradle", "gradlew"}, 72 } 73 opts := ExecuteOptions{ 74 BuildGradlePath: "path/to", 75 Task: "build", 76 InitScriptContent: "", 77 UseWrapper: true, 78 } 79 80 _, err := Execute(&opts, utils) 81 assert.NoError(t, err) 82 83 assert.Equal(t, 1, len(utils.Calls)) 84 assert.Equal(t, mock.ExecCall{Exec: "./gradlew", Params: []string{"build", "-p", "path/to"}}, utils.Calls[0]) 85 assert.Equal(t, []string(nil), utils.writtenFiles) 86 assert.Equal(t, []string(nil), utils.removedFiles) 87 }) 88 89 t.Run("use init script to apply plugin", func(t *testing.T) { 90 utils := &MockUtils{ 91 FilesMock: &mock.FilesMock{}, 92 ExecMockRunner: &mock.ExecMockRunner{}, 93 existingFiles: []string{"path/to/build.gradle.kts"}, 94 } 95 opts := ExecuteOptions{ 96 BuildGradlePath: "path/to", 97 Task: "build", 98 InitScriptContent: "some content", 99 UseWrapper: false, 100 } 101 102 _, err := Execute(&opts, utils) 103 assert.NoError(t, err) 104 105 assert.Equal(t, 2, len(utils.Calls)) 106 assert.Equal(t, mock.ExecCall{Exec: "gradle", Params: []string{"tasks", "-p", "path/to"}}, utils.Calls[0]) 107 assert.Equal(t, mock.ExecCall{Execution: (*mock.Execution)(nil), Async: false, Exec: "gradle", Params: []string{"build", "-p", "path/to", "--init-script", "initScript.gradle.tmp"}}, utils.Calls[1]) 108 assert.Equal(t, []string{"initScript.gradle.tmp"}, utils.writtenFiles) 109 assert.Equal(t, []string{"initScript.gradle.tmp"}, utils.removedFiles) 110 }) 111 112 t.Run("failed - use init script to apply plugin", func(t *testing.T) { 113 utils := &MockUtils{ 114 FilesMock: &mock.FilesMock{}, 115 ExecMockRunner: &mock.ExecMockRunner{ 116 ShouldFailOnCommand: map[string]error{"gradle tasks -p path/to": errors.New("failed to get tasks")}, 117 }, 118 existingFiles: []string{"path/to/build.gradle.kts"}, 119 } 120 opts := ExecuteOptions{ 121 BuildGradlePath: "path/to", 122 Task: "build", 123 InitScriptContent: "some content", 124 UseWrapper: false, 125 } 126 127 _, err := Execute(&opts, utils) 128 assert.Error(t, err) 129 assert.Contains(t, err.Error(), "failed to get tasks") 130 }) 131 132 t.Run("use init script to apply an existing plugin", func(t *testing.T) { 133 utils := &MockUtils{ 134 FilesMock: &mock.FilesMock{}, 135 ExecMockRunner: &mock.ExecMockRunner{}, 136 existingFiles: []string{"path/to/build.gradle.kts"}, 137 } 138 utils.StdoutReturn = map[string]string{"gradle tasks -p path/to": "createBom"} 139 opts := ExecuteOptions{ 140 BuildGradlePath: "path/to", 141 Task: "createBom", 142 InitScriptContent: "some content", 143 UseWrapper: false, 144 } 145 146 _, err := Execute(&opts, utils) 147 assert.NoError(t, err) 148 149 assert.Equal(t, 2, len(utils.Calls)) 150 assert.Equal(t, mock.ExecCall{Exec: "gradle", Params: []string{"tasks", "-p", "path/to"}}, utils.Calls[0]) 151 assert.Equal(t, mock.ExecCall{Execution: (*mock.Execution)(nil), Async: false, Exec: "gradle", Params: []string{"createBom", "-p", "path/to"}}, utils.Calls[1]) 152 assert.Equal(t, []string(nil), utils.writtenFiles) 153 assert.Equal(t, []string(nil), utils.removedFiles) 154 }) 155 156 t.Run("failed - run command", func(t *testing.T) { 157 utils := &MockUtils{ 158 FilesMock: &mock.FilesMock{}, 159 ExecMockRunner: &mock.ExecMockRunner{ 160 ShouldFailOnCommand: map[string]error{"gradle build -p path/to": errors.New("failed to build")}, 161 }, 162 existingFiles: []string{"path/to/build.gradle"}, 163 } 164 opts := ExecuteOptions{ 165 BuildGradlePath: "path/to", 166 Task: "build", 167 InitScriptContent: "", 168 UseWrapper: false, 169 } 170 171 _, err := Execute(&opts, utils) 172 assert.Error(t, err) 173 assert.Contains(t, err.Error(), "failed to build") 174 }) 175 176 t.Run("failed - missing gradle build script", func(t *testing.T) { 177 utils := &MockUtils{ 178 FilesMock: &mock.FilesMock{}, 179 ExecMockRunner: &mock.ExecMockRunner{}, 180 existingFiles: []string{}, 181 } 182 opts := ExecuteOptions{ 183 BuildGradlePath: "path/to", 184 Task: "build", 185 InitScriptContent: "", 186 UseWrapper: false, 187 } 188 189 _, err := Execute(&opts, utils) 190 assert.Error(t, err) 191 assert.Contains(t, err.Error(), "the specified gradle build script could not be found") 192 }) 193 194 t.Run("success - should return stdOut", func(t *testing.T) { 195 expectedOutput := "mocked output" 196 utils := &MockUtils{ 197 FilesMock: &mock.FilesMock{}, 198 ExecMockRunner: &mock.ExecMockRunner{}, 199 existingFiles: []string{"path/to/build.gradle"}, 200 } 201 utils.StdoutReturn = map[string]string{"gradle build -p path/to": expectedOutput} 202 opts := ExecuteOptions{ 203 BuildGradlePath: "path/to", 204 Task: "build", 205 InitScriptContent: "", 206 UseWrapper: false, 207 } 208 209 actualOutput, err := Execute(&opts, utils) 210 assert.NoError(t, err) 211 212 assert.Equal(t, expectedOutput, actualOutput) 213 }) 214 }