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  }