1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
13 "git.curoverse.com/arvados.git/lib/config"
14 "git.curoverse.com/arvados.git/sdk/go/arvados"
15 check "gopkg.in/check.v1"
18 var _ = check.Suite(&GitoliteSuite{})
20 // GitoliteSuite tests need an API server, an arv-git-httpd server,
21 // and a repository hosted by gitolite.
22 type GitoliteSuite struct {
27 func (s *GitoliteSuite) SetUpTest(c *check.C) {
29 s.gitoliteHome, err = ioutil.TempDir("", "arv-git-httpd")
30 c.Assert(err, check.Equals, nil)
32 runGitolite := func(prog string, args ...string) {
33 c.Log(prog, " ", args)
34 cmd := exec.Command(prog, args...)
35 cmd.Dir = s.gitoliteHome
36 cmd.Env = []string{"HOME=" + s.gitoliteHome}
37 for _, e := range os.Environ() {
38 if !strings.HasPrefix(e, "HOME=") {
39 cmd.Env = append(cmd.Env, e)
42 diags, err := cmd.CombinedOutput()
44 c.Assert(err, check.Equals, nil)
47 runGitolite("gitolite", "setup", "--admin", "root")
49 s.tmpRepoRoot = s.gitoliteHome + "/repositories"
51 cfg, err := config.NewLoader(nil, nil).Load()
52 c.Assert(err, check.Equals, nil)
53 s.cluster, err = cfg.GetCluster("")
54 c.Assert(err, check.Equals, nil)
56 s.cluster.Services.GitHTTP.InternalURLs = map[arvados.URL]arvados.ServiceInstance{arvados.URL{Host: "localhost:0"}: arvados.ServiceInstance{}}
57 s.cluster.TLS.Insecure = true
58 s.cluster.Git.GitCommand = "/usr/share/gitolite3/gitolite-shell"
59 s.cluster.Git.GitoliteHome = s.gitoliteHome
60 s.cluster.Git.Repositories = s.tmpRepoRoot
62 s.IntegrationSuite.SetUpTest(c)
64 // Install the gitolite hooks in the bare repo we made in
65 // (*IntegrationTest)SetUpTest() -- see 2.2.4 at
66 // http://gitolite.com/gitolite/gitolite.html
67 runGitolite("gitolite", "setup")
70 func (s *GitoliteSuite) TearDownTest(c *check.C) {
71 // We really want Unsetenv here, but it's not worth forcing an
73 os.Setenv("GITOLITE_HTTP_HOME", "")
74 os.Setenv("GL_BYPASS_ACCESS_CHECKS", "")
75 if s.gitoliteHome != "" {
76 err := os.RemoveAll(s.gitoliteHome)
77 c.Check(err, check.Equals, nil)
79 s.IntegrationSuite.TearDownTest(c)
82 func (s *GitoliteSuite) TestFetch(c *check.C) {
83 err := s.RunGit(c, activeToken, "fetch", "active/foo.git")
84 c.Check(err, check.Equals, nil)
87 func (s *GitoliteSuite) TestFetchUnreadable(c *check.C) {
88 err := s.RunGit(c, anonymousToken, "fetch", "active/foo.git")
89 c.Check(err, check.ErrorMatches, `.* not found.*`)
92 func (s *GitoliteSuite) TestPush(c *check.C) {
93 err := s.RunGit(c, activeToken, "push", "active/foo.git", "master:gitolite-push")
94 c.Check(err, check.Equals, nil)
96 // Check that the commit hash appears in the gitolite log, as
97 // assurance that the gitolite hooks really did run.
99 sha1, err := exec.Command("git", "--git-dir", s.tmpWorkdir+"/.git",
100 "log", "-n1", "--format=%H").CombinedOutput()
101 c.Logf("git-log in workdir: %q", string(sha1))
102 c.Assert(err, check.Equals, nil)
103 c.Assert(len(sha1), check.Equals, 41)
105 gitoliteLog, err := exec.Command("grep", "-r", string(sha1[:40]), s.gitoliteHome+"/.gitolite/logs").CombinedOutput()
106 c.Check(err, check.Equals, nil)
107 c.Logf("gitolite log message: %q", string(gitoliteLog))
110 func (s *GitoliteSuite) TestPushUnwritable(c *check.C) {
111 err := s.RunGit(c, spectatorToken, "push", "active/foo.git", "master:gitolite-push-fail")
112 c.Check(err, check.ErrorMatches, `.*HTTP (code = )?403.*`)