Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
YottaChain
YTBP
提交
5b79ea0b
Y
YTBP
项目概览
YottaChain
/
YTBP
通知
0
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
Y
YTBP
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
5b79ea0b
编写于
5月 01, 2018
作者:
K
Kevin Heifner
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Update comments
上级
fdcf0073
变更
5
显示空白变更内容
内联
并排
Showing
5 changed file
with
2 addition
and
268 deletion
+2
-268
tests/common/database_fixture.cpp
tests/common/database_fixture.cpp
+0
-266
tests/config.hpp.in
tests/config.hpp.in
+0
-0
tests/main.cpp
tests/main.cpp
+0
-0
tests/wallet_tests.cpp
tests/wallet_tests.cpp
+0
-0
unittests/CMakeLists.txt
unittests/CMakeLists.txt
+2
-2
未找到文件。
tests/common/database_fixture.cpp
已删除
100644 → 0
浏览文件 @
fdcf0073
/**
* @file
* @copyright defined in eos/LICENSE.txt
*/
#include <boost/test/unit_test.hpp>
#include <boost/program_options.hpp>
#include <boost/signals2/shared_connection_block.hpp>
#include <eos/chain/account_object.hpp>
#include <eos/chain/producer_object.hpp>
#include <eos/chain/authority_checker.hpp>
#include <eos/producer_plugin/producer_plugin.hpp>
#include <eos/utilities/tempdir.hpp>
#include <eos/native_contract/native_contract_chain_initializer.hpp>
#include <eos/native_contract/native_contract_chain_administrator.hpp>
#include <eos/native_contract/objects.hpp>
#include <fc/crypto/digest.hpp>
#include <fc/smart_ref_impl.hpp>
#include <Inline/BasicTypes.h>
#include <IR/Module.h>
#include <IR/Validate.h>
#include <WAST/WAST.h>
#include <WASM/WASM.h>
#include <Runtime/Runtime.h>
#include <boost/range/adaptor/map.hpp>
#include <iostream>
#include <iomanip>
#include <sstream>
#include "database_fixture.hpp"
uint32_t
EOS_TESTING_GENESIS_TIMESTAMP
=
1431700005
;
namespace
eosio
{
namespace
chain
{
testing_fixture
::
testing_fixture
()
{
default_genesis_state
.
initial_timestamp
=
fc
::
time_point_sec
(
EOS_TESTING_GENESIS_TIMESTAMP
);
for
(
int
i
=
0
;
i
<
config
::
blocks_per_round
;
++
i
)
{
auto
name
=
std
::
string
(
"inita"
);
name
.
back
()
+=
i
;
auto
private_key
=
fc
::
ecc
::
private_key
::
regenerate
(
fc
::
sha256
::
hash
(
name
));
public_key_type
public_key
=
private_key
.
get_public_key
();
default_genesis_state
.
initial_accounts
.
emplace_back
(
name
,
0
,
100000
,
public_key
,
public_key
);
store_private_key
(
private_key
);
private_key
=
fc
::
ecc
::
private_key
::
regenerate
(
fc
::
sha256
::
hash
(
name
+
".producer"
));
public_key
=
private_key
.
get_public_key
();
default_genesis_state
.
initial_producers
.
emplace_back
(
name
,
public_key
);
store_private_key
(
private_key
);
}
}
fc
::
path
testing_fixture
::
get_temp_dir
(
std
::
string
id
)
{
if
(
id
.
empty
())
{
anonymous_temp_dirs
.
emplace_back
();
return
anonymous_temp_dirs
.
back
().
path
();
}
if
(
named_temp_dirs
.
count
(
id
))
return
named_temp_dirs
[
id
].
path
();
return
named_temp_dirs
.
emplace
(
std
::
make_pair
(
id
,
fc
::
temp_directory
())).
first
->
second
.
path
();
}
const
native_contract
::
genesis_state_type
&
testing_fixture
::
genesis_state
()
const
{
return
default_genesis_state
;
}
native_contract
::
genesis_state_type
&
testing_fixture
::
genesis_state
()
{
return
default_genesis_state
;
}
void
testing_fixture
::
store_private_key
(
const
private_key_type
&
key
)
{
key_ring
[
key
.
get_public_key
()]
=
key
;
}
private_key_type
testing_fixture
::
get_private_key
(
const
public_key_type
&
public_key
)
const
{
auto
itr
=
key_ring
.
find
(
public_key
);
EOS_ASSERT
(
itr
!=
key_ring
.
end
(),
missing_key_exception
,
"Private key corresponding to public key ${k} not known."
,
(
"k"
,
public_key
));
return
itr
->
second
;
}
flat_set
<
public_key_type
>
testing_fixture
::
available_keys
()
const
{
auto
range
=
key_ring
|
boost
::
adaptors
::
map_keys
;
return
{
range
.
begin
(),
range
.
end
()};
}
testing_blockchain
::
testing_blockchain
(
chainbase
::
database
&
db
,
fork_database
&
fork_db
,
block_log
&
blocklog
,
chain_initializer_interface
&
initializer
,
testing_fixture
&
fixture
)
:
chain_controller
(
db
,
fork_db
,
blocklog
,
initializer
,
native_contract
::
make_administrator
(),
::
eosio
::
chain_plugin
::
default_transaction_execution_time
*
1000
,
::
eosio
::
chain_plugin
::
default_received_block_transaction_execution_time
*
1000
,
::
eosio
::
chain_plugin
::
default_create_block_transaction_execution_time
*
1000
,
chain_controller
::
txn_msg_limits
{}),
db
(
db
),
fixture
(
fixture
)
{}
testing_blockchain
::
testing_blockchain
(
chainbase
::
database
&
db
,
fork_database
&
fork_db
,
block_log
&
blocklog
,
chain_initializer_interface
&
initializer
,
testing_fixture
&
fixture
,
uint32_t
transaction_execution_time_msec
,
uint32_t
received_block_execution_time_msec
,
uint32_t
create_block_execution_time_msec
,
const
chain_controller
::
txn_msg_limits
&
rate_limits
)
:
chain_controller
(
db
,
fork_db
,
blocklog
,
initializer
,
native_contract
::
make_administrator
(),
transaction_execution_time_msec
*
1000
,
received_block_execution_time_msec
*
1000
,
create_block_execution_time_msec
*
1000
,
rate_limits
),
db
(
db
),
fixture
(
fixture
)
{}
void
testing_blockchain
::
produce_blocks
(
uint32_t
count
,
uint32_t
blocks_to_miss
)
{
if
(
count
==
0
)
return
;
for
(
int
i
=
0
;
i
<
count
;
++
i
)
{
auto
slot
=
blocks_to_miss
+
1
;
auto
producer
=
get_producer
(
get_scheduled_producer
(
slot
));
auto
private_key
=
fixture
.
get_private_key
(
producer
.
signing_key
);
generate_block
(
get_slot_time
(
slot
),
producer
.
owner
,
private_key
,
block_schedule
::
in_single_thread
,
chain_controller
::
created_block
|
(
skip_trx_sigs
?
chain_controller
::
skip_transaction_signatures
:
0
));
}
}
void
testing_blockchain
::
sync_with
(
testing_blockchain
&
other
)
{
// Already in sync?
if
(
head_block_id
()
==
other
.
head_block_id
())
return
;
// If other has a longer chain than we do, sync it to us first
if
(
head_block_num
()
<
other
.
head_block_num
())
return
other
.
sync_with
(
*
this
);
auto
sync_dbs
=
[](
testing_blockchain
&
a
,
testing_blockchain
&
b
)
{
for
(
int
i
=
1
;
i
<=
a
.
head_block_num
();
++
i
)
{
auto
block
=
a
.
fetch_block_by_number
(
i
);
if
(
block
&&
!
b
.
is_known_block
(
block
->
id
()))
{
b
.
push_block
(
*
block
,
chain_controller
::
validation_steps
::
created_block
);
}
}
};
sync_dbs
(
*
this
,
other
);
sync_dbs
(
other
,
*
this
);
}
types
::
asset
testing_blockchain
::
get_liquid_balance
(
const
types
::
account_name
&
account
)
{
return
get_database
().
get
<
balance_object
,
eosio
::
chain
::
by_owner_name
>
(
account
).
balance
;
}
types
::
asset
testing_blockchain
::
get_staked_balance
(
const
types
::
account_name
&
account
)
{
return
get_database
().
get
<
staked_balance_object
,
eosio
::
chain
::
by_owner_name
>
(
account
).
staked_balance
;
}
types
::
asset
testing_blockchain
::
get_unstaking_balance
(
const
types
::
account_name
&
account
)
{
return
get_database
().
get
<
staked_balance_object
,
eosio
::
chain
::
by_owner_name
>
(
account
).
unstaking_balance
;
}
std
::
set
<
types
::
account_name
>
testing_blockchain
::
get_approved_producers
(
const
types
::
account_name
&
account
)
{
const
auto
&
sbo
=
get_database
().
get
<
staked_balance_object
,
by_owner_name
>
(
account
);
if
(
sbo
.
producer_votes
.
contains
<
producer_slate
>
())
{
auto
range
=
sbo
.
producer_votes
.
get
<
producer_slate
>
().
range
();
return
{
range
.
begin
(),
range
.
end
()};
}
return
{};
}
types
::
public_key
testing_blockchain
::
get_block_signing_key
(
const
types
::
account_name
&
producerName
)
{
return
get_database
().
get
<
producer_object
,
by_owner
>
(
producerName
).
signing_key
;
}
void
testing_blockchain
::
sign_transaction
(
signed_transaction
&
trx
)
const
{
auto
keys
=
get_required_keys
(
trx
,
fixture
.
available_keys
());
for
(
const
auto
&
k
:
keys
)
{
// TODO: Use a real chain_id here
trx
.
sign
(
fixture
.
get_private_key
(
k
),
chain_id_type
{});
}
}
fc
::
optional
<
processed_transaction
>
testing_blockchain
::
push_transaction
(
signed_transaction
trx
,
uint32_t
skip_flags
)
{
if
(
skip_trx_sigs
)
skip_flags
|=
chain_controller
::
skip_transaction_signatures
;
if
(
auto_sign_trxs
)
{
sign_transaction
(
trx
);
}
if
(
hold_for_review
)
{
review_storage
=
std
::
make_pair
(
trx
,
skip_flags
);
return
{};
}
return
chain_controller
::
push_transaction
(
trx
,
skip_flags
|
chain_controller
::
pushed_transaction
);
}
vector
<
uint8_t
>
testing_blockchain
::
assemble_wast
(
const
std
::
string
&
wast
)
{
// std::cout << "\n" << wast << "\n";
IR
::
Module
module
;
std
::
vector
<
WAST
::
Error
>
parseErrors
;
WAST
::
parseModule
(
wast
.
c_str
(),
wast
.
size
(),
module
,
parseErrors
);
if
(
parseErrors
.
size
())
{
// Print any parse errors;
std
::
cerr
<<
"Error parsing WebAssembly text file:"
<<
std
::
endl
;
for
(
auto
&
error
:
parseErrors
)
{
std
::
cerr
<<
":"
<<
error
.
locus
.
describe
()
<<
": "
<<
error
.
message
.
c_str
()
<<
std
::
endl
;
std
::
cerr
<<
error
.
locus
.
sourceLine
<<
std
::
endl
;
std
::
cerr
<<
std
::
setw
(
error
.
locus
.
column
(
8
))
<<
"^"
<<
std
::
endl
;
}
FC_ASSERT
(
!
"error parsing wast"
);
}
try
{
// Serialize the WebAssembly module.
Serialization
::
ArrayOutputStream
stream
;
WASM
::
serialize
(
stream
,
module
);
return
stream
.
getBytes
();
}
catch
(
Serialization
::
FatalSerializationException
exception
)
{
std
::
cerr
<<
"Error serializing WebAssembly binary file:"
<<
std
::
endl
;
std
::
cerr
<<
exception
.
message
<<
std
::
endl
;
throw
;
}
}
void
testing_network
::
connect_blockchain
(
testing_blockchain
&
new_database
)
{
if
(
blockchains
.
count
(
&
new_database
))
return
;
// If the network isn't empty, sync the new database with one of the old ones. The old ones are already in sync with
// each other, so just grab one arbitrarily. The old databases are connected to the propagation signals, so when one
// of them gets synced, it will propagate blocks to the others as well.
if
(
!
blockchains
.
empty
())
{
blockchains
.
begin
()
->
first
->
sync_with
(
new_database
);
}
// The new database is now in sync with any old ones; go ahead and connect the propagation signal.
blockchains
[
&
new_database
]
=
new_database
.
applied_block
.
connect
([
this
,
&
new_database
](
const
signed_block
&
block
)
{
propagate_block
(
block
,
new_database
);
});
}
void
testing_network
::
disconnect_database
(
testing_blockchain
&
leaving_database
)
{
blockchains
.
erase
(
&
leaving_database
);
}
void
testing_network
::
disconnect_all
()
{
blockchains
.
clear
();
}
void
testing_network
::
propagate_block
(
const
signed_block
&
block
,
const
testing_blockchain
&
skip_db
)
{
for
(
const
auto
&
pair
:
blockchains
)
{
if
(
pair
.
first
==
&
skip_db
)
continue
;
boost
::
signals2
::
shared_connection_block
blocker
(
pair
.
second
);
pair
.
first
->
push_block
(
block
,
chain_controller
::
created_block
);
}
}
}
}
// eosio::chain
tests/
tests/
config.hpp.in
→
tests/config.hpp.in
浏览文件 @
5b79ea0b
文件已移动
tests/
common/
main.cpp
→
tests/main.cpp
浏览文件 @
5b79ea0b
文件已移动
tests/
tests/
wallet_tests.cpp
→
tests/wallet_tests.cpp
浏览文件 @
5b79ea0b
文件已移动
unittests/CMakeLists.txt
浏览文件 @
5b79ea0b
...
...
@@ -29,8 +29,8 @@ target_include_directories( unit_test PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/wasm_te
target_include_directories
(
unit_test PUBLIC
${
CMAKE_CURRENT_SOURCE_DIR
}
/include
)
add_dependencies
(
unit_test asserter test_api test_api_mem test_api_db test_api_multi_index exchange eosio.token proxy identity identity_test stltest infinite eosio.system eosio.token eosio.bios test.inline multi_index_test noop dice eosio.msig
)
#Manually run
chain
_test for all supported runtimes
#To run
chain_test with all log from blockchain displayed, put --verbose after --, i.e. chain
_test -- --verbose
#Manually run
unit
_test for all supported runtimes
#To run
unit_test with all log from blockchain displayed, put --verbose after --, i.e. unit
_test -- --verbose
add_test
(
NAME unit_test_binaryen COMMAND unit_test -t \!auth_tests/linkauth_special -t \!eosio_system_tests/* -t \!delay_tests/* --report_level=detailed --color_output -- --binaryen
)
add_test
(
NAME unit_test_wavm COMMAND unit_test -t \!auth_tests/linkauth_special -t \!eosio_system_tests/* -t \!delay_tests/* --report_level=detailed --color_output --catch_system_errors=no -- --wavm
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录