github.com/annwntech/go-micro/v2@v2.9.5/store/memory/memory_test.go (about)

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