13
13
using Microsoft . AspNetCore . Http ;
14
14
using Microsoft . VisualStudio . TestPlatform . ObjectModel . DataCollection ;
15
15
using Microsoft . VisualStudio . TestTools . UnitTesting ;
16
+ using Neo . Cryptography . ECC ;
16
17
using Neo . IO ;
17
18
using Neo . Json ;
18
19
using Neo . Network . P2P . Payloads ;
20
+ using Neo . Persistence ;
19
21
using Neo . SmartContract ;
20
22
using Neo . SmartContract . Native ;
21
23
using Neo . UnitTests ;
25
27
using System . IO ;
26
28
using System . Linq ;
27
29
using System . Text ;
30
+ using System . Threading ;
28
31
29
32
namespace Neo . Plugins . RpcServer . Tests ;
30
33
31
34
public partial class UT_RpcServer
32
35
{
33
- static readonly string NeoScriptHash = "0xef4073a0f2b305a38ec4050e4d3d28bc40ea63f5" ;
34
- static readonly string GasScriptHash = "0xd2a4cff31913016155e38e474a2c06d08be276cf" ;
35
36
static readonly string NeoTotalSupplyScript = "wh8MC3RvdGFsU3VwcGx5DBT1Y\u002B pAvCg9TQ4FxI6jBbPyoHNA70FifVtS" ;
36
37
static readonly string NeoTransferScript = "CxEMFPlu76Cuc\u002B bgteStE4ozsOWTNUdrDBQtYNweHko3YcnMFOes3ceblcI/lRTAHwwIdHJhbnNmZXIMFPVj6kC8KD1NDgXEjqMFs/Kgc0DvQWJ9W1I=" ;
37
38
static readonly UInt160 ValidatorScriptHash = Contract
@@ -59,12 +60,12 @@ public void TestInvokeFunction()
59
60
{
60
61
_rpcServer . wallet = _wallet ;
61
62
62
- JObject resp = ( JObject ) _rpcServer . InvokeFunction ( new JArray ( NeoScriptHash , "totalSupply" , new JArray ( [ ] ) , validatorSigner , true ) ) ;
63
+ JObject resp = ( JObject ) _rpcServer . InvokeFunction ( new JArray ( NeoScriptHash . ToString ( ) , "totalSupply" , new JArray ( [ ] ) , validatorSigner , true ) ) ;
63
64
Assert . AreEqual ( resp . Count , 8 ) ;
64
65
Assert . AreEqual ( resp [ "script" ] , NeoTotalSupplyScript ) ;
65
66
Assert . IsTrue ( resp . ContainsProperty ( "gasconsumed" ) ) ;
66
67
Assert . IsTrue ( resp . ContainsProperty ( "diagnostics" ) ) ;
67
- Assert . AreEqual ( resp [ "diagnostics" ] [ "invokedcontracts" ] [ "call" ] [ 0 ] [ "hash" ] , NeoScriptHash ) ;
68
+ Assert . AreEqual ( resp [ "diagnostics" ] [ "invokedcontracts" ] [ "call" ] [ 0 ] [ "hash" ] , NeoScriptHash . ToString ( ) ) ;
68
69
Assert . IsTrue ( ( ( JArray ) resp [ "diagnostics" ] [ "storagechanges" ] ) . Count == 0 ) ;
69
70
Assert . AreEqual ( resp [ "state" ] , "HALT" ) ;
70
71
Assert . AreEqual ( resp [ "exception" ] , null ) ;
@@ -73,7 +74,7 @@ public void TestInvokeFunction()
73
74
Assert . AreEqual ( resp [ "stack" ] [ 0 ] [ "value" ] , "100000000" ) ;
74
75
Assert . IsTrue ( resp . ContainsProperty ( "tx" ) ) ;
75
76
76
- resp = ( JObject ) _rpcServer . InvokeFunction ( new JArray ( NeoScriptHash , "symbol" ) ) ;
77
+ resp = ( JObject ) _rpcServer . InvokeFunction ( new JArray ( NeoScriptHash . ToString ( ) , "symbol" ) ) ;
77
78
Assert . AreEqual ( resp . Count , 6 ) ;
78
79
Assert . IsTrue ( resp . ContainsProperty ( "script" ) ) ;
79
80
Assert . IsTrue ( resp . ContainsProperty ( "gasconsumed" ) ) ;
@@ -84,7 +85,7 @@ public void TestInvokeFunction()
84
85
Assert . AreEqual ( resp [ "stack" ] [ 0 ] [ "value" ] , Convert . ToBase64String ( Encoding . UTF8 . GetBytes ( "NEO" ) ) ) ;
85
86
86
87
// This call triggers not only NEO but also unclaimed GAS
87
- resp = ( JObject ) _rpcServer . InvokeFunction ( new JArray ( NeoScriptHash , "transfer" , new JArray ( [
88
+ resp = ( JObject ) _rpcServer . InvokeFunction ( new JArray ( NeoScriptHash . ToString ( ) , "transfer" , new JArray ( [
88
89
new JObject ( ) { [ "type" ] = "Hash160" , [ "value" ] = MultisigScriptHash . ToString ( ) } ,
89
90
new JObject ( ) { [ "type" ] = "Hash160" , [ "value" ] = ValidatorScriptHash . ToString ( ) } ,
90
91
new JObject ( ) { [ "type" ] = "Integer" , [ "value" ] = "1" } ,
@@ -94,17 +95,17 @@ public void TestInvokeFunction()
94
95
Assert . AreEqual ( resp [ "script" ] , NeoTransferScript ) ;
95
96
Assert . IsTrue ( resp . ContainsProperty ( "gasconsumed" ) ) ;
96
97
Assert . IsTrue ( resp . ContainsProperty ( "diagnostics" ) ) ;
97
- Assert . AreEqual ( resp [ "diagnostics" ] [ "invokedcontracts" ] [ "call" ] [ 0 ] [ "hash" ] , NeoScriptHash ) ;
98
+ Assert . AreEqual ( resp [ "diagnostics" ] [ "invokedcontracts" ] [ "call" ] [ 0 ] [ "hash" ] , NeoScriptHash . ToString ( ) ) ;
98
99
Assert . IsTrue ( ( ( JArray ) resp [ "diagnostics" ] [ "storagechanges" ] ) . Count == 4 ) ;
99
100
Assert . AreEqual ( resp [ "state" ] , "HALT" ) ;
100
101
Assert . AreEqual ( resp [ "exception" ] , $ "The smart contract or address { MultisigScriptHash . ToString ( ) } is not found") ;
101
102
JArray notifications = ( JArray ) resp [ "notifications" ] ;
102
103
Assert . AreEqual ( notifications . Count , 2 ) ;
103
104
Assert . AreEqual ( notifications [ 0 ] [ "eventname" ] . AsString ( ) , "Transfer" ) ;
104
- Assert . AreEqual ( notifications [ 0 ] [ "contract" ] . AsString ( ) , NeoScriptHash ) ;
105
+ Assert . AreEqual ( notifications [ 0 ] [ "contract" ] . AsString ( ) , NeoScriptHash . ToString ( ) ) ;
105
106
Assert . AreEqual ( notifications [ 0 ] [ "state" ] [ "value" ] [ 2 ] [ "value" ] , "1" ) ;
106
107
Assert . AreEqual ( notifications [ 1 ] [ "eventname" ] . AsString ( ) , "Transfer" ) ;
107
- Assert . AreEqual ( notifications [ 1 ] [ "contract" ] . AsString ( ) , GasScriptHash ) ;
108
+ Assert . AreEqual ( notifications [ 1 ] [ "contract" ] . AsString ( ) , GasScriptHash . ToString ( ) ) ;
108
109
Assert . AreEqual ( notifications [ 1 ] [ "state" ] [ "value" ] [ 2 ] [ "value" ] , "50000000" ) ;
109
110
110
111
_rpcServer . wallet = null ;
@@ -117,7 +118,7 @@ public void TestInvokeScript()
117
118
Assert . AreEqual ( resp . Count , 7 ) ;
118
119
Assert . IsTrue ( resp . ContainsProperty ( "gasconsumed" ) ) ;
119
120
Assert . IsTrue ( resp . ContainsProperty ( "diagnostics" ) ) ;
120
- Assert . AreEqual ( resp [ "diagnostics" ] [ "invokedcontracts" ] [ "call" ] [ 0 ] [ "hash" ] , NeoScriptHash ) ;
121
+ Assert . AreEqual ( resp [ "diagnostics" ] [ "invokedcontracts" ] [ "call" ] [ 0 ] [ "hash" ] , NeoScriptHash . ToString ( ) ) ;
121
122
Assert . AreEqual ( resp [ "state" ] , "HALT" ) ;
122
123
Assert . AreEqual ( resp [ "exception" ] , null ) ;
123
124
Assert . AreEqual ( ( ( JArray ) resp [ "notifications" ] ) . Count , 0 ) ;
@@ -133,7 +134,8 @@ public void TestInvokeScript()
133
134
[ TestMethod ]
134
135
public void TestTraverseIterator ( )
135
136
{
136
- JObject resp = ( JObject ) _rpcServer . InvokeFunction ( new JArray ( NeoScriptHash , "getAllCandidates" , new JArray ( [ ] ) , validatorSigner , true ) ) ;
137
+ // GetAllCandidates that should return 0 candidates
138
+ JObject resp = ( JObject ) _rpcServer . InvokeFunction ( new JArray ( NeoScriptHash . ToString ( ) , "getAllCandidates" , new JArray ( [ ] ) , validatorSigner , true ) ) ;
137
139
string sessionId = resp [ "session" ] . AsString ( ) ;
138
140
string iteratorId = resp [ "stack" ] [ 0 ] [ "id" ] . AsString ( ) ;
139
141
JArray respArray = ( JArray ) _rpcServer . TraverseIterator ( [ sessionId , iteratorId , 100 ] ) ;
@@ -147,6 +149,80 @@ public void TestTraverseIterator()
147
149
{
148
150
Assert . AreEqual ( e . Message , "Unknown session" ) ;
149
151
}
152
+
153
+ // register candidate in snapshot
154
+ resp = ( JObject ) _rpcServer . InvokeFunction ( new JArray ( NeoScriptHash . ToString ( ) , "registerCandidate" ,
155
+ new JArray ( [ new JObject ( )
156
+ {
157
+ [ "type" ] = "PublicKey" ,
158
+ [ "value" ] = TestProtocolSettings . SoleNode . StandbyCommittee [ 0 ] . ToString ( ) ,
159
+ } ] ) , validatorSigner , true ) ) ;
160
+ Assert . AreEqual ( resp [ "state" ] , "HALT" ) ;
161
+ SnapshotCache snapshot = _neoSystem . GetSnapshotCache ( ) ;
162
+ Transaction ? tx = new Transaction
163
+ {
164
+ Nonce = 233 ,
165
+ ValidUntilBlock = NativeContract . Ledger . CurrentIndex ( snapshot ) + _neoSystem . Settings . MaxValidUntilBlockIncrement ,
166
+ Signers = [ new Signer ( ) { Account = ValidatorScriptHash , Scopes = WitnessScope . CalledByEntry } ] ,
167
+ Attributes = Array . Empty < TransactionAttribute > ( ) ,
168
+ Script = Convert . FromBase64String ( resp [ "script" ] . AsString ( ) ) ,
169
+ Witnesses = null ,
170
+ } ;
171
+ ApplicationEngine engine = ApplicationEngine . Run ( tx . Script , snapshot , container : tx , settings : _neoSystem . Settings , gas : 1200_0000_0000 ) ;
172
+ engine . SnapshotCache . Commit ( ) ;
173
+
174
+ // GetAllCandidates that should return 1 candidate
175
+ resp = ( JObject ) _rpcServer . InvokeFunction ( new JArray ( NeoScriptHash . ToString ( ) , "getAllCandidates" , new JArray ( [ ] ) , validatorSigner , true ) ) ;
176
+ sessionId = resp [ "session" ] . AsString ( ) ;
177
+ iteratorId = resp [ "stack" ] [ 0 ] [ "id" ] . AsString ( ) ;
178
+ respArray = ( JArray ) _rpcServer . TraverseIterator ( [ sessionId , iteratorId , 100 ] ) ;
179
+ Assert . AreEqual ( respArray . Count , 1 ) ;
180
+ Assert . AreEqual ( respArray [ 0 ] [ "type" ] , "Struct" ) ;
181
+ JArray value = ( JArray ) respArray [ 0 ] [ "value" ] ;
182
+ Assert . AreEqual ( value . Count , 2 ) ;
183
+ Assert . AreEqual ( value [ 0 ] [ "type" ] , "ByteString" ) ;
184
+ Assert . AreEqual ( value [ 0 ] [ "value" ] , Convert . ToBase64String ( TestProtocolSettings . SoleNode . StandbyCommittee [ 0 ] . ToArray ( ) ) ) ;
185
+ Assert . AreEqual ( value [ 1 ] [ "type" ] , "Integer" ) ;
186
+ Assert . AreEqual ( value [ 1 ] [ "value" ] , "0" ) ;
187
+
188
+ // No result when traversed again
189
+ respArray = ( JArray ) _rpcServer . TraverseIterator ( [ sessionId , iteratorId , 100 ] ) ;
190
+ Assert . AreEqual ( respArray . Count , 0 ) ;
191
+
192
+ // GetAllCandidates again
193
+ resp = ( JObject ) _rpcServer . InvokeFunction ( new JArray ( NeoScriptHash . ToString ( ) , "getAllCandidates" , new JArray ( [ ] ) , validatorSigner , true ) ) ;
194
+ sessionId = resp [ "session" ] . AsString ( ) ;
195
+ iteratorId = resp [ "stack" ] [ 0 ] [ "id" ] . AsString ( ) ;
196
+
197
+ // Insufficient result count limit
198
+ respArray = ( JArray ) _rpcServer . TraverseIterator ( [ sessionId , iteratorId , 0 ] ) ;
199
+ Assert . AreEqual ( respArray . Count , 0 ) ;
200
+
201
+ // Mocking session timeout
202
+ Thread . Sleep ( _rpcServerSettings . SessionExpirationTime . Milliseconds + 1 ) ;
203
+ _rpcServer . OnTimer ( new object ( ) ) ;
204
+ try
205
+ {
206
+ respArray = ( JArray ) _rpcServer . TraverseIterator ( [ sessionId , iteratorId , 100 ] ) ;
207
+ }
208
+ catch ( RpcException e )
209
+ {
210
+ Assert . AreEqual ( e . Message , "Unknown session" ) ;
211
+ }
212
+
213
+ // Mocking disposal
214
+ resp = ( JObject ) _rpcServer . InvokeFunction ( new JArray ( NeoScriptHash . ToString ( ) , "getAllCandidates" , new JArray ( [ ] ) , validatorSigner , true ) ) ;
215
+ sessionId = resp [ "session" ] . AsString ( ) ;
216
+ iteratorId = resp [ "stack" ] [ 0 ] [ "id" ] . AsString ( ) ;
217
+ _rpcServer . Dispose_SmartContract ( ) ;
218
+ try
219
+ {
220
+ respArray = ( JArray ) _rpcServer . TraverseIterator ( [ sessionId , iteratorId , 100 ] ) ;
221
+ }
222
+ catch ( RpcException e )
223
+ {
224
+ Assert . AreEqual ( e . Message , "Unknown session" ) ;
225
+ }
150
226
}
151
227
152
228
[ TestMethod ]
0 commit comments