github.com/jenkins-x/jx/v2@v2.1.155/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/jenkins-x/jx/v2/pkg/config" 14 "github.com/jenkins-x/jx/v2/pkg/gits" 15 "github.com/jenkins-x/jx/v2/pkg/util" 16 "github.com/jenkins-x/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 }