go-micro.dev/v5@v5.12.0/store/file_test.go (about)

     1  package store
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"path/filepath"
     7  	"strings"
     8  	"testing"
     9  	"time"
    10  
    11  	"github.com/davecgh/go-spew/spew"
    12  	"github.com/kr/pretty"
    13  )
    14  
    15  func cleanup(db string, s Store) {
    16  	s.Close()
    17  	dir := filepath.Join(DefaultDir, db+"/")
    18  	os.RemoveAll(dir)
    19  }
    20  
    21  func TestFileStoreReInit(t *testing.T) {
    22  	s := NewStore(Table("aaa"))
    23  	defer cleanup(DefaultDatabase, s)
    24  	s.Init(Table("bbb"))
    25  	if s.Options().Table != "bbb" {
    26  		t.Error("Init didn't reinitialise the store")
    27  	}
    28  }
    29  
    30  func TestFileStoreBasic(t *testing.T) {
    31  	s := NewStore()
    32  	defer cleanup(DefaultDatabase, s)
    33  	fileTest(s, t)
    34  }
    35  
    36  func TestFileStoreTable(t *testing.T) {
    37  	s := NewStore(Table("testTable"))
    38  	defer cleanup(DefaultDatabase, s)
    39  	fileTest(s, t)
    40  }
    41  
    42  func TestFileStoreDatabase(t *testing.T) {
    43  	s := NewStore(Database("testdb"))
    44  	defer cleanup("testdb", s)
    45  	fileTest(s, t)
    46  }
    47  
    48  func TestFileStoreDatabaseTable(t *testing.T) {
    49  	s := NewStore(Table("testTable"), Database("testdb"))
    50  	defer cleanup("testdb", s)
    51  	fileTest(s, t)
    52  }
    53  
    54  func fileTest(s Store, t *testing.T) {
    55  	if len(os.Getenv("IN_TRAVIS_CI")) == 0 {
    56  		t.Logf("Options %s %v\n", s.String(), s.Options())
    57  	}
    58  	// Read and Write an expiring Record
    59  	if err := s.Write(&Record{
    60  		Key:    "Hello",
    61  		Value:  []byte("World"),
    62  		Expiry: time.Millisecond * 150,
    63  	}); err != nil {
    64  		t.Error(err)
    65  	}
    66  
    67  	if r, err := s.Read("Hello"); err != nil {
    68  		t.Fatal(err)
    69  	} else {
    70  		if len(r) != 1 {
    71  			t.Error("Read returned multiple records")
    72  		}
    73  		if r[0].Key != "Hello" {
    74  			t.Errorf("Expected %s, got %s", "Hello", r[0].Key)
    75  		}
    76  		if string(r[0].Value) != "World" {
    77  			t.Errorf("Expected %s, got %s", "World", r[0].Value)
    78  		}
    79  	}
    80  
    81  	// wait for expiry
    82  	time.Sleep(time.Millisecond * 200)
    83  
    84  	if _, err := s.Read("Hello"); err != ErrNotFound {
    85  		t.Errorf("Expected %# v, got %# v", ErrNotFound, err)
    86  	}
    87  
    88  	// Write 3 records with various expiry and get with Table
    89  	records := []*Record{
    90  		{
    91  			Key:   "foo",
    92  			Value: []byte("foofoo"),
    93  		},
    94  		{
    95  			Key:    "foobar",
    96  			Value:  []byte("foobarfoobar"),
    97  			Expiry: time.Millisecond * 100,
    98  		},
    99  	}
   100  
   101  	for _, r := range records {
   102  		if err := s.Write(r); err != nil {
   103  			t.Errorf("Couldn't write k: %s, v: %# v (%s)", r.Key, pretty.Formatter(r.Value), err)
   104  		}
   105  	}
   106  
   107  	if results, err := s.Read("foo", ReadPrefix()); err != nil {
   108  		t.Errorf("Couldn't read all \"foo\" keys, got %# v (%s)", spew.Sdump(results), err)
   109  	} else {
   110  		if len(results) != 2 {
   111  			t.Errorf("Expected 2 items, got %d", len(results))
   112  			// t.Logf("Table test: %v\n", spew.Sdump(results))
   113  		}
   114  	}
   115  
   116  	// wait for the expiry
   117  	time.Sleep(time.Millisecond * 200)
   118  
   119  	if results, err := s.Read("foo", ReadPrefix()); err != nil {
   120  		t.Errorf("Couldn't read all \"foo\" keys, got %# v (%s)", spew.Sdump(results), err)
   121  	} else if len(results) != 1 {
   122  		t.Errorf("Expected 1 item, got %d", len(results))
   123  		// t.Logf("Table test: %v\n", spew.Sdump(results))
   124  	}
   125  
   126  	if err := s.Delete("foo"); err != nil {
   127  		t.Errorf("Delete failed (%v)", err)
   128  	}
   129  
   130  	if results, err := s.Read("foo"); err != ErrNotFound {
   131  		t.Errorf("Expected read failure read all \"foo\" keys, got %# v (%s)", spew.Sdump(results), err)
   132  	} else {
   133  		if len(results) != 0 {
   134  			t.Errorf("Expected 0 items, got %d (%# v)", len(results), spew.Sdump(results))
   135  		}
   136  	}
   137  
   138  	// Write 3 records with various expiry and get with Suffix
   139  	records = []*Record{
   140  		{
   141  			Key:   "foo",
   142  			Value: []byte("foofoo"),
   143  		},
   144  		{
   145  			Key:   "barfoo",
   146  			Value: []byte("barfoobarfoo"),
   147  
   148  			Expiry: time.Millisecond * 100,
   149  		},
   150  		{
   151  			Key:    "bazbarfoo",
   152  			Value:  []byte("bazbarfoobazbarfoo"),
   153  			Expiry: 2 * time.Millisecond * 100,
   154  		},
   155  	}
   156  	for _, r := range records {
   157  		if err := s.Write(r); err != nil {
   158  			t.Errorf("Couldn't write k: %s, v: %# v (%s)", r.Key, pretty.Formatter(r.Value), err)
   159  		}
   160  	}
   161  	if results, err := s.Read("foo", ReadSuffix()); err != nil {
   162  		t.Errorf("Couldn't read all \"foo\" keys, got %# v (%s)", spew.Sdump(results), err)
   163  	} else {
   164  		if len(results) != 3 {
   165  			t.Errorf("Expected 3 items, got %d", len(results))
   166  			// t.Logf("Table test: %v\n", spew.Sdump(results))
   167  		}
   168  	}
   169  	time.Sleep(time.Millisecond * 100)
   170  	if results, err := s.Read("foo", ReadSuffix()); err != nil {
   171  		t.Errorf("Couldn't read all \"foo\" keys, got %# v (%s)", spew.Sdump(results), err)
   172  	} else {
   173  		if len(results) != 2 {
   174  			t.Errorf("Expected 2 items, got %d", len(results))
   175  			// t.Logf("Table test: %v\n", spew.Sdump(results))
   176  		}
   177  	}
   178  	time.Sleep(time.Millisecond * 100)
   179  	if results, err := s.Read("foo", ReadSuffix()); err != nil {
   180  		t.Errorf("Couldn't read all \"foo\" keys, got %# v (%s)", spew.Sdump(results), err)
   181  	} else {
   182  		if len(results) != 1 {
   183  			t.Errorf("Expected 1 item, got %d", len(results))
   184  			//	t.Logf("Table test: %# v\n", spew.Sdump(results))
   185  		}
   186  	}
   187  	if err := s.Delete("foo"); err != nil {
   188  		t.Errorf("Delete failed (%v)", err)
   189  	}
   190  	if results, err := s.Read("foo", ReadSuffix()); err != nil {
   191  		t.Errorf("Couldn't read all \"foo\" keys, got %# v (%s)", spew.Sdump(results), err)
   192  	} else {
   193  		if len(results) != 0 {
   194  			t.Errorf("Expected 0 items, got %d (%# v)", len(results), spew.Sdump(results))
   195  		}
   196  	}
   197  
   198  	// Test Table, Suffix and WriteOptions
   199  	if err := s.Write(&Record{
   200  		Key:   "foofoobarbar",
   201  		Value: []byte("something"),
   202  	}, WriteTTL(time.Millisecond*100)); err != nil {
   203  		t.Error(err)
   204  	}
   205  	if err := s.Write(&Record{
   206  		Key:   "foofoo",
   207  		Value: []byte("something"),
   208  	}, WriteExpiry(time.Now().Add(time.Millisecond*100))); err != nil {
   209  		t.Error(err)
   210  	}
   211  	if err := s.Write(&Record{
   212  		Key:   "barbar",
   213  		Value: []byte("something"),
   214  		// TTL has higher precedence than expiry
   215  	}, WriteExpiry(time.Now().Add(time.Hour)), WriteTTL(time.Millisecond*100)); err != nil {
   216  		t.Error(err)
   217  	}
   218  
   219  	if results, err := s.Read("foo", ReadPrefix(), ReadSuffix()); err != nil {
   220  		t.Error(err)
   221  	} else {
   222  		if len(results) != 1 {
   223  			t.Errorf("Expected 1 results, got %d: %# v", len(results), spew.Sdump(results))
   224  		}
   225  	}
   226  
   227  	time.Sleep(time.Millisecond * 100)
   228  
   229  	if results, err := s.List(); err != nil {
   230  		t.Errorf("List failed: %s", err)
   231  	} else {
   232  		if len(results) != 0 {
   233  			t.Errorf("Expiry options were not effective, results :%v", spew.Sdump(results))
   234  		}
   235  	}
   236  
   237  	// write the following records
   238  	for i := 0; i < 10; i++ {
   239  		s.Write(&Record{
   240  			Key:   fmt.Sprintf("a%d", i),
   241  			Value: []byte{},
   242  		})
   243  	}
   244  
   245  	// read back a few records
   246  	if results, err := s.Read("a", ReadLimit(5), ReadPrefix()); err != nil {
   247  		t.Error(err)
   248  	} else {
   249  		if len(results) != 5 {
   250  			t.Fatal("Expected 5 results, got ", len(results))
   251  		}
   252  		if !strings.HasPrefix(results[0].Key, "a") {
   253  			t.Fatalf("Expected a prefix, got %s", results[0].Key)
   254  		}
   255  	}
   256  
   257  	// read the rest back
   258  	if results, err := s.Read("a", ReadLimit(30), ReadOffset(5), ReadPrefix()); err != nil {
   259  		t.Fatal(err)
   260  	} else {
   261  		if len(results) != 5 {
   262  			t.Fatal("Expected 5 results, got ", len(results))
   263  		}
   264  	}
   265  }