github.com/minio/minio@v0.0.0-20240328213742-3f72439b8a27/internal/store/queuestore_test.go (about) 1 // Copyright (c) 2015-2021 MinIO, Inc. 2 // 3 // This file is part of MinIO Object Storage stack 4 // 5 // This program is free software: you can redistribute it and/or modify 6 // it under the terms of the GNU Affero General Public License as published by 7 // the Free Software Foundation, either version 3 of the License, or 8 // (at your option) any later version. 9 // 10 // This program is distributed in the hope that it will be useful 11 // but WITHOUT ANY WARRANTY; without even the implied warranty of 12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 // GNU Affero General Public License for more details. 14 // 15 // You should have received a copy of the GNU Affero General Public License 16 // along with this program. If not, see <http://www.gnu.org/licenses/>. 17 18 package store 19 20 import ( 21 "os" 22 "path/filepath" 23 "reflect" 24 "strings" 25 "testing" 26 ) 27 28 type TestItem struct { 29 Name string `json:"Name"` 30 Property string `json:"property"` 31 } 32 33 var ( 34 // TestDir 35 queueDir = filepath.Join(os.TempDir(), "minio_test") 36 // Sample test item. 37 testItem = TestItem{Name: "test-item", Property: "property"} 38 // Ext for test item 39 testItemExt = ".test" 40 ) 41 42 // Initialize the queue store. 43 func setUpQueueStore(directory string, limit uint64) (Store[TestItem], error) { 44 queueStore := NewQueueStore[TestItem](queueDir, limit, testItemExt) 45 if oErr := queueStore.Open(); oErr != nil { 46 return nil, oErr 47 } 48 return queueStore, nil 49 } 50 51 // Tear down queue store. 52 func tearDownQueueStore() error { 53 return os.RemoveAll(queueDir) 54 } 55 56 // TestQueueStorePut - tests for store.Put 57 func TestQueueStorePut(t *testing.T) { 58 defer func() { 59 if err := tearDownQueueStore(); err != nil { 60 t.Fatal("Failed to tear down store ", err) 61 } 62 }() 63 store, err := setUpQueueStore(queueDir, 100) 64 if err != nil { 65 t.Fatal("Failed to create a queue store ", err) 66 } 67 // Put 100 items. 68 for i := 0; i < 100; i++ { 69 if err := store.Put(testItem); err != nil { 70 t.Fatal("Failed to put to queue store ", err) 71 } 72 } 73 // Count the items. 74 names, err := store.List() 75 if err != nil { 76 t.Fatal(err) 77 } 78 if len(names) != 100 { 79 t.Fatalf("List() Expected: 100, got %d", len(names)) 80 } 81 } 82 83 // TestQueueStoreGet - tests for store.Get 84 func TestQueueStoreGet(t *testing.T) { 85 defer func() { 86 if err := tearDownQueueStore(); err != nil { 87 t.Fatal("Failed to tear down store ", err) 88 } 89 }() 90 store, err := setUpQueueStore(queueDir, 10) 91 if err != nil { 92 t.Fatal("Failed to create a queue store ", err) 93 } 94 // Put 10 items 95 for i := 0; i < 10; i++ { 96 if err := store.Put(testItem); err != nil { 97 t.Fatal("Failed to put to queue store ", err) 98 } 99 } 100 itemKeys, err := store.List() 101 if err != nil { 102 t.Fatal(err) 103 } 104 // Get 10 items. 105 if len(itemKeys) == 10 { 106 for _, key := range itemKeys { 107 item, eErr := store.Get(strings.TrimSuffix(key, testItemExt)) 108 if eErr != nil { 109 t.Fatal("Failed to Get the item from the queue store ", eErr) 110 } 111 if !reflect.DeepEqual(testItem, item) { 112 t.Fatalf("Failed to read the item: error: expected = %v, got = %v", testItem, item) 113 } 114 } 115 } else { 116 t.Fatalf("List() Expected: 10, got %d", len(itemKeys)) 117 } 118 } 119 120 // TestQueueStoreDel - tests for store.Del 121 func TestQueueStoreDel(t *testing.T) { 122 defer func() { 123 if err := tearDownQueueStore(); err != nil { 124 t.Fatal("Failed to tear down store ", err) 125 } 126 }() 127 store, err := setUpQueueStore(queueDir, 20) 128 if err != nil { 129 t.Fatal("Failed to create a queue store ", err) 130 } 131 // Put 20 items. 132 for i := 0; i < 20; i++ { 133 if err := store.Put(testItem); err != nil { 134 t.Fatal("Failed to put to queue store ", err) 135 } 136 } 137 itemKeys, err := store.List() 138 if err != nil { 139 t.Fatal(err) 140 } 141 // Remove all the items. 142 if len(itemKeys) == 20 { 143 for _, key := range itemKeys { 144 err := store.Del(strings.TrimSuffix(key, testItemExt)) 145 if err != nil { 146 t.Fatal("queue store Del failed with ", err) 147 } 148 } 149 } else { 150 t.Fatalf("List() Expected: 20, got %d", len(itemKeys)) 151 } 152 153 names, err := store.List() 154 if err != nil { 155 t.Fatal(err) 156 } 157 if len(names) != 0 { 158 t.Fatalf("List() Expected: 0, got %d", len(names)) 159 } 160 } 161 162 // TestQueueStoreLimit - tests the item limit for the store. 163 func TestQueueStoreLimit(t *testing.T) { 164 defer func() { 165 if err := tearDownQueueStore(); err != nil { 166 t.Fatal("Failed to tear down store ", err) 167 } 168 }() 169 // The max limit is set to 5. 170 store, err := setUpQueueStore(queueDir, 5) 171 if err != nil { 172 t.Fatal("Failed to create a queue store ", err) 173 } 174 for i := 0; i < 5; i++ { 175 if err := store.Put(testItem); err != nil { 176 t.Fatal("Failed to put to queue store ", err) 177 } 178 } 179 // Should not allow 6th Put. 180 if err := store.Put(testItem); err == nil { 181 t.Fatalf("Expected to fail with %s, but passes", errLimitExceeded) 182 } 183 } 184 185 // TestQueueStoreLimit - tests for store.LimitN. 186 func TestQueueStoreListN(t *testing.T) { 187 defer func() { 188 if err := tearDownQueueStore(); err != nil { 189 t.Fatal("Failed to tear down store ", err) 190 } 191 }() 192 store, err := setUpQueueStore(queueDir, 10) 193 if err != nil { 194 t.Fatal("Failed to create a queue store ", err) 195 } 196 for i := 0; i < 10; i++ { 197 if err := store.Put(testItem); err != nil { 198 t.Fatal("Failed to put to queue store ", err) 199 } 200 } 201 // Should return all the item keys in the store. 202 names, err := store.List() 203 if err != nil { 204 t.Fatal(err) 205 } 206 207 if len(names) != 10 { 208 t.Fatalf("List() Expected: 10, got %d", len(names)) 209 } 210 211 // re-open 212 store, err = setUpQueueStore(queueDir, 10) 213 if err != nil { 214 t.Fatal("Failed to create a queue store ", err) 215 } 216 names, err = store.List() 217 if err != nil { 218 t.Fatal(err) 219 } 220 221 if len(names) != 10 { 222 t.Fatalf("List() Expected: 10, got %d", len(names)) 223 } 224 if len(names) != store.Len() { 225 t.Fatalf("List() Expected: 10, got %d", len(names)) 226 } 227 228 // Delete all 229 for _, key := range names { 230 err := store.Del(key) 231 if err != nil { 232 t.Fatal(err) 233 } 234 } 235 // Re-list 236 lst, err := store.List() 237 if len(lst) > 0 || err != nil { 238 t.Fatalf("Expected List() to return empty list and no error, got %v err: %v", lst, err) 239 } 240 }