public void TryWriteCoinEmptyPayload() { var sozu = new VolatileCoinStore(); var inbox = new BoundedInbox(); var outbox = new BoundedInbox(); var controller = new CoinController(inbox, outbox, sozu, _hash); controller.Lineage = MakeLineage(); var clientId = new ClientId(); var reqId = new RequestId(1); var coin = GetCoin(_rand); var writeCoinRequest = ProduceCoinRequest.From(reqId, clientId, coin.Outpoint, (OutpointFlags)coin.OutpointFlags, new BlockAlias(3), 100, 50, Span <byte> .Empty, clientId.Mask); inbox.TryWrite(writeCoinRequest.Span); controller.HandleRequest(); var raw = outbox.Peek(); Assert.Equal(ProduceCoinResponse.SizeInBytes, raw.Length); var response = new ProduceCoinResponse(raw.Span); // verify response contents Assert.Equal(reqId, response.MessageHeader.RequestId); Assert.Equal(clientId, response.MessageHeader.ClientId); Assert.Equal(MessageKind.ProduceCoinResponse, response.MessageHeader.MessageKind); Assert.Equal(ChangeCoinStatus.InvalidContext, response.Status); }
public void TryReadingNonExistentCoin() { var sozu = new VolatileCoinStore(); var inbox = new BoundedInbox(); var outbox = new BoundedInbox(); var controller = new CoinController(inbox, outbox, sozu, _hash); var clientId = new ClientId(); var reqId = new RequestId(1); var coin = GetCoin(_rand); var readCoinRequest = GetCoinRequest.From(reqId, clientId, coin.Outpoint, new BlockAlias(3), clientId.Mask); inbox.TryWrite(readCoinRequest.Span); controller.HandleRequest(); var raw = outbox.Peek(); var response = new GetCoinResponse(raw.Span); // verify response contents Assert.Equal(reqId, response.MessageHeader.RequestId); Assert.Equal(clientId, response.MessageHeader.ClientId); Assert.Equal(GetCoinStatus.OutpointNotFound, response.Status); }
public void RemoveProductionAndConsumption() { var sozu = new VolatileCoinStore(); var inbox = new BoundedInbox(); var outbox = new BoundedInbox(); var controller = new CoinController(inbox, outbox, sozu, _hash); controller.Lineage = new MockLineage(); var clientId = new ClientId(); var reqId = new RequestId(1); var coin = GetCoin(_rand); sozu.AddProduction( _hash.Hash(ref coin.Outpoint), ref coin.Outpoint, false, coin.Payload, new BlockAlias(2), null); sozu.AddConsumption( _hash.Hash(ref coin.Outpoint), ref coin.Outpoint, new BlockAlias(2), null); var buffer = new byte[RemoveCoinRequest.SizeInBytes]; var removeCoinRequest = new RemoveCoinRequest( buffer, reqId, ref coin.Outpoint, new BlockAlias(2).ConvertToBlockHandle(clientId.Mask), true, true); inbox.TryWrite(removeCoinRequest.Span); controller.HandleRequest(); var raw = outbox.Peek(); Assert.Equal(RemoveCoinResponse.SizeInBytes, raw.Length); var response = new RemoveCoinResponse(raw.Span); // verify response contents Assert.Equal(reqId, response.MessageHeader.RequestId); Assert.Equal(clientId, response.MessageHeader.ClientId); Assert.Equal(MessageKind.RemoveCoinResponse, response.MessageHeader.MessageKind); Assert.Equal(ChangeCoinStatus.Success, response.Status); sozu.TryGet(_hash.Hash(ref coin.Outpoint), ref coin.Outpoint, new BlockAlias(2), null, out var coin2, out var pe, out var ce); Assert.False(pe.IsDefined); Assert.False(ce.IsDefined); }
public void ReadExistingCoin() { var sozu = new VolatileCoinStore(); var inbox = new BoundedInbox(); var outbox = new BoundedInbox(); var controller = new CoinController(inbox, outbox, sozu, _hash); var coin = GetCoin(_rand); sozu.AddProduction( _hash.Hash(ref coin.Outpoint), ref coin.Outpoint, false, coin.Payload, new BlockAlias(3), null); // lineage is not used in VolatileCoinStore var clientId = new ClientId(); var reqId = new RequestId(1); var context = new BlockAlias(3); var readCoinRequest = GetCoinRequest.From(reqId, clientId, coin.Outpoint, context, clientId.Mask); inbox.TryWrite(readCoinRequest.Span); controller.HandleRequest(); var raw = outbox.Peek(); var response = new GetCoinResponse(raw.Span); Assert.Equal(response.MessageHeader.MessageSizeInBytes, raw.Length); // verify response contents Assert.Equal(reqId, response.MessageHeader.RequestId); Assert.Equal(clientId, response.MessageHeader.ClientId); Assert.Equal(MessageKind.GetCoinResponse, response.MessageHeader.MessageKind); Assert.Equal(coin.Outpoint, response.Outpoint); Assert.Equal(OutpointFlags.None, response.OutpointFlags); Assert.Equal(context, response.Context.ConvertToBlockAlias(clientId.Mask)); Assert.Equal(context, response.Production.ConvertToBlockAlias(clientId.Mask)); Assert.Equal(BlockAlias.Undefined.ConvertToBlockHandle(clientId.Mask), response.Consumption); Assert.Equal(coin.Payload.Satoshis, response.Satoshis); Assert.Equal(coin.Payload.NLockTime, response.NLockTime); Assert.True(coin.Payload.Script.SequenceEqual(response.Script)); }
public void WriteCoinCons() { var sozu = new VolatileCoinStore(); var inbox = new BoundedInbox(); var outbox = new BoundedInbox(); var controller = new CoinController(inbox, outbox, sozu, _hash); controller.Lineage = new MockLineage(); var clientId = new ClientId(); var reqId = new RequestId(1); var coin = GetCoin(_rand); sozu.AddProduction( _hash.Hash(ref coin.Outpoint), ref coin.Outpoint, false, coin.Payload, new BlockAlias(2), null); var pool = new SpanPool <byte>(4096); var buffer = new byte[ConsumeCoinRequest.SizeInBytes]; var writeCoinRequest = new ConsumeCoinRequest( reqId, ref coin.Outpoint, new BlockAlias(2).ConvertToBlockHandle(clientId.Mask), pool); inbox.TryWrite(writeCoinRequest.Span); controller.HandleRequest(); var raw = outbox.Peek(); Assert.Equal(ConsumeCoinResponse.SizeInBytes, raw.Length); var response = new ConsumeCoinResponse(raw.Span); // verify response contents Assert.Equal(reqId, response.MessageHeader.RequestId); Assert.Equal(clientId, response.MessageHeader.ClientId); Assert.Equal(MessageKind.ConsumeCoinResponse, response.MessageHeader.MessageKind); Assert.Equal(ChangeCoinStatus.Success, response.Status); }