Skip to content
This repository was archived by the owner on Sep 9, 2020. It is now read-only.

Commit 90abc13

Browse files
committed
gps: Tests for adaptive git repo recovery/cleanup
This covers three basic cases - untracked files, modified files, and some corruption in the .git directory. The first two are plausible; the third is less so, as we don't know much about what real git failure patterns could look like in the .git directory itself. However, it's an adequate test inasmuch as it triggers failure in the basic git calls we make, thereby triggering the recovery procedure.
1 parent d596e65 commit 90abc13

File tree

4 files changed

+99
-9
lines changed

4 files changed

+99
-9
lines changed

internal/gps/manager_test.go

-6
Original file line numberDiff line numberDiff line change
@@ -259,12 +259,6 @@ func TestSourceInit(t *testing.T) {
259259

260260
os.Stat(filepath.Join(cpath, "metadata", "github.com", "sdboyer", "gpkt", "cache.json"))
261261

262-
// TODO(sdboyer) disabled until we get caching working
263-
//_, err = os.Stat(filepath.Join(cpath, "metadata", "github.com", "sdboyer", "gpkt", "cache.json"))
264-
//if err != nil {
265-
//t.Error("Metadata cache json file does not exist in expected location")
266-
//}
267-
268262
// Ensure source existence values are what we expect
269263
var exists bool
270264
exists, err = sm.SourceExists(id)

internal/gps/maybe_source.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ func (m maybeGitSource) try(ctx context.Context, cachedir string, c singleSource
108108
if err := superv.do(ctx, "git", ctValidateLocal, func(ctx context.Context) error {
109109
// If repository already exists on disk, make a pass to be sure
110110
// everything's clean.
111-
return src.cleanup(ctx)
111+
return src.ensureClean(ctx)
112112
}); err != nil {
113113
return nil, 0, err
114114
}

internal/gps/vcs_source.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -124,8 +124,8 @@ type gitSource struct {
124124
}
125125

126126
// ensureClean sees to it that a git repository is clean and in working order,
127-
// or returns an error if it can't.
128-
func (s *gitSource) cleanup(ctx context.Context) error {
127+
// or returns an error if the adaptive recovery attempts fail.
128+
func (s *gitSource) ensureClean(ctx context.Context) error {
129129
r := s.repo.(*gitRepo)
130130
cmd := commandContext(
131131
ctx,

internal/gps/vcs_source_test.go

+96
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ package gps
77
import (
88
"context"
99
"io/ioutil"
10+
"log"
1011
"net/url"
1112
"os"
1213
"os/exec"
@@ -647,6 +648,101 @@ func TestGitSourceListVersionsNoDupes(t *testing.T) {
647648
}
648649
}
649650

651+
func TestGitSourceAdaptiveCleanup(t *testing.T) {
652+
t.Parallel()
653+
654+
// This test is slowish, skip it on -short
655+
if testing.Short() {
656+
t.Skip("Skipping git adaptive failure recovery test in short mode")
657+
}
658+
requiresBins(t, "git")
659+
660+
cpath, err := ioutil.TempDir("", "smcache")
661+
if err != nil {
662+
t.Fatalf("Failed to create temp dir: %s", err)
663+
}
664+
665+
var sm *SourceMgr
666+
mkSM := func() {
667+
// If sm is already set, make sure it's released, then create a new one.
668+
if sm != nil {
669+
sm.Release()
670+
}
671+
672+
var err error
673+
sm, err = NewSourceManager(SourceManagerConfig{
674+
Cachedir: cpath,
675+
Logger: log.New(test.Writer{TB: t}, "", 0),
676+
})
677+
if err != nil {
678+
t.Fatalf("Unexpected error on SourceManager creation: %s", err)
679+
}
680+
}
681+
682+
mkSM()
683+
id := mkPI("github.com/sdboyer/gpkt")
684+
err = sm.SyncSourceFor(id)
685+
if err != nil {
686+
t.Fatal(err)
687+
}
688+
689+
repodir := filepath.Join(sm.cachedir, "sources", "https---github.lhy31512.workers.dev-sdboyer-gpkt")
690+
if _, err := os.Stat(repodir); err != nil {
691+
if os.IsNotExist(err) {
692+
t.Fatalf("expected location for repodir did not exist: %q", repodir)
693+
} else {
694+
t.Fatal(err)
695+
}
696+
}
697+
698+
// Create a file that git will see as untracked.
699+
untrackedPath := filepath.Join(repodir, "untrackedfile")
700+
f, err := os.Create(untrackedPath)
701+
if err != nil {
702+
t.Fatal(err)
703+
}
704+
f.Close()
705+
706+
mkSM()
707+
err = sm.SyncSourceFor(id)
708+
if err != nil {
709+
t.Fatalf("choked after adding dummy file: %q", err)
710+
}
711+
712+
if _, err := os.Stat(untrackedPath); err == nil {
713+
t.Fatal("untracked file still existed after cleanup should've been triggered")
714+
}
715+
716+
// Remove a file that we know exists, which `git status` checks should catch.
717+
readmePath := filepath.Join(repodir, "README.md")
718+
os.Remove(readmePath)
719+
720+
mkSM()
721+
err = sm.SyncSourceFor(id)
722+
if err != nil {
723+
t.Fatalf("choked after removing known file: %q", err)
724+
}
725+
726+
if _, err := os.Stat(readmePath); err != nil {
727+
t.Fatal("README was still absent after cleanup should've been triggered")
728+
}
729+
730+
// Remove .git/objects directory, which should make git bite it.
731+
err = os.RemoveAll(filepath.Join(repodir, ".git", "objects"))
732+
if err != nil {
733+
t.Fatal(err)
734+
}
735+
736+
mkSM()
737+
err = sm.SyncSourceFor(id)
738+
if err != nil {
739+
t.Fatalf("choked after removing .git/objects directory: %q", err)
740+
}
741+
742+
sm.Release()
743+
os.RemoveAll(cpath)
744+
}
745+
650746
func Test_bzrSource_exportRevisionTo_removeVcsFiles(t *testing.T) {
651747
t.Parallel()
652748

0 commit comments

Comments
 (0)