@@ -19,11 +19,14 @@ package txvalidator
1919import (
2020 "testing"
2121
22+ "github.com/golang/protobuf/proto"
2223 "github.com/hyperledger/fabric/core/ledger/ledgermgmt"
2324 "github.com/hyperledger/fabric/core/ledger/testutil"
2425 "github.com/hyperledger/fabric/core/ledger/util"
26+ util2 "github.com/hyperledger/fabric/core/util"
2527 "github.com/hyperledger/fabric/protos/common"
2628 pb "github.com/hyperledger/fabric/protos/peer"
29+ "github.com/hyperledger/fabric/protos/utils"
2730 "github.com/spf13/viper"
2831 "github.com/stretchr/testify/assert"
2932)
@@ -65,3 +68,65 @@ func TestKVLedgerBlockStorage(t *testing.T) {
6568 assert .True (t , ! txsfltr .IsSet (uint (1 )))
6669 assert .True (t , ! txsfltr .IsSet (uint (2 )))
6770}
71+
72+ func TestNewTxValidator_DuplicateTransactions (t * testing.T ) {
73+ viper .Set ("peer.fileSystemPath" , "/tmp/fabric/txvalidatortest" )
74+ ledgermgmt .InitializeTestEnv ()
75+ defer ledgermgmt .CleanupTestEnv ()
76+ ledger , _ := ledgermgmt .CreateLedger ("TestLedger" )
77+ defer ledger .Close ()
78+
79+ validator := & txValidator {ledger , & mockVsccValidator {}}
80+
81+ // Create simeple endorsement transaction
82+ payload := & common.Payload {
83+ Header : & common.Header {
84+ ChainHeader : & common.ChainHeader {
85+ TxID : "simple_txID" , // Fake txID
86+ Type : int32 (common .HeaderType_ENDORSER_TRANSACTION ),
87+ ChainID : util2 .GetTestChainID (),
88+ },
89+ },
90+ Data : []byte ("test" ),
91+ }
92+
93+ payloadBytes , err := proto .Marshal (payload )
94+
95+ // Check marshaling didn't fail
96+ assert .NoError (t , err )
97+
98+ // Envelope the payload
99+ envelope := & common.Envelope {
100+ Payload : payloadBytes ,
101+ }
102+
103+ envelopeBytes , err := proto .Marshal (envelope )
104+
105+ // Check marshaling didn't fail
106+ assert .NoError (t , err )
107+
108+ block := & common.Block {
109+ Data : & common.BlockData {
110+ // Enconde transactions
111+ Data : [][]byte {envelopeBytes },
112+ },
113+ }
114+
115+ block .Header = & common.BlockHeader {
116+ Number : 1 ,
117+ DataHash : block .Data .Hash (),
118+ }
119+
120+ // Initialize metadata
121+ utils .InitBlockMetadata (block )
122+ // Commit block to the ledger
123+ ledger .Commit (block )
124+
125+ // Validation should invalidate transaction,
126+ // because it's already committed
127+ validator .Validate (block )
128+
129+ txsfltr := util .NewFilterBitArrayFromBytes (block .Metadata .Metadata [common .BlockMetadataIndex_TRANSACTIONS_FILTER ])
130+
131+ assert .True (t , txsfltr .IsSet (0 ))
132+ }
0 commit comments