Пример #1
0
        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
                }
            }
        }
Пример #2
0
        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;
            }
        }