public static async Task ReportAsync(CancellationToken ctsToken, WalletJob walletJob) { while (true) { if (ctsToken.IsCancellationRequested) { return; } try { await Task.Delay(1000, ctsToken).ContinueWith(t => { }).ConfigureAwait(false); Height currHeaderHeight; if (WalletJob.TryGetHeaderHeight(out currHeaderHeight)) { // HEADERCHAIN if (currHeaderHeight.Type == HeightType.Chain && (_prevHeaderHeight == Height.Unknown || currHeaderHeight > _prevHeaderHeight)) { Debug.WriteLine($"HeaderChain height: {currHeaderHeight}"); _prevHeaderHeight = currHeaderHeight; } // TRACKER var currHeight = walletJob.BestHeight; if (currHeight.Type == HeightType.Chain && (_prevHeight == Height.Unknown || currHeight > _prevHeight)) { Debug.WriteLine($"Tracker height: {currHeight} left: {currHeaderHeight.Value - currHeight.Value}"); _prevHeight = currHeight; } } } catch { // ignored } } }
public void SyncingTest(string networkString) { // load wallet Network network = networkString == "TestNet"? Network.TestNet:Network.Main; string path = $"Wallets/Empty{network}.json"; const string password = ""; Safe safe; if (File.Exists(path)) { safe = Safe.Load(password, path); } else { Mnemonic mnemonic; safe = Safe.Create(out mnemonic, password, path, network); } Debug.WriteLine($"Unique Safe ID: {safe.UniqueId}"); // create walletjob WalletJob walletJob = new WalletJob(Helpers.SocksPortHandler, Helpers.ControlPortClient, safe); // note some event _fullyConnected = false; _syncedOnce = false; WalletJob.ConnectedNodeCountChanged += WalletJob_ConnectedNodeCountChanged; walletJob.StateChanged += WalletJob_StateChanged; Assert.True(walletJob.SafeAccounts.Count == 0); Assert.True(WalletJob.ConnectedNodeCount == 0); var allTxCount = walletJob.Tracker.TrackedTransactions.Count; Assert.True(allTxCount == 0); Assert.True(!walletJob.GetSafeHistory().Any()); Assert.True(walletJob.State == WalletState.NotStarted); Assert.True(walletJob.TracksDefaultSafe); // start syncing var cts = new CancellationTokenSource(); var walletJobTask = walletJob.StartAsync(cts.Token); Assert.True(walletJob.State != WalletState.NotStarted); Task reportTask = Helpers.ReportAsync(cts.Token, walletJob); try { // wait until fully synced and connected while (!_fullyConnected) { Task.Delay(10).Wait(); } while (!_syncedOnce) { Task.Delay(1000).Wait(); } Assert.True(walletJob.State == WalletState.Synced); Assert.True(walletJob.CreationHeight != Height.Unknown); Assert.True(walletJob.Tracker.TrackedTransactions.Count == 0); Assert.True(!walletJob.GetSafeHistory().Any()); Height headerHeight; Assert.True(WalletJob.TryGetHeaderHeight(out headerHeight)); var expectedBlockCount = headerHeight.Value - walletJob.CreationHeight.Value + 1; Assert.True(walletJob.Tracker.BlockCount == expectedBlockCount); Assert.True(walletJob.Tracker.TrackedScriptPubKeys.Count > 0); Assert.True(walletJob.Tracker.TrackedTransactions.Count == 0); } finally { cts.Cancel(); Task.WhenAll(reportTask, walletJobTask).Wait(); WalletJob.ConnectedNodeCountChanged -= WalletJob_ConnectedNodeCountChanged; walletJob.StateChanged -= WalletJob_StateChanged; } }