+func TestWalletVersion(t *testing.T) {
+ // prepare wallet
+ dirPath, err := ioutil.TempDir(".", "")
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer os.RemoveAll(dirPath)
+
+ testDB := dbm.NewDB("testdb", "leveldb", "temp")
+ defer os.RemoveAll("temp")
+
+ dispatcher := event.NewDispatcher()
+ w := mockWallet(testDB, nil, nil, nil, dispatcher, false)
+
+ // legacy status test case
+ type legacyStatusInfo struct {
+ WorkHeight uint64
+ WorkHash bc.Hash
+ BestHeight uint64
+ BestHash bc.Hash
+ }
+ rawWallet, err := json.Marshal(legacyStatusInfo{})
+ if err != nil {
+ t.Fatal("Marshal legacyStatusInfo")
+ }
+
+ w.DB.Set(walletKey, rawWallet)
+ rawWallet = w.DB.Get(walletKey)
+ if rawWallet == nil {
+ t.Fatal("fail to load wallet StatusInfo")
+ }
+
+ if err := json.Unmarshal(rawWallet, &w.status); err != nil {
+ t.Fatal(err)
+ }
+
+ if err := w.checkWalletInfo(); err != errWalletVersionMismatch {
+ t.Fatal("fail to detect legacy wallet version")
+ }
+
+ // lower wallet version test case
+ lowerVersion := StatusInfo{Version: currentVersion - 1}
+ rawWallet, err = json.Marshal(lowerVersion)
+ if err != nil {
+ t.Fatal("save wallet info")
+ }
+
+ w.DB.Set(walletKey, rawWallet)
+ rawWallet = w.DB.Get(walletKey)
+ if rawWallet == nil {
+ t.Fatal("fail to load wallet StatusInfo")
+ }
+
+ if err := json.Unmarshal(rawWallet, &w.status); err != nil {
+ t.Fatal(err)
+ }
+
+ if err := w.checkWalletInfo(); err != errWalletVersionMismatch {
+ t.Fatal("fail to detect expired wallet version")
+ }
+}
+