github.com/jfrog/jfrog-cli-go@v1.22.1-0.20200318093948-4826ef344ffd/buildinfo_test.go (about) 1 package main 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "github.com/buger/jsonparser" 7 "github.com/jfrog/jfrog-cli-go/artifactory/commands/generic" 8 "github.com/jfrog/jfrog-cli-go/artifactory/utils" 9 "github.com/jfrog/jfrog-cli-go/inttestutils" 10 "github.com/jfrog/jfrog-cli-go/utils/cliutils" 11 "github.com/jfrog/jfrog-cli-go/utils/tests" 12 "github.com/jfrog/jfrog-client-go/artifactory/buildinfo" 13 "github.com/jfrog/jfrog-client-go/artifactory/services" 14 rtutils "github.com/jfrog/jfrog-client-go/artifactory/services/utils" 15 "github.com/jfrog/jfrog-client-go/httpclient" 16 clientutils "github.com/jfrog/jfrog-client-go/utils" 17 "github.com/jfrog/jfrog-client-go/utils/io/fileutils" 18 "github.com/stretchr/testify/assert" 19 "github.com/stretchr/testify/require" 20 "io/ioutil" 21 "os" 22 "path/filepath" 23 "strconv" 24 "strings" 25 "testing" 26 ) 27 28 const ModuleNameJFrogTest = "jfrog-test" 29 30 func TestBuildAddDependenciesFromHomeDir(t *testing.T) { 31 initArtifactoryTest(t) 32 // Clean old build tests if exists 33 inttestutils.DeleteBuild(artifactoryDetails.Url, tests.BuildAddDepsBuildName, artHttpDetails) 34 35 fileName := "cliTestFile.txt" 36 testFileRelPath, testFileAbs := createFileInHomeDir(t, fileName) 37 38 test := buildAddDepsBuildInfoTestParams{description: "'rt bad' from home dir", commandArgs: []string{testFileRelPath, "--recursive=false"}, expectedDependencies: []string{fileName}, buildName: tests.BuildAddDepsBuildName, buildNumber: "1"} 39 collectDepsAndPublishBuild(test, false, t) 40 validateBuildAddDepsBuildInfo(t, test) 41 42 os.Remove(testFileAbs) 43 inttestutils.DeleteBuild(artifactoryDetails.Url, tests.BuildAddDepsBuildName, artHttpDetails) 44 cleanArtifactoryTest() 45 } 46 47 func TestBuildPromote(t *testing.T) { 48 initArtifactoryTest(t) 49 buildName, buildNumberA := "cli-test-build", "10" 50 51 // Upload files with buildName and buildNumber 52 specFileA, err := tests.CreateSpec(tests.SplitUploadSpecA) 53 assert.NoError(t, err) 54 artifactoryCli.Exec("upload", "--spec="+specFileA, "--build-name="+buildName, "--build-number="+buildNumberA) 55 artifactoryCli.Exec("build-publish", buildName, buildNumberA) 56 57 key1 := "key" 58 value1 := "v1,v2" 59 key2 := "another" 60 value2 := "property" 61 artifactoryCli.Exec("build-promote", buildName, buildNumberA, tests.Repo2, fmt.Sprintf("--props=%s=%s;%s=%s", key1, value1, key2, value2)) 62 buildInfo := inttestutils.GetBuildInfo(artifactoryDetails.Url, buildName, buildNumberA, t, artHttpDetails) 63 resultItems := getResultItemsFromArtifactory(tests.SearchRepo2, t) 64 65 assert.Equal(t, len(buildInfo.Modules[0].Artifacts), len(resultItems), "Incorrect number of artifacts were uploaded") 66 67 propsMap := map[string]string{ 68 "build.name": buildInfo.Name, 69 "build.number": buildInfo.Number, 70 key1: value1, 71 key2: value2, 72 } 73 74 validateArtifactsProperties(resultItems, t, propsMap) 75 cleanArtifactoryTest() 76 } 77 78 // Returns the artifacts found by the provided spec 79 func getResultItemsFromArtifactory(specName string, t *testing.T) []rtutils.ResultItem { 80 searchGoSpecFile, err := tests.CreateSpec(specName) 81 assert.NoError(t, err) 82 spec, flags := getSpecAndCommonFlags(searchGoSpecFile) 83 flags.SetArtifactoryDetails(artAuth) 84 var resultItems []rtutils.ResultItem 85 for i := 0; i < len(spec.Files); i++ { 86 searchParams, err := generic.GetSearchParams(spec.Get(i)) 87 assert.NoError(t, err) 88 89 currentResultItems, err := services.SearchBySpecFiles(searchParams, flags, rtutils.ALL) 90 assert.NoError(t, err, "Failed Searching files") 91 resultItems = append(resultItems, currentResultItems...) 92 } 93 return resultItems 94 } 95 96 // This function validates the properties on the provided artifacts. Every property within the provided map should be attached to the artifact. 97 func validateArtifactsProperties(resultItems []rtutils.ResultItem, t *testing.T, propsMap map[string]string) { 98 for _, item := range resultItems { 99 properties := item.Properties 100 assert.GreaterOrEqual(t, len(properties), 1, "Failed finding properties on item:", item.GetItemRelativePath()) 101 propertiesMap := tests.ConvertSliceToMap(properties) 102 103 for key, value := range propsMap { 104 valueFromArtifact, contains := propertiesMap[key] 105 assert.True(t, contains, "Failed finding %s property on %s", key, item.Name) 106 assert.Equalf(t, value, valueFromArtifact, "Wrong value for %s property on %s.", key, item.Name) 107 } 108 } 109 } 110 111 func TestBuildAddDependenciesDryRun(t *testing.T) { 112 initArtifactoryTest(t) 113 // Clean old build tests if exists 114 inttestutils.DeleteBuild(artifactoryDetails.Url, tests.BuildAddDepsBuildName, artHttpDetails) 115 err := utils.RemoveBuildDir(tests.BuildAddDepsBuildName, "1") 116 assert.NoError(t, err) 117 118 wd, err := os.Getwd() 119 assert.NoError(t, err) 120 121 defer os.Chdir(wd) 122 err = os.Chdir("testsdata") 123 assert.NoError(t, err) 124 125 noCredsCli := tests.NewJfrogCli(execMain, "jfrog rt", "") 126 // Execute the bad command 127 noCredsCli.Exec("bad", tests.BuildAddDepsBuildName, "1", "a/*", "--dry-run=true") 128 buildDir, err := utils.GetBuildDir(tests.BuildAddDepsBuildName, "1") 129 assert.NoError(t, err) 130 131 files, _ := ioutil.ReadDir(buildDir) 132 assert.Zero(t, len(files), "'rt bad' command with dry-run failed. The dry-run option has no effect.") 133 134 inttestutils.DeleteBuild(artifactoryDetails.Url, tests.BuildAddDepsBuildName, artHttpDetails) 135 os.Chdir(wd) 136 cleanArtifactoryTest() 137 } 138 139 func TestBuildAddDependencies(t *testing.T) { 140 initArtifactoryTest(t) 141 // Clean old build tests if exists 142 inttestutils.DeleteBuild(artifactoryDetails.Url, tests.BuildAddDepsBuildName, artHttpDetails) 143 144 allFiles := []string{"a1.in", "a2.in", "a3.in", "b1.in", "b2.in", "b3.in", "c1.in", "c2.in", "c3.in"} 145 var badTests = []buildAddDepsBuildInfoTestParams{ 146 {description: "'rt bad' simple cli", commandArgs: []string{"testsdata/a/*"}, expectedDependencies: allFiles}, 147 {description: "'rt bad' single file", commandArgs: []string{"testsdata/a/a1.in"}, expectedDependencies: []string{"a1.in"}}, 148 {description: "'rt bad' none recursive", commandArgs: []string{"testsdata/a/*", "--recursive=false"}, expectedDependencies: []string{"a1.in", "a2.in", "a3.in"}}, 149 {description: "'rt bad' special chars recursive", commandArgs: []string{getSpecialCharFilePath()}, expectedDependencies: []string{"a1.in"}}, 150 {description: "'rt bad' exclude command line wildcards", commandArgs: []string{"testsdata/a/*", "--exclude-patterns=*a2*;*a3.in"}, expectedDependencies: []string{"a1.in", "b1.in", "b2.in", "b3.in", "c1.in", "c2.in", "c3.in"}}, 151 {description: "'rt bad' spec", commandArgs: []string{"--spec=" + tests.GetFilePathForArtifactory(tests.BuildAddDepsSpec)}, expectedDependencies: allFiles}, 152 {description: "'rt bad' two specFiles", commandArgs: []string{"--spec=" + tests.GetFilePathForArtifactory(tests.BuildAddDepsDoubleSpec)}, expectedDependencies: []string{"a1.in", "a2.in", "a3.in", "b1.in", "b2.in", "b3.in"}}, 153 {description: "'rt bad' exclude command line regexp", commandArgs: []string{"testsdata/a/a(.*)", "--exclude-patterns=(.*)a2.*;.*a3.in", "--regexp=true"}, expectedDependencies: []string{"a1.in"}}, 154 } 155 156 // Tests compatibility to file paths with windows separators. 157 if cliutils.IsWindows() { 158 var compatibilityTests = []buildAddDepsBuildInfoTestParams{ 159 {description: "'rt bad' win compatibility by arguments", commandArgs: []string{"testsdata\\\\a\\\\a1.in"}, expectedDependencies: []string{"a1.in"}}, 160 {description: "'rt bad' win compatibility by spec", commandArgs: []string{"--spec=" + tests.GetFilePathForArtifactory(tests.WinBuildAddDepsSpec)}, expectedDependencies: allFiles}, 161 } 162 badTests = append(badTests, compatibilityTests...) 163 } 164 165 for i, badTest := range badTests { 166 badTest.buildName = tests.BuildAddDepsBuildName 167 badTest.buildNumber = strconv.Itoa(i + 1) 168 169 collectDepsAndPublishBuild(badTest, true, t) 170 validateBuildAddDepsBuildInfo(t, badTest) 171 utils.RemoveBuildDir(badTest.buildName, badTest.buildNumber) 172 173 collectDepsAndPublishBuild(badTest, false, t) 174 validateBuildAddDepsBuildInfo(t, badTest) 175 utils.RemoveBuildDir(badTest.buildName, badTest.buildNumber) 176 } 177 178 inttestutils.DeleteBuild(artifactoryDetails.Url, tests.BuildAddDepsBuildName, artHttpDetails) 179 } 180 181 // Test publish build info without --build-url 182 func TestArtifactoryPublishBuildInfo(t *testing.T) { 183 initArtifactoryTest(t) 184 buildName, buildNumber := "cli-test-build", "10" 185 inttestutils.DeleteBuild(artifactoryDetails.Url, buildName, artHttpDetails) 186 187 body := uploadFilesAndGetBuildInfo(t, buildName, buildNumber, "") 188 189 // Validate no build url 190 _, _, _, err := jsonparser.Get(body, "buildInfo", "url") 191 assert.Error(t, err, "Build url is expected to be empty") 192 193 // Cleanup 194 inttestutils.DeleteBuild(artifactoryDetails.Url, buildName, artHttpDetails) 195 cleanArtifactoryTest() 196 } 197 198 // Test publish build info with --build-url 199 func TestArtifactoryPublishBuildInfoBuildUrl(t *testing.T) { 200 initArtifactoryTest(t) 201 buildName, buildNumber := "cli-test-build", "11" 202 buildUrl := "http://example.ci.com" 203 os.Setenv(cliutils.BuildUrl, "http://override-me.ci.com") 204 defer os.Unsetenv(cliutils.BuildUrl) 205 inttestutils.DeleteBuild(artifactoryDetails.Url, buildName, artHttpDetails) 206 207 body := uploadFilesAndGetBuildInfo(t, buildName, buildNumber, buildUrl) 208 209 // Validate correctness of build url 210 actualBuildUrl, err := jsonparser.GetString(body, "buildInfo", "url") 211 assert.NoError(t, err) 212 assert.Equal(t, buildUrl, actualBuildUrl) 213 214 // Cleanup 215 inttestutils.DeleteBuild(artifactoryDetails.Url, buildName, artHttpDetails) 216 cleanArtifactoryTest() 217 } 218 219 // Test publish build info with JFROG_CLI_BUILD_URL env 220 func TestArtifactoryPublishBuildInfoBuildUrlFromEnv(t *testing.T) { 221 initArtifactoryTest(t) 222 buildName, buildNumber := "cli-test-build", "11" 223 buildUrl := "http://example-env.ci.com" 224 inttestutils.DeleteBuild(artifactoryDetails.Url, buildName, artHttpDetails) 225 os.Setenv(cliutils.BuildUrl, buildUrl) 226 defer os.Unsetenv(cliutils.BuildUrl) 227 body := uploadFilesAndGetBuildInfo(t, buildName, buildNumber, "") 228 229 // Validate correctness of build url 230 actualBuildUrl, err := jsonparser.GetString(body, "buildInfo", "url") 231 assert.NoError(t, err) 232 assert.Equal(t, buildUrl, actualBuildUrl) 233 234 // Cleanup 235 inttestutils.DeleteBuild(artifactoryDetails.Url, buildName, artHttpDetails) 236 cleanArtifactoryTest() 237 } 238 239 func TestArtifactoryCleanBuildInfo(t *testing.T) { 240 initArtifactoryTest(t) 241 buildName, buildNumber := "cli-test-build", "11" 242 inttestutils.DeleteBuild(artifactoryDetails.Url, buildName, artHttpDetails) 243 244 // Upload files with buildName and buildNumber 245 specFile, err := tests.CreateSpec(tests.SplitUploadSpecA) 246 assert.NoError(t, err) 247 artifactoryCli.Exec("upload", "--spec="+specFile, "--build-name="+buildName, "--build-number="+buildNumber) 248 249 // Cleanup buildInfo with the same buildName and buildNumber 250 artifactoryCli.WithSuffix("").Exec("build-clean", buildName, buildNumber) 251 252 // Upload different files with the same buildName and buildNumber 253 specFile, err = tests.CreateSpec(tests.SplitUploadSpecB) 254 assert.NoError(t, err) 255 artifactoryCli.Exec("upload", "--spec="+specFile, "--build-name="+buildName, "--build-number="+buildNumber) 256 257 // Publish buildInfo 258 artifactoryCli.Exec("build-publish", buildName, buildNumber) 259 260 // Download by build and verify that only artifacts uploaded after clean are downloaded 261 outputDir := filepath.Join(tests.Out, "clean-build") 262 artifactoryCli.Exec("download", tests.Repo1, outputDir+fileutils.GetFileSeparator(), "--build="+buildName+"/"+buildNumber) 263 paths, _ := fileutils.ListFilesRecursiveWalkIntoDirSymlink(outputDir, false) 264 tests.VerifyExistLocally(tests.GetCleanBuild(), paths, t) 265 266 // Cleanup 267 inttestutils.DeleteBuild(artifactoryDetails.Url, buildName, artHttpDetails) 268 cleanArtifactoryTest() 269 } 270 271 func TestBuildAddGit(t *testing.T) { 272 testBuildAddGit(t, false) 273 } 274 275 func TestBuildAddGitEnvBuildNameAndNumber(t *testing.T) { 276 testBuildAddGit(t, true) 277 } 278 279 func testBuildAddGit(t *testing.T, useEnvBuildNameAndNumber bool) { 280 initArtifactoryTest(t) 281 gitCollectCliRunner := tests.NewJfrogCli(execMain, "jfrog rt", "") 282 buildName, buildNumber := "cli-test-build", "13" 283 284 // Populate cli config with 'default' server 285 oldHomeDir := os.Getenv(cliutils.HomeDir) 286 createJfrogHomeConfig(t) 287 288 // Create .git folder for this test 289 originalFolder := "buildaddgit_.git_suffix" 290 baseDir, dotGitPath := tests.PrepareDotGitDir(t, originalFolder, "testsdata") 291 292 // Get path for build-add-git config file 293 pwd, _ := os.Getwd() 294 configPath := filepath.Join(pwd, "testsdata", "buildaddgit_config.yaml") 295 296 // Run build-add-git 297 var err error 298 if useEnvBuildNameAndNumber { 299 os.Setenv(cliutils.BuildName, buildName) 300 os.Setenv(cliutils.BuildNumber, buildNumber) 301 defer os.Unsetenv(cliutils.BuildName) 302 defer os.Unsetenv(cliutils.BuildNumber) 303 err = gitCollectCliRunner.Exec("build-add-git", baseDir, "--config="+configPath) 304 } else { 305 err = gitCollectCliRunner.Exec("build-add-git", buildName, buildNumber, baseDir, "--config="+configPath) 306 } 307 defer cleanBuildAddGitTest(t, baseDir, originalFolder, oldHomeDir, dotGitPath, buildName) 308 if err != nil { 309 t.Fatal(err) 310 } 311 312 // Clear previous build if exists and publish build-info 313 inttestutils.DeleteBuild(artifactoryDetails.Url, buildName, artHttpDetails) 314 artifactoryCli.Exec("build-publish", buildName, buildNumber) 315 316 // Fetch the published build-info for validation 317 buildInfo := inttestutils.GetBuildInfo(artifactoryDetails.Url, buildName, buildNumber, t, artHttpDetails) 318 if t.Failed() { 319 t.FailNow() 320 } 321 require.NotNil(t, buildInfo.Vcs, "Received build-info with empty VCS.") 322 323 // Validate results 324 expectedVcsUrl := "https://github.com/jfrog/jfrog-cli-go.git" 325 expectedVcsRevision := "b033a0e508bdb52eee25654c9e12db33ff01b8ff" 326 buildInfoVcsUrl := buildInfo.Vcs.Url 327 buildInfoVcsRevision := buildInfo.Vcs.Revision 328 assert.Equal(t, expectedVcsRevision, buildInfoVcsRevision, "Wrong revision") 329 assert.Equal(t, expectedVcsUrl, buildInfoVcsUrl, "Wrong url") 330 assert.False(t, buildInfo.Issues == nil || len(buildInfo.Issues.AffectedIssues) != 4, 331 "Wrong issues number, expected 4 issues, received: %+v", *buildInfo.Issues) 332 } 333 334 func cleanBuildAddGitTest(t *testing.T, baseDir, originalFolder, oldHomeDir, dotGitPath, buildName string) { 335 tests.RenamePath(dotGitPath, filepath.Join(baseDir, originalFolder), t) 336 inttestutils.DeleteBuild(artifactoryDetails.Url, buildName, artHttpDetails) 337 os.Setenv(cliutils.HomeDir, oldHomeDir) 338 cleanArtifactoryTest() 339 } 340 341 func TestReadGitConfig(t *testing.T) { 342 dotGitPath := getCliDotGitPath(t) 343 gitManager := clientutils.NewGitManager(dotGitPath) 344 err := gitManager.ReadConfig() 345 assert.NoError(t, err, "Failed to read .git config file.") 346 347 workingDir, err := os.Getwd() 348 assert.NoError(t, err, "Failed to get current dir.") 349 gitExecutor := tests.GitExecutor(workingDir) 350 revision, _, err := gitExecutor.GetRevision() 351 require.NoError(t, err) 352 assert.Equal(t, revision, gitManager.GetRevision(), "Wrong revision") 353 354 url, _, err := gitExecutor.GetUrl() 355 require.NoError(t, err) 356 if !strings.HasSuffix(url, ".git") { 357 url += ".git" 358 } 359 360 assert.Equal(t, url, gitManager.GetUrl(), "Wrong url") 361 } 362 363 func uploadFilesAndGetBuildInfo(t *testing.T, buildName, buildNumber, buildUrl string) []byte { 364 uploadFiles(t, "upload", "--build-name="+buildName, "--build-number="+buildNumber) 365 366 //publish buildInfo 367 publishBuildInfoArgs := []string{"build-publish", buildName, buildNumber} 368 if buildUrl != "" { 369 publishBuildInfoArgs = append(publishBuildInfoArgs, "--build-url="+buildUrl) 370 } 371 artifactoryCli.Exec(publishBuildInfoArgs...) 372 373 //validate files are uploaded with the build info name and number 374 props := fmt.Sprintf("build.name=%v;build.number=%v", buildName, buildNumber) 375 verifyExistInArtifactoryByProps(tests.GetSimpleUploadExpectedRepo1(), tests.Repo1+"/*", props, t) 376 377 //download build info 378 buildInfoUrl := fmt.Sprintf("%vapi/build/%v/%v", artifactoryDetails.Url, buildName, buildNumber) 379 client, err := httpclient.ClientBuilder().Build() 380 assert.NoError(t, err) 381 _, body, _, err := client.SendGet(buildInfoUrl, false, artHttpDetails) 382 assert.NoError(t, err) 383 return body 384 } 385 386 func uploadFiles(t *testing.T, args ...string) { 387 // Upload files with buildName and buildNumber 388 specFile, err := tests.CreateSpec(tests.UploadFlatRecursive) 389 assert.NoError(t, err) 390 args = append(args, "--spec="+specFile) 391 artifactoryCli.Exec(args...) 392 } 393 394 func downloadFiles(t *testing.T, args ...string) { 395 // Download files with buildName and buildNumber 396 specFile, err := tests.CreateSpec(tests.DownloadAllRepo1TestResources) 397 assert.NoError(t, err) 398 args = append(args, "--spec="+specFile) 399 artifactoryCli.Exec(args...) 400 } 401 402 func TestModuleName(t *testing.T) { 403 initArtifactoryTest(t) 404 buildName := "cli-test-build" 405 type command struct { 406 execFunc func(t *testing.T, args ...string) 407 args []string 408 } 409 410 tests := []struct { 411 testName string 412 buildNumber string 413 moduleName string 414 expectedDependencies int 415 expectedArtifacts int 416 execCommands []command 417 }{ 418 {"uploadWithModuleChange", "9", ModuleNameJFrogTest, 0, 9, []command{{uploadFiles, []string{"upload", "--build-name=" + buildName, "--module=" + ModuleNameJFrogTest}}}}, 419 {"uploadWithoutChange", "10", buildName, 0, 9, []command{{uploadFiles, []string{"upload", "--build-name=" + buildName}}}}, 420 {"downloadWithModuleChange", "11", ModuleNameJFrogTest, 9, 0, []command{{downloadFiles, []string{"download", "--build-name=" + buildName, "--module=" + ModuleNameJFrogTest}}}}, 421 {"downloadWithoutModuleChange", "12", buildName, 9, 0, []command{{downloadFiles, []string{"download", "--build-name=" + buildName}}}}, 422 {"uploadAndDownloadAggregationWithModuleChange", "13", ModuleNameJFrogTest, 9, 9, []command{{uploadFiles, []string{"upload", "--build-name=" + buildName, "--module=" + ModuleNameJFrogTest}}, {downloadFiles, []string{"download", "--build-name=" + buildName, "--module=" + ModuleNameJFrogTest}}}}, 423 {"uploadAndDownloadAggregationWithoutModuleChange", "14", buildName, 9, 9, []command{{uploadFiles, []string{"upload", "--build-name=" + buildName}}, {downloadFiles, []string{"download", "--build-name=" + buildName}}}}, 424 } 425 426 inttestutils.DeleteBuild(artifactoryDetails.Url, buildName, artHttpDetails) 427 for _, test := range tests { 428 t.Run(test.testName, func(t *testing.T) { 429 for _, exeCommand := range test.execCommands { 430 exeCommand.args = append(exeCommand.args, "--build-number="+test.buildNumber) 431 exeCommand.execFunc(t, exeCommand.args...) 432 } 433 artifactoryCli.Exec("bp", buildName, test.buildNumber) 434 buildInfo := inttestutils.GetBuildInfo(artifactoryDetails.Url, buildName, test.buildNumber, t, artHttpDetails) 435 validateBuildInfo(buildInfo, t, test.expectedDependencies, test.expectedArtifacts, test.moduleName) 436 }) 437 } 438 439 inttestutils.DeleteBuild(artifactoryDetails.Url, buildName, artHttpDetails) 440 } 441 442 func collectDepsAndPublishBuild(badTest buildAddDepsBuildInfoTestParams, useEnvBuildNameAndNumber bool, t *testing.T) { 443 noCredsCli := tests.NewJfrogCli(execMain, "jfrog rt", "") 444 // Remove old tests data from fs if exists 445 err := utils.RemoveBuildDir(badTest.buildName, badTest.buildNumber) 446 assert.NoError(t, err) 447 448 command := []string{"bad"} 449 if useEnvBuildNameAndNumber { 450 os.Setenv(cliutils.BuildName, badTest.buildName) 451 os.Setenv(cliutils.BuildNumber, badTest.buildNumber) 452 defer os.Unsetenv(cliutils.BuildName) 453 defer os.Unsetenv(cliutils.BuildNumber) 454 } else { 455 command = append(command, badTest.buildName, badTest.buildNumber) 456 } 457 458 // Execute tha bad command 459 noCredsCli.Exec(append(command, badTest.commandArgs...)...) 460 artifactoryCli.Exec("bp", badTest.buildName, badTest.buildNumber) 461 } 462 463 func validateBuildAddDepsBuildInfo(t *testing.T, buildInfoTestParams buildAddDepsBuildInfoTestParams) { 464 buildInfo := inttestutils.GetBuildInfo(artifactoryDetails.Url, buildInfoTestParams.buildName, buildInfoTestParams.buildNumber, t, artHttpDetails) 465 if buildInfo.Modules == nil || len(buildInfo.Modules) == 0 { 466 buildInfoString, _ := json.Marshal(buildInfo) 467 // Case no module was not created 468 assert.Failf(t, "%s test with the command: \nrt bad %s \nexpected to have module with the following dependencies: \n%s \nbut has no modules: \n%s", 469 buildInfoTestParams.description, buildInfoTestParams.commandArgs, buildInfoTestParams.expectedDependencies, buildInfoString) 470 } 471 // The checksums are ignored when comparing the actual and the expected 472 assert.Equalf(t, len(buildInfoTestParams.expectedDependencies), len(buildInfo.Modules[0].Dependencies), 473 "%s test with the command: \nrt bad %s \nexpected to have the following dependencies: \n%s \nbut has: \n%s", 474 buildInfoTestParams.description, buildInfoTestParams.commandArgs, buildInfoTestParams.expectedDependencies, dependenciesToPrintableArray(buildInfo.Modules[0].Dependencies)) 475 476 for _, expectedDependency := range buildInfoTestParams.expectedDependencies { 477 found := false 478 for _, actualDependency := range buildInfo.Modules[0].Dependencies { 479 if actualDependency.Id == expectedDependency { 480 found = true 481 break 482 } 483 } 484 // The checksums are ignored when comparing the actual and the expected 485 assert.Truef(t, found, "%s test with the command: \nrt bad %s \nexpected to have the following dependencies: \n%s \nbut has: \n%s", 486 buildInfoTestParams.description, buildInfoTestParams.commandArgs, buildInfoTestParams.expectedDependencies, dependenciesToPrintableArray(buildInfo.Modules[0].Dependencies)) 487 } 488 } 489 490 func dependenciesToPrintableArray(dependencies []buildinfo.Dependency) []string { 491 ids := []string{} 492 for _, dependency := range dependencies { 493 ids = append(ids, dependency.Id) 494 } 495 return ids 496 } 497 498 type buildAddDepsBuildInfoTestParams struct { 499 description string 500 commandArgs []string 501 expectedDependencies []string 502 buildName string 503 buildNumber string 504 validationFunc func(*testing.T, buildAddDepsBuildInfoTestParams) 505 }