1
// Copyright 2013 Canonical Ltd.
2
// Licensed under the AGPLv3, see LICENCE file for details.
4
package filestorage_test
6
// The filestorage structs are used as stubs in tests.
7
// The tests defined herein are simple smoke tests for the
8
// required reader and writer functionality.
17
gc "launchpad.net/gocheck"
19
"launchpad.net/juju-core/environs/filestorage"
20
"launchpad.net/juju-core/environs/storage"
21
coreerrors "launchpad.net/juju-core/errors"
22
jc "launchpad.net/juju-core/testing/checkers"
25
func TestPackage(t *testing.T) {
29
type filestorageSuite struct {
31
reader storage.StorageReader
32
writer storage.StorageWriter
35
var _ = gc.Suite(&filestorageSuite{})
37
func (s *filestorageSuite) SetUpTest(c *gc.C) {
40
s.reader, err = filestorage.NewFileStorageReader(s.dir)
41
c.Assert(err, gc.IsNil)
42
s.writer, err = filestorage.NewFileStorageWriter(s.dir, filestorage.UseDefaultTmpDir)
43
c.Assert(err, gc.IsNil)
46
func (s *filestorageSuite) createFile(c *gc.C, name string) (fullpath string, data []byte) {
47
fullpath = filepath.Join(s.dir, name)
48
dir := filepath.Dir(fullpath)
49
c.Assert(os.MkdirAll(dir, 0755), gc.IsNil)
50
data = []byte{1, 2, 3, 4, 5}
51
err := ioutil.WriteFile(fullpath, data, 0644)
52
c.Assert(err, gc.IsNil)
56
func (s *filestorageSuite) TestList(c *gc.C) {
64
for _, name := range names {
71
for i, test := range []test{
72
{"a", []string{"a/b/c", "a/bb", "a/c", "aa"}},
73
{"a/b", []string{"a/b/c", "a/bb"}},
74
{"a/b/c", []string{"a/b/c"}},
77
c.Logf("test %d: prefix=%q", i, test.prefix)
78
files, err := storage.List(s.reader, test.prefix)
79
c.Assert(err, gc.IsNil)
80
c.Assert(files, gc.DeepEquals, test.expected)
84
func (s *filestorageSuite) TestURL(c *gc.C) {
85
expectedpath, _ := s.createFile(c, "test-file")
86
_, file := filepath.Split(expectedpath)
87
url, err := s.reader.URL(file)
88
c.Assert(err, gc.IsNil)
89
c.Assert(url, gc.Equals, "file://"+expectedpath)
92
func (s *filestorageSuite) TestGet(c *gc.C) {
93
expectedpath, data := s.createFile(c, "test-file")
94
_, file := filepath.Split(expectedpath)
95
rc, err := storage.Get(s.reader, file)
96
c.Assert(err, gc.IsNil)
98
c.Assert(err, gc.IsNil)
99
b, err := ioutil.ReadAll(rc)
100
c.Assert(err, gc.IsNil)
101
c.Assert(b, gc.DeepEquals, data)
103
// Get on a non-existant path returns NotFoundError
104
_, err = s.reader.Get("nowhere")
105
c.Assert(err, jc.Satisfies, coreerrors.IsNotFoundError)
107
// Get on a directory returns NotFoundError
108
s.createFile(c, "dir/file")
109
_, err = s.reader.Get("dir")
110
c.Assert(err, jc.Satisfies, coreerrors.IsNotFoundError)
113
func (s *filestorageSuite) TestPut(c *gc.C) {
114
data := []byte{1, 2, 3, 4, 5}
115
err := s.writer.Put("test-write", bytes.NewReader(data), int64(len(data)))
116
c.Assert(err, gc.IsNil)
117
b, err := ioutil.ReadFile(filepath.Join(s.dir, "test-write"))
118
c.Assert(err, gc.IsNil)
119
c.Assert(b, gc.DeepEquals, data)
122
func (s *filestorageSuite) TestRemove(c *gc.C) {
123
expectedpath, _ := s.createFile(c, "test-file")
124
_, file := filepath.Split(expectedpath)
125
err := s.writer.Remove(file)
126
c.Assert(err, gc.IsNil)
127
_, err = ioutil.ReadFile(expectedpath)
128
c.Assert(err, gc.Not(gc.IsNil))
131
func (s *filestorageSuite) TestRemoveAll(c *gc.C) {
132
expectedpath, _ := s.createFile(c, "test-file")
133
err := s.writer.RemoveAll()
134
c.Assert(err, gc.IsNil)
135
_, err = ioutil.ReadFile(expectedpath)
136
c.Assert(err, gc.Not(gc.IsNil))
139
func (s *filestorageSuite) TestPutTmpDir(c *gc.C) {
140
// Put should create and clean up the temporary directory if
141
// tmpdir==UseDefaultTmpDir.
142
err := s.writer.Put("test-write", bytes.NewReader(nil), 0)
143
c.Assert(err, gc.IsNil)
144
_, err = os.Stat(s.dir + ".tmp")
145
c.Assert(err, jc.Satisfies, os.IsNotExist)
147
// To deal with recovering from hard failure, UseDefaultTmpDir
148
// doesn't care if the temporary directory already exists. It
149
// still removes it, though.
150
err = os.Mkdir(s.dir+".tmp", 0755)
151
c.Assert(err, gc.IsNil)
152
err = s.writer.Put("test-write", bytes.NewReader(nil), 0)
153
c.Assert(err, gc.IsNil)
154
_, err = os.Stat(s.dir + ".tmp")
155
c.Assert(err, jc.Satisfies, os.IsNotExist)
157
// If we explicitly set the temporary directory, it must already exist.
158
s.writer, err = filestorage.NewFileStorageWriter(s.dir, s.dir+".tmp")
159
c.Assert(err, gc.IsNil)
160
err = s.writer.Put("test-write", bytes.NewReader(nil), 0)
161
c.Assert(err, jc.Satisfies, os.IsNotExist)
162
err = os.Mkdir(s.dir+".tmp", 0755)
163
c.Assert(err, gc.IsNil)
164
err = s.writer.Put("test-write", bytes.NewReader(nil), 0)
165
c.Assert(err, gc.IsNil)
166
// Temporary directory should not have been moved.
167
_, err = os.Stat(s.dir + ".tmp")
168
c.Assert(err, gc.IsNil)