github.com/olli-ai/jx/v2@v2.0.400-0.20210921045218-14731b4dd448/pkg/versionstream/versionstreamrepo/gitrepo_integration_test.go (about)

     1  // +build integration
     2  
     3  package versionstreamrepo_test
     4  
     5  import (
     6  	"fmt"
     7  	"io/ioutil"
     8  	"os"
     9  	"path/filepath"
    10  	"testing"
    11  	"time"
    12  
    13  	"github.com/olli-ai/jx/v2/pkg/config"
    14  	"github.com/olli-ai/jx/v2/pkg/gits"
    15  	"github.com/olli-ai/jx/v2/pkg/util"
    16  	"github.com/olli-ai/jx/v2/pkg/versionstream/versionstreamrepo"
    17  	"github.com/stretchr/testify/assert"
    18  
    19  	v1 "github.com/jenkins-x/jx-api/pkg/apis/jenkins.io/v1"
    20  )
    21  
    22  const (
    23  	TagFromDefaultURL = "v1.0.114"
    24  	FirstTag          = "v0.0.1"
    25  	SecondTag         = "v0.0.2"
    26  	BranchRef         = "master"
    27  )
    28  
    29  func TestCloneJXVersionsRepoWithDefaultURL(t *testing.T) {
    30  	origJxHome := os.Getenv("JX_HOME")
    31  
    32  	tmpJxHome, err := ioutil.TempDir("", "jx-test-"+t.Name())
    33  	assert.NoError(t, err)
    34  
    35  	err = os.Setenv("JX_HOME", tmpJxHome)
    36  	assert.NoError(t, err)
    37  
    38  	defer func() {
    39  		_ = os.RemoveAll(tmpJxHome)
    40  		err = os.Setenv("JX_HOME", origJxHome)
    41  	}()
    42  
    43  	gitter := gits.NewGitCLI()
    44  	_, _ = assertClonesCorrectly(t, "", TagFromDefaultURL, TagFromDefaultURL, gitter, nil)
    45  }
    46  
    47  func initializeTempGitRepo(gitter gits.Gitter) (string, string, error) {
    48  	dir, err := ioutil.TempDir("", "")
    49  	if err != nil {
    50  		return "", "", err
    51  	}
    52  
    53  	err = gitter.Init(dir)
    54  	if err != nil {
    55  		return "", "", err
    56  	}
    57  
    58  	err = gitter.AddCommit(dir, "Initial Commit")
    59  	if err != nil {
    60  		return "", "", err
    61  	}
    62  
    63  	testFile, err := ioutil.TempFile(dir, "versionstreams-test-")
    64  	if err != nil {
    65  		return "", "", err
    66  	}
    67  
    68  	testFileContents := []byte("foo")
    69  	_, err = testFile.Write(testFileContents)
    70  	if err != nil {
    71  		return "", "", err
    72  	}
    73  
    74  	err = gitter.Add(dir, ".")
    75  	if err != nil {
    76  		return "", "", err
    77  	}
    78  	err = gitter.AddCommit(dir, "Adding foo")
    79  	if err != nil {
    80  		return "", "", err
    81  	}
    82  
    83  	err = gitter.CreateTag(dir, FirstTag, "First Tag")
    84  	if err != nil {
    85  		return "", "", err
    86  	}
    87  
    88  	testFileContents = []byte("bar")
    89  	_, err = testFile.Write(testFileContents)
    90  	if err != nil {
    91  		return "", "", err
    92  	}
    93  
    94  	err = gitter.AddCommit(dir, "Adding bar")
    95  	if err != nil {
    96  		return "", "", err
    97  	}
    98  
    99  	err = gitter.CreateTag(dir, SecondTag, "Second Tag")
   100  	if err != nil {
   101  		return "", "", err
   102  	}
   103  
   104  	testFileContents = []byte("baz")
   105  	_, err = testFile.Write(testFileContents)
   106  	if err != nil {
   107  		return "", "", err
   108  	}
   109  
   110  	err = gitter.AddCommit(dir, "Adding baz")
   111  	if err != nil {
   112  		return "", "", err
   113  	}
   114  
   115  	return fmt.Sprint(dir), filepath.Base(testFile.Name()), nil
   116  }
   117  
   118  func TestCloneJXVersionsRepoWithOverriddenDefault(t *testing.T) {
   119  	origJxHome := os.Getenv("JX_HOME")
   120  
   121  	tmpJxHome, err := ioutil.TempDir("", "jx-test-"+t.Name())
   122  	assert.NoError(t, err)
   123  
   124  	err = os.Setenv("JX_HOME", tmpJxHome)
   125  	assert.NoError(t, err)
   126  
   127  	defer func() {
   128  		_ = os.RemoveAll(tmpJxHome)
   129  		err = os.Setenv("JX_HOME", origJxHome)
   130  	}()
   131  
   132  	gitter := gits.NewGitCLI()
   133  	gitDir, testFileName, err := initializeTempGitRepo(gitter)
   134  	defer func() {
   135  		err := os.RemoveAll(gitDir)
   136  		assert.NoError(t, err)
   137  	}()
   138  	assert.NoError(t, err)
   139  
   140  	originalDefaultVersionsURL := config.DefaultVersionsURL
   141  	originalDefaultVersionsRef := config.DefaultVersionsRef
   142  
   143  	config.DefaultVersionsURL = gitDir
   144  	config.DefaultVersionsRef = FirstTag
   145  
   146  	defer func() {
   147  		config.DefaultVersionsRef = originalDefaultVersionsRef
   148  		config.DefaultVersionsURL = originalDefaultVersionsURL
   149  	}()
   150  
   151  	_ = assertClonesCorrectlyWithCorrectFileContents(t, "", "", FirstTag, gitter, testFileName, "foo", nil)
   152  }
   153  
   154  func TestCloneJXVersionsRepoReplacingCurrent(t *testing.T) {
   155  	origJxHome := os.Getenv("JX_HOME")
   156  
   157  	tmpJxHome, err := ioutil.TempDir("", "jx-test-"+t.Name())
   158  	assert.NoError(t, err)
   159  
   160  	err = os.Setenv("JX_HOME", tmpJxHome)
   161  	assert.NoError(t, err)
   162  
   163  	defer func() {
   164  		_ = os.RemoveAll(tmpJxHome)
   165  		err = os.Setenv("JX_HOME", origJxHome)
   166  	}()
   167  
   168  	gitter := gits.NewGitCLI()
   169  	// First, clone the default URL so we can make sure it gets removed.
   170  	_, _ = assertClonesCorrectly(t, "", TagFromDefaultURL, TagFromDefaultURL, gitter, nil)
   171  
   172  	// Sleep briefly so that git GC in the background has finished
   173  	time.Sleep(5 * time.Second)
   174  
   175  	// Next, switch to using the temp repo and make sure that replaces the current one.
   176  	gitDir, testFileName, err := initializeTempGitRepo(gitter)
   177  	defer func() {
   178  		err := os.RemoveAll(gitDir)
   179  		assert.NoError(t, err)
   180  	}()
   181  	assert.NoError(t, err)
   182  	settings := &v1.TeamSettings{
   183  		VersionStreamURL: gitDir,
   184  		VersionStreamRef: FirstTag,
   185  	}
   186  
   187  	_ = assertClonesCorrectlyWithCorrectFileContents(t, "", "", FirstTag, gitter, testFileName, "foo", settings)
   188  }
   189  
   190  func TestCloneJXVersionsRepoWithTeamSettings(t *testing.T) {
   191  	origJxHome := os.Getenv("JX_HOME")
   192  
   193  	tmpJxHome, err := ioutil.TempDir("", "jx-test-"+t.Name())
   194  	assert.NoError(t, err)
   195  
   196  	err = os.Setenv("JX_HOME", tmpJxHome)
   197  	assert.NoError(t, err)
   198  
   199  	defer func() {
   200  		_ = os.RemoveAll(tmpJxHome)
   201  		err = os.Setenv("JX_HOME", origJxHome)
   202  	}()
   203  
   204  	gitter := gits.NewGitCLI()
   205  	gitDir, testFileName, err := initializeTempGitRepo(gitter)
   206  	defer func() {
   207  		err := os.RemoveAll(gitDir)
   208  		assert.NoError(t, err)
   209  	}()
   210  	assert.NoError(t, err)
   211  	settings := &v1.TeamSettings{
   212  		VersionStreamURL: gitDir,
   213  		VersionStreamRef: FirstTag,
   214  	}
   215  
   216  	_ = assertClonesCorrectlyWithCorrectFileContents(t, "", "", FirstTag, gitter, testFileName, "foo", settings)
   217  }
   218  
   219  func TestCloneJXVersionsRepoWithATag(t *testing.T) {
   220  	origJxHome := os.Getenv("JX_HOME")
   221  
   222  	tmpJxHome, err := ioutil.TempDir("", "jx-test-"+t.Name())
   223  	assert.NoError(t, err)
   224  
   225  	err = os.Setenv("JX_HOME", tmpJxHome)
   226  	assert.NoError(t, err)
   227  
   228  	defer func() {
   229  		_ = os.RemoveAll(tmpJxHome)
   230  		err = os.Setenv("JX_HOME", origJxHome)
   231  	}()
   232  
   233  	gitter := gits.NewGitCLI()
   234  	gitDir, testFileName, err := initializeTempGitRepo(gitter)
   235  	defer func() {
   236  		err := os.RemoveAll(gitDir)
   237  		assert.NoError(t, err)
   238  	}()
   239  	assert.NoError(t, err)
   240  
   241  	_ = assertClonesCorrectlyWithCorrectFileContents(t, gitDir, FirstTag, FirstTag, gitter, testFileName, "foo", nil)
   242  }
   243  
   244  func TestCloneJXVersionsRepoWithABranch(t *testing.T) {
   245  	origJxHome := os.Getenv("JX_HOME")
   246  
   247  	tmpJxHome, err := ioutil.TempDir("", "jx-test-"+t.Name())
   248  	assert.NoError(t, err)
   249  
   250  	err = os.Setenv("JX_HOME", tmpJxHome)
   251  	assert.NoError(t, err)
   252  
   253  	defer func() {
   254  		_ = os.RemoveAll(tmpJxHome)
   255  		err = os.Setenv("JX_HOME", origJxHome)
   256  	}()
   257  
   258  	gitter := gits.NewGitCLI()
   259  	gitDir, testFileName, err := initializeTempGitRepo(gitter)
   260  	defer func() {
   261  		err := os.RemoveAll(gitDir)
   262  		assert.NoError(t, err)
   263  	}()
   264  	assert.NoError(t, err)
   265  
   266  	_ = assertClonesCorrectlyWithCorrectFileContents(t, gitDir, BranchRef, BranchRef, gitter, testFileName, "foobarbaz", nil)
   267  }
   268  
   269  func TestCloneJXVersionsRepoWithACommit(t *testing.T) {
   270  	origJxHome := os.Getenv("JX_HOME")
   271  
   272  	tmpJxHome, err := ioutil.TempDir("", "jx-test-"+t.Name())
   273  	assert.NoError(t, err)
   274  
   275  	err = os.Setenv("JX_HOME", tmpJxHome)
   276  	assert.NoError(t, err)
   277  
   278  	defer func() {
   279  		_ = os.RemoveAll(tmpJxHome)
   280  		err = os.Setenv("JX_HOME", origJxHome)
   281  	}()
   282  
   283  	gitter := gits.NewGitCLI()
   284  	gitDir, testFileName, err := initializeTempGitRepo(gitter)
   285  	defer func() {
   286  		err := os.RemoveAll(gitDir)
   287  		assert.NoError(t, err)
   288  	}()
   289  	assert.NoError(t, err)
   290  
   291  	headMinusOne, err := gitter.RevParse(gitDir, "HEAD~1")
   292  
   293  	_ = assertClonesCorrectlyWithCorrectFileContents(t, gitDir, headMinusOne, SecondTag, gitter, testFileName, "foobar", nil)
   294  }
   295  
   296  func TestCloneJXVersionsRepoWithAnUntaggedCommit(t *testing.T) {
   297  	origJxHome := os.Getenv("JX_HOME")
   298  
   299  	tmpJxHome, err := ioutil.TempDir("", "jx-test-"+t.Name())
   300  	assert.NoError(t, err)
   301  
   302  	err = os.Setenv("JX_HOME", tmpJxHome)
   303  	assert.NoError(t, err)
   304  
   305  	defer func() {
   306  		_ = os.RemoveAll(tmpJxHome)
   307  		err = os.Setenv("JX_HOME", origJxHome)
   308  	}()
   309  
   310  	gitter := gits.NewGitCLI()
   311  	gitDir, testFileName, err := initializeTempGitRepo(gitter)
   312  	defer func() {
   313  		err := os.RemoveAll(gitDir)
   314  		assert.NoError(t, err)
   315  	}()
   316  	assert.NoError(t, err)
   317  
   318  	head, err := gitter.RevParse(gitDir, "HEAD")
   319  
   320  	_ = assertClonesCorrectlyWithCorrectFileContents(t, gitDir, head, head, gitter, testFileName, "foobarbaz", nil)
   321  }
   322  
   323  func TestCloneJXVersionsRepoWithNonFastForward(t *testing.T) {
   324  	origJxHome := os.Getenv("JX_HOME")
   325  
   326  	tmpJxHome, err := ioutil.TempDir("", "jx-test-"+t.Name())
   327  	assert.NoError(t, err)
   328  
   329  	err = os.Setenv("JX_HOME", tmpJxHome)
   330  	assert.NoError(t, err)
   331  
   332  	defer func() {
   333  		_ = os.RemoveAll(tmpJxHome)
   334  		err = os.Setenv("JX_HOME", origJxHome)
   335  	}()
   336  
   337  	gitter := gits.NewGitCLI()
   338  	gitDir, testFileName, err := initializeTempGitRepo(gitter)
   339  	defer func() {
   340  		err := os.RemoveAll(gitDir)
   341  		assert.NoError(t, err)
   342  	}()
   343  	assert.NoError(t, err)
   344  
   345  	dir := assertClonesCorrectlyWithCorrectFileContents(t, gitDir, BranchRef, BranchRef, gitter, testFileName, "foobarbaz", nil)
   346  
   347  	// Update the git repo with a new commit
   348  	testFileContents := []byte("banana")
   349  	err = ioutil.WriteFile(filepath.Join(gitDir, testFileName), testFileContents, util.DefaultWritePermissions)
   350  	assert.NoError(t, err)
   351  
   352  	err = gitter.AddCommit(gitDir, "changing to banana")
   353  	assert.NoError(t, err)
   354  
   355  	// Make a different change to the local clone of the repo
   356  	testFileContents = []byte("apple")
   357  	err = ioutil.WriteFile(filepath.Join(dir, testFileName), testFileContents, util.DefaultWritePermissions)
   358  	assert.NoError(t, err)
   359  
   360  	err = gitter.AddCommit(dir, "changing to apple")
   361  	assert.NoError(t, err)
   362  
   363  	// Run CloneJXVersionsRepo and verify that it does checkout the latest of the branch.
   364  	_ = assertClonesCorrectlyWithCorrectFileContents(t, gitDir, BranchRef, BranchRef, gitter, testFileName, "banana", nil)
   365  }
   366  
   367  func assertClonesCorrectlyWithCorrectFileContents(t *testing.T, gitDir string, versionRefToCheckout string, expectedRef string, gitter gits.Gitter, testFileName string, expectedFileContent string, settings *v1.TeamSettings) string {
   368  	dir, actualVersionRef := assertClonesCorrectly(t, gitDir, versionRefToCheckout, expectedRef, gitter, settings)
   369  	err := gitter.Checkout(dir, actualVersionRef)
   370  	assert.NoError(t, err)
   371  
   372  	actualFileContents, err := ioutil.ReadFile(filepath.Join(dir, testFileName))
   373  	assert.NoError(t, err)
   374  	assert.Equal(t, expectedFileContent, string(actualFileContents))
   375  
   376  	return dir
   377  }
   378  
   379  func assertClonesCorrectly(t *testing.T, gitDir string, versionRefToCheckout string, expectedRef string, gitter gits.Gitter, settings *v1.TeamSettings) (string, string) {
   380  	dir, actualVersionRef, err := versionstreamrepo.CloneJXVersionsRepo(
   381  		gitDir,
   382  		versionRefToCheckout,
   383  		settings,
   384  		gitter,
   385  		true,
   386  		false,
   387  		util.IOFileHandles{},
   388  	)
   389  	assert.NoError(t, err)
   390  	assert.NotNil(t, dir)
   391  	assert.NotNil(t, actualVersionRef)
   392  	assert.Equal(t, expectedRef, actualVersionRef)
   393  
   394  	return dir, actualVersionRef
   395  }