diff --git a/backup/backup.go b/backup/backup.go index c7d8b8dca75c37dc4d07b12486fc8657c5237a38..866aa394ea525f7fd2af89a486365d7fa8579c10 100644 --- a/backup/backup.go +++ b/backup/backup.go @@ -111,7 +111,7 @@ func initializeBackup(password string, updateBackupCb UpdateBackupFn, // Setting backup trigger in client b.backupContainer.SetBackup(b.TriggerBackup) - b.backupContainer.TriggerBackup("initializeBackup") + b.TriggerBackup("initializeBackup") jww.INFO.Print("Initialized backup with new user key.") return b, nil @@ -199,7 +199,13 @@ func (b *Backup) TriggerBackup(reason string) { jww.INFO.Printf("Backup triggered: %s", reason) // Send backup on callback - go b.updateBackupCb(encryptedBackup) + b.mux.RLock() + defer b.mux.RUnlock() + if b.updateBackupCb != nil { + go b.updateBackupCb(encryptedBackup) + } else { + jww.WARN.Printf("could not call backup callback, stopped...") + } } // StopBackup stops the backup processes and deletes the user's password, key, diff --git a/backup/backup_test.go b/backup/backup_test.go index fc80163e64f39fd19882fb563f7a586b1d14c2bf..2cf59bd022cb81bfbe3b3d2c58e1fdc84278fbc1 100644 --- a/backup/backup_test.go +++ b/backup/backup_test.go @@ -9,15 +9,16 @@ package backup import ( "bytes" + "reflect" + "strings" + "testing" + "time" + "gitlab.com/elixxir/client/interfaces" "gitlab.com/elixxir/client/storage" "gitlab.com/elixxir/crypto/backup" "gitlab.com/elixxir/crypto/fastRNG" "gitlab.com/xx_network/crypto/csprng" - "reflect" - "strings" - "testing" - "time" ) // Tests that Backup.initializeBackup returns a new Backup with a copy of the @@ -196,6 +197,11 @@ func TestBackup_TriggerBackup_NoKey(t *testing.T) { cbChan := make(chan []byte) cb := func(encryptedBackup []byte) { cbChan <- encryptedBackup } b := newTestBackup("MySuperSecurePassword", cb, t) + select { + case <-cbChan: + case <-time.After(10 * time.Millisecond): + t.Errorf("backup not called") + } err := deleteBackup(b.store.GetKV()) if err != nil { @@ -209,6 +215,7 @@ func TestBackup_TriggerBackup_NoKey(t *testing.T) { t.Errorf("Callback received when it should not have been called: %q", r) case <-time.After(10 * time.Millisecond): } + } // Tests that Backup.StopBackup prevents the callback from triggering and that @@ -217,6 +224,11 @@ func TestBackup_StopBackup(t *testing.T) { cbChan := make(chan []byte) cb := func(encryptedBackup []byte) { cbChan <- encryptedBackup } b := newTestBackup("MySuperSecurePassword", cb, t) + select { + case <-cbChan: + case <-time.After(1000 * time.Millisecond): + t.Errorf("backup not called") + } err := b.StopBackup() if err != nil {