diff --git a/storage/session.go b/storage/session.go index 1fc0aec0e43ffa46d95ce07db69936e381a4e0db..2ad3042ed7c76758227a42f751f146ae15cc58b4 100644 --- a/storage/session.go +++ b/storage/session.go @@ -282,7 +282,7 @@ func Load(baseDir, password string, currentVersion version.Version, "Failed to load bucket store") } - s.ud, err = ud.LoadStore(s.kv) + s.ud, err = ud.NewOrLoadStore(s.kv) if err != nil { return nil, errors.WithMessage(err, "Failed to load ud store") } diff --git a/storage/ud/store.go b/storage/ud/store.go index 33f62113e8218b378df3e6afd2f72ea972a2a6e0..64325e317bef67ef2d192ab64e70ba32da2d5365 100644 --- a/storage/ud/store.go +++ b/storage/ud/store.go @@ -8,6 +8,7 @@ import ( "gitlab.com/elixxir/client/storage/versioned" "gitlab.com/elixxir/primitives/fact" "gitlab.com/xx_network/primitives/netTime" + "strings" ) // Storage constants @@ -101,17 +102,23 @@ func (s *Store) saveUnconfirmedFacts() error { // LOAD FUNCTIONS ///////////////////////////////////////////////////////////////// -// LoadStore loads the Store object from the provided versioned.KV. -func LoadStore(kv *versioned.KV) (*Store, error) { - kv = kv.Prefix(prefix) +// NewOrLoadStore loads the Store object from the provided versioned.KV. +func NewOrLoadStore(kv *versioned.KV) (*Store, error) { s := &Store{ confirmedFacts: make(map[fact.Fact]struct{}, 0), unconfirmedFacts: make(map[string]fact.Fact, 0), - kv: kv, + kv: kv.Prefix(prefix), } - return s, s.load() + if err := s.load(); err != nil { + if strings.Contains(err.Error(), "object not found") || + strings.Contains(err.Error(), "no such file or directory") { + return s, s.save() + } + } + + return s, nil } @@ -143,6 +150,9 @@ func (s *Store) loadConfirmedFacts() error { // Place the map in memory s.confirmedFacts, err = s.unmarshalConfirmedFacts(obj.Data) + if err != nil { + return err + } return nil } @@ -158,6 +168,9 @@ func (s *Store) loadUnconfirmedFacts() error { // Place the map in memory s.unconfirmedFacts, err = s.unmarshalUnconfirmedFacts(obj.Data) + if err != nil { + return err + } return nil } diff --git a/storage/ud/store_test.go b/storage/ud/store_test.go index 135348eed9bfa97db73931db19d81fc1a69b3cff..977aba8ef641029199bf186d4e9a1af2fc692131 100644 --- a/storage/ud/store_test.go +++ b/storage/ud/store_test.go @@ -4,11 +4,13 @@ import ( "bytes" "gitlab.com/elixxir/client/storage/versioned" "gitlab.com/elixxir/ekv" + "gitlab.com/elixxir/primitives/fact" "reflect" "testing" ) -func TestLoadStore(t *testing.T) { +// Test it loads a Store from storage if it exists. +func TestNewOrLoadStore_LoadStore(t *testing.T) { kv := versioned.NewKV(make(ekv.Memstore)) expectedStore, err := NewStore(kv) @@ -16,13 +18,37 @@ func TestLoadStore(t *testing.T) { t.Errorf("NewStore() produced an error: %v", err) } - receivedStore, err := LoadStore(kv) + receivedStore, err := NewOrLoadStore(kv) if err != nil { - t.Fatalf("LoadStore() produced an error: %v", err) + t.Fatalf("NewOrLoadStore() produced an error: %v", err) } if !reflect.DeepEqual(expectedStore, receivedStore) { - t.Errorf("LoadStore() returned incorrect Store."+ + t.Errorf("NewOrLoadStore() returned incorrect Store."+ + "\nexpected: %#v\nreceived: %#v", expectedStore, + receivedStore) + + } + +} + +// Test that it creates a new store if an old one is not in storage. +func TestNewOrLoadStore_NewStore(t *testing.T) { + kv := versioned.NewKV(make(ekv.Memstore)) + + receivedStore, err := NewOrLoadStore(kv) + if err != nil { + t.Fatalf("NewOrLoadStore() produced an error: %v", err) + } + + expectedStore := &Store{ + confirmedFacts: make(map[fact.Fact]struct{}, 0), + unconfirmedFacts: make(map[string]fact.Fact, 0), + kv: kv.Prefix(prefix), + } + + if !reflect.DeepEqual(expectedStore, receivedStore) { + t.Errorf("NewOrLoadStore() returned incorrect Store."+ "\nexpected: %#v\nreceived: %#v", expectedStore, receivedStore)