diff --git a/pkg/storage/fs/fs.go b/pkg/storage/fs/fs.go index e333ce8..d34888a 100644 --- a/pkg/storage/fs/fs.go +++ b/pkg/storage/fs/fs.go @@ -102,7 +102,7 @@ func NewFS(storageRoot string) (*fsStorage, error) { func (s *fsStorage) StateExistsAsync(callback func(bool, error)) { go func() { - exists, err := s.FileExists(stateFileName) + exists, err := s.StateExists() if callback != nil { callback(exists, err) } @@ -111,7 +111,7 @@ func (s *fsStorage) StateExistsAsync(callback func(bool, error)) { func (s *fsStorage) LoadStateAsync(callback func(client.State, error)) { go func() { - state, err := s.loadStateSync() + state, err := s.LoadState() if callback != nil { callback(state, err) } @@ -120,7 +120,7 @@ func (s *fsStorage) LoadStateAsync(callback func(client.State, error)) { func (s *fsStorage) SaveStateAsync(state client.State, callback func(error)) { go func() { - err := s.saveStateSync(state) + err := s.SaveState(state) if callback != nil { callback(err) } @@ -253,7 +253,11 @@ func (s *fsStorage) ListFiles() ([]string, error) { return files, nil } -func (s *fsStorage) loadStateSync() (client.State, error) { +func (s *fsStorage) StateExists() (bool, error) { + return s.FileExists(stateFileName) +} + +func (s *fsStorage) LoadState() (client.State, error) { data, err := s.ReadFile(stateFileName) if err != nil { return client.State{}, err @@ -261,7 +265,7 @@ func (s *fsStorage) loadStateSync() (client.State, error) { return unmarshalState(data) } -func (s *fsStorage) saveStateSync(state client.State) error { +func (s *fsStorage) SaveState(state client.State) error { data, err := marshalState(state) if err != nil { return err diff --git a/pkg/storage/fs/fs_test.go b/pkg/storage/fs/fs_test.go index 21345de..8e44acc 100644 --- a/pkg/storage/fs/fs_test.go +++ b/pkg/storage/fs/fs_test.go @@ -22,6 +22,39 @@ type callbackResult[T any] struct { err error } +func TestStateRoundTrip(t *testing.T) { + s := newTestStorage(t) + want := sampleState() + + exists, err := s.StateExists() + if err != nil { + t.Fatalf("state exists before save: %v", err) + } + if exists { + t.Fatal("state file should not exist before save") + } + + if err := s.SaveState(want); err != nil { + t.Fatalf("save state: %v", err) + } + + exists, err = s.StateExists() + if err != nil { + t.Fatalf("state exists after save: %v", err) + } + if !exists { + t.Fatal("state file should exist after save") + } + + got, err := s.LoadState() + if err != nil { + t.Fatalf("load state: %v", err) + } + if !reflect.DeepEqual(got, want) { + t.Fatalf("loaded state mismatch\nwant: %#v\ngot: %#v", want, got) + } +} + func TestStateRoundTripAsync(t *testing.T) { s := newTestStorage(t) want := sampleState() diff --git a/pkg/storage/storage.go b/pkg/storage/storage.go index 0c28a7a..68aded8 100644 --- a/pkg/storage/storage.go +++ b/pkg/storage/storage.go @@ -14,7 +14,9 @@ type Storage interface { DeleteFile(string) error ListFiles() ([]string, error) - // StateExistss() (bool, error) + StateExists() (bool, error) + LoadState() (client.State, error) + SaveState(client.State) error } // UIStorage manages Client's data local storing and retrieval.