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 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 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 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 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 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 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 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
        }
示例#11
0
        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);
        }
        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);
        }
示例#13
0
        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();
        }
示例#14
0
        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);
        }