public void ValidateTransaction_ThrowsException_InvalidTransactionType() { var expectedTransaction = new InvalidTransactionType(1, "blabla action", "Data", 0); StateTransactionValidator sut = new StateTransactionValidator(_transactionFinalizerMock.Object, _blockchainRepoMock.Object, _transactionRepoMock.Object, _skuRepoMock.Object, _signerMock.Object); var exception = Assert.ThrowsException <ArgumentException>(() => sut.ValidateTransaction(expectedTransaction, _netid)); Assert.AreEqual("Transaction is not of type StateTransaction.", exception.Message); }
public void CoinbaseValidateTransaction_Successful_ZeroCoinbaseReward() { var expectedTransaction = new StateTransaction(null, _toPubKey, null, 0, 0, 1, TransactionAction.ClaimCoinbase.ToString(), null, 0); expectedTransaction.Finalize(_hash, _signature); StateTransactionValidator sut = new StateTransactionValidator(_transactionFinalizerMock.Object, _blockchainRepoMock.Object, _transactionRepoMock.Object, _skuRepoMock.Object, _signerMock.Object); _signerMock.Setup(m => m.SignatureIsValid(_signature, _hash, _toPubKey)).Returns(true); _transactionFinalizerMock.Setup(m => m.CalculateHash(expectedTransaction)).Returns(_hash); sut.ValidateTransaction(expectedTransaction, _netid); // Should not throw exception }
public void CoinbaseValidateTransaction_Successful_ExactCoinbaseReward() { uint consensusCoinbaseReward = 5000; //! change this whenever the coinbasereward changes in the Logistichain.consensus assembly! var expectedTransaction = new StateTransaction(null, _toPubKey, null, 0, consensusCoinbaseReward, 1, TransactionAction.ClaimCoinbase.ToString(), null, 0); expectedTransaction.Finalize(_hash, _signature); StateTransactionValidator sut = new StateTransactionValidator(_transactionFinalizerMock.Object, _blockchainRepoMock.Object, _transactionRepoMock.Object, _skuRepoMock.Object, _signerMock.Object); _signerMock.Setup(m => m.SignatureIsValid(_signature, _hash, _toPubKey)).Returns(true); _transactionFinalizerMock.Setup(m => m.CalculateHash(expectedTransaction)).Returns(_hash); sut.ValidateTransaction(expectedTransaction, _netid); // Should not throw exception }
public void ValidateTransaction_Calls_WithDefaultParams() { var consensusNetworkIdentifier = "testnet"; //! change this whenever the networkidentifier changes in the mpb.consensus assembly! var expectedTransaction = new StateTransaction("a", "b", null, 0, 1, 1, TransactionAction.ClaimCoinbase.ToString(), null, 0); var selfCallingMock = new Mock <StateTransactionValidator>(new object[] { _transactionFinalizerMock.Object, _blockchainRepoMock.Object, _transactionRepoMock.Object, _skuRepoMock.Object, _signerMock.Object }) { CallBase = true }; selfCallingMock.Setup(m => m.ValidateTransaction(expectedTransaction, consensusNetworkIdentifier)); StateTransactionValidator sut = selfCallingMock.Object; sut.ValidateTransaction(expectedTransaction); selfCallingMock.Verify(m => m.ValidateTransaction(expectedTransaction)); selfCallingMock.Verify(m => m.ValidateTransaction(expectedTransaction, consensusNetworkIdentifier)); selfCallingMock.VerifyNoOtherCalls(); }
public void CoinbaseValidateTransaction_ThrowsException_CoinbaseRewardTooHigh() { uint consensusCoinbaseReward = 5000; //! change this whenever the coinbasereward changes in the Logistichain.consensus assembly! var expectedTransaction = new StateTransaction(null, _toPubKey, null, 0, consensusCoinbaseReward + 1, 1, TransactionAction.ClaimCoinbase.ToString(), null, 0); expectedTransaction.Finalize(_hash, _signature); StateTransactionValidator sut = new StateTransactionValidator(_transactionFinalizerMock.Object, _blockchainRepoMock.Object, _transactionRepoMock.Object, _skuRepoMock.Object, _signerMock.Object); _signerMock.Setup(m => m.SignatureIsValid(_signature, _hash, _toPubKey)).Returns(true); _transactionFinalizerMock.Setup(m => m.CalculateHash(expectedTransaction)).Returns(_hash); var exception = Assert.ThrowsException <TransactionRejectedException>(() => sut.ValidateTransaction(expectedTransaction, _netid)); Assert.AreEqual("Coinbase reward is too high. Maximum: " + consensusCoinbaseReward, exception.Message); Assert.AreEqual(expectedTransaction, exception.Transaction); }
public void CoinbaseValidateTransaction_ThrowsException_FeeNotZero() { var expectedTransaction = new StateTransaction(null, _toPubKey, null, 0, 1, 1, TransactionAction.ClaimCoinbase.ToString(), null, 10); expectedTransaction.Finalize(_hash, _signature); StateTransactionValidator sut = new StateTransactionValidator(_transactionFinalizerMock.Object, _blockchainRepoMock.Object, _transactionRepoMock.Object, _skuRepoMock.Object, _signerMock.Object); _signerMock.Setup(m => m.SignatureIsValid(_signature, _hash, _toPubKey)).Returns(true); _transactionFinalizerMock.Setup(m => m.CalculateHash(expectedTransaction)).Returns(_hash); var exception = Assert.ThrowsException <TransactionRejectedException>(() => sut.ValidateTransaction(expectedTransaction, _netid)); Assert.AreEqual("Fee must be zero on Coinbase transactions", exception.Message); Assert.AreEqual(expectedTransaction, exception.Transaction); }
public void CoinbaseValidateTransaction_ThrowsException_NotNullFromPubKey() { var expectedTransaction = new StateTransaction("wrongvalue", "b", null, 0, 1, 1, TransactionAction.ClaimCoinbase.ToString(), null, 0); expectedTransaction.Finalize(_hash, _signature); StateTransactionValidator sut = new StateTransactionValidator(_transactionFinalizerMock.Object, _blockchainRepoMock.Object, _transactionRepoMock.Object, _skuRepoMock.Object, _signerMock.Object); _signerMock.Setup(m => m.SignatureIsValid(_signature, _hash, "b")).Returns(true); _transactionFinalizerMock.Setup(m => m.CalculateHash(expectedTransaction)).Returns(_hash); var exception = Assert.ThrowsException <TransactionRejectedException>(() => sut.ValidateTransaction(expectedTransaction, _netid)); Assert.AreEqual(nameof(expectedTransaction.FromPubKey) + " field must be null in a Coinbase transaction", exception.Message); Assert.AreEqual(expectedTransaction, exception.Transaction); }
public void TokenValidateTransaction_ThrowsException_NullSenderAndReceiver() { var expectedTransaction = new StateTransaction(null, null, null, 0, 1, 1, TransactionAction.TransferToken.ToString(), null, 0); StateTransactionValidator sut = new StateTransactionValidator(_transactionFinalizerMock.Object, _blockchainRepoMock.Object, _transactionRepoMock.Object, _skuRepoMock.Object, _signerMock.Object); var exception = Assert.ThrowsException <TransactionRejectedException>(() => sut.ValidateTransaction(expectedTransaction, _netid)); Assert.AreEqual(nameof(expectedTransaction.FromPubKey) + " and " + nameof(expectedTransaction.ToPubKey) + " are both null or empty", exception.Message); Assert.AreEqual(expectedTransaction, exception.Transaction); }
public void ValidateTransaction_ThrowsException_HigherTransactionVersion() { uint consensusTransactionVersion = 1; //! change this whenever the networkidentifier changes in the mpb.consensus assembly! var expectedTransaction = new StateTransaction(null, null, null, 0, 1, consensusTransactionVersion + 1, TransactionAction.ClaimCoinbase.ToString(), null, 0); StateTransactionValidator sut = new StateTransactionValidator(_transactionFinalizerMock.Object, _blockchainRepoMock.Object, _transactionRepoMock.Object, _skuRepoMock.Object, _signerMock.Object); var exception = Assert.ThrowsException <TransactionRejectedException>(() => sut.ValidateTransaction(expectedTransaction, _netid)); Assert.AreEqual("Unsupported transaction version", exception.Message); Assert.AreEqual(expectedTransaction, exception.Transaction); }
public void TokenValidateTransaction_ThrowsException_IncorrectSignature() { var hash = "hash"; var senderPublicKey = "from"; var signature = "sig"; var expectedTransaction = new StateTransaction(senderPublicKey, "to", null, 0, 1, 1, TransactionAction.TransferToken.ToString(), null, 100); expectedTransaction.Finalize(hash, signature); StateTransactionValidator sut = new StateTransactionValidator(_transactionFinalizerMock.Object, _blockchainRepoMock.Object, _transactionRepoMock.Object, _skuRepoMock.Object, _signerMock.Object); _transactionFinalizerMock.Setup(m => m.CalculateHash(It.IsAny <AbstractTransaction>())).Returns(hash); _signerMock.Setup(m => m.SignatureIsValid(signature, hash, senderPublicKey)).Returns(false); var exception = Assert.ThrowsException <TransactionRejectedException>(() => sut.ValidateTransaction(expectedTransaction, _netid)); Assert.AreEqual("Transaction signature is invalid", exception.Message); Assert.AreEqual(expectedTransaction, exception.Transaction); }
public void TransferTokenValidateTransaction_ThrowsException_NullFromPubKey() { var expectedTransaction = new StateTransaction(null, "to", null, 0, 1, 1, TransactionAction.TransferToken.ToString(), null, 0); expectedTransaction.Finalize("hash", "sig"); StateTransactionValidator sut = new StateTransactionValidator(_transactionFinalizerMock.Object, _blockchainRepoMock.Object, _transactionRepoMock.Object, _skuRepoMock.Object, _signerMock.Object); _transactionFinalizerMock.Setup(m => m.CalculateHash(It.IsAny <AbstractTransaction>())).Returns("hash"); var exception = Assert.ThrowsException <TransactionRejectedException>(() => sut.ValidateTransaction(expectedTransaction, _netid)); Assert.AreEqual("Tried to validate a signature with an empty public key", exception.Message); Assert.AreEqual(expectedTransaction, exception.Transaction); }
public void TokenValidateTransaction_ThrowsException_IncorrectHash() { var expectedTransaction = new StateTransaction("from", "to", null, 0, 1, 1, TransactionAction.TransferToken.ToString(), null, 0); expectedTransaction.Finalize("invalidhash", ""); StateTransactionValidator sut = new StateTransactionValidator(_transactionFinalizerMock.Object, _blockchainRepoMock.Object, _transactionRepoMock.Object, _skuRepoMock.Object, _signerMock.Object); _transactionFinalizerMock.Setup(m => m.CalculateHash(It.IsAny <AbstractTransaction>())).Returns(""); var exception = Assert.ThrowsException <TransactionRejectedException>(() => sut.ValidateTransaction(expectedTransaction, _netid)); Assert.AreEqual(nameof(expectedTransaction.Hash) + " is incorrect", exception.Message); Assert.AreEqual(expectedTransaction, exception.Transaction); }
public void TokenValidateTransaction_ThrowsException_NotFinalized() { var expectedTransaction = new StateTransaction("from", "to", null, 0, 1, 1, TransactionAction.TransferToken.ToString(), null, 0); StateTransactionValidator sut = new StateTransactionValidator(_transactionFinalizerMock.Object, _blockchainRepoMock.Object, _transactionRepoMock.Object, _skuRepoMock.Object, _signerMock.Object); var exception = Assert.ThrowsException <TransactionRejectedException>(() => sut.ValidateTransaction(expectedTransaction, _netid)); Assert.AreEqual("Transaction is not finalized", exception.Message); Assert.AreEqual(expectedTransaction, exception.Transaction); }
public void TransferTokenValidateTransaction_ThrowsException_NullToPubKey() { var expectedTransaction = new StateTransaction("from", null, null, 0, 1, 1, TransactionAction.TransferToken.ToString(), null, 0); expectedTransaction.Finalize("hash", "sig"); StateTransactionValidator sut = new StateTransactionValidator(_transactionFinalizerMock.Object, _blockchainRepoMock.Object, _transactionRepoMock.Object, _skuRepoMock.Object, _signerMock.Object); _signerMock.Setup(m => m.SignatureIsValid("sig", "hash", "from")).Returns(true); _transactionFinalizerMock.Setup(m => m.CalculateHash(It.IsAny <AbstractTransaction>())).Returns("hash"); var exception = Assert.ThrowsException <TransactionRejectedException>(() => sut.ValidateTransaction(expectedTransaction, _netid)); Assert.AreEqual(nameof(expectedTransaction.ToPubKey) + " field cannot be null", exception.Message); Assert.AreEqual(expectedTransaction, exception.Transaction); }