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