github.com/jfrog/jfrog-cli-core/v2@v2.51.0/common/build/buildutils_test.go (about)

     1  package build
     2  
     3  import (
     4  	biutils "github.com/jfrog/build-info-go/utils"
     5  	"os"
     6  	"path/filepath"
     7  	"strconv"
     8  	"testing"
     9  	"time"
    10  
    11  	"github.com/jfrog/jfrog-cli-core/v2/utils/tests"
    12  	testsutils "github.com/jfrog/jfrog-client-go/utils/tests"
    13  
    14  	"github.com/jfrog/jfrog-cli-core/v2/utils/coreutils"
    15  	artclientutils "github.com/jfrog/jfrog-client-go/artifactory/services/utils"
    16  	"github.com/stretchr/testify/assert"
    17  )
    18  
    19  var timestamp = strconv.FormatInt(time.Now().Unix(), 10)
    20  
    21  const buildNameFile = "fileBuildName"
    22  
    23  func TestGetBuildName(t *testing.T) {
    24  	const buildName = "buildName1"
    25  	const buildNameEnv = "envBuildName"
    26  
    27  	// Setup global build name env var.
    28  	// Ensure that other parallel tests won't be effected.
    29  	oldBuildName := coreutils.BuildName
    30  	coreutils.BuildName = oldBuildName + timestamp
    31  	defer func() { coreutils.BuildName = oldBuildName }()
    32  
    33  	// Create build config in temp folder.
    34  	tmpDir, createTempDirCallback := tests.CreateTempDirWithCallbackAndAssert(t)
    35  	defer createTempDirCallback()
    36  
    37  	confFileName := filepath.Join(tmpDir, ".jfrog", "projects")
    38  	assert.NoError(t, biutils.CopyFile(confFileName, filepath.Join("testdata", "build.yaml")))
    39  
    40  	wd, err := os.Getwd()
    41  	assert.NoError(t, err, "Failed to get current dir")
    42  	chdirCallBack := testsutils.ChangeDirWithCallback(t, wd, tmpDir)
    43  	defer chdirCallBack()
    44  
    45  	buildConfig := NewBuildConfiguration(buildName, "buildNumber", "module", "project")
    46  	for i := 0; i < 2; i++ {
    47  		// Validate build name form params input (first priority).
    48  		actualBuildName, err := buildConfig.GetBuildName()
    49  		assert.NoError(t, err)
    50  		assert.Equal(t, actualBuildName, buildName)
    51  
    52  		// Set build name // Set build name using env var.
    53  		// We're now making suer that these env vars aren't affecting the build name and number,
    54  		// because they should still be read from the params.using env var.
    55  		testsutils.SetEnvAndAssert(t, coreutils.BuildName, buildNameEnv)
    56  	}
    57  
    58  	// Validate build name form env var (second priority).
    59  	buildConfig.SetBuildName("")
    60  	actualBuildName, err := buildConfig.GetBuildName()
    61  	assert.NoError(t, err)
    62  	assert.Equal(t, actualBuildName, buildNameEnv)
    63  	testsutils.UnSetEnvAndAssert(t, coreutils.BuildName)
    64  
    65  	// Validate build name form config file (third priority).
    66  	buildConfig.SetBuildName("")
    67  	actualBuildName, err = buildConfig.GetBuildName()
    68  	assert.NoError(t, err)
    69  	assert.Equal(t, buildNameFile, actualBuildName)
    70  }
    71  
    72  func TestGetEmptyBuildNameOnUnixAccessDenied(t *testing.T) {
    73  	if coreutils.IsWindows() {
    74  		t.Skip("Skipping TestGetEmptyBuildNameOnUnixAccessDenied test on windows...")
    75  	}
    76  	// Create build config in temp folder.
    77  	tmpDir, createTempDirCallback := tests.CreateTempDirWithCallbackAndAssert(t)
    78  	defer createTempDirCallback()
    79  
    80  	destConfFile := filepath.Join(tmpDir, ".jfrog", "projects")
    81  	srcConfFile := filepath.Join("testdata", "build.yaml")
    82  	assert.NoError(t, biutils.CopyFile(destConfFile, srcConfFile))
    83  
    84  	// Remove permissions from config file.
    85  	assert.NoError(t, os.Chmod(destConfFile, 0000))
    86  	defer func() {
    87  		// Restore permissions for deleting the config file.
    88  		assert.NoError(t, os.Chmod(destConfFile, 0770))
    89  	}()
    90  
    91  	// Validate build name form config file doesn't throw an error if access is denied.
    92  	wd, err := os.Getwd()
    93  	assert.NoError(t, err, "Failed to get current dir")
    94  	chdirCallBack := testsutils.ChangeDirWithCallback(t, wd, tmpDir)
    95  	defer chdirCallBack()
    96  	buildConfig := NewBuildConfiguration("", "", "", "")
    97  	actualBuildName, err := buildConfig.GetBuildName()
    98  	assert.NoError(t, err)
    99  	assert.False(t, buildConfig.loadedFromConfigFile)
   100  	assert.Empty(t, actualBuildName)
   101  }
   102  
   103  func TestGetBuildNumber(t *testing.T) {
   104  	const buildNumber = "buildNumber1"
   105  	const buildNumberEnv = "envBuildNumber"
   106  	const buildNumberFromFile = artclientutils.LatestBuildNumberKey
   107  
   108  	// Create build config in temp folder.
   109  	tmpDir, createTempDirCallback := tests.CreateTempDirWithCallbackAndAssert(t)
   110  	defer createTempDirCallback()
   111  
   112  	// Create build config in temp folder
   113  	confFileName := filepath.Join(tmpDir, ".jfrog", "projects")
   114  	assert.NoError(t, biutils.CopyFile(confFileName, filepath.Join("testdata", "build.yaml")))
   115  
   116  	wd, err := os.Getwd()
   117  	assert.NoError(t, err, "Failed to get current dir")
   118  	chdirCallBack := testsutils.ChangeDirWithCallback(t, wd, tmpDir)
   119  	defer chdirCallBack()
   120  
   121  	// Setup global build number env var.
   122  	// Make sure other parallel tests won't be affected.
   123  	oldBuildNumber := coreutils.BuildNumber
   124  	coreutils.BuildNumber = oldBuildNumber + timestamp
   125  	defer func() { coreutils.BuildNumber = oldBuildNumber }()
   126  
   127  	buildConfig := NewBuildConfiguration("", buildNumber, "module", "project")
   128  	for i := 0; i < 2; i++ {
   129  		// Validate build number form params input (first priority).
   130  		actualBuildNumber, err := buildConfig.GetBuildNumber()
   131  		assert.NoError(t, err)
   132  		assert.Equal(t, actualBuildNumber, buildNumber)
   133  
   134  		// Set build number using env var.
   135  		testsutils.SetEnvAndAssert(t, coreutils.BuildNumber, buildNumberEnv)
   136  	}
   137  
   138  	// Validate build number form env var (second priority).
   139  	buildConfig.SetBuildNumber("")
   140  	actualBuildNumber, err := buildConfig.GetBuildNumber()
   141  	assert.NoError(t, err)
   142  	assert.Equal(t, actualBuildNumber, buildNumberEnv)
   143  	testsutils.UnSetEnvAndAssert(t, coreutils.BuildNumber)
   144  
   145  	// Validate build number form file (third priority).
   146  	buildConfig.SetBuildNumber("")
   147  	actualBuildNumber, err = buildConfig.GetBuildNumber()
   148  	assert.NoError(t, err)
   149  	assert.Equal(t, actualBuildNumber, buildNumberFromFile)
   150  }
   151  
   152  func TestGetProject(t *testing.T) {
   153  	const project = "project1"
   154  	const projectEnv = "envProject"
   155  
   156  	// Setup global project env var.
   157  	// Make sure other parallel tests won't be affected.
   158  	oldProject := coreutils.Project
   159  	coreutils.Project = oldProject + timestamp
   160  	defer func() { coreutils.Project = oldProject }()
   161  
   162  	buildConfig := NewBuildConfiguration("", "", "", project)
   163  	for i := 0; i < 2; i++ {
   164  		actualProject := buildConfig.GetProject()
   165  		assert.Equal(t, actualProject, project)
   166  
   167  		// Set project using env var.
   168  		testsutils.SetEnvAndAssert(t, coreutils.Project, projectEnv)
   169  	}
   170  
   171  	// Validate project form env var (second priority).
   172  	buildConfig.SetProject("")
   173  	actualProject := buildConfig.GetProject()
   174  	assert.Equal(t, actualProject, projectEnv)
   175  	testsutils.UnSetEnvAndAssert(t, coreutils.Project)
   176  }
   177  
   178  func TestIsCollectBuildInfo(t *testing.T) {
   179  	buildConfig := NewBuildConfiguration("", "", "", "")
   180  	toCollect, err := buildConfig.IsCollectBuildInfo()
   181  	assert.NoError(t, err)
   182  	assert.False(t, toCollect)
   183  	buildConfig.SetBuildName("a")
   184  	toCollect, err = buildConfig.IsCollectBuildInfo()
   185  	assert.NoError(t, err)
   186  	assert.False(t, toCollect)
   187  	buildConfig.SetProject("a")
   188  	toCollect, err = buildConfig.IsCollectBuildInfo()
   189  	assert.NoError(t, err)
   190  	assert.False(t, toCollect)
   191  	buildConfig.SetModule("a")
   192  	toCollect, err = buildConfig.IsCollectBuildInfo()
   193  	assert.NoError(t, err)
   194  	assert.False(t, toCollect)
   195  	buildConfig.SetBuildNumber("a")
   196  	toCollect, err = buildConfig.IsCollectBuildInfo()
   197  	assert.NoError(t, err)
   198  	assert.True(t, toCollect)
   199  }
   200  
   201  func TestIsLoadedFromConfigFile(t *testing.T) {
   202  	// Create build config in temp folder.
   203  	tmpDir, createTempDirCallback := tests.CreateTempDirWithCallbackAndAssert(t)
   204  	defer createTempDirCallback()
   205  	buildConfig := NewBuildConfiguration("", "", "", "")
   206  	assert.False(t, buildConfig.IsLoadedFromConfigFile())
   207  	buildConfig.SetBuildName("a")
   208  	assert.False(t, buildConfig.IsLoadedFromConfigFile())
   209  	buildConfig.SetProject("a")
   210  	assert.False(t, buildConfig.IsLoadedFromConfigFile())
   211  	buildConfig.SetModule("a")
   212  	assert.False(t, buildConfig.IsLoadedFromConfigFile())
   213  	buildConfig.SetBuildNumber("a")
   214  	assert.False(t, buildConfig.IsLoadedFromConfigFile())
   215  
   216  	buildConfig.SetBuildNumber("")
   217  	buildConfig.SetBuildName("")
   218  	// Create build config in temp folder
   219  	confFileName := filepath.Join(tmpDir, ".jfrog", "projects")
   220  	assert.NoError(t, biutils.CopyFile(confFileName, filepath.Join("testdata", "build.yaml")))
   221  	wd, err := os.Getwd()
   222  	assert.NoError(t, err, "Failed to get current dir")
   223  	chdirCallBack := testsutils.ChangeDirWithCallback(t, wd, tmpDir)
   224  	defer chdirCallBack()
   225  	buildName, err := buildConfig.GetBuildName()
   226  	assert.NoError(t, err)
   227  	assert.True(t, buildConfig.IsLoadedFromConfigFile())
   228  	assert.Equal(t, buildName, buildNameFile)
   229  	buildNumber, err := buildConfig.GetBuildNumber()
   230  	assert.NoError(t, err)
   231  	assert.Equal(t, buildNumber, artclientutils.LatestBuildNumberKey)
   232  	assert.True(t, buildConfig.IsLoadedFromConfigFile())
   233  
   234  	// Try to get build number first before build name.
   235  	buildConfig = NewBuildConfiguration("", "", "", "")
   236  	assert.False(t, buildConfig.IsLoadedFromConfigFile())
   237  
   238  	// Create build config in temp folder
   239  	buildNumber, err = buildConfig.GetBuildNumber()
   240  	assert.NoError(t, err)
   241  	assert.True(t, buildConfig.IsLoadedFromConfigFile())
   242  	buildName, err = buildConfig.GetBuildName()
   243  	assert.True(t, buildConfig.IsLoadedFromConfigFile())
   244  	assert.NoError(t, err)
   245  	assert.Equal(t, buildName, buildNameFile)
   246  	assert.Equal(t, buildNumber, artclientutils.LatestBuildNumberKey)
   247  }