22#include <glog/logging.h>
23#include <gtest/gtest.h>
33const std::string
test_dir = std::string(getenv(
"TEST_SRCDIR")) +
"/" +
34 std::string(getenv(
"TEST_WORKSPACE")) +
35 "/service/contract/executor/service/";
37std::string ToString(
const Request& request) {
39 request.SerializeToString(&ret);
43class ContractTransactionManagerTest :
public Test {
45 ContractTransactionManagerTest() {
46 std::string contract_path =
test_dir +
"test_data/contract.json";
48 std::ifstream contract_fstream(contract_path);
49 if (!contract_fstream) {
50 throw std::runtime_error(fmt::format(
51 "Unable to open contract definition file {}", contract_path));
54 nlohmann::json definition = nlohmann::json::parse(contract_fstream);
62 request.set_cmd(Request::CREATE_ACCOUNT);
63 std::unique_ptr<std::string> ret =
executor_.ExecuteData(ToString(request));
64 EXPECT_TRUE(ret !=
nullptr);
65 response.ParseFromString(*ret);
66 return response.account();
69 absl::StatusOr<Contract> Deploy(
const Account& account,
70 DeployInfo deploy_info) {
74 request.set_caller_address(account.address());
75 *request.mutable_deploy_info() = deploy_info;
76 request.set_cmd(Request::DEPLOY);
78 std::unique_ptr<std::string> ret =
executor_.ExecuteData(ToString(request));
79 EXPECT_TRUE(ret !=
nullptr);
81 response.ParseFromString(*ret);
82 if (response.ret() == 0) {
83 return response.contract();
85 return absl::InternalError(
"DeployFail.");
89 absl::StatusOr<uint256_t> Execute(
const std::string& caller_address,
90 const std::string& contract_address,
91 const Params& params) {
95 request.set_caller_address(caller_address);
96 request.set_contract_address(contract_address);
97 request.set_cmd(Request::EXECUTE);
98 *request.mutable_func_params() = params;
100 std::unique_ptr<std::string> ret =
executor_.ExecuteData(ToString(request));
101 EXPECT_TRUE(ret !=
nullptr);
103 response.ParseFromString(*ret);
105 if (response.ret() == 0) {
106 return eevm::to_uint256(response.res());
108 return absl::InternalError(
"DeployFail.");
117TEST_F(ContractTransactionManagerTest, ExecContract) {
120 EXPECT_FALSE(account.address().empty());
122 std::string contract_name =
"ERC20.sol:ERC20Token";
127 DeployInfo deploy_info;
128 deploy_info.set_contract_bin(contract_code);
129 deploy_info.set_contract_name(contract_name);
131 for (
auto& func : func_hashes.items()) {
132 FuncInfo* new_func = deploy_info.add_func_info();
133 new_func->set_func_name(func.key());
134 new_func->set_hash(func.value());
136 deploy_info.add_init_param(
"1000");
138 absl::StatusOr<Contract> contract_or = Deploy(account, deploy_info);
139 EXPECT_TRUE(contract_or.ok());
140 Contract contract = *contract_or;
145 func_params.set_func_name(
"balanceOf(address)");
146 func_params.add_param(account.address());
149 Execute(account.address(), contract.contract_address(), func_params);
150 EXPECT_EQ(*result, 0x3e8);
154 EXPECT_FALSE(account.address().empty());
158 func_params.set_func_name(
"balanceOf(address)");
159 func_params.add_param(transfer_receiver.address());
162 Execute(account.address(), contract.contract_address(), func_params);
163 EXPECT_EQ(*result, 0);
169 func_params.set_func_name(
"transfer(address,uint256)");
170 func_params.add_param(transfer_receiver.address());
171 func_params.add_param(
"400");
174 Execute(account.address(), contract.contract_address(), func_params);
175 EXPECT_EQ(*result, 1);
181 func_params.set_func_name(
"balanceOf(address)");
182 func_params.add_param(account.address());
185 Execute(account.address(), contract.contract_address(), func_params);
186 EXPECT_EQ(*result, 600);
192 func_params.set_func_name(
"balanceOf(address)");
193 func_params.add_param(transfer_receiver.address());
196 Execute(account.address(), contract.contract_address(), func_params);
197 EXPECT_EQ(*result, 400);
201TEST_F(ContractTransactionManagerTest, DeployFail) {
204 EXPECT_FALSE(account.address().empty());
206 std::string contract_name =
"ERC20.sol:ERC20Token";
211 DeployInfo deploy_info;
212 deploy_info.set_contract_bin(contract_code);
213 deploy_info.set_contract_name(contract_name);
215 for (
auto& func : func_hashes.items()) {
216 FuncInfo* new_func = deploy_info.add_func_info();
217 new_func->set_func_name(func.key());
218 new_func->set_hash(func.value());
222 absl::StatusOr<Contract> contract_or = Deploy(account, deploy_info);
223 EXPECT_FALSE(contract_or.ok());
226TEST_F(ContractTransactionManagerTest, NoFunc) {
229 EXPECT_FALSE(account.address().empty());
231 std::string contract_name =
"ERC20.sol:ERC20Token";
236 DeployInfo deploy_info;
237 deploy_info.set_contract_bin(contract_code);
238 deploy_info.set_contract_name(contract_name);
240 for (
auto& func : func_hashes.items()) {
241 FuncInfo* new_func = deploy_info.add_func_info();
242 new_func->set_func_name(func.key());
243 new_func->set_hash(func.value());
245 deploy_info.add_init_param(
"1000");
247 absl::StatusOr<Contract> contract_or = Deploy(account, deploy_info);
248 EXPECT_TRUE(contract_or.ok());
249 Contract contract = *contract_or;
253 func_params.set_func_name(
"balanceOf()");
254 func_params.add_param(account.address());
257 Execute(account.address(), contract.contract_address(), func_params);
258 EXPECT_FALSE(result.ok());
ContractTransactionManager executor_
nlohmann::json contracts_json_
const std::string test_dir
TEST_F(ResDBTest, TestPBFTService)