1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
package repoutil
import (
"context"
"os"
"testing"
"github.com/stretchr/testify/require"
"gitlab.com/gitlab-org/gitaly/v16/internal/git/gittest"
"gitlab.com/gitlab-org/gitaly/v16/internal/gitaly/config"
"gitlab.com/gitlab-org/gitaly/v16/internal/gitaly/transaction"
"gitlab.com/gitlab-org/gitaly/v16/internal/helper/perm"
"gitlab.com/gitlab-org/gitaly/v16/internal/structerr"
"gitlab.com/gitlab-org/gitaly/v16/internal/testhelper"
"gitlab.com/gitlab-org/gitaly/v16/internal/testhelper/testcfg"
"gitlab.com/gitlab-org/gitaly/v16/proto/go/gitalypb"
)
func TestRemove(t *testing.T) {
t.Parallel()
for _, tc := range []struct {
desc string
createRepo func(tb testing.TB, ctx context.Context, cfg config.Cfg) (*gitalypb.Repository, string)
expectedErr error
}{
{
desc: "success",
createRepo: func(tb testing.TB, ctx context.Context, cfg config.Cfg) (*gitalypb.Repository, string) {
return gittest.CreateRepository(t, ctx, cfg, gittest.CreateRepositoryConfig{
SkipCreationViaService: true,
})
},
},
{
desc: "does not exist",
createRepo: func(tb testing.TB, ctx context.Context, cfg config.Cfg) (*gitalypb.Repository, string) {
repo := &gitalypb.Repository{StorageName: cfg.Storages[0].Name, RelativePath: "/does/not/exist"}
return repo, ""
},
expectedErr: structerr.NewNotFound("repository does not exist"),
},
{
desc: "locked",
createRepo: func(tb testing.TB, ctx context.Context, cfg config.Cfg) (*gitalypb.Repository, string) {
repo, repoPath := gittest.CreateRepository(t, ctx, cfg, gittest.CreateRepositoryConfig{
SkipCreationViaService: true,
})
// Simulate a concurrent RPC holding the repository lock.
lockPath := repoPath + ".lock"
require.NoError(t, os.WriteFile(lockPath, []byte{}, perm.SharedFile))
tb.Cleanup(func() {
require.NoError(t, os.RemoveAll(lockPath))
})
return repo, repoPath
},
expectedErr: structerr.NewFailedPrecondition("repository is already locked"),
},
} {
tc := tc
t.Run(tc.desc, func(t *testing.T) {
t.Parallel()
ctx := testhelper.Context(t)
cfg := testcfg.Build(t)
locator := config.NewLocator(cfg)
txManager := transaction.NewTrackingManager()
repo, repoPath := tc.createRepo(t, ctx, cfg)
if repoPath != "" {
require.DirExists(t, repoPath)
}
err := Remove(ctx, locator, txManager, repo)
if tc.expectedErr != nil {
require.Equal(t, tc.expectedErr, err)
return
}
require.NoError(t, err)
if repoPath != "" {
require.NoDirExists(t, repoPath)
}
})
}
}
|