8311: Add git_tree mount type.
[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) SetUpSuite(c *check.C) {
26         git_client.InstallProtocol("https", git_http.NewClient(arvados.InsecureHTTPClient))
27 }
28
29 func (s *GitMountSuite) SetUpTest(c *check.C) {
30         port, err := ioutil.ReadFile("../../tmp/arv-git-httpd-ssl.port")
31         c.Assert(err, check.IsNil)
32         discoveryMap["gitUrl"] = "https://localhost:" + string(port)
33
34         s.tmpdir, err = ioutil.TempDir("", "")
35         c.Assert(err, check.IsNil)
36 }
37
38 func (s *GitMountSuite) TearDownTest(c *check.C) {
39         err := os.RemoveAll(s.tmpdir)
40         c.Check(err, check.IsNil)
41 }
42
43 // Commit fd3531f is crunch-run-tree-test
44 func (s *GitMountSuite) TestextractTree(c *check.C) {
45         gm := gitMount{
46                 Path:   "/",
47                 UUID:   arvadostest.Repository2UUID,
48                 Commit: "fd3531f42995344f36c30b79f55f27b502f3d344",
49         }
50         err := gm.extractTree(&ArvTestClient{}, s.tmpdir)
51         c.Check(err, check.IsNil)
52
53         fnm := filepath.Join(s.tmpdir, "dir1/dir2/file with mode 0644")
54         data, err := ioutil.ReadFile(fnm)
55         c.Check(err, check.IsNil)
56         c.Check(data, check.DeepEquals, []byte{0, 1, 2, 3})
57         fi, err := os.Stat(fnm)
58         c.Check(err, check.IsNil)
59         if err == nil {
60                 c.Check(fi.Mode(), check.Equals, os.FileMode(0644))
61         }
62
63         fnm = filepath.Join(s.tmpdir, "dir1/dir2/file with mode 0755")
64         data, err = ioutil.ReadFile(fnm)
65         c.Check(err, check.IsNil)
66         c.Check(string(data), check.DeepEquals, "#!/bin/sh\nexec echo OK\n")
67         fi, err = os.Stat(fnm)
68         c.Check(err, check.IsNil)
69         if err == nil {
70                 c.Check(fi.Mode(), check.Equals, os.FileMode(0755))
71         }
72
73         // Ensure there's no extra stuff like a ".git" dir
74         s.checkTmpdirContents(c, []string{"dir1"})
75 }
76
77 // Commit 5ebfab0 is not the tip of any branch or tag, but is
78 // reachable in branch "crunch-run-non-tip-test".
79 func (s *GitMountSuite) TestExtractNonTipCommit(c *check.C) {
80         gm := gitMount{
81                 Path:   "/",
82                 UUID:   arvadostest.Repository2UUID,
83                 Commit: "5ebfab0522851df01fec11ec55a6d0f4877b542e",
84         }
85         err := gm.extractTree(&ArvTestClient{}, s.tmpdir)
86         c.Check(err, check.IsNil)
87
88         fnm := filepath.Join(s.tmpdir, "file only on testbranch")
89         data, err := ioutil.ReadFile(fnm)
90         c.Check(err, check.IsNil)
91         c.Check(string(data), check.DeepEquals, "testfile\n")
92 }
93
94 func (s *GitMountSuite) TestNonexistentRepository(c *check.C) {
95         gm := gitMount{
96                 Path:   "/",
97                 UUID:   "zzzzz-s0uqq-nonexistentrepo",
98                 Commit: "5ebfab0522851df01fec11ec55a6d0f4877b542e",
99         }
100         err := gm.extractTree(&ArvTestClient{}, s.tmpdir)
101         c.Check(err, check.NotNil)
102         c.Check(err, check.ErrorMatches, ".*repository not found.*")
103
104         s.checkTmpdirContents(c, []string{})
105 }
106
107 func (s *GitMountSuite) TestNonexistentCommit(c *check.C) {
108         gm := gitMount{
109                 Path:   "/",
110                 UUID:   arvadostest.Repository2UUID,
111                 Commit: "bb66b6bb6b6bbb6b6b6b66b6b6b6b6b6b6b6b66b",
112         }
113         err := gm.extractTree(&ArvTestClient{}, s.tmpdir)
114         c.Check(err, check.NotNil)
115         c.Check(err, check.ErrorMatches, ".*object not found.*")
116
117         s.checkTmpdirContents(c, []string{})
118 }
119
120 func (s *GitMountSuite) TestInvalid(c *check.C) {
121         for _, trial := range []struct {
122                 gm      gitMount
123                 matcher string
124         }{
125                 {
126                         gm: gitMount{
127                                 Path:   "/",
128                                 UUID:   arvadostest.Repository2UUID,
129                                 Commit: "abc123",
130                         },
131                         matcher: ".*sha1.*",
132                 },
133                 {
134                         gm: gitMount{
135                                 Path:   "/dir1/",
136                                 UUID:   arvadostest.Repository2UUID,
137                                 Commit: "5ebfab0522851df01fec11ec55a6d0f4877b542e",
138                         },
139                         matcher: ".*path.*",
140                 },
141                 {
142                         gm: gitMount{
143                                 Path:   "/",
144                                 Commit: "5ebfab0522851df01fec11ec55a6d0f4877b542e",
145                         },
146                         matcher: ".*UUID.*",
147                 },
148         } {
149                 err := trial.gm.extractTree(&ArvTestClient{}, s.tmpdir)
150                 c.Check(err, check.NotNil)
151                 s.checkTmpdirContents(c, []string{})
152
153                 err := trial.gm.validate()
154                 c.Check(err, check.ErrorMatches, trial.matcher)
155         }
156 }
157
158 func (s *GitMountSuite) checkTmpdirContents(c *check.C, expect []string) {
159         f, err := os.Open(s.tmpdir)
160         c.Check(err, check.IsNil)
161         names, err := f.Readdirnames(-1)
162         c.Check(err, check.IsNil)
163         c.Check(names, check.DeepEquals, expect)
164 }