github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/environs/storage/storage_test.go (about) 1 // Copyright 2013 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package storage_test 5 6 import ( 7 "bytes" 8 "fmt" 9 "io" 10 "io/ioutil" 11 stdtesting "testing" 12 13 jc "github.com/juju/testing/checkers" 14 "github.com/juju/utils" 15 gc "gopkg.in/check.v1" 16 17 "github.com/juju/juju/environs/filestorage" 18 "github.com/juju/juju/environs/simplestreams" 19 "github.com/juju/juju/environs/storage" 20 "github.com/juju/juju/testing" 21 ) 22 23 func TestPackage(t *stdtesting.T) { 24 gc.TestingT(t) 25 } 26 27 var _ = gc.Suite(&datasourceSuite{}) 28 29 type datasourceSuite struct { 30 testing.FakeJujuXDGDataHomeSuite 31 stor storage.Storage 32 baseURL string 33 } 34 35 func (s *datasourceSuite) SetUpTest(c *gc.C) { 36 s.FakeJujuXDGDataHomeSuite.SetUpTest(c) 37 38 storageDir := c.MkDir() 39 stor, err := filestorage.NewFileStorageWriter(storageDir) 40 c.Assert(err, jc.ErrorIsNil) 41 s.stor = stor 42 s.baseURL, err = s.stor.URL("") 43 c.Assert(err, jc.ErrorIsNil) 44 } 45 46 func (s *datasourceSuite) TestFetch(c *gc.C) { 47 sampleData := "hello world" 48 s.stor.Put("foo/bar/data.txt", bytes.NewReader([]byte(sampleData)), int64(len(sampleData))) 49 ds := storage.NewStorageSimpleStreamsDataSource("test datasource", s.stor, "", simplestreams.DEFAULT_CLOUD_DATA, false) 50 rc, url, err := ds.Fetch("foo/bar/data.txt") 51 c.Assert(err, jc.ErrorIsNil) 52 defer rc.Close() 53 c.Assert(url, gc.Equals, s.baseURL+"/foo/bar/data.txt") 54 data, err := ioutil.ReadAll(rc) 55 c.Assert(data, gc.DeepEquals, []byte(sampleData)) 56 } 57 58 func (s *datasourceSuite) TestFetchWithBasePath(c *gc.C) { 59 sampleData := "hello world" 60 s.stor.Put("base/foo/bar/data.txt", bytes.NewReader([]byte(sampleData)), int64(len(sampleData))) 61 ds := storage.NewStorageSimpleStreamsDataSource("test datasource", s.stor, "base", simplestreams.DEFAULT_CLOUD_DATA, false) 62 rc, url, err := ds.Fetch("foo/bar/data.txt") 63 c.Assert(err, jc.ErrorIsNil) 64 defer rc.Close() 65 c.Assert(url, gc.Equals, s.baseURL+"/base/foo/bar/data.txt") 66 data, err := ioutil.ReadAll(rc) 67 c.Assert(data, gc.DeepEquals, []byte(sampleData)) 68 } 69 70 func (s *datasourceSuite) TestFetchWithRetry(c *gc.C) { 71 stor := &fakeStorage{shouldRetry: true} 72 ds := storage.NewStorageSimpleStreamsDataSource("test datasource", stor, "base", simplestreams.DEFAULT_CLOUD_DATA, false) 73 ds.SetAllowRetry(true) 74 _, _, err := ds.Fetch("foo/bar/data.txt") 75 c.Assert(err, gc.ErrorMatches, "an error") 76 c.Assert(stor.getName, gc.Equals, "base/foo/bar/data.txt") 77 c.Assert(stor.invokeCount, gc.Equals, 10) 78 } 79 80 func (s *datasourceSuite) TestFetchWithNoRetry(c *gc.C) { 81 // NB shouldRetry below is true indicating the fake storage is capable of 82 // retrying, not that it will retry. 83 stor := &fakeStorage{shouldRetry: true} 84 ds := storage.NewStorageSimpleStreamsDataSource("test datasource", stor, "base", simplestreams.DEFAULT_CLOUD_DATA, false) 85 _, _, err := ds.Fetch("foo/bar/data.txt") 86 c.Assert(err, gc.ErrorMatches, "an error") 87 c.Assert(stor.getName, gc.Equals, "base/foo/bar/data.txt") 88 c.Assert(stor.invokeCount, gc.Equals, 1) 89 } 90 91 func (s *datasourceSuite) TestURL(c *gc.C) { 92 sampleData := "hello world" 93 s.stor.Put("bar/data.txt", bytes.NewReader([]byte(sampleData)), int64(len(sampleData))) 94 ds := storage.NewStorageSimpleStreamsDataSource("test datasource", s.stor, "", simplestreams.DEFAULT_CLOUD_DATA, false) 95 url, err := ds.URL("bar") 96 c.Assert(err, jc.ErrorIsNil) 97 expectedURL, _ := s.stor.URL("bar") 98 c.Assert(url, gc.Equals, expectedURL) 99 } 100 101 func (s *datasourceSuite) TestURLWithBasePath(c *gc.C) { 102 sampleData := "hello world" 103 s.stor.Put("base/bar/data.txt", bytes.NewReader([]byte(sampleData)), int64(len(sampleData))) 104 ds := storage.NewStorageSimpleStreamsDataSource("test datasource", s.stor, "base", simplestreams.DEFAULT_CLOUD_DATA, false) 105 url, err := ds.URL("bar") 106 c.Assert(err, jc.ErrorIsNil) 107 expectedURL, _ := s.stor.URL("base/bar") 108 c.Assert(url, gc.Equals, expectedURL) 109 } 110 111 var _ = gc.Suite(&storageSuite{}) 112 113 type storageSuite struct{} 114 115 type fakeStorage struct { 116 getName string 117 listPrefix string 118 invokeCount int 119 shouldRetry bool 120 } 121 122 func (s *fakeStorage) Get(name string) (io.ReadCloser, error) { 123 s.getName = name 124 s.invokeCount++ 125 return nil, fmt.Errorf("an error") 126 } 127 128 func (s *fakeStorage) List(prefix string) ([]string, error) { 129 s.listPrefix = prefix 130 s.invokeCount++ 131 return nil, fmt.Errorf("an error") 132 } 133 134 func (s *fakeStorage) URL(name string) (string, error) { 135 return "", nil 136 } 137 138 func (s *fakeStorage) DefaultConsistencyStrategy() utils.AttemptStrategy { 139 // TODO(katco): 2016-08-09: lp:1611427 140 return utils.AttemptStrategy{Min: 10} 141 } 142 143 func (s *fakeStorage) ShouldRetry(error) bool { 144 return s.shouldRetry 145 } 146 147 func (s *storageSuite) TestGetWithRetry(c *gc.C) { 148 stor := &fakeStorage{shouldRetry: true} 149 // TODO(katco): 2016-08-09: lp:1611427 150 attempt := utils.AttemptStrategy{Min: 5} 151 storage.GetWithRetry(stor, "foo", attempt) 152 c.Assert(stor.getName, gc.Equals, "foo") 153 c.Assert(stor.invokeCount, gc.Equals, 5) 154 } 155 156 func (s *storageSuite) TestGet(c *gc.C) { 157 stor := &fakeStorage{shouldRetry: true} 158 storage.Get(stor, "foo") 159 c.Assert(stor.getName, gc.Equals, "foo") 160 c.Assert(stor.invokeCount, gc.Equals, 10) 161 } 162 163 func (s *storageSuite) TestGetNoRetryAllowed(c *gc.C) { 164 stor := &fakeStorage{} 165 storage.Get(stor, "foo") 166 c.Assert(stor.getName, gc.Equals, "foo") 167 c.Assert(stor.invokeCount, gc.Equals, 1) 168 } 169 170 func (s *storageSuite) TestListWithRetry(c *gc.C) { 171 stor := &fakeStorage{shouldRetry: true} 172 // TODO(katco): 2016-08-09: lp:1611427 173 attempt := utils.AttemptStrategy{Min: 5} 174 storage.ListWithRetry(stor, "foo", attempt) 175 c.Assert(stor.listPrefix, gc.Equals, "foo") 176 c.Assert(stor.invokeCount, gc.Equals, 5) 177 } 178 179 func (s *storageSuite) TestList(c *gc.C) { 180 stor := &fakeStorage{shouldRetry: true} 181 storage.List(stor, "foo") 182 c.Assert(stor.listPrefix, gc.Equals, "foo") 183 c.Assert(stor.invokeCount, gc.Equals, 10) 184 } 185 186 func (s *storageSuite) TestListNoRetryAllowed(c *gc.C) { 187 stor := &fakeStorage{} 188 storage.List(stor, "foo") 189 c.Assert(stor.listPrefix, gc.Equals, "foo") 190 c.Assert(stor.invokeCount, gc.Equals, 1) 191 }