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  }