13111: Reload project dir if fsync(2) was called since last load.
[arvados.git] / sdk / go / arvados / fs_project_test.go
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: Apache-2.0
4
5 package arvados
6
7 import (
8         "bytes"
9         "encoding/json"
10         "io"
11         "os"
12
13         "git.curoverse.com/arvados.git/sdk/go/arvadostest"
14         check "gopkg.in/check.v1"
15 )
16
17 type spiedRequest struct {
18         method string
19         path   string
20         params map[string]interface{}
21 }
22
23 type spyingClient struct {
24         *Client
25         calls []spiedRequest
26 }
27
28 func (sc *spyingClient) RequestAndDecode(dst interface{}, method, path string, body io.Reader, params interface{}) error {
29         var paramsCopy map[string]interface{}
30         var buf bytes.Buffer
31         json.NewEncoder(&buf).Encode(params)
32         json.NewDecoder(&buf).Decode(&paramsCopy)
33         sc.calls = append(sc.calls, spiedRequest{
34                 method: method,
35                 path:   path,
36                 params: paramsCopy,
37         })
38         return sc.Client.RequestAndDecode(dst, method, path, body, params)
39 }
40
41 func (s *SiteFSSuite) TestHomeProject(c *check.C) {
42         f, err := s.fs.Open("/home")
43         c.Assert(err, check.IsNil)
44         fis, err := f.Readdir(-1)
45         c.Check(len(fis), check.Not(check.Equals), 0)
46
47         ok := false
48         for _, fi := range fis {
49                 c.Check(fi.Name(), check.Not(check.Equals), "")
50                 if fi.Name() == "A Project" {
51                         ok = true
52                 }
53         }
54         c.Check(ok, check.Equals, true)
55
56         f, err = s.fs.Open("/home/A Project/..")
57         c.Assert(err, check.IsNil)
58         fi, err := f.Stat()
59         c.Check(err, check.IsNil)
60         c.Check(fi.IsDir(), check.Equals, true)
61         c.Check(fi.Name(), check.Equals, "home")
62
63         f, err = s.fs.Open("/home/A Project/A Subproject")
64         c.Check(err, check.IsNil)
65         fi, err = f.Stat()
66         c.Check(err, check.IsNil)
67         c.Check(fi.IsDir(), check.Equals, true)
68
69         for _, nx := range []string{
70                 "/home/Unrestricted public data",
71                 "/home/Unrestricted public data/does not exist",
72                 "/home/A Project/does not exist",
73         } {
74                 c.Log(nx)
75                 f, err = s.fs.Open(nx)
76                 c.Check(err, check.NotNil)
77                 c.Check(os.IsNotExist(err), check.Equals, true)
78         }
79 }
80
81 func (s *SiteFSSuite) TestProjectUpdatedByOther(c *check.C) {
82         project, err := s.fs.OpenFile("/home/A Project", 0, 0)
83         c.Check(err, check.IsNil)
84
85         _, err = s.fs.Open("/home/A Project/oob")
86         c.Check(err, check.NotNil)
87
88         oob := Collection{
89                 Name:      "oob",
90                 OwnerUUID: arvadostest.AProjectUUID,
91         }
92         err = s.client.RequestAndDecode(&oob, "POST", "arvados/v1/collections", s.client.UpdateBody(&oob), nil)
93         c.Assert(err, check.IsNil)
94         defer s.client.RequestAndDecode(nil, "DELETE", "arvados/v1/collections/"+oob.UUID, nil, nil)
95
96         err = project.Sync()
97         c.Check(err, check.IsNil)
98         f, err := s.fs.Open("/home/A Project/oob")
99         c.Assert(err, check.IsNil)
100         fi, err := f.Stat()
101         c.Check(fi.IsDir(), check.Equals, true)
102         f.Close()
103
104         wf, err := s.fs.OpenFile("/home/A Project/oob/test.txt", os.O_CREATE|os.O_RDWR, 0700)
105         c.Assert(err, check.IsNil)
106         _, err = wf.Write([]byte("hello oob\n"))
107         c.Check(err, check.IsNil)
108         err = wf.Close()
109         c.Check(err, check.IsNil)
110
111         // Delete test.txt behind s.fs's back by updating the
112         // collection record with the old (empty) ManifestText.
113         err = s.client.RequestAndDecode(nil, "PATCH", "arvados/v1/collections/"+oob.UUID, s.client.UpdateBody(&oob), nil)
114         c.Assert(err, check.IsNil)
115
116         err = project.Sync()
117         c.Check(err, check.IsNil)
118         _, err = s.fs.Open("/home/A Project/oob/test.txt")
119         c.Check(err, check.NotNil)
120         _, err = s.fs.Open("/home/A Project/oob")
121         c.Check(err, check.IsNil)
122
123         err = s.client.RequestAndDecode(nil, "DELETE", "arvados/v1/collections/"+oob.UUID, nil, nil)
124         c.Assert(err, check.IsNil)
125
126         err = project.Sync()
127         c.Check(err, check.IsNil)
128         _, err = s.fs.Open("/home/A Project/oob")
129         c.Check(err, check.NotNil)
130 }