Skip to content

Commit 61f76d3

Browse files
author
Sanskar Jaiswal
committed
use context for cloning in tests
Signed-off-by: Sanskar Jaiswal <[email protected]>
1 parent 5ee6446 commit 61f76d3

File tree

2 files changed

+72
-56
lines changed

2 files changed

+72
-56
lines changed

controllers/git_test.go

Lines changed: 28 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,10 @@ import (
1010

1111
"github.com/go-logr/logr"
1212
libgit2 "github.com/libgit2/git2go/v33"
13-
"k8s.io/apimachinery/pkg/types"
14-
1513
. "github.com/onsi/gomega"
14+
"k8s.io/apimachinery/pkg/types"
1615

1716
"github.com/fluxcd/pkg/gittestserver"
18-
"github.com/fluxcd/source-controller/pkg/git/libgit2/managed"
1917
)
2018

2119
func populateRepoFromFixture(repo *libgit2.Repository, fixture string) error {
@@ -131,24 +129,29 @@ func TestPushRejected(t *testing.T) {
131129
t.Fatal(err)
132130
}
133131

134-
// this is currently defined in update_test.go, but handy right here ..
132+
// We use "test" as the branch to init repo, to avoid potential conflicts
133+
// with the default branch(main/master) of the system this test is running
134+
// on. If, for e.g., we used main as the branch and the default branch is
135+
// supposed to be main, this will fail as this would try to create a branch
136+
// named main explicitly.
135137
if err = initGitRepo(gitServer, "testdata/appconfig", "test", "/appconfig.git"); err != nil {
136138
t.Fatal(err)
137139
}
138140

139141
repoURL := gitServer.HTTPAddressWithCredentials() + "/appconfig.git"
140-
repo, err := clone(repoURL, "test")
142+
cloneCtx, cancel := context.WithTimeout(ctx, time.Second*10)
143+
defer cancel()
144+
repo, err := clone(cloneCtx, repoURL, "test")
141145
if err != nil {
142146
t.Fatal(err)
143147
}
144148
defer repo.Free()
145149

146-
transportOptsURL := "http://" + randStringRunes(5)
147-
managed.AddTransportOptions(transportOptsURL, managed.TransportOptions{
148-
TargetURL: repoURL,
149-
})
150-
defer managed.RemoveTransportOptions(transportOptsURL)
151-
repo.Remotes.SetUrl("origin", transportOptsURL)
150+
cleanup, err := configureTransportOptsForRepo(repo)
151+
if err != nil {
152+
t.Fatal(err)
153+
}
154+
defer cleanup()
152155

153156
// This is here to guard against push in general being broken
154157
err = push(context.TODO(), repo.Workdir(), "test", repoAccess{})
@@ -176,11 +179,18 @@ func Test_switchToBranch(t *testing.T) {
176179
gitServer.AutoCreate()
177180
g.Expect(gitServer.StartHTTP()).To(Succeed())
178181

182+
// We use "test" as the branch to init repo, to avoid potential conflicts
183+
// with the default branch(main/master) of the system this test is running
184+
// on. If, for e.g., we used main as the branch and the default branch is
185+
// supposed to be main, this will fail as this would try to create a branch
186+
// named main explicitly.
179187
branch := "test"
180188
g.Expect(initGitRepo(gitServer, "testdata/appconfig", branch, "/appconfig.git")).To(Succeed())
181189

182190
repoURL := gitServer.HTTPAddressWithCredentials() + "/appconfig.git"
183-
repo, err := clone(repoURL, branch)
191+
cloneCtx, cancel := context.WithTimeout(ctx, time.Second*10)
192+
defer cancel()
193+
repo, err := clone(cloneCtx, repoURL, branch)
184194
g.Expect(err).ToNot(HaveOccurred())
185195
defer repo.Free()
186196

@@ -190,12 +200,11 @@ func Test_switchToBranch(t *testing.T) {
190200
target := head.Target()
191201

192202
// register transport options and update remote to transport url
193-
transportOptsURL := "http://" + randStringRunes(5)
194-
managed.AddTransportOptions(transportOptsURL, managed.TransportOptions{
195-
TargetURL: repoURL,
196-
})
197-
defer managed.RemoveTransportOptions(transportOptsURL)
198-
repo.Remotes.SetUrl("origin", transportOptsURL)
203+
cleanup, err := configureTransportOptsForRepo(repo)
204+
if err != nil {
205+
t.Fatal(err)
206+
}
207+
defer cleanup()
199208

200209
// calling switchToBranch with a branch that doesn't exist on origin
201210
// should result in the branch being created and switched to.
@@ -217,7 +226,7 @@ func Test_switchToBranch(t *testing.T) {
217226
branch = "exists-on-origin"
218227
_, err = repo.CreateBranch(branch, cc, false)
219228
g.Expect(err).ToNot(HaveOccurred())
220-
origin, err := repo.Remotes.Lookup("origin")
229+
origin, err := repo.Remotes.Lookup(originRemote)
221230
g.Expect(err).ToNot(HaveOccurred())
222231
defer origin.Free()
223232

controllers/update_test.go

Lines changed: 44 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -480,12 +480,11 @@ func TestImageAutomationReconciler_e2e(t *testing.T) {
480480

481481
t.Run("PushSpec", func(t *testing.T) {
482482
// Clone the repo locally.
483-
localRepo, err := clone(cloneLocalRepoURL, branch)
483+
cloneCtx, cancel := context.WithTimeout(ctx, time.Second*10)
484+
defer cancel()
485+
localRepo, err := clone(cloneCtx, cloneLocalRepoURL, branch)
484486
g.Expect(err).ToNot(HaveOccurred(), "failed to clone git repo")
485487
defer localRepo.Free()
486-
origin, err := localRepo.Remotes.Lookup("origin")
487-
g.Expect(err).ToNot(HaveOccurred(), "failed to clone git repo")
488-
defer origin.Free()
489488

490489
// NB not testing the image reflector controller; this
491490
// will make a "fully formed" ImagePolicy object.
@@ -617,7 +616,9 @@ func TestImageAutomationReconciler_e2e(t *testing.T) {
617616
// test helper. When switching branches, the localRepo seems to get
618617
// stuck in one particular branch. As a workaround, create a
619618
// separate localRepo.
620-
localRepo, err := clone(cloneLocalRepoURL, branch)
619+
cloneCtx, cancel := context.WithTimeout(ctx, time.Second*10)
620+
defer cancel()
621+
localRepo, err := clone(cloneCtx, cloneLocalRepoURL, branch)
621622
g.Expect(err).ToNot(HaveOccurred(), "failed to clone git repo")
622623
defer localRepo.Free()
623624

@@ -862,8 +863,9 @@ func compareRepoWithExpected(g *WithT, repoURL, branch, fixture string, changeFi
862863

863864
copy.Copy(fixture, expected)
864865
changeFixture(expected)
865-
866-
repo, err := clone(repoURL, branch)
866+
cloneCtx, cancel := context.WithTimeout(ctx, time.Second*10)
867+
defer cancel()
868+
repo, err := clone(cloneCtx, repoURL, branch)
867869
g.Expect(err).ToNot(HaveOccurred())
868870
defer repo.Free()
869871
// NOTE: The workdir contains a trailing /. Clean it to not confuse the
@@ -875,26 +877,28 @@ func compareRepoWithExpected(g *WithT, repoURL, branch, fixture string, changeFi
875877
test.ExpectMatchingDirectories(g, actual, expected)
876878
}
877879

878-
// configureManagedTransportOptions registers the transport options for this repository
880+
// configureTransportOptsForRepo registers the transport options for this repository
879881
// and sets the remote url of origin to the transport options url. If repoURL is empty
880882
// it tries to figure it out by looking at the remote url of origin. It returns a function
881883
// which removes the transport options for this repo and sets the remote url of the origin
882884
// back to the actual url. Callers are expected to call this function in a deferred manner.
883-
func configureManagedTransportOptions(repo *libgit2.Repository, repoURL string) (func(), error) {
884-
if repoURL == "" {
885-
origin, err := repo.Remotes.Lookup(originRemote)
886-
if err != nil {
887-
return nil, err
888-
}
889-
defer origin.Free()
890-
repoURL = origin.Url()
885+
func configureTransportOptsForRepo(repo *libgit2.Repository) (func(), error) {
886+
origin, err := repo.Remotes.Lookup(originRemote)
887+
if err != nil {
888+
return nil, err
891889
}
892-
transportOptsURL := "http://" + randStringRunes(5)
890+
defer origin.Free()
891+
repoURL := origin.Url()
892+
u, err := url.Parse(repoURL)
893+
if err != nil {
894+
return nil, err
895+
}
896+
transportOptsURL := u.Scheme + "://" + randStringRunes(5)
893897
managed.AddTransportOptions(transportOptsURL, managed.TransportOptions{
894898
TargetURL: repoURL,
895899
})
896900

897-
err := repo.Remotes.SetUrl(originRemote, transportOptsURL)
901+
err = repo.Remotes.SetUrl(originRemote, transportOptsURL)
898902
if err != nil {
899903
return nil, fmt.Errorf("could not set remote origin url: %v", err)
900904
}
@@ -905,7 +909,9 @@ func configureManagedTransportOptions(repo *libgit2.Repository, repoURL string)
905909
}
906910

907911
func commitInRepo(g *WithT, repoURL, branch, msg string, changeFiles func(path string)) *libgit2.Oid {
908-
repo, err := clone(repoURL, branch)
912+
cloneCtx, cancel := context.WithTimeout(ctx, time.Second*10)
913+
defer cancel()
914+
repo, err := clone(cloneCtx, repoURL, branch)
909915
g.Expect(err).ToNot(HaveOccurred())
910916
defer repo.Free()
911917

@@ -919,7 +925,7 @@ func commitInRepo(g *WithT, repoURL, branch, msg string, changeFiles func(path s
919925
id, err := commitWorkDir(repo, branch, msg, sig)
920926
g.Expect(err).ToNot(HaveOccurred())
921927

922-
cleanup, err := configureManagedTransportOptions(repo, repoURL)
928+
cleanup, err := configureTransportOptsForRepo(repo)
923929
g.Expect(err).ToNot(HaveOccurred())
924930
defer cleanup()
925931
origin, err := repo.Remotes.Lookup(originRemote)
@@ -951,8 +957,7 @@ func initGitRepo(gitServer *gittestserver.GitServer, fixture, branch, repository
951957
if err != nil {
952958
return err
953959
}
954-
955-
return repo.Remotes.AddPush("origin", branchRefName(branch))
960+
return repo.Remotes.AddPush(originRemote, branchRefName(branch))
956961
}
957962

958963
func initGitRepoPlain(fixture, repositoryPath string) (*git2go.Repository, error) {
@@ -1157,14 +1162,15 @@ func mockSignature(time time.Time) *git2go.Signature {
11571162
}
11581163
}
11591164

1160-
func clone(repoURL, branchName string) (*git2go.Repository, error) {
1165+
func clone(ctx context.Context, repoURL, branchName string) (*git2go.Repository, error) {
11611166
dir, err := os.MkdirTemp("", "iac-clone-*")
11621167
if err != nil {
11631168
return nil, err
11641169
}
11651170
transportOptsURL := "http://" + randStringRunes(5)
11661171
managed.AddTransportOptions(transportOptsURL, managed.TransportOptions{
11671172
TargetURL: repoURL,
1173+
Context: ctx,
11681174
})
11691175
defer managed.RemoveTransportOptions(transportOptsURL)
11701176

@@ -1176,11 +1182,14 @@ func clone(repoURL, branchName string) (*git2go.Repository, error) {
11761182
},
11771183
}
11781184
repo, err := git2go.Clone(transportOptsURL, dir, opts)
1185+
if err != nil {
1186+
return nil, err
1187+
}
11791188

11801189
// set the origin remote url to the actual repo url, since
11811190
// the origin remote will have transportOptsURl as the it's url
11821191
// because that's the url used to clone the repo.
1183-
err = repo.Remotes.SetUrl("origin", repoURL)
1192+
err = repo.Remotes.SetUrl(originRemote, repoURL)
11841193
if err != nil {
11851194
return nil, err
11861195
}
@@ -1190,16 +1199,12 @@ func clone(repoURL, branchName string) (*git2go.Repository, error) {
11901199
func waitForNewHead(g *WithT, repo *git2go.Repository, branch, preChangeHash string) {
11911200
var commitToResetTo *git2go.Commit
11921201

1193-
cleanup, err := configureManagedTransportOptions(repo, "")
1194-
if err != nil {
1195-
panic(err)
1196-
}
1202+
cleanup, err := configureTransportOptsForRepo(repo)
1203+
g.Expect(err).ToNot(HaveOccurred())
11971204
defer cleanup()
11981205

1199-
origin, err := repo.Remotes.Lookup("origin")
1200-
if err != nil {
1201-
panic("origin not set")
1202-
}
1206+
origin, err := repo.Remotes.Lookup(originRemote)
1207+
g.Expect(err).ToNot(HaveOccurred())
12031208
defer origin.Free()
12041209

12051210
// Now try to fetch new commits from that remote branch
@@ -1252,13 +1257,13 @@ func commitIdFromBranch(repo *git2go.Repository, branchName string) string {
12521257
}
12531258

12541259
func getRemoteHead(repo *git2go.Repository, branchName string) (*git2go.Oid, error) {
1255-
cleanup, err := configureManagedTransportOptions(repo, "")
1260+
cleanup, err := configureTransportOptsForRepo(repo)
12561261
if err != nil {
12571262
return nil, err
12581263
}
12591264
defer cleanup()
12601265

1261-
remote, err := repo.Remotes.Lookup("origin")
1266+
remote, err := repo.Remotes.Lookup(originRemote)
12621267
if err != nil {
12631268
return nil, err
12641269
}
@@ -1438,14 +1443,16 @@ func testWithCustomRepoAndImagePolicy(
14381443

14391444
// Clone the repo.
14401445
repoURL := gitServer.HTTPAddressWithCredentials() + repositoryPath
1441-
localRepo, err := clone(repoURL, args.branch)
1446+
cloneCtx, cancel := context.WithTimeout(ctx, time.Second*10)
1447+
defer cancel()
1448+
localRepo, err := clone(cloneCtx, repoURL, args.branch)
14421449
g.Expect(err).ToNot(HaveOccurred(), "failed to clone git repo")
14431450
defer localRepo.Free()
14441451

1445-
origin, err := localRepo.Remotes.Lookup("origin")
1452+
origin, err := localRepo.Remotes.Lookup(originRemote)
14461453
g.Expect(err).ToNot(HaveOccurred(), "failed to look up remote origin")
14471454
defer origin.Free()
1448-
localRepo.Remotes.SetUrl("origin", repoURL)
1455+
localRepo.Remotes.SetUrl(originRemote, repoURL)
14491456

14501457
// Create GitRepository resource for the above repo.
14511458
err = createGitRepository(kClient, args.gitRepoName, args.gitRepoNamespace, repoURL, "")

0 commit comments

Comments
 (0)