@@ -19,11 +19,14 @@ package txvalidator
19
19
import (
20
20
"testing"
21
21
22
+ "github.com/golang/protobuf/proto"
22
23
"github.com/hyperledger/fabric/core/ledger/ledgermgmt"
23
24
"github.com/hyperledger/fabric/core/ledger/testutil"
24
25
"github.com/hyperledger/fabric/core/ledger/util"
26
+ util2 "github.com/hyperledger/fabric/core/util"
25
27
"github.com/hyperledger/fabric/protos/common"
26
28
pb "github.com/hyperledger/fabric/protos/peer"
29
+ "github.com/hyperledger/fabric/protos/utils"
27
30
"github.com/spf13/viper"
28
31
"github.com/stretchr/testify/assert"
29
32
)
@@ -65,3 +68,65 @@ func TestKVLedgerBlockStorage(t *testing.T) {
65
68
assert .True (t , ! txsfltr .IsSet (uint (1 )))
66
69
assert .True (t , ! txsfltr .IsSet (uint (2 )))
67
70
}
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