github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/state/binarystorage/layered_test.go (about) 1 // Copyright 2016 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package binarystorage_test 5 6 import ( 7 "io" 8 9 "github.com/juju/errors" 10 "github.com/juju/testing" 11 jc "github.com/juju/testing/checkers" 12 gc "gopkg.in/check.v1" 13 14 "github.com/juju/juju/state/binarystorage" 15 coretesting "github.com/juju/juju/testing" 16 ) 17 18 type layeredStorageSuite struct { 19 coretesting.BaseSuite 20 stores []*mockStorage 21 store binarystorage.Storage 22 } 23 24 var _ = gc.Suite(&layeredStorageSuite{}) 25 26 func (s *layeredStorageSuite) SetUpTest(c *gc.C) { 27 s.BaseSuite.SetUpTest(c) 28 s.stores = []*mockStorage{{ 29 metadata: []binarystorage.Metadata{{ 30 Version: "1.0", Size: 1, SHA256: "foo", 31 }, { 32 Version: "2.0", Size: 2, SHA256: "bar", 33 }}, 34 }, { 35 metadata: []binarystorage.Metadata{{ 36 Version: "3.0", Size: 3, SHA256: "baz", 37 }, { 38 Version: "1.0", Size: 3, SHA256: "meh", 39 }}, 40 }} 41 42 stores := make([]binarystorage.Storage, len(s.stores)) 43 for i, store := range s.stores { 44 stores[i] = store 45 } 46 var err error 47 s.store, err = binarystorage.NewLayeredStorage(stores...) 48 c.Assert(err, jc.ErrorIsNil) 49 } 50 51 func (s *layeredStorageSuite) TestNewLayeredStorageError(c *gc.C) { 52 _, err := binarystorage.NewLayeredStorage(s.stores[0]) 53 c.Assert(err, gc.ErrorMatches, "expected multiple stores") 54 } 55 56 func (s *layeredStorageSuite) TestAdd(c *gc.C) { 57 r := new(readCloser) 58 m := binarystorage.Metadata{Version: "4.0", Size: 4, SHA256: "qux"} 59 expectedErr := errors.New("wut") 60 s.stores[0].SetErrors(expectedErr) 61 err := s.store.Add(r, m) 62 c.Assert(err, gc.Equals, expectedErr) 63 s.stores[0].CheckCalls(c, []testing.StubCall{{"Add", []interface{}{r, m}}}) 64 s.stores[1].CheckNoCalls(c) 65 } 66 67 func (s *layeredStorageSuite) TestAllMetadata(c *gc.C) { 68 all, err := s.store.AllMetadata() 69 c.Assert(err, jc.ErrorIsNil) 70 c.Assert(all, jc.DeepEquals, []binarystorage.Metadata{ 71 {Version: "1.0", Size: 1, SHA256: "foo"}, 72 {Version: "2.0", Size: 2, SHA256: "bar"}, 73 {Version: "3.0", Size: 3, SHA256: "baz"}, 74 }) 75 s.stores[0].CheckCallNames(c, "AllMetadata") 76 s.stores[1].CheckCallNames(c, "AllMetadata") 77 } 78 79 func (s *layeredStorageSuite) TestAllMetadataError(c *gc.C) { 80 expectedErr := errors.New("wut") 81 s.stores[0].SetErrors(expectedErr) 82 _, err := s.store.AllMetadata() 83 c.Assert(err, gc.Equals, expectedErr) 84 s.stores[0].CheckCallNames(c, "AllMetadata") 85 s.stores[1].CheckNoCalls(c) 86 } 87 88 func (s *layeredStorageSuite) TestMetadata(c *gc.C) { 89 s.stores[0].SetErrors(errors.NotFoundf("metadata")) 90 m, err := s.store.Metadata("3.0") 91 c.Assert(err, jc.ErrorIsNil) 92 c.Assert(m, jc.DeepEquals, s.stores[1].metadata[0]) 93 s.stores[0].CheckCalls(c, []testing.StubCall{{ 94 "Metadata", []interface{}{"3.0"}, 95 }}) 96 s.stores[1].CheckCalls(c, []testing.StubCall{{ 97 "Metadata", []interface{}{"3.0"}, 98 }}) 99 } 100 101 func (s *layeredStorageSuite) TestMetadataEarlyExit(c *gc.C) { 102 m, err := s.store.Metadata("1.0") 103 c.Assert(err, jc.ErrorIsNil) 104 s.stores[0].CheckCalls(c, []testing.StubCall{{ 105 "Metadata", []interface{}{"1.0"}, 106 }}) 107 s.stores[1].CheckNoCalls(c) 108 c.Assert(m, jc.DeepEquals, s.stores[0].metadata[0]) 109 } 110 111 func (s *layeredStorageSuite) TestMetadataFatalError(c *gc.C) { 112 expectedErr := errors.New("wut") 113 s.stores[0].SetErrors(expectedErr) 114 _, err := s.store.Metadata("1.0") 115 c.Assert(err, gc.Equals, expectedErr) 116 s.stores[0].CheckCalls(c, []testing.StubCall{{ 117 "Metadata", []interface{}{"1.0"}, 118 }}) 119 s.stores[1].CheckNoCalls(c) 120 } 121 122 func (s *layeredStorageSuite) TestOpen(c *gc.C) { 123 s.stores[0].SetErrors(errors.NotFoundf("metadata")) 124 m, rc, err := s.store.Open("3.0") 125 c.Assert(err, jc.ErrorIsNil) 126 c.Assert(m, jc.DeepEquals, s.stores[1].metadata[0]) 127 c.Assert(rc, gc.Equals, &s.stores[1].rc) 128 s.stores[0].CheckCalls(c, []testing.StubCall{{ 129 "Open", []interface{}{"3.0"}, 130 }}) 131 s.stores[1].CheckCalls(c, []testing.StubCall{{ 132 "Open", []interface{}{"3.0"}, 133 }}) 134 } 135 136 func (s *layeredStorageSuite) TestOpenEarlyExit(c *gc.C) { 137 m, rc, err := s.store.Open("1.0") 138 c.Assert(err, jc.ErrorIsNil) 139 c.Assert(m, jc.DeepEquals, s.stores[0].metadata[0]) 140 c.Assert(rc, gc.Equals, &s.stores[0].rc) 141 s.stores[0].CheckCalls(c, []testing.StubCall{{ 142 "Open", []interface{}{"1.0"}, 143 }}) 144 s.stores[1].CheckNoCalls(c) 145 } 146 147 func (s *layeredStorageSuite) TestOpenFatalError(c *gc.C) { 148 expectedErr := errors.New("wut") 149 s.stores[0].SetErrors(expectedErr) 150 _, _, err := s.store.Open("1.0") 151 c.Assert(err, gc.Equals, expectedErr) 152 s.stores[0].CheckCalls(c, []testing.StubCall{{ 153 "Open", []interface{}{"1.0"}, 154 }}) 155 s.stores[1].CheckNoCalls(c) 156 } 157 158 type mockStorage struct { 159 testing.Stub 160 rc readCloser 161 metadata []binarystorage.Metadata 162 } 163 164 func (s *mockStorage) Add(r io.Reader, m binarystorage.Metadata) error { 165 s.MethodCall(s, "Add", r, m) 166 return s.NextErr() 167 } 168 169 func (s *mockStorage) AllMetadata() ([]binarystorage.Metadata, error) { 170 s.MethodCall(s, "AllMetadata") 171 return s.metadata, s.NextErr() 172 } 173 174 func (s *mockStorage) Metadata(version string) (binarystorage.Metadata, error) { 175 s.MethodCall(s, "Metadata", version) 176 return s.metadata[0], s.NextErr() 177 } 178 179 func (s *mockStorage) Open(version string) (binarystorage.Metadata, io.ReadCloser, error) { 180 s.MethodCall(s, "Open", version) 181 return s.metadata[0], &s.rc, s.NextErr() 182 } 183 184 type readCloser struct{ io.ReadCloser }