public async Task CanSubmitSingleSegmentedMessage()
    {
        await using var fx = await TestTopic.CreateAsync(_network);

        var submitParams = new SubmitMessageParams
        {
            Topic             = fx.Record.Topic,
            Segment           = Encoding.ASCII.GetBytes(Generator.String(120, 199)),
            Index             = 1,
            TotalSegmentCount = 1,
            Signatory         = fx.ParticipantPrivateKey
        };
        var receipt = await fx.Client.SubmitMessageAsync(submitParams);

        Assert.Equal(ResponseCode.Success, receipt.Status);
        Assert.Equal(1ul, receipt.SequenceNumber);
        Assert.False(receipt.RunningHash.IsEmpty);
        Assert.Equal(3ul, receipt.RunningHashVersion);
        var txId = receipt.Id;

        var info = await fx.Client.GetTopicInfoAsync(fx.Record.Topic);

        Assert.Equal(fx.Memo, info.Memo);
        Assert.NotEmpty(info.RunningHash.ToArray());
        Assert.Equal(1UL, info.SequenceNumber);
        Assert.True(info.Expiration > DateTime.MinValue);
        Assert.Equal(new Endorsement(fx.AdminPublicKey), info.Administrator);
        Assert.Equal(new Endorsement(fx.ParticipantPublicKey), info.Participant);
        Assert.True(info.AutoRenewPeriod > TimeSpan.MinValue);
        Assert.Equal(fx.TestAccount.Record.Address, info.RenewAccount);
        AssertHg.NotEmpty(info.Ledger);

        await Task.Delay(7000); // give the beta net time to sync

        TopicMessage topicMessage = null;

        using var ctx          = new CancellationTokenSource();
        await using var mirror = _network.NewMirror();
        try
        {
            var subscribeTask = mirror.SubscribeTopicAsync(new SubscribeTopicParams
            {
                Topic         = fx.Record.Topic,
                Starting      = DateTime.UtcNow.AddHours(-1),
                MessageWriter = new TopicMessageWriterAdapter(m =>
                {
                    topicMessage = m;
                    ctx.Cancel();
                }),
                CancellationToken = ctx.Token
            });

            ctx.CancelAfter(5000);

            await subscribeTask;

            if (topicMessage == null)
            {
                _network.Output?.WriteLine("INDETERMINATE TEST - MIRROR NODE DID NOT RETURN TOPIC IN ALLOWED TIME");
            }
            else
            {
                Assert.Equal(submitParams.Topic, topicMessage.Topic);
                Assert.Equal(1ul, topicMessage.SequenceNumber);
                Assert.Equal(receipt.RunningHash.ToArray(), topicMessage.RunningHash.ToArray());
                Assert.Equal(submitParams.Segment.ToArray(), topicMessage.Messsage.ToArray());
                Assert.NotNull(topicMessage.SegmentInfo);
                Assert.Equal(txId, topicMessage.SegmentInfo.ParentTxId);
                Assert.Equal(1, topicMessage.SegmentInfo.Index);
                Assert.Equal(1, topicMessage.SegmentInfo.TotalSegmentCount);
            }
        }
        catch (MirrorException mex) when(mex.Code == MirrorExceptionCode.TopicNotFound)
        {
            _network.Output?.WriteLine("INDETERMINATE TEST - MIRROR NODE DID NOT RECEIVE TOPIC CREATE IN ALLOWED TIME");
            return;
        }
    }
示例#2
0
        public async Task CanSubmitLargeSegmentedMessage()
        {
            await using var fx = await TestTopic.CreateAsync(_network);

            var message       = Encoding.ASCII.GetBytes(Generator.String(1200, 1990));
            var segmentSize   = Generator.Integer(100, 200);
            var expectedCount = message.Length / segmentSize + 1;
            var receipts      = await fx.Client.SubmitLargeMessageAsync(fx.Record.Topic, message, segmentSize, fx.ParticipantPrivateKey);

            Assert.Equal(expectedCount, receipts.Length);
            for (int i = 0; i < expectedCount; i++)
            {
                var receipt = receipts[i];
                Assert.Equal(ResponseCode.Success, receipt.Status);
                Assert.Equal((ulong)(i + 1), receipt.SequenceNumber);
                Assert.False(receipt.RunningHash.IsEmpty);
                Assert.Equal(3ul, receipt.RunningHashVersion);
            }

            var info = await fx.Client.GetTopicInfoAsync(fx.Record.Topic);

            Assert.Equal(fx.Memo, info.Memo);
            Assert.NotEqual(ReadOnlyMemory <byte> .Empty, info.RunningHash);
            Assert.Equal((ulong)expectedCount, info.SequenceNumber);
            Assert.True(info.Expiration > DateTime.MinValue);
            Assert.Equal(new Endorsement(fx.AdminPublicKey), info.Administrator);
            Assert.Equal(new Endorsement(fx.ParticipantPublicKey), info.Participant);
            Assert.True(info.AutoRenewPeriod > TimeSpan.MinValue);
            Assert.Equal(fx.TestAccount.Record.Address, info.RenewAccount);

            await Task.Delay(10000); // give the beta net time to sync

            try
            {
                await using var mirror = _network.NewMirror();
                var topicMessages = await TopicMessageCapture.CaptureOrTimeoutAsync(mirror, fx.Record.Topic, expectedCount, 7000);

                if (topicMessages.Length == 0)
                {
                    _network.Output?.WriteLine("INDETERMINATE TEST - MIRROR NODE DID NOT RETURN TOPIC IN ALLOWED TIME");
                }
                else
                {
                    var pointerIndex         = 0;
                    var reconstitutedMessage = new byte[message.Length];
                    Assert.Equal(expectedCount, topicMessages.Length);
                    for (int i = 0; i < topicMessages.Length; i++)
                    {
                        var topicMessage = topicMessages[i];
                        Assert.Equal(fx.Record.Topic, topicMessage.Topic);
                        Assert.Equal((ulong)i + 1, topicMessage.SequenceNumber);
                        Assert.Equal(receipts[i].RunningHash.ToArray(), topicMessage.RunningHash.ToArray());
                        Assert.NotNull(topicMessage.SegmentInfo);
                        Assert.Equal(receipts[0].Id, topicMessage.SegmentInfo.ParentTxId);
                        Assert.Equal(i + 1, topicMessage.SegmentInfo.Index);
                        Assert.Equal(expectedCount, topicMessage.SegmentInfo.TotalSegmentCount);
                        topicMessage.Messsage.ToArray().CopyTo(reconstitutedMessage, pointerIndex);
                        pointerIndex += topicMessage.Messsage.Length;
                    }
                    Assert.Equal(message.ToArray(), reconstitutedMessage);
                }
            }
            catch (MirrorException mex) when(mex.Code == MirrorExceptionCode.TopicNotFound)
            {
                _network.Output?.WriteLine("INDETERMINATE TEST - MIRROR NODE DID NOT RECEIVE TOPIC CREATE IN ALLOWED TIME");
                return;
            }
        }