8311: Pass in container token to extractTree
[arvados.git] / services / crunch-run / git_mount_test.go
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 package main
6
7 import (
8         "io/ioutil"
9         "os"
10         "path/filepath"
11
12         "git.curoverse.com/arvados.git/sdk/go/arvados"
13         "git.curoverse.com/arvados.git/sdk/go/arvadostest"
14         check "gopkg.in/check.v1"
15         git_client "gopkg.in/src-d/go-git.v4/plumbing/transport/client"
16         git_http "gopkg.in/src-d/go-git.v4/plumbing/transport/http"
17 )
18
19 type GitMountSuite struct {
20         tmpdir string
21 }
22
23 var _ = check.Suite(&GitMountSuite{})
24
25 func (s *GitMountSuite) SetUpTest(c *check.C) {
26         s.useTestGitServer(c)
27
28         var err error
29         s.tmpdir, err = ioutil.TempDir("", "")
30         c.Assert(err, check.IsNil)
31 }
32
33 func (s *GitMountSuite) TearDownTest(c *check.C) {
34         err := os.RemoveAll(s.tmpdir)
35         c.Check(err, check.IsNil)
36 }
37
38 // Commit fd3531f is crunch-run-tree-test
39 func (s *GitMountSuite) TestextractTree(c *check.C) {
40         gm := gitMount{
41                 Path:   "/",
42                 UUID:   arvadostest.Repository2UUID,
43                 Commit: "fd3531f42995344f36c30b79f55f27b502f3d344",
44         }
45         err := gm.extractTree(&ArvTestClient{}, s.tmpdir, arvadostest.ActiveToken)
46         c.Check(err, check.IsNil)
47
48         fnm := filepath.Join(s.tmpdir, "dir1/dir2/file with mode 0644")
49         data, err := ioutil.ReadFile(fnm)
50         c.Check(err, check.IsNil)
51         c.Check(data, check.DeepEquals, []byte{0, 1, 2, 3})
52         fi, err := os.Stat(fnm)
53         c.Check(err, check.IsNil)
54         if err == nil {
55                 c.Check(fi.Mode(), check.Equals, os.FileMode(0644))
56         }
57
58         fnm = filepath.Join(s.tmpdir, "dir1/dir2/file with mode 0755")
59         data, err = ioutil.ReadFile(fnm)
60         c.Check(err, check.IsNil)
61         c.Check(string(data), check.DeepEquals, "#!/bin/sh\nexec echo OK\n")
62         fi, err = os.Stat(fnm)
63         c.Check(err, check.IsNil)
64         if err == nil {
65                 c.Check(fi.Mode(), check.Equals, os.FileMode(0755))
66         }
67
68         // Ensure there's no extra stuff like a ".git" dir
69         s.checkTmpdirContents(c, []string{"dir1"})
70 }
71
72 // Commit 5ebfab0 is not the tip of any branch or tag, but is
73 // reachable in branch "crunch-run-non-tip-test".
74 func (s *GitMountSuite) TestExtractNonTipCommit(c *check.C) {
75         gm := gitMount{
76                 UUID:   arvadostest.Repository2UUID,
77                 Commit: "5ebfab0522851df01fec11ec55a6d0f4877b542e",
78         }
79         err := gm.extractTree(&ArvTestClient{}, s.tmpdir, arvadostest.ActiveToken)
80         c.Check(err, check.IsNil)
81
82         fnm := filepath.Join(s.tmpdir, "file only on testbranch")
83         data, err := ioutil.ReadFile(fnm)
84         c.Check(err, check.IsNil)
85         c.Check(string(data), check.DeepEquals, "testfile\n")
86 }
87
88 func (s *GitMountSuite) TestNonexistentRepository(c *check.C) {
89         gm := gitMount{
90                 Path:   "/",
91                 UUID:   "zzzzz-s0uqq-nonexistentrepo",
92                 Commit: "5ebfab0522851df01fec11ec55a6d0f4877b542e",
93         }
94         err := gm.extractTree(&ArvTestClient{}, s.tmpdir, arvadostest.ActiveToken)
95         c.Check(err, check.NotNil)
96         c.Check(err, check.ErrorMatches, ".*repository not found.*")
97
98         s.checkTmpdirContents(c, []string{})
99 }
100
101 func (s *GitMountSuite) TestNonexistentCommit(c *check.C) {
102         gm := gitMount{
103                 Path:   "/",
104                 UUID:   arvadostest.Repository2UUID,
105                 Commit: "bb66b6bb6b6bbb6b6b6b66b6b6b6b6b6b6b6b66b",
106         }
107         err := gm.extractTree(&ArvTestClient{}, s.tmpdir, arvadostest.ActiveToken)
108         c.Check(err, check.NotNil)
109         c.Check(err, check.ErrorMatches, ".*object not found.*")
110
111         s.checkTmpdirContents(c, []string{})
112 }
113
114 func (s *GitMountSuite) TestGitUrlDiscoveryFails(c *check.C) {
115         delete(discoveryMap, "gitUrl")
116         gm := gitMount{
117                 Path:   "/",
118                 UUID:   arvadostest.Repository2UUID,
119                 Commit: "5ebfab0522851df01fec11ec55a6d0f4877b542e",
120         }
121         err := gm.extractTree(&ArvTestClient{}, s.tmpdir, arvadostest.ActiveToken)
122         c.Check(err, check.ErrorMatches, ".*gitUrl.*")
123 }
124
125 func (s *GitMountSuite) TestInvalid(c *check.C) {
126         for _, trial := range []struct {
127                 gm      gitMount
128                 matcher string
129         }{
130                 {
131                         gm: gitMount{
132                                 Path:   "/",
133                                 UUID:   arvadostest.Repository2UUID,
134                                 Commit: "abc123",
135                         },
136                         matcher: ".*SHA1.*",
137                 },
138                 {
139                         gm: gitMount{
140                                 Path:           "/",
141                                 UUID:           arvadostest.Repository2UUID,
142                                 RepositoryName: arvadostest.Repository2Name,
143                                 Commit:         "5ebfab0522851df01fec11ec55a6d0f4877b542e",
144                         },
145                         matcher: ".*repository_name.*",
146                 },
147                 {
148                         gm: gitMount{
149                                 Path:   "/",
150                                 GitURL: "https://localhost:0/" + arvadostest.Repository2Name + ".git",
151                                 Commit: "5ebfab0522851df01fec11ec55a6d0f4877b542e",
152                         },
153                         matcher: ".*git_url.*",
154                 },
155                 {
156                         gm: gitMount{
157                                 Path:   "/dir1/",
158                                 UUID:   arvadostest.Repository2UUID,
159                                 Commit: "5ebfab0522851df01fec11ec55a6d0f4877b542e",
160                         },
161                         matcher: ".*path.*",
162                 },
163                 {
164                         gm: gitMount{
165                                 Path:   "/",
166                                 Commit: "5ebfab0522851df01fec11ec55a6d0f4877b542e",
167                         },
168                         matcher: ".*UUID.*",
169                 },
170         } {
171                 err := trial.gm.extractTree(&ArvTestClient{}, s.tmpdir, arvadostest.ActiveToken)
172                 c.Check(err, check.NotNil)
173                 s.checkTmpdirContents(c, []string{})
174
175                 err = trial.gm.validate()
176                 c.Check(err, check.ErrorMatches, trial.matcher)
177         }
178 }
179
180 func (s *GitMountSuite) checkTmpdirContents(c *check.C, expect []string) {
181         f, err := os.Open(s.tmpdir)
182         c.Check(err, check.IsNil)
183         names, err := f.Readdirnames(-1)
184         c.Check(err, check.IsNil)
185         c.Check(names, check.DeepEquals, expect)
186 }
187
188 func (*GitMountSuite) useTestGitServer(c *check.C) {
189         git_client.InstallProtocol("https", git_http.NewClient(arvados.InsecureHTTPClient))
190
191         port, err := ioutil.ReadFile("../../tmp/arv-git-httpd-ssl.port")
192         c.Assert(err, check.IsNil)
193         discoveryMap["gitUrl"] = "https://localhost:" + string(port)
194 }