test_sdk1 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CONTRIBUTING.md +1 -0
- data/LICENSE +201 -0
- data/README.md +147 -0
- data/SECURITY.md +12 -0
- data/lib/crypto/00_asymmetric_key.rb +95 -0
- data/lib/crypto/01_ed25519.rb +67 -0
- data/lib/crypto/asymmetric_key.rb +87 -0
- data/lib/crypto/ed25519_key.rb +44 -0
- data/lib/crypto/key_pair.rb +40 -0
- data/lib/crypto/keys.rb +7 -0
- data/lib/crypto/secp256k1_key.rb +0 -0
- data/lib/crypto/test_ed25519_key.rb +44 -0
- data/lib/entity/account.rb +45 -0
- data/lib/entity/action_thresholds.rb +25 -0
- data/lib/entity/associated_key.rb +24 -0
- data/lib/entity/auction_state.rb +36 -0
- data/lib/entity/bid.rb +24 -0
- data/lib/entity/bid_info.rb +51 -0
- data/lib/entity/contract.rb +47 -0
- data/lib/entity/contract_package.rb +41 -0
- data/lib/entity/contract_version.rb +33 -0
- data/lib/entity/delegator.rb +37 -0
- data/lib/entity/deploy.rb +44 -0
- data/lib/entity/deploy_approval.rb +24 -0
- data/lib/entity/deploy_executable.rb +162 -0
- data/lib/entity/deploy_executable_item_internal.rb +26 -0
- data/lib/entity/deploy_executable_transfer.rb +50 -0
- data/lib/entity/deploy_hash.rb +16 -0
- data/lib/entity/deploy_header.rb +60 -0
- data/lib/entity/deploy_info.rb +44 -0
- data/lib/entity/deploy_named_argument.rb +19 -0
- data/lib/entity/deploy_transfer.rb +10 -0
- data/lib/entity/disabled_version.rb +26 -0
- data/lib/entity/era_info.rb +18 -0
- data/lib/entity/era_summary.rb +44 -0
- data/lib/entity/era_validator.rb +23 -0
- data/lib/entity/executable_deploy_item.rb +11 -0
- data/lib/entity/group.rb +25 -0
- data/lib/entity/module_bytes.rb +50 -0
- data/lib/entity/peer.rb +25 -0
- data/lib/entity/seigniorage_allocation.rb +18 -0
- data/lib/entity/stored_contract_by_hash.rb +50 -0
- data/lib/entity/stored_contract_by_name.rb +50 -0
- data/lib/entity/stored_value.rb +57 -0
- data/lib/entity/stored_versioned_contract_by_hash.rb +61 -0
- data/lib/entity/stored_versioned_contract_by_name.rb +61 -0
- data/lib/entity/transfer.rb +65 -0
- data/lib/entity/validator_weight.rb +23 -0
- data/lib/entity/vesting_schedule.rb +22 -0
- data/lib/include.rb +18 -0
- data/lib/rpc/rpc.rb +227 -0
- data/lib/rpc/rpc_client.rb +233 -0
- data/lib/rpc/rpc_error.rb +79 -0
- data/lib/serialization/cl_type_serializer.rb +76 -0
- data/lib/serialization/cl_value_bytes_parsers.rb +498 -0
- data/lib/serialization/cl_value_serializer.rb +259 -0
- data/lib/serialization/deploy_approval_serializer.rb +15 -0
- data/lib/serialization/deploy_executable_serializer.rb +27 -0
- data/lib/serialization/deploy_header_serializer.rb +49 -0
- data/lib/serialization/deploy_named_arg_serializer.rb +19 -0
- data/lib/serialization/deploy_serializer.rb +268 -0
- data/lib/serialization/test.rb +431 -0
- data/lib/test_sdk1.rb +289 -0
- data/lib/types/cl_account_hash.rb +24 -0
- data/lib/types/cl_account_hash_type.rb +22 -0
- data/lib/types/cl_any.rb +25 -0
- data/lib/types/cl_any_type.rb +22 -0
- data/lib/types/cl_bool.rb +32 -0
- data/lib/types/cl_bool_type.rb +35 -0
- data/lib/types/cl_byte_array.rb +25 -0
- data/lib/types/cl_byte_array_type.rb +27 -0
- data/lib/types/cl_i32.rb +26 -0
- data/lib/types/cl_i32_type.rb +26 -0
- data/lib/types/cl_i64.rb +26 -0
- data/lib/types/cl_i64_type.rb +27 -0
- data/lib/types/cl_key.rb +39 -0
- data/lib/types/cl_key_type.rb +27 -0
- data/lib/types/cl_list.rb +25 -0
- data/lib/types/cl_list_type.rb +26 -0
- data/lib/types/cl_map.rb +25 -0
- data/lib/types/cl_map_type.rb +26 -0
- data/lib/types/cl_option.rb +33 -0
- data/lib/types/cl_option_type.rb +52 -0
- data/lib/types/cl_public_key.rb +152 -0
- data/lib/types/cl_public_key_type.rb +26 -0
- data/lib/types/cl_result.rb +25 -0
- data/lib/types/cl_result_type.rb +26 -0
- data/lib/types/cl_string.rb +39 -0
- data/lib/types/cl_string_type.rb +32 -0
- data/lib/types/cl_tuple.rb +151 -0
- data/lib/types/cl_tuple_type.rb +108 -0
- data/lib/types/cl_type.rb +94 -0
- data/lib/types/cl_type_tag.rb +51 -0
- data/lib/types/cl_u128.rb +26 -0
- data/lib/types/cl_u128_type.rb +26 -0
- data/lib/types/cl_u256.rb +26 -0
- data/lib/types/cl_u256_type.rb +26 -0
- data/lib/types/cl_u32.rb +26 -0
- data/lib/types/cl_u32_type.rb +26 -0
- data/lib/types/cl_u512.rb +26 -0
- data/lib/types/cl_u512_type.rb +26 -0
- data/lib/types/cl_u64.rb +26 -0
- data/lib/types/cl_u64_type.rb +27 -0
- data/lib/types/cl_u8.rb +26 -0
- data/lib/types/cl_u8_type.rb +26 -0
- data/lib/types/cl_unit.rb +38 -0
- data/lib/types/cl_unit_type.rb +22 -0
- data/lib/types/cl_uref.rb +120 -0
- data/lib/types/cl_uref_type.rb +46 -0
- data/lib/types/cl_value.rb +10 -0
- data/lib/types/constants.rb +50 -0
- data/lib/types/error.rb +7 -0
- data/lib/utils/base_16.rb +18 -0
- data/lib/utils/byte_utils.rb +107 -0
- data/lib/utils/find_byte_parser_by_cl_type.rb +53 -0
- data/lib/utils/hash_utils.rb +19 -0
- data/lib/utils/hex_utils.rb +12 -0
- data/lib/utils/time_utils.rb +85 -0
- data/lib/utils/utils.rb +2 -0
- data/lib/version.rb +3 -0
- data/spec/a_spec.rb +697 -0
- data/spec/byte_utils_spec.rb +72 -0
- data/spec/cl_public_spec.rb +169 -0
- data/spec/cl_types_spec.rb +715 -0
- data/spec/cl_value_serializer_spec.rb +140 -0
- data/spec/client_spec.rb +25 -0
- data/spec/crypto_spec.rb +42 -0
- data/spec/deploy_approval_serializer_spec.rb +26 -0
- data/spec/deploy_executable_serializer_spec.rb +0 -0
- data/spec/deploy_header_serializer_spec.rb +21 -0
- data/spec/deploy_named_arg_serializer_spec.rb +49 -0
- data/spec/deploy_serializer_spec.rb +77 -0
- data/spec/deploy_serializer_test_spec.rb +225 -0
- data/spec/mainnet_spec.rb +452 -0
- data/spec/spec_helper.rb +100 -0
- data/spec/string_spec.rb +68 -0
- data/spec/testnet_spec.rb +498 -0
- data/spec/time_utils_spec.rb +87 -0
- metadata +198 -0
@@ -0,0 +1,498 @@
|
|
1
|
+
# mainnet_spec.rb
|
2
|
+
require './lib/rpc/rpc_client.rb'
|
3
|
+
|
4
|
+
# Ip Address taken from Testnet
|
5
|
+
# client = Casper::RpcClient.new("138.201.54.44")
|
6
|
+
# Ip Address taken from Testnet
|
7
|
+
# client = Casper::RpcClient.new("65.21.227.101") # IP is taken from "TestNet"
|
8
|
+
# client = Casper::RpcClient.new("138.201.54.44") # IP is taken from "TestNet"
|
9
|
+
client = Casper::RpcClient.new("5.9.23.55") # IP is taken from "TestNet"
|
10
|
+
|
11
|
+
# block_Hash taken from Testnet
|
12
|
+
block_hash = "71e19e2e9629c716dc9578066cfeceace559d32fe51b08245ddd4d218f8c18da"
|
13
|
+
# deploy_Hash taken from Testnet
|
14
|
+
deploy_hash = "d3e0a1bd85ee74916e096cf4b18df391ada414d0915aeb865eff0ba75f04c3d8"
|
15
|
+
state_root_hash = "2a62440a1e1e57bff71344aac8a7de169f6dd08d29cffe83b2fb5d6648971855"
|
16
|
+
item_key = "f870e3cadfde21d7d7686fdf3d1a8413838274d363ca7b27ae71fc9125eb6743"
|
17
|
+
uref = "uref-9199d08ff4ca4d52cd7a05ba0d2694204b7ebff963fec1c216f81bf654e0e59f-007"
|
18
|
+
describe Casper::RpcClient do
|
19
|
+
url = "65.21.0.X"
|
20
|
+
client2 = Casper::RpcClient.new(url)
|
21
|
+
it "fails, wrong ip format : #{url}" do
|
22
|
+
expect(client2.get_error).to eql("SocketError")
|
23
|
+
end
|
24
|
+
|
25
|
+
url2 = "65.21.0.0"
|
26
|
+
client3 = Casper::RpcClient.new(url2)
|
27
|
+
it "fails, #{url2} is not available in network" do
|
28
|
+
expect(client3.get_error).to eql("Errno::ECONNREFUSED")
|
29
|
+
end
|
30
|
+
|
31
|
+
# Test info_get_peers()
|
32
|
+
describe "#info_get_peers" do
|
33
|
+
peers = client.info_get_peers
|
34
|
+
context "Peers Array" do
|
35
|
+
it "passes, peers array is not nil" do
|
36
|
+
expect(peers).to be_truthy
|
37
|
+
end
|
38
|
+
# it "fails, connecting non existing node" do
|
39
|
+
# client2 = Casper::RpcClient.new("12.2.2.2")
|
40
|
+
# end
|
41
|
+
it "passes, peers array is not empty" do
|
42
|
+
expect(peers).not_to be_empty
|
43
|
+
end
|
44
|
+
|
45
|
+
# it "passes, size of both peer arrays are equal" do
|
46
|
+
# # Check the length of the peers array
|
47
|
+
# client2 = Casper::RpcClient.new("34.192.231.34")
|
48
|
+
# other_peers = client2.info_get_peers
|
49
|
+
# expect(peers.size).to eql(other_peers.size)
|
50
|
+
# end
|
51
|
+
|
52
|
+
it "passes, peers object is a type of Array" do
|
53
|
+
# Check whether ıt is an array or not
|
54
|
+
expect(client.info_get_peers).to be_an(Array)
|
55
|
+
# Check the length of the peers array
|
56
|
+
expect(client.info_get_peers.length).to be > 0
|
57
|
+
end
|
58
|
+
|
59
|
+
it "passes, peers member are types of Hash" do
|
60
|
+
# Check type of peers elements
|
61
|
+
expect(peers[0]).to be_an_instance_of(Hash)
|
62
|
+
end
|
63
|
+
|
64
|
+
peer = peers[0]
|
65
|
+
first_item = peer["node_id"]
|
66
|
+
second_item = peer["address"]
|
67
|
+
it "passes, peer members are types of String" do
|
68
|
+
expect(first_item).to be_an_instance_of(String)
|
69
|
+
expect(second_item).to be_an_instance_of(String)
|
70
|
+
expect(first_item.length).to eq(14)
|
71
|
+
end
|
72
|
+
|
73
|
+
it "passes, length of first_item equal #{first_item.length}" do
|
74
|
+
expect(first_item.length).to eq(14)
|
75
|
+
end
|
76
|
+
|
77
|
+
peer.deep_symbolize_keys!
|
78
|
+
it "passes, peer includes node_id key" do
|
79
|
+
expect(peer).to have_key(:node_id)
|
80
|
+
end
|
81
|
+
|
82
|
+
it "passes, peer includes address key" do
|
83
|
+
expect(peer).to have_key(:address)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
context "When called info_get_peers with invalid ip address" do
|
87
|
+
client4 = Casper::RpcClient.new("65.21.227.X")
|
88
|
+
# puts client4.info_get_peers
|
89
|
+
it "fails, \"#{client4.info_get_peers}\"" do
|
90
|
+
expect(client4.info_get_peers).to eql("SocketError")
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
# Test chain_get_StateRootHash
|
96
|
+
describe "#chain_get_StateRootHash" do
|
97
|
+
context "Without a block_hash parameter" do
|
98
|
+
current_state_root_hash = client.chain_get_StateRootHash("")
|
99
|
+
it "passes, current state_root_hash is a type of String" do
|
100
|
+
expect(current_state_root_hash).to be_an(String)
|
101
|
+
end
|
102
|
+
|
103
|
+
it "passes, current state_root_hash is not nil" do
|
104
|
+
expect(current_state_root_hash).to be_truthy
|
105
|
+
end
|
106
|
+
|
107
|
+
it "passes, current state_root_hash is not empty" do
|
108
|
+
expect(current_state_root_hash).not_to be_empty
|
109
|
+
end
|
110
|
+
|
111
|
+
it "passes, current state_root_hash is 64 characters long" do
|
112
|
+
expect(current_state_root_hash.length).to eq(64)
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
context "With a block_hash parameter" do
|
117
|
+
current_state_root_hash = client.chain_get_StateRootHash(state_root_hash)
|
118
|
+
it "passes, current state_root_hash is a type of String" do
|
119
|
+
expect(current_state_root_hash).to be_an(String)
|
120
|
+
end
|
121
|
+
|
122
|
+
it "passes, current state_root_hash is not nil" do
|
123
|
+
expect(current_state_root_hash).to be_truthy
|
124
|
+
end
|
125
|
+
|
126
|
+
it "passes, current state_root_hash is not empty" do
|
127
|
+
expect(current_state_root_hash).not_to be_empty
|
128
|
+
end
|
129
|
+
|
130
|
+
it "passes, current state_root_hash is 64 characters long" do
|
131
|
+
expect(current_state_root_hash.length).to eq(64)
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
# Test info_get_deploy(deploy_hash)
|
137
|
+
describe "#info_get_deploy" do
|
138
|
+
context "When info_get_deploy method is called with deploy hash parameter" do
|
139
|
+
deploy_hash = "68265220148756e85e9b1dc2e774f9b8c40e5cf1782abe321ea95a8f58a670ae"
|
140
|
+
deploy = client.info_get_deploy(deploy_hash)
|
141
|
+
deploy.deep_symbolize_keys!
|
142
|
+
payment = deploy[:payment]
|
143
|
+
session = deploy[:session]
|
144
|
+
approvals = deploy[:approvals]
|
145
|
+
|
146
|
+
it "passes, Deploy type is a Hash" do
|
147
|
+
expect(deploy).to be_a(Hash)
|
148
|
+
end
|
149
|
+
|
150
|
+
it "passes, hash value of Deploy is equal to the deploy_hash value" do
|
151
|
+
hash_value = deploy[:hash]
|
152
|
+
expect(hash_value).to eql(deploy_hash)
|
153
|
+
end
|
154
|
+
|
155
|
+
it "passes, header is not nil" do
|
156
|
+
header = deploy[:header]
|
157
|
+
expect(header).to be_truthy
|
158
|
+
end
|
159
|
+
|
160
|
+
it "passes, payment is not nil" do
|
161
|
+
expect(payment).to be_truthy
|
162
|
+
end
|
163
|
+
|
164
|
+
it "passes, payment includes ModuleBytes key" do
|
165
|
+
# module_bytes = payment[:ModuleBytes]
|
166
|
+
# key_variable = :ModuleBytes
|
167
|
+
expect(payment).to have_key(:ModuleBytes)
|
168
|
+
end
|
169
|
+
|
170
|
+
it "passes, session is not nil" do
|
171
|
+
expect(session).to be_truthy
|
172
|
+
expect(session).to be_an_instance_of(Hash)
|
173
|
+
end
|
174
|
+
|
175
|
+
it "passes, session includes StoredContractByHash key" do
|
176
|
+
expect(session).to have_key(:StoredContractByHash)
|
177
|
+
end
|
178
|
+
|
179
|
+
it "passes, approvals is not nil" do
|
180
|
+
expect(approvals).to be_truthy
|
181
|
+
expect(approvals).to be_an_instance_of(Array)
|
182
|
+
end
|
183
|
+
|
184
|
+
it "passes, approvals includes signer" do
|
185
|
+
expect(approvals[0]).to have_key(:signer)
|
186
|
+
end
|
187
|
+
|
188
|
+
it "passes, approvals includes signature" do
|
189
|
+
expect(approvals[0]).to have_key(:signature)
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
193
|
+
context "When info_get_deploy is called with an empty deploy hash parameter" do
|
194
|
+
it "fails, ServerError: Invalid params " do
|
195
|
+
err = client.info_get_deploy("")
|
196
|
+
# err = "Server error -32602: Invalid params (Jimson::Client::Error::ServerError)"
|
197
|
+
expect {raise StandardError, err}.
|
198
|
+
to raise_error(err)
|
199
|
+
end
|
200
|
+
end
|
201
|
+
context "When info_get_deploy is called with an invalid parameter" do
|
202
|
+
it "fails, ServerError: Invalid params " do
|
203
|
+
err = client.info_get_deploy("AAAAAAA146419d036d13b83f37e7580df1ddfd925fbe4b36ee90f9d6fd63b9bb")
|
204
|
+
expect {raise StandardError, err}.
|
205
|
+
to raise_error(err)
|
206
|
+
end
|
207
|
+
it "fails, ServerError: Invalid params " do
|
208
|
+
err = client.info_get_deploy("asdsadsadsa")
|
209
|
+
expect {raise StandardError, err}.
|
210
|
+
to raise_error(err)
|
211
|
+
end
|
212
|
+
end
|
213
|
+
end
|
214
|
+
|
215
|
+
# Test info_get_status()
|
216
|
+
describe "#info_get_status" do
|
217
|
+
node_status = client.info_get_status
|
218
|
+
node_status.deep_symbolize_keys!
|
219
|
+
context "Returns the current status of the node" do
|
220
|
+
it "passes, node includes api_version, chainspec_name, starting_state_root_hash, peers, last_added_block_info, our_public_signing_key, round_length, next_upgrade, build_version, uptime keys" do
|
221
|
+
expect(node_status).to have_key(:api_version)
|
222
|
+
expect(node_status).to have_key(:chainspec_name)
|
223
|
+
expect(node_status).to have_key(:starting_state_root_hash)
|
224
|
+
expect(node_status).to have_key(:peers)
|
225
|
+
expect(node_status).to have_key(:last_added_block_info)
|
226
|
+
expect(node_status).to have_key(:our_public_signing_key)
|
227
|
+
expect(node_status).to have_key(:round_length)
|
228
|
+
expect(node_status).to have_key(:next_upgrade)
|
229
|
+
expect(node_status).to have_key(:build_version)
|
230
|
+
expect(node_status).to have_key(:uptime)
|
231
|
+
end
|
232
|
+
|
233
|
+
it "passes, network is casper" do
|
234
|
+
chainspec_name = node_status[:chainspec_name]
|
235
|
+
expect(chainspec_name).to eql("casper-test")
|
236
|
+
end
|
237
|
+
|
238
|
+
it "passes, last added block includes hash, timestamp, era_id, height, state_root_hash, creator keys" do
|
239
|
+
last_block = node_status[:last_added_block_info]
|
240
|
+
expect(last_block).to have_key(:hash)
|
241
|
+
expect(last_block).to have_key(:timestamp)
|
242
|
+
expect(last_block).to have_key(:era_id)
|
243
|
+
expect(last_block).to have_key(:state_root_hash)
|
244
|
+
expect(last_block).to have_key(:creator)
|
245
|
+
end
|
246
|
+
|
247
|
+
it "passes, the number of peers are equal" do
|
248
|
+
peers_from_info_get_peers = client.info_get_peers
|
249
|
+
peers_from_info_get_status = node_status[:peers]
|
250
|
+
expect(peers_from_info_get_status.size).to be > 0
|
251
|
+
end
|
252
|
+
|
253
|
+
it "passes, node public key is : 018597e78805200d5469105024d7741894c2c1eac69fb9c15e718e1824261722a2" do
|
254
|
+
our_public_signing_key = "018597e78805200d5469105024d7741894c2c1eac69fb9c15e718e1824261722a2"
|
255
|
+
expect(node_status[:our_public_signing_key]).to eql(our_public_signing_key)
|
256
|
+
end
|
257
|
+
end
|
258
|
+
end
|
259
|
+
|
260
|
+
# Test chain_get_block_transfers(block_hash)
|
261
|
+
describe "#chain_get_block_transfers" do
|
262
|
+
block_hash1 = "7aaacec3c4abdbd8766a5f0fc29ee54c18b16a19b0efc2685c44d75e1dff4eed"
|
263
|
+
transfers = client.chain_get_block_transfers(block_hash1)
|
264
|
+
transfers[0].deep_symbolize_keys!
|
265
|
+
|
266
|
+
context "Returns all transfers for a Block from the network" do
|
267
|
+
it "passes, transfers is not empty and the number of transfers is #{transfers.size}" do
|
268
|
+
expect(transfers).not_to be_empty
|
269
|
+
expect(transfers.size).to eql(1)
|
270
|
+
end
|
271
|
+
|
272
|
+
it "passes, all keys in transfers are \'deploy_hash\', \'from\', \'to\',
|
273
|
+
\'source\', \'target\', \'amount\', \'gas\', \'id\' respectively" do
|
274
|
+
transfers = transfers[0]
|
275
|
+
transfers.deep_symbolize_keys!
|
276
|
+
expect(transfers).to have_key(:deploy_hash)
|
277
|
+
expect(transfers).to have_key(:from)
|
278
|
+
expect(transfers).to have_key(:to)
|
279
|
+
expect(transfers).to have_key(:source)
|
280
|
+
expect(transfers).to have_key(:target)
|
281
|
+
expect(transfers).to have_key(:amount)
|
282
|
+
expect(transfers).to have_key(:gas)
|
283
|
+
expect(transfers).to have_key(:id)
|
284
|
+
end
|
285
|
+
|
286
|
+
it "passes, amount of the first transaction is 100000000000 motes" do
|
287
|
+
first_transaction = transfers
|
288
|
+
first_transfer_amount = 100000000000
|
289
|
+
expect(first_transaction[:amount].to_i).to eql(first_transfer_amount)
|
290
|
+
end
|
291
|
+
|
292
|
+
block_hash2 = "6d728385f84ca94d33729890f41420a9cd203f2ca6460d1f8a761d9753f578d7"
|
293
|
+
transfer2 = client.chain_get_block_transfers(block_hash2)
|
294
|
+
|
295
|
+
it "passes, amount of the second transaction is 120000000000 motes" do
|
296
|
+
second_transaction = transfer2[0].deep_symbolize_keys!
|
297
|
+
second_transfer_amount = 120000000000
|
298
|
+
expect(second_transaction[:amount].to_i).to eql(second_transfer_amount)
|
299
|
+
end
|
300
|
+
|
301
|
+
# it "fails, when called with invalid parameter" do
|
302
|
+
# response = client.chain_get_block_transfers("sasdsdsd")
|
303
|
+
# expect {raise StandardError, response}.to raise_error(response)
|
304
|
+
# # expect { response }.to raise_error(Casper::RpcError::InvalidParameter.error)
|
305
|
+
# end
|
306
|
+
|
307
|
+
end
|
308
|
+
end
|
309
|
+
|
310
|
+
# Test chain_get_block(block_hash)
|
311
|
+
describe "#chain_get_block" do
|
312
|
+
block_hash = "7e89d689b1604280e1c4c83c743f58ecef1f2177f5307580313122ab11595f4b"
|
313
|
+
block = client.chain_get_block(block_hash)
|
314
|
+
block.deep_symbolize_keys!
|
315
|
+
header = block[:header]
|
316
|
+
body = block[:body]
|
317
|
+
describe "Returns a Block from the network" do
|
318
|
+
context "When chain_get_block method is called with deploy hash parameter" do
|
319
|
+
it "passes, block hash : #{block[:hash]}" do
|
320
|
+
expect(block[:hash]).to be_truthy
|
321
|
+
expect(block[:hash]).to be_a(String)
|
322
|
+
expect(block[:hash]).not_to be_empty
|
323
|
+
expect(block[:hash].length).to eql(64)
|
324
|
+
end
|
325
|
+
|
326
|
+
it "passes, hash value of block is equal to the block hash given as parameter" do
|
327
|
+
expect(block[:hash]).to eq(block_hash)
|
328
|
+
end
|
329
|
+
|
330
|
+
it "passes, block includes \'hash\', \'header\', \'body\' and \'proofs\' respectively" do
|
331
|
+
expect(block).to have_key(:hash)
|
332
|
+
expect(block).to have_key(:header)
|
333
|
+
expect(block).to have_key(:body)
|
334
|
+
# expect(block).to have_key(:testtest) # Negative test, uncomment and test again to see the result.
|
335
|
+
end
|
336
|
+
|
337
|
+
it "passes, header includes \'parent_hash\', \'state_root_hash\', \'body_hash\', \'random_bit\',
|
338
|
+
\'accumulated_seed\', \'era_end\', \'timestamp\', \'era_id\', \'height\', \'protocol_version\' keys respectively" do
|
339
|
+
expect(header).to have_key(:parent_hash)
|
340
|
+
expect(header[:parent_hash]).not_to be_empty # parent_hash is not empty
|
341
|
+
expect(header).to have_key(:state_root_hash)
|
342
|
+
expect(header[:state_root_hash]).not_to be_empty # state_root_hash is not empty
|
343
|
+
expect(header).to have_key(:body_hash)
|
344
|
+
expect(header[:body_hash]).not_to be_empty # body_hash is not empty
|
345
|
+
expect(header).to have_key(:random_bit)
|
346
|
+
expect(header[:random_bit]).to be_truthy # random_bit is true
|
347
|
+
expect(header).to have_key(:accumulated_seed)
|
348
|
+
expect(header[:accumulated_seed]).not_to be_empty # accumulated_seed is not empty
|
349
|
+
expect(header).to have_key(:era_end)
|
350
|
+
expect(header[:era_end]).to be_falsey # era_end is not nil
|
351
|
+
expect(header).to have_key(:timestamp)
|
352
|
+
expect(header[:timestamp]).not_to be_empty # timestamp is not nil
|
353
|
+
expect(header).to have_key(:height)
|
354
|
+
expect(header[:height]).to be_truthy # height is not nil
|
355
|
+
expect(header).to have_key(:protocol_version)
|
356
|
+
expect(header[:protocol_version]).to be_truthy # protocol_version is not nil
|
357
|
+
# expect(header).to have_key(:testtest) # Negative test, uncomment and test again to see the result.
|
358
|
+
end
|
359
|
+
|
360
|
+
it "passes, body includes \'proposer\', \'deploy_hashes\' and \'transfer_hashes\' keys respectively" do
|
361
|
+
expect(body).to have_key(:proposer)
|
362
|
+
expect(body[:proposer]).not_to be_empty
|
363
|
+
expect(body).to have_key(:deploy_hashes)
|
364
|
+
expect(body[:deploy_hashes]).to be_a_kind_of(Array)
|
365
|
+
expect(body).to have_key(:transfer_hashes)
|
366
|
+
expect(body[:transfer_hashes]).to be_a_kind_of(Array)
|
367
|
+
# expect(body).to have_key(:testtest) # Negative test, uncomment and test again to see the result.
|
368
|
+
end
|
369
|
+
|
370
|
+
it "includes public_key and signature keys" do
|
371
|
+
proofs = block[:proofs]
|
372
|
+
proof_item = proofs[0]
|
373
|
+
expect(proof_item).to have_key(:public_key)
|
374
|
+
expect(proof_item[:public_key]).not_to be_empty
|
375
|
+
expect(proof_item).to have_key(:signature)
|
376
|
+
expect(proof_item[:signature]).not_to be_empty
|
377
|
+
# expect(proof_item).to have_key(:testtest) # Negative test, uncomment and test again to see the result.
|
378
|
+
end
|
379
|
+
end
|
380
|
+
context "When chain_get_block method is called without deploy hash parameter" do
|
381
|
+
# Add tests
|
382
|
+
end
|
383
|
+
end
|
384
|
+
end
|
385
|
+
|
386
|
+
# Test chain_get_eraInfo_by_SwitchBlock(block_hash)
|
387
|
+
describe "#chain_get_eraInfo_by_SwitchBlock" do
|
388
|
+
context "Returns an EraInfo from the network" do
|
389
|
+
switch_block_hash = "9e30104581a492f5c6faad4cdfb098311e3bf0e93897ebbfb47c3df62f5e6375"
|
390
|
+
era_summary = client.chain_get_eraInfo_by_SwitchBlock(switch_block_hash)
|
391
|
+
if era_summary.class == Hash
|
392
|
+
era_summary.deep_symbolize_keys!
|
393
|
+
|
394
|
+
era_id = 3921
|
395
|
+
it "passes, era_ids are equal" do
|
396
|
+
expect(era_summary[:era_id]).to eql(era_id)
|
397
|
+
end
|
398
|
+
|
399
|
+
state_root_hash = "6ec5bfba7d7bad174209f80f63820e671ca0dc8d22cb365a45c2b84fb1e4bf46"
|
400
|
+
it "passes, state_root_hashes are equal" do
|
401
|
+
expect(era_summary[:state_root_hash]).to eql(state_root_hash)
|
402
|
+
end
|
403
|
+
end
|
404
|
+
end
|
405
|
+
end
|
406
|
+
|
407
|
+
# Test state_get_item(state_root_hash, key, path)
|
408
|
+
describe "#state_get_item" do
|
409
|
+
context "Returns a stored value from the network" do
|
410
|
+
stored_value = client.state_get_item("420b18a9cb47f1f60b332a7d6376b700cc68fba8a24603b6550fd178cfabdf70", "account-hash-b0032b1c87261c9a440705762876a64354d37a2c57be269bae69bb450e6b8c2b", [])
|
411
|
+
stored_value.deep_symbolize_keys!
|
412
|
+
account = stored_value[:Account]
|
413
|
+
associated_keys = account[:associated_keys]
|
414
|
+
action_thresholds = account[:action_thresholds]
|
415
|
+
|
416
|
+
it "passes, Account includes account_hash, named_keys, main_purse, associated_keys, action_thresholds keys" do
|
417
|
+
expect(stored_value[:Account]).to have_key(:account_hash)
|
418
|
+
expect(stored_value[:Account]).to have_key(:named_keys)
|
419
|
+
expect(stored_value[:Account]).to have_key(:main_purse)
|
420
|
+
expect(stored_value[:Account]).to have_key(:associated_keys)
|
421
|
+
expect(stored_value[:Account]).to have_key(:action_thresholds)
|
422
|
+
end
|
423
|
+
|
424
|
+
it "passes, account hash = account-hash-b0032b1c87261c9a440705762876a64354d37a2c57be269bae69bb450e6b8c2b" do
|
425
|
+
account_hash_value = "account-hash-b0032b1c87261c9a440705762876a64354d37a2c57be269bae69bb450e6b8c2b"
|
426
|
+
account_hash = stored_value[:Account][:account_hash]
|
427
|
+
# account_hash.slice!("account-hash-")
|
428
|
+
expect(account_hash).to eql(account_hash_value)
|
429
|
+
end
|
430
|
+
|
431
|
+
it "passes, main_purse is not nil" do
|
432
|
+
expect(account[:main_purse]).to be_truthy
|
433
|
+
end
|
434
|
+
|
435
|
+
it "passes, main_purse : uref-f4d4d840464dd8934fcca9758d64cb514f52285ae0b79d706436f2cfe87e34fd-007" do
|
436
|
+
expect(account[:main_purse]).to eql("uref-f4d4d840464dd8934fcca9758d64cb514f52285ae0b79d706436f2cfe87e34fd-007")
|
437
|
+
end
|
438
|
+
|
439
|
+
it "passes, named_keys is not empty" do
|
440
|
+
expect(account[:named_keys]).not_to be_empty
|
441
|
+
end
|
442
|
+
|
443
|
+
it "passes, deployment of action_thresholds is equal to 1" do
|
444
|
+
expect(action_thresholds[:deployment]).to eql(1)
|
445
|
+
end
|
446
|
+
|
447
|
+
it "passes, weight of associated keys is equal to 1" do
|
448
|
+
expect(associated_keys[0][:weight]).to eql(1)
|
449
|
+
end
|
450
|
+
|
451
|
+
end
|
452
|
+
end
|
453
|
+
|
454
|
+
# Test state_get_dictionary_item(state_root_hash, item_key, uref)
|
455
|
+
describe "#state_get_dictionary_item" do
|
456
|
+
stored_value = client.state_get_dictionary_item("146b860f82359ced6e801cbad31015b5a9f9eb147ab2a449fd5cdb950e961ca8",
|
457
|
+
"abc_name",
|
458
|
+
"uref-30074a46a79b2d80cff437594d2422383f6c754de453b732448cc711b9f7e129-007")
|
459
|
+
stored_value.deep_symbolize_keys!
|
460
|
+
it "checks that CLValue should not be nil" do
|
461
|
+
expect(stored_value[:CLValue]).to be_truthy
|
462
|
+
end
|
463
|
+
|
464
|
+
it "checks that cl_type should equal to String" do
|
465
|
+
expect(stored_value[:CLValue][:cl_type]).to eql("String")
|
466
|
+
end
|
467
|
+
|
468
|
+
it "checks that CLValue parsed equals to \"abc_value\"" do
|
469
|
+
expect(stored_value[:CLValue][:parsed]).to eql("abc_value")
|
470
|
+
end
|
471
|
+
end
|
472
|
+
|
473
|
+
# Test state_get_balance(state_root_hash, balance_uref)
|
474
|
+
describe "#state_get_balance" do
|
475
|
+
balance = client.state_get_balance("146b860f82359ced6e801cbad31015b5a9f9eb147ab2a449fd5cdb950e961ca8", "uref-f4d4d840464dd8934fcca9758d64cb514f52285ae0b79d706436f2cfe87e34fd-007")
|
476
|
+
|
477
|
+
it "is equal to 390000000000" do
|
478
|
+
expect(balance.to_i).to eql(390000000000)
|
479
|
+
end
|
480
|
+
end
|
481
|
+
|
482
|
+
# Test state_get_AuctionInfo
|
483
|
+
describe "#state_get_AuctionInfo" do
|
484
|
+
auction_state = client.state_get_AuctionInfo
|
485
|
+
if auction_state.class == Hash
|
486
|
+
auction_state.deep_symbolize_keys!
|
487
|
+
it "checks state root hash equality and they should be equal" do
|
488
|
+
expect(auction_state[:state_root_hash]).to eql(client.chain_get_StateRootHash)
|
489
|
+
end
|
490
|
+
|
491
|
+
it "checks that era_validators is not empty" do
|
492
|
+
# puts auction_state[:era_validators]
|
493
|
+
expect(auction_state[:era_validators]).not_to be_empty
|
494
|
+
end
|
495
|
+
end
|
496
|
+
end
|
497
|
+
|
498
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require_relative '../lib/utils/time_utils.rb'
|
2
|
+
require_relative '../lib/utils/byte_utils.rb'
|
3
|
+
|
4
|
+
RSpec.describe Utils::TimeUtils do
|
5
|
+
let(:time_utils) { Utils::TimeUtils }
|
6
|
+
let(:byte_utils) { Utils::ByteUtils }
|
7
|
+
|
8
|
+
it "serialize 1603994401469 ms to 0xbd3a847575010000" do
|
9
|
+
expect("0x"+ byte_utils.to_u64(1603994401469)).to eql("0xbd3a847575010000")
|
10
|
+
expect(byte_utils.to_u64(1603994401469)).to eql("bd3a847575010000")
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should convert iso datetime to ms from unix epoch" do
|
14
|
+
date = "2020-11-17T00:39:24.072Z"
|
15
|
+
expect(time_utils.to_epoc_ms(date)).to eql(1605573564072)
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should convert miliseconds to iso datetime" do
|
19
|
+
date = "2020-11-17T00:39:24.072Z"
|
20
|
+
milliseconds = 1605573564072
|
21
|
+
expect(time_utils.to_iso_string(milliseconds)).to eql("2020-11-17T00:39:24.072Z")
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should convert ttl to milliseconds" do
|
25
|
+
time1 = time_utils.ttl_to_milliseconds("1d")
|
26
|
+
expect(time1).to eql(86400000)
|
27
|
+
|
28
|
+
time2 = time_utils.ttl_to_milliseconds("1h")
|
29
|
+
expect(time2).to eql(3600000)
|
30
|
+
|
31
|
+
time3 = time_utils.ttl_to_milliseconds("30m")
|
32
|
+
expect(time3).to eql(1800000)
|
33
|
+
|
34
|
+
time4 = time_utils.ttl_to_milliseconds("50s")
|
35
|
+
expect(time4).to eql(50000)
|
36
|
+
|
37
|
+
time5 = time_utils.ttl_to_milliseconds("90ms")
|
38
|
+
expect(time5).to eql(90)
|
39
|
+
|
40
|
+
time6 = time_utils.ttl_to_milliseconds("1d 1h 30m 50s 90ms")
|
41
|
+
expect(time6).to eql(91850090)
|
42
|
+
|
43
|
+
time7 = time_utils.ttl_to_milliseconds("1h 30m 50s 90ms")
|
44
|
+
expect(time7).to eql(5450090)
|
45
|
+
|
46
|
+
time8 = time_utils.ttl_to_milliseconds("30m 50s 90ms")
|
47
|
+
expect(time8).to eql(1850090)
|
48
|
+
|
49
|
+
time9 = time_utils.ttl_to_milliseconds("50s 90ms")
|
50
|
+
expect(time9).to eql(50090)
|
51
|
+
|
52
|
+
time10 = time_utils.ttl_to_milliseconds("90ms")
|
53
|
+
expect(time10).to eql(90)
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should convert milliseconds to ttl" do
|
57
|
+
ttl1 = time_utils.milliseconds_to_ttl(86400000)
|
58
|
+
expect(ttl1).to eql("1d")
|
59
|
+
|
60
|
+
ttl2 = time_utils.milliseconds_to_ttl(3600000)
|
61
|
+
expect(ttl2).to eql("1h")
|
62
|
+
|
63
|
+
ttl3 = time_utils.milliseconds_to_ttl(1800000)
|
64
|
+
expect(ttl3).to eql("30m")
|
65
|
+
|
66
|
+
ttl4 = time_utils.milliseconds_to_ttl(50000)
|
67
|
+
expect(ttl4).to eql("50s")
|
68
|
+
|
69
|
+
ttl5 = time_utils.milliseconds_to_ttl(90)
|
70
|
+
expect(ttl5).to eql("90ms")
|
71
|
+
|
72
|
+
ttl6 = time_utils.milliseconds_to_ttl(91850090)
|
73
|
+
expect(ttl6).to eql("1d 1h 30m 50s 90ms")
|
74
|
+
|
75
|
+
ttl7 = time_utils.milliseconds_to_ttl(5450090)
|
76
|
+
expect(ttl7).to eql("1h 30m 50s 90ms")
|
77
|
+
|
78
|
+
ttl8 = time_utils.milliseconds_to_ttl(1850090)
|
79
|
+
expect(ttl8).to eql("30m 50s 90ms")
|
80
|
+
|
81
|
+
ttl9 = time_utils.milliseconds_to_ttl(50090)
|
82
|
+
expect(ttl9).to eql("50s 90ms")
|
83
|
+
|
84
|
+
ttl10 = time_utils.milliseconds_to_ttl(90)
|
85
|
+
expect(ttl10).to eql("90ms")
|
86
|
+
end
|
87
|
+
end
|