github.com/ouraigua/jenkins-library@v0.0.0-20231028010029-fbeaf2f3aa9b/pkg/maven/maven_test.go (about) 1 //go:build unit 2 // +build unit 3 4 package maven 5 6 import ( 7 "errors" 8 "github.com/SAP/jenkins-library/pkg/mock" 9 "path/filepath" 10 11 "net/http" 12 "testing" 13 14 "github.com/stretchr/testify/assert" 15 ) 16 17 type MockUtils struct { 18 shouldFail bool 19 requestedUrls []string 20 requestedFiles []string 21 *mock.FilesMock 22 *mock.ExecMockRunner 23 } 24 25 func (m *MockUtils) DownloadFile(url, filename string, header http.Header, cookies []*http.Cookie) error { 26 m.requestedUrls = append(m.requestedUrls, url) 27 m.requestedFiles = append(m.requestedFiles, filename) 28 if m.shouldFail { 29 return errors.New("something happened") 30 } 31 return nil 32 } 33 34 func NewMockUtils(downloadShouldFail bool) MockUtils { 35 utils := MockUtils{ 36 shouldFail: downloadShouldFail, 37 FilesMock: &mock.FilesMock{}, 38 ExecMockRunner: &mock.ExecMockRunner{}, 39 } 40 return utils 41 } 42 43 func TestExecute(t *testing.T) { 44 t.Run("should return stdOut", func(t *testing.T) { 45 expectedOutput := "mocked output" 46 utils := NewMockUtils(false) 47 utils.StdoutReturn = map[string]string{"mvn --file pom.xml -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn --batch-mode": "mocked output"} 48 opts := ExecuteOptions{PomPath: "pom.xml", ReturnStdout: true} 49 50 mavenOutput, _ := Execute(&opts, &utils) 51 52 assert.Equal(t, expectedOutput, mavenOutput) 53 }) 54 t.Run("should not return stdOut", func(t *testing.T) { 55 expectedOutput := "" 56 utils := NewMockUtils(false) 57 utils.StdoutReturn = map[string]string{"mvn --file pom.xml -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn --batch-mode": "mocked output"} 58 opts := ExecuteOptions{PomPath: "pom.xml", ReturnStdout: false} 59 60 mavenOutput, _ := Execute(&opts, &utils) 61 62 assert.Equal(t, expectedOutput, mavenOutput) 63 }) 64 t.Run("should log that command failed if executing maven failed", func(t *testing.T) { 65 utils := NewMockUtils(false) 66 utils.ShouldFailOnCommand = map[string]error{"mvn --file pom.xml -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn --batch-mode": errors.New("error case")} 67 opts := ExecuteOptions{PomPath: "pom.xml", ReturnStdout: false} 68 69 output, err := Execute(&opts, &utils) 70 71 assert.EqualError(t, err, "failed to run executable, command: '[mvn --file pom.xml -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn --batch-mode]', error: error case") 72 assert.Equal(t, "", output) 73 }) 74 t.Run("should have all configured parameters in the exec call", func(t *testing.T) { 75 utils := NewMockUtils(false) 76 opts := ExecuteOptions{PomPath: "pom.xml", ProjectSettingsFile: "settings.xml", 77 GlobalSettingsFile: "anotherSettings.xml", M2Path: ".m2/", 78 Goals: []string{"flatten", "install"}, Defines: []string{"-Da=b"}, 79 Flags: []string{"-q"}, LogSuccessfulMavenTransfers: true, 80 ReturnStdout: false} 81 expectedParameters := []string{"--global-settings", "anotherSettings.xml", "--settings", "settings.xml", 82 "-Dmaven.repo.local=.m2/", "--file", "pom.xml", "-q", "-Da=b", "--batch-mode", 83 "flatten", "install"} 84 85 mavenOutput, _ := Execute(&opts, &utils) 86 87 assert.Equal(t, len(expectedParameters), len(utils.Calls[0].Params)) 88 assert.Equal(t, mock.ExecCall{Exec: "mvn", Params: expectedParameters}, utils.Calls[0]) 89 assert.Equal(t, "", mavenOutput) 90 }) 91 } 92 93 func TestEvaluate(t *testing.T) { 94 t.Run("should evaluate expression", func(t *testing.T) { 95 utils := NewMockUtils(false) 96 utils.StdoutReturn = map[string]string{"mvn --file pom.xml -Dexpression=project.groupId -DforceStdout -q -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn --batch-mode org.apache.maven.plugins:maven-help-plugin:3.1.0:evaluate": "com.awesome"} 97 98 result, err := Evaluate(&EvaluateOptions{PomPath: "pom.xml"}, "project.groupId", &utils) 99 if assert.NoError(t, err) { 100 assert.Equal(t, "com.awesome", result) 101 } 102 }) 103 t.Run("should not evaluate expression", func(t *testing.T) { 104 utils := NewMockUtils(false) 105 utils.StdoutReturn = map[string]string{"mvn --file pom.xml -Dexpression=project.groupId -DforceStdout -q -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn --batch-mode org.apache.maven.plugins:maven-help-plugin:3.1.0:evaluate": "null object or invalid expression"} 106 107 result, err := Evaluate(&EvaluateOptions{PomPath: "pom.xml"}, "project.groupId", &utils) 108 if assert.EqualError(t, err, "expression 'project.groupId' in file 'pom.xml' could not be resolved") { 109 assert.Equal(t, "", result) 110 } 111 }) 112 } 113 114 func TestGetParameters(t *testing.T) { 115 t.Run("should resolve configured parameters and download the settings files", func(t *testing.T) { 116 utils := NewMockUtils(false) 117 opts := ExecuteOptions{PomPath: "pom.xml", GlobalSettingsFile: "https://mysettings.com", ProjectSettingsFile: "http://myprojectsettings.com", ReturnStdout: false} 118 expectedParameters := []string{ 119 "--global-settings", ".pipeline/mavenGlobalSettings.xml", 120 "--settings", ".pipeline/mavenProjectSettings.xml", 121 "--file", "pom.xml", 122 "-Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn", 123 "--batch-mode"} 124 125 parameters, err := getParametersFromOptions(&opts, &utils) 126 if assert.NoError(t, err) { 127 assert.Equal(t, len(expectedParameters), len(parameters)) 128 assert.Equal(t, expectedParameters, parameters) 129 if assert.Equal(t, 2, len(utils.requestedUrls)) { 130 assert.Equal(t, "https://mysettings.com", utils.requestedUrls[0]) 131 assert.Equal(t, ".pipeline/mavenGlobalSettings.xml", utils.requestedFiles[0]) 132 assert.Equal(t, "http://myprojectsettings.com", utils.requestedUrls[1]) 133 assert.Equal(t, ".pipeline/mavenProjectSettings.xml", utils.requestedFiles[1]) 134 } 135 } 136 }) 137 t.Run("should resolve configured parameters and not download existing settings files", func(t *testing.T) { 138 utils := NewMockUtils(false) 139 utils.AddFile(".pipeline/mavenGlobalSettings.xml", []byte("dummyContent")) 140 utils.AddFile(".pipeline/mavenProjectSettings.xml", []byte("dummyContent")) 141 opts := ExecuteOptions{PomPath: "pom.xml", GlobalSettingsFile: "https://mysettings.com", ProjectSettingsFile: "http://myprojectsettings.com", ReturnStdout: false} 142 expectedParameters := []string{ 143 "--global-settings", ".pipeline/mavenGlobalSettings.xml", 144 "--settings", ".pipeline/mavenProjectSettings.xml", 145 "--file", "pom.xml", 146 "-Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn", 147 "--batch-mode"} 148 149 parameters, err := getParametersFromOptions(&opts, &utils) 150 if assert.NoError(t, err) { 151 assert.Equal(t, len(expectedParameters), len(parameters)) 152 assert.Equal(t, expectedParameters, parameters) 153 assert.Equal(t, 0, len(utils.requestedUrls)) 154 } 155 }) 156 } 157 158 func TestGetTestModulesExcludes(t *testing.T) { 159 t.Run("Should return excludes for unit- and integration-tests", func(t *testing.T) { 160 utils := NewMockUtils(false) 161 utils.AddFile("unit-tests/pom.xml", []byte("dummyContent")) 162 utils.AddFile("integration-tests/pom.xml", []byte("dummyContent")) 163 expected := []string{"-pl", "!unit-tests", "-pl", "!integration-tests"} 164 165 modulesExcludes := GetTestModulesExcludes(&utils) 166 assert.Equal(t, expected, modulesExcludes) 167 }) 168 t.Run("Should not return excludes for unit- and integration-tests", func(t *testing.T) { 169 utils := NewMockUtils(false) 170 171 var expected []string 172 173 modulesExcludes := GetTestModulesExcludes(&utils) 174 assert.Equal(t, expected, modulesExcludes) 175 }) 176 } 177 178 func TestMavenInstall(t *testing.T) { 179 t.Parallel() 180 t.Run("Should return path to jar file", func(t *testing.T) { 181 actual := jarFile("app", "my-app") 182 assert.Equal(t, filepath.Join("app", "target", "my-app.jar"), actual) 183 }) 184 185 t.Run("Should return path to war file", func(t *testing.T) { 186 actual := warFile("app", "my-app") 187 assert.Equal(t, filepath.Join("app", "target", "my-app.war"), actual) 188 }) 189 190 t.Run("Install a file", func(t *testing.T) { 191 utils := NewMockUtils(false) 192 expectedParameters := []string{"-Dfile=app.jar", "-Dpackaging=jar", "-DpomFile=pom.xml", "-Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn", "--batch-mode", "install:install-file"} 193 194 err := InstallFile("app.jar", "pom.xml", &EvaluateOptions{}, &utils) 195 196 assert.NoError(t, err) 197 if assert.Equal(t, len(expectedParameters), len(utils.Calls[0].Params)) { 198 assert.Equal(t, mock.ExecCall{Exec: "mvn", Params: expectedParameters}, utils.Calls[0]) 199 } 200 }) 201 202 t.Run("Install files in a project", func(t *testing.T) { 203 utils := NewMockUtils(false) 204 utils.AddFile("target/foo.jar", []byte("dummyContent")) 205 utils.AddFile("target/foo.war", []byte("dummyContent")) 206 utils.AddFile("pom.xml", []byte("<project></project>")) 207 208 options := EvaluateOptions{} 209 options.ProjectSettingsFile = "settings.xml" 210 utils.StdoutReturn = map[string]string{"mvn --settings settings.xml --file pom.xml -Dexpression=project.build.finalName -DforceStdout -q -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn --batch-mode org.apache.maven.plugins:maven-help-plugin:3.1.0:evaluate": "foo"} 211 err := doInstallMavenArtifacts(&options, &utils) 212 213 assert.NoError(t, err) 214 if assert.Equal(t, 5, len(utils.Calls)) { 215 assert.Equal(t, mock.ExecCall{Exec: "mvn", Params: []string{"--settings", "settings.xml", "-Dflatten.mode=resolveCiFriendliesOnly", "-Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn", "--batch-mode", "flatten:flatten"}}, utils.Calls[0]) 216 assert.Equal(t, mock.ExecCall{Exec: "mvn", Params: []string{"--settings", "settings.xml", "--file", "pom.xml", "-Dexpression=project.packaging", "-DforceStdout", "-q", "-Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn", "--batch-mode", "org.apache.maven.plugins:maven-help-plugin:3.1.0:evaluate"}}, utils.Calls[1]) 217 assert.Equal(t, mock.ExecCall{Exec: "mvn", Params: []string{"--settings", "settings.xml", "--file", "pom.xml", "-Dexpression=project.build.finalName", "-DforceStdout", "-q", "-Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn", "--batch-mode", "org.apache.maven.plugins:maven-help-plugin:3.1.0:evaluate"}}, utils.Calls[2]) 218 assert.Equal(t, mock.ExecCall{Exec: "mvn", Params: []string{"--settings", "settings.xml", "-Dfile=" + filepath.Join(".", "target", "foo.jar"), "-Dpackaging=jar", "-DpomFile=pom.xml", "-Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn", "--batch-mode", "install:install-file"}}, utils.Calls[3]) 219 assert.Equal(t, mock.ExecCall{Exec: "mvn", Params: []string{"--settings", "settings.xml", "-Dfile=" + filepath.Join(".", "target", "foo.war"), "-DpomFile=pom.xml", "-Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn", "--batch-mode", "install:install-file"}}, utils.Calls[4]) 220 } 221 }) 222 223 t.Run("Install files in a spring-boot project", func(t *testing.T) { 224 utils := NewMockUtils(false) 225 utils.AddFile("target/foo.jar", []byte("dummyContent")) 226 utils.AddFile("target/foo.jar.original", []byte("dummyContent")) 227 utils.AddFile("pom.xml", []byte("<project></project>")) 228 229 options := EvaluateOptions{} 230 utils.StdoutReturn = map[string]string{"mvn --file pom.xml -Dexpression=project.build.finalName -DforceStdout -q -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn --batch-mode org.apache.maven.plugins:maven-help-plugin:3.1.0:evaluate": "foo"} 231 err := doInstallMavenArtifacts(&options, &utils) 232 233 assert.NoError(t, err) 234 if assert.Equal(t, 4, len(utils.Calls)) { 235 assert.Equal(t, mock.ExecCall{Exec: "mvn", Params: []string{"-Dflatten.mode=resolveCiFriendliesOnly", "-Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn", "--batch-mode", "flatten:flatten"}}, utils.Calls[0]) 236 assert.Equal(t, mock.ExecCall{Exec: "mvn", Params: []string{"--file", "pom.xml", "-Dexpression=project.packaging", "-DforceStdout", "-q", "-Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn", "--batch-mode", "org.apache.maven.plugins:maven-help-plugin:3.1.0:evaluate"}}, utils.Calls[1]) 237 assert.Equal(t, mock.ExecCall{Exec: "mvn", Params: []string{"--file", "pom.xml", "-Dexpression=project.build.finalName", "-DforceStdout", "-q", "-Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn", "--batch-mode", "org.apache.maven.plugins:maven-help-plugin:3.1.0:evaluate"}}, utils.Calls[2]) 238 assert.Equal(t, mock.ExecCall{Exec: "mvn", Params: []string{"-Dfile=" + filepath.Join(".", "target", "foo.jar.original"), "-Dpackaging=jar", "-DpomFile=pom.xml", "-Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn", "--batch-mode", "install:install-file"}}, utils.Calls[3]) 239 } 240 }) 241 242 t.Run("Install files in a multi-module-project", func(t *testing.T) { 243 utils := NewMockUtils(false) 244 utils.AddFile("parent/module1/target/module1.jar", []byte("dummyContent")) 245 utils.AddFile("parent/module1/target/module1.jar.original", []byte("dummyContent")) 246 utils.AddFile("parent/pom.xml", []byte("<project></project>")) 247 utils.AddFile("parent/module1/pom.xml", []byte( 248 "<project></project>")) 249 250 options := EvaluateOptions{ 251 PomPath: filepath.Join(".", "parent", "pom.xml"), 252 } 253 utils.StdoutReturn = map[string]string{`mvn --file ` + `.*module1.*` + `-Dexpression=project.build.finalName -DforceStdout -q -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn --batch-mode org.apache.maven.plugins:maven-help-plugin:3.1.0:evaluate`: "module1"} 254 err := doInstallMavenArtifacts(&options, &utils) 255 256 assert.NoError(t, err) 257 if assert.Equal(t, 7, len(utils.Calls)) { 258 assert.Equal(t, mock.ExecCall{Exec: "mvn", Params: []string{"--file", filepath.Join(".", "parent", "pom.xml"), "-Dflatten.mode=resolveCiFriendliesOnly", "-Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn", "--batch-mode", "flatten:flatten"}}, utils.Calls[0]) 259 assert.Equal(t, mock.ExecCall{Exec: "mvn", Params: []string{"--file", filepath.Join(".", "parent", "module1", "pom.xml"), "-Dexpression=project.packaging", "-DforceStdout", "-q", "-Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn", "--batch-mode", "org.apache.maven.plugins:maven-help-plugin:3.1.0:evaluate"}}, utils.Calls[1]) 260 assert.Equal(t, mock.ExecCall{Exec: "mvn", Params: []string{"--file", filepath.Join(".", "parent", "module1", "pom.xml"), "-Dexpression=project.build.finalName", "-DforceStdout", "-q", "-Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn", "--batch-mode", "org.apache.maven.plugins:maven-help-plugin:3.1.0:evaluate"}}, utils.Calls[2]) 261 assert.Equal(t, mock.ExecCall{Exec: "mvn", Params: []string{"-Dfile=" + filepath.Join(".", "parent/module1/target", "module1.jar.original"), "-Dpackaging=jar", "-DpomFile=" + filepath.Join("parent/module1/pom.xml"), "-Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn", "--batch-mode", "install:install-file"}}, utils.Calls[3]) 262 assert.Equal(t, mock.ExecCall{Exec: "mvn", Params: []string{"--file", filepath.Join(".", "parent", "pom.xml"), "-Dexpression=project.packaging", "-DforceStdout", "-q", "-Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn", "--batch-mode", "org.apache.maven.plugins:maven-help-plugin:3.1.0:evaluate"}}, utils.Calls[4]) 263 assert.Equal(t, mock.ExecCall{Exec: "mvn", Params: []string{"--file", filepath.Join(".", "parent", "pom.xml"), "-Dexpression=project.build.finalName", "-DforceStdout", "-q", "-Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn", "--batch-mode", "org.apache.maven.plugins:maven-help-plugin:3.1.0:evaluate"}}, utils.Calls[5]) 264 assert.Equal(t, mock.ExecCall{Exec: "mvn", Params: []string{"-Dfile=" + filepath.Join(".", "parent", "pom.xml"), "-DpomFile=" + filepath.Join("parent/pom.xml"), "-Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn", "--batch-mode", "install:install-file"}}, utils.Calls[6]) 265 } 266 }) 267 268 }