22#include <glog/logging.h>
23#include <gtest/gtest.h>
35const std::string
test_dir = std::string(getenv(
"TEST_SRCDIR")) +
"/" +
36 std::string(getenv(
"TEST_WORKSPACE")) +
37 "/service/contract/executor/manager/";
39Address get_random_address() {
return AddressManager().CreateRandomAddress(); }
41std::string U256ToString(uint256_t v) {
return eevm::to_hex_string(v); }
42uint256_t HexToInt(
const std::string& v) {
return eevm::to_uint256(v); }
44class ContractManagerTest :
public Test {
47 std::string contract_path =
test_dir +
"test_data/contract.json";
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));
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"];
66TEST_F(ContractManagerTest, NoContract) {
67 ContractManager manager;
68 auto account = manager.GetContract(1234);
69 EXPECT_FALSE(account.ok());
73 ContractManager manager;
75 DeployInfo deploy_info;
78 FuncInfo* new_func = deploy_info.add_func_info();
79 new_func->set_func_name(func.key());
80 new_func->set_hash(func.value());
83 deploy_info.add_init_param(U256ToString(1000));
87 EXPECT_GT(contract_address, 0);
88 auto account = manager.GetContract(contract_address);
89 EXPECT_TRUE(account.ok());
92TEST_F(ContractManagerTest, InitContract) {
93 ContractManager manager;
95 DeployInfo deploy_info;
98 FuncInfo* new_func = deploy_info.add_func_info();
99 new_func->set_func_name(func.key());
100 new_func->set_hash(func.value());
103 deploy_info.add_init_param(U256ToString(1000));
107 EXPECT_GT(contract_address, 0);
108 auto account = manager.GetContract(contract_address);
109 EXPECT_TRUE(account.ok());
111 Address caller = get_random_address();
113 func_params.set_func_name(
"totalSupply()");
114 auto result = manager.ExecContract(caller, contract_address, func_params);
115 EXPECT_EQ(HexToInt(*result), 1000);
118TEST_F(ContractManagerTest, ExecContract) {
119 ContractManager manager;
121 DeployInfo deploy_info;
124 FuncInfo* new_func = deploy_info.add_func_info();
125 new_func->set_func_name(func.key());
126 new_func->set_hash(func.value());
129 deploy_info.add_init_param(U256ToString(1000));
133 EXPECT_GT(contract_address, 0);
134 auto account = manager.GetContract(contract_address);
135 EXPECT_TRUE(account.ok());
137 Address transfer_receiver = get_random_address();
138 Address transfer_receiver2 = get_random_address();
143 func_params.set_func_name(
"balanceOf(address)");
147 manager.ExecContract(
owner_address_, contract_address, func_params);
148 EXPECT_EQ(HexToInt(*result), 1000);
154 func_params.set_func_name(
"balanceOf(address)");
155 func_params.add_param(U256ToString(transfer_receiver));
158 manager.ExecContract(
owner_address_, contract_address, func_params);
159 EXPECT_EQ(HexToInt(*result), 0);
165 func_params.set_func_name(
"transfer(address,uint256)");
166 func_params.add_param(U256ToString(transfer_receiver));
167 func_params.add_param(U256ToString(400));
170 manager.ExecContract(
owner_address_, contract_address, func_params);
171 EXPECT_EQ(HexToInt(*result), 1);
176 Address caller = get_random_address();
178 func_params.set_func_name(
"balanceOf(address)");
179 func_params.add_param(U256ToString(transfer_receiver));
181 auto result = manager.ExecContract(caller, contract_address, func_params);
182 EXPECT_EQ(HexToInt(*result), 400);
186 Address caller = get_random_address();
188 func_params.set_func_name(
"balanceOf(address)");
191 auto result = manager.ExecContract(caller, contract_address, func_params);
192 EXPECT_EQ(HexToInt(*result), 600);
198 func_params.set_func_name(
"approve(address,uint256)");
199 func_params.add_param(U256ToString(transfer_receiver));
200 func_params.add_param(U256ToString(200));
203 manager.ExecContract(transfer_receiver, contract_address, func_params);
204 EXPECT_EQ(HexToInt(*result), 1);
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));
214 manager.ExecContract(transfer_receiver, contract_address, func_params);
215 EXPECT_EQ(HexToInt(*result), 1);
219TEST_F(ContractManagerTest, NoFunc) {
220 ContractManager manager;
222 DeployInfo deploy_info;
225 FuncInfo* new_func = deploy_info.add_func_info();
226 new_func->set_func_name(func.key());
227 new_func->set_hash(func.value());
230 deploy_info.add_init_param(U256ToString(1000));
234 EXPECT_GT(contract_address, 0);
235 auto account = manager.GetContract(contract_address);
236 EXPECT_TRUE(account.ok());
241 func_params.set_func_name(
"balanceOf()");
245 manager.ExecContract(
owner_address_, contract_address, func_params);
246 EXPECT_FALSE(result.ok());
nlohmann::json contract_json_
const std::string test_dir
TEST_F(ResDBTest, TestPBFTService)