Loading...
Searching...
No Matches
contract_manager_test.cpp
Go to the documentation of this file.
1/*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing,
13 * software distributed under the License is distributed on an
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 * KIND, either express or implied. See the License for the
16 * specific language governing permissions and limitations
17 * under the License.
18 */
19
21
22#include <glog/logging.h>
23#include <gtest/gtest.h>
24
25#include <fstream>
26
28
29namespace resdb {
30namespace contract {
31namespace {
32
33using ::testing::Test;
34
35const std::string test_dir = std::string(getenv("TEST_SRCDIR")) + "/" +
36 std::string(getenv("TEST_WORKSPACE")) +
37 "/service/contract/executor/manager/";
38
39Address get_random_address() { return AddressManager().CreateRandomAddress(); }
40
41std::string U256ToString(uint256_t v) { return eevm::to_hex_string(v); }
42uint256_t HexToInt(const std::string& v) { return eevm::to_uint256(v); }
43
44class ContractManagerTest : public Test {
45 public:
46 ContractManagerTest() : owner_address_(get_random_address()) {
47 std::string contract_path = test_dir + "test_data/contract.json";
48
49 std::ifstream contract_fstream(contract_path);
50 if (!contract_fstream) {
51 throw std::runtime_error(fmt::format(
52 "Unable to open contract definition file {}", contract_path));
53 }
54
55 const auto contracts_definition = nlohmann::json::parse(contract_fstream);
56 const auto all_contracts = contracts_definition["contracts"];
57 const auto contract_code = all_contracts["ERC20.sol:ERC20Token"];
58 contract_json_ = contract_code;
59 }
60
61 protected:
63 nlohmann::json contract_json_;
64};
65
66TEST_F(ContractManagerTest, NoContract) {
67 ContractManager manager;
68 auto account = manager.GetContract(1234);
69 EXPECT_FALSE(account.ok());
70}
71
72TEST_F(ContractManagerTest, DeployContract) {
73 ContractManager manager;
74
75 DeployInfo deploy_info;
76 deploy_info.set_contract_bin(contract_json_["bin"]);
77 for (auto& func : contract_json_["hashes"].items()) {
78 FuncInfo* new_func = deploy_info.add_func_info();
79 new_func->set_func_name(func.key());
80 new_func->set_hash(func.value());
81 }
82
83 deploy_info.add_init_param(U256ToString(1000));
84
85 Address contract_address =
86 manager.DeployContract(owner_address_, deploy_info);
87 EXPECT_GT(contract_address, 0);
88 auto account = manager.GetContract(contract_address);
89 EXPECT_TRUE(account.ok());
90}
91
92TEST_F(ContractManagerTest, InitContract) {
93 ContractManager manager;
94
95 DeployInfo deploy_info;
96 deploy_info.set_contract_bin(contract_json_["bin"]);
97 for (auto& func : contract_json_["hashes"].items()) {
98 FuncInfo* new_func = deploy_info.add_func_info();
99 new_func->set_func_name(func.key());
100 new_func->set_hash(func.value());
101 }
102
103 deploy_info.add_init_param(U256ToString(1000));
104
105 Address contract_address =
106 manager.DeployContract(owner_address_, deploy_info);
107 EXPECT_GT(contract_address, 0);
108 auto account = manager.GetContract(contract_address);
109 EXPECT_TRUE(account.ok());
110
111 Address caller = get_random_address();
112 Params func_params;
113 func_params.set_func_name("totalSupply()");
114 auto result = manager.ExecContract(caller, contract_address, func_params);
115 EXPECT_EQ(HexToInt(*result), 1000);
116}
117
118TEST_F(ContractManagerTest, ExecContract) {
119 ContractManager manager;
120
121 DeployInfo deploy_info;
122 deploy_info.set_contract_bin(contract_json_["bin"]);
123 for (auto& func : contract_json_["hashes"].items()) {
124 FuncInfo* new_func = deploy_info.add_func_info();
125 new_func->set_func_name(func.key());
126 new_func->set_hash(func.value());
127 }
128
129 deploy_info.add_init_param(U256ToString(1000));
130
131 Address contract_address =
132 manager.DeployContract(owner_address_, deploy_info);
133 EXPECT_GT(contract_address, 0);
134 auto account = manager.GetContract(contract_address);
135 EXPECT_TRUE(account.ok());
136
137 Address transfer_receiver = get_random_address();
138 Address transfer_receiver2 = get_random_address();
139
140 // owner 1000
141 {
142 Params func_params;
143 func_params.set_func_name("balanceOf(address)");
144 func_params.add_param(U256ToString(owner_address_));
145
146 auto result =
147 manager.ExecContract(owner_address_, contract_address, func_params);
148 EXPECT_EQ(HexToInt(*result), 1000);
149 }
150
151 // receiver 0
152 {
153 Params func_params;
154 func_params.set_func_name("balanceOf(address)");
155 func_params.add_param(U256ToString(transfer_receiver));
156
157 auto result =
158 manager.ExecContract(owner_address_, contract_address, func_params);
159 EXPECT_EQ(HexToInt(*result), 0);
160 }
161
162 // transfer 400 to receiver
163 {
164 Params func_params;
165 func_params.set_func_name("transfer(address,uint256)");
166 func_params.add_param(U256ToString(transfer_receiver));
167 func_params.add_param(U256ToString(400));
168
169 auto result =
170 manager.ExecContract(owner_address_, contract_address, func_params);
171 EXPECT_EQ(HexToInt(*result), 1);
172 }
173
174 // receiver 400
175 {
176 Address caller = get_random_address();
177 Params func_params;
178 func_params.set_func_name("balanceOf(address)");
179 func_params.add_param(U256ToString(transfer_receiver));
180
181 auto result = manager.ExecContract(caller, contract_address, func_params);
182 EXPECT_EQ(HexToInt(*result), 400);
183 }
184 // owner 600
185 {
186 Address caller = get_random_address();
187 Params func_params;
188 func_params.set_func_name("balanceOf(address)");
189 func_params.add_param(U256ToString(owner_address_));
190
191 auto result = manager.ExecContract(caller, contract_address, func_params);
192 EXPECT_EQ(HexToInt(*result), 600);
193 }
194
195 // transfer 200 to receiver2 from receiver
196 {
197 Params func_params;
198 func_params.set_func_name("approve(address,uint256)");
199 func_params.add_param(U256ToString(transfer_receiver));
200 func_params.add_param(U256ToString(200));
201
202 auto result =
203 manager.ExecContract(transfer_receiver, contract_address, func_params);
204 EXPECT_EQ(HexToInt(*result), 1);
205 }
206 {
207 Params func_params;
208 func_params.set_func_name("transferFrom(address,address,uint256)");
209 func_params.add_param(U256ToString(transfer_receiver));
210 func_params.add_param(U256ToString(transfer_receiver2));
211 func_params.add_param(U256ToString(200));
212
213 auto result =
214 manager.ExecContract(transfer_receiver, contract_address, func_params);
215 EXPECT_EQ(HexToInt(*result), 1);
216 }
217}
218
219TEST_F(ContractManagerTest, NoFunc) {
220 ContractManager manager;
221
222 DeployInfo deploy_info;
223 deploy_info.set_contract_bin(contract_json_["bin"]);
224 for (auto& func : contract_json_["hashes"].items()) {
225 FuncInfo* new_func = deploy_info.add_func_info();
226 new_func->set_func_name(func.key());
227 new_func->set_hash(func.value());
228 }
229
230 deploy_info.add_init_param(U256ToString(1000));
231
232 Address contract_address =
233 manager.DeployContract(owner_address_, deploy_info);
234 EXPECT_GT(contract_address, 0);
235 auto account = manager.GetContract(contract_address);
236 EXPECT_TRUE(account.ok());
237
238 // owner 1000
239 {
240 Params func_params;
241 func_params.set_func_name("balanceOf()");
242 func_params.add_param(U256ToString(owner_address_));
243
244 auto result =
245 manager.ExecContract(owner_address_, contract_address, func_params);
246 EXPECT_FALSE(result.ok());
247 }
248}
249
250} // namespace
251} // namespace contract
252} // namespace resdb
nlohmann::json contract_json_
Address owner_address_
void DeployContract(ContractClient *client, const std::string &caller_address, const std::string &contract_name, const std::string &contract_path, const std::vector< std::string > &init_params)
eevm::Address Address
Definition utils.h:27
const std::string test_dir
TEST_F(ResDBTest, TestPBFTService)