/** * This test covers methods on CWallet * GenerateNewZKey() * AddZKey() * LoadZKey() * LoadZKeyMetadata() */ TEST(wallet_zkeys_tests, store_and_load_zkeys) { SelectParams(CBaseChainParams::MAIN); CWallet wallet; // wallet should be empty std::set<libzcash::PaymentAddress> addrs; wallet.GetPaymentAddresses(addrs); ASSERT_EQ(0, addrs.size()); // wallet should have one key CZCPaymentAddress paymentAddress = wallet.GenerateNewZKey(); wallet.GetPaymentAddresses(addrs); ASSERT_EQ(1, addrs.size()); // verify wallet has spending key for the address auto addr = paymentAddress.Get(); ASSERT_TRUE(wallet.HaveSpendingKey(addr)); // manually add new spending key to wallet auto sk = libzcash::SpendingKey::random(); ASSERT_TRUE(wallet.AddZKey(sk)); // verify wallet did add it addr = sk.address(); ASSERT_TRUE(wallet.HaveSpendingKey(addr)); // verify spending key stored correctly libzcash::SpendingKey keyOut; wallet.GetSpendingKey(addr, keyOut); ASSERT_EQ(sk, keyOut); // verify there are two keys wallet.GetPaymentAddresses(addrs); ASSERT_EQ(2, addrs.size()); ASSERT_EQ(1, addrs.count(addr)); // Load a third key into the wallet sk = libzcash::SpendingKey::random(); ASSERT_TRUE(wallet.LoadZKey(sk)); // attach metadata to this third key addr = sk.address(); int64_t now = GetTime(); CKeyMetadata meta(now); ASSERT_TRUE(wallet.LoadZKeyMetadata(addr, meta)); // check metadata is the same CKeyMetadata m= wallet.mapZKeyMetadata[addr]; ASSERT_EQ(m.nCreateTime, now); }