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; } }
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; } }