github.com/uber/kraken@v0.1.4/lib/store/base/fixtures.go (about) 1 // Copyright (c) 2016-2019 Uber Technologies, Inc. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 package base 15 16 import ( 17 "fmt" 18 "io/ioutil" 19 "log" 20 "os" 21 22 "github.com/uber/kraken/core" 23 "github.com/uber/kraken/utils/testutil" 24 25 "github.com/andres-erbsen/clock" 26 ) 27 28 func fileStatesFixture() (state1, state2, state3 FileState, run func()) { 29 cleanup := &testutil.Cleanup{} 30 defer cleanup.Recover() 31 32 root, err := ioutil.TempDir("/tmp", "store_test") 33 if err != nil { 34 log.Fatal(err) 35 } 36 cleanup.Add(func() { os.RemoveAll(root) }) 37 38 state1Dir, err := ioutil.TempDir(root, "state1") 39 if err != nil { 40 log.Fatal(err) 41 } 42 43 state2Dir, err := ioutil.TempDir(root, "state2") 44 if err != nil { 45 log.Fatal(err) 46 } 47 48 state3Dir, err := ioutil.TempDir(root, "state3") 49 if err != nil { 50 log.Fatal(err) 51 } 52 53 state1 = NewFileState(state1Dir) 54 state2 = NewFileState(state2Dir) 55 state3 = NewFileState(state3Dir) 56 57 return state1, state2, state3, cleanup.Run 58 } 59 60 type fileEntryTestBundle struct { 61 state1 FileState 62 state2 FileState 63 state3 FileState 64 65 entry FileEntry 66 } 67 68 func fileEntryLocalFixture() (bundle *fileEntryTestBundle, run func()) { 69 cleanup := &testutil.Cleanup{} 70 defer cleanup.Recover() 71 72 state1, state2, state3, f := fileStatesFixture() 73 cleanup.Add(f) 74 entry, err := NewLocalFileEntryFactory().Create(core.DigestFixture().Hex(), state1) 75 if err != nil { 76 panic(fmt.Sprintf("create test file: %s", err)) 77 } 78 79 return &fileEntryTestBundle{ 80 state1: state1, 81 state2: state2, 82 state3: state3, 83 entry: entry, 84 }, cleanup.Run 85 } 86 87 type fileMapTestBundle struct { 88 state1 FileState 89 state2 FileState 90 state3 FileState 91 92 entry FileEntry 93 fm FileMap 94 } 95 96 func fileMapLRUFixture() (bundle *fileMapTestBundle, run func()) { 97 cleanup := &testutil.Cleanup{} 98 defer cleanup.Recover() 99 100 b, clean := fileEntryLocalFixture() 101 cleanup.Add(clean) 102 103 fm := NewLRUFileMap(100, clock.New()) 104 105 return &fileMapTestBundle{ 106 state1: b.state1, 107 state2: b.state2, 108 state3: b.state3, 109 entry: b.entry, 110 fm: fm, 111 }, cleanup.Run 112 } 113 114 // fileStoreBundle contains available states, FileStore and a map of FileEntry 115 // NOTE: do not use this struct directly, use fixtures instead 116 // TODO: breakdown fileStoreTestBundle 117 type fileStoreTestBundle struct { 118 clk clock.Clock 119 120 state1 FileState 121 state2 FileState 122 state3 FileState 123 124 createStore func(clk clock.Clock) *localFileStore 125 store *localFileStore 126 files map[FileState]string 127 } 128 129 func (b *fileStoreTestBundle) recreateStore() { 130 b.store = b.createStore(b.clk) 131 } 132 133 func fileStoreDefaultFixture() (*fileStoreTestBundle, func()) { 134 return fileStoreFixture(func(clk clock.Clock) *localFileStore { 135 store := NewLocalFileStore(clk) 136 return store.(*localFileStore) 137 }) 138 } 139 140 func fileStoreCASFixture() (*fileStoreTestBundle, func()) { 141 return fileStoreFixture(func(clk clock.Clock) *localFileStore { 142 store := NewCASFileStore(clk) 143 return store.(*localFileStore) 144 }) 145 } 146 147 func fileStoreLRUFixture(size int) (*fileStoreTestBundle, func()) { 148 return fileStoreFixture(func(clk clock.Clock) *localFileStore { 149 store := NewLRUFileStore(size, clk) 150 return store.(*localFileStore) 151 }) 152 } 153 154 func fileStoreFixture( 155 createStore func(clk clock.Clock) *localFileStore) (*fileStoreTestBundle, func()) { 156 157 clk := clock.NewMock() 158 store := createStore(clk) 159 cleanup := &testutil.Cleanup{} 160 defer cleanup.Recover() 161 162 state1, state2, state3, f := fileStatesFixture() 163 cleanup.Add(f) 164 165 storeBundle := &fileStoreTestBundle{ 166 clk: clk, 167 state1: state1, 168 state2: state2, 169 state3: state3, 170 createStore: createStore, 171 store: store, 172 files: make(map[FileState]string), 173 } 174 175 // Create one test file in store 176 testFile := core.DigestFixture().Hex() 177 err := storeBundle.store.NewFileOp().CreateFile(testFile, storeBundle.state1, 5) 178 if err != nil { 179 log.Fatal(err) 180 } 181 182 storeBundle.files[storeBundle.state1] = testFile 183 184 return storeBundle, cleanup.Run 185 }