Skip to content

Commit df95677

Browse files
committed
increase test coverage
1 parent b035c06 commit df95677

File tree

3 files changed

+135
-7
lines changed

3 files changed

+135
-7
lines changed

Cargo.lock

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

light-client-lib/Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,3 +78,5 @@ rand = "0.8"
7878
serde_json = "1.0"
7979
lazy_static = "1.3.0"
8080
env_logger = "0.11"
81+
ckb-db = "0.121.0"
82+
ckb-db-schema = "0.121.0"

light-client-lib/src/tests/verify.rs

Lines changed: 131 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,141 @@
11
use std::sync::Arc;
22

3-
use ckb_jsonrpc_types::{Block, Script, Transaction};
4-
use ckb_types::{
5-
core::Capacity,
6-
packed,
7-
prelude::{IntoHeaderView, IntoTransactionView as _},
8-
};
9-
103
use crate::{
114
storage::{ScriptStatus, ScriptType, StorageWithChainData},
125
tests::{prelude::*, utils::MockChain},
136
verify::{resolve_tx, verify_tx, FeeCalculator},
147
};
8+
use ckb_chain_spec::consensus::Consensus;
9+
use ckb_dao_utils::pack_dao_data;
10+
use ckb_db::RocksDB;
11+
use ckb_db_schema::COLUMNS;
12+
use ckb_jsonrpc_types::{Block, Script, Transaction};
13+
use ckb_store::{ChainDB, ChainStore};
14+
use ckb_types::{
15+
bytes::Bytes,
16+
core::{capacity_bytes, BlockBuilder, Capacity, EpochNumberWithFraction, HeaderBuilder},
17+
packed::{self, CellOutput},
18+
prelude::{Entity, IntoHeaderView, IntoTransactionView as _, Pack},
19+
};
20+
use ckb_types::{core::TransactionBuilder, prelude::Builder};
21+
use tempfile::TempDir;
22+
#[test]
23+
fn check_withdraw_calculation() {
24+
let data = Bytes::from(vec![1; 10]);
25+
let output = CellOutput::new_builder()
26+
.capacity(capacity_bytes!(1000000).pack())
27+
.build();
28+
let tx = TransactionBuilder::default()
29+
.output(output.clone())
30+
.output_data(data.pack())
31+
.build();
32+
let epoch = EpochNumberWithFraction::new(1, 100, 1000);
33+
let deposit_header = HeaderBuilder::default()
34+
.number(100.pack())
35+
.epoch(epoch.pack())
36+
.dao(pack_dao_data(
37+
10_000_000_000_123_456,
38+
Default::default(),
39+
Default::default(),
40+
Default::default(),
41+
))
42+
.build();
43+
let deposit_block = BlockBuilder::default()
44+
.header(deposit_header)
45+
.transaction(tx)
46+
.build();
47+
48+
let epoch = EpochNumberWithFraction::new(1, 200, 1000);
49+
let withdrawing_header = HeaderBuilder::default()
50+
.number(200.pack())
51+
.epoch(epoch.pack())
52+
.dao(pack_dao_data(
53+
10_000_000_001_123_456,
54+
Default::default(),
55+
Default::default(),
56+
Default::default(),
57+
))
58+
.build();
59+
let withdrawing_block = BlockBuilder::default().header(withdrawing_header).build();
60+
61+
let tmp_dir = TempDir::new().unwrap();
62+
let db = RocksDB::open_in(&tmp_dir, COLUMNS);
63+
let store = ChainDB::new(db, Default::default());
64+
let txn = store.begin_transaction();
65+
txn.insert_block(&deposit_block).unwrap();
66+
txn.attach_block(&deposit_block).unwrap();
67+
txn.insert_block(&withdrawing_block).unwrap();
68+
txn.attach_block(&withdrawing_block).unwrap();
69+
txn.commit().unwrap();
70+
71+
let consensus = Arc::new(Consensus::default());
72+
let data_loader = Arc::new(store.borrow_as_data_loader());
73+
let calculator = FeeCalculator::new(Arc::clone(&consensus), data_loader);
74+
let result = calculator.calculate_maximum_withdraw(
75+
&output,
76+
Capacity::bytes(data.len()).expect("should not overflow"),
77+
&deposit_block.hash(),
78+
&withdrawing_block.hash(),
79+
);
80+
assert_eq!(result.unwrap(), Capacity::shannons(100_000_000_009_999));
81+
}
82+
83+
#[test]
84+
fn check_withdraw_calculation_overflows() {
85+
let output = CellOutput::new_builder()
86+
.capacity(Capacity::shannons(18_446_744_073_709_550_000).pack())
87+
.build();
88+
let tx = TransactionBuilder::default().output(output.clone()).build();
89+
let epoch = EpochNumberWithFraction::new(1, 100, 1000);
90+
let deposit_header = HeaderBuilder::default()
91+
.number(100.pack())
92+
.epoch(epoch.pack())
93+
.dao(pack_dao_data(
94+
10_000_000_000_123_456,
95+
Default::default(),
96+
Default::default(),
97+
Default::default(),
98+
))
99+
.build();
100+
let deposit_block = BlockBuilder::default()
101+
.header(deposit_header)
102+
.transaction(tx)
103+
.build();
104+
105+
let epoch = EpochNumberWithFraction::new(1, 200, 1000);
106+
let withdrawing_header = HeaderBuilder::default()
107+
.number(200.pack())
108+
.epoch(epoch.pack())
109+
.dao(pack_dao_data(
110+
10_000_000_001_123_456,
111+
Default::default(),
112+
Default::default(),
113+
Default::default(),
114+
))
115+
.build();
116+
let withdrawing_block = BlockBuilder::default().header(withdrawing_header).build();
117+
118+
let tmp_dir = TempDir::new().unwrap();
119+
let db = RocksDB::open_in(&tmp_dir, COLUMNS);
120+
let store = ChainDB::new(db, Default::default());
121+
let txn = store.begin_transaction();
122+
txn.insert_block(&deposit_block).unwrap();
123+
txn.attach_block(&deposit_block).unwrap();
124+
txn.insert_block(&withdrawing_block).unwrap();
125+
txn.attach_block(&withdrawing_block).unwrap();
126+
txn.commit().unwrap();
127+
128+
let consensus = Arc::new(Consensus::default());
129+
let data_loader = Arc::new(store.borrow_as_data_loader());
130+
let calculator = FeeCalculator::new(consensus, data_loader);
131+
let result = calculator.calculate_maximum_withdraw(
132+
&output,
133+
Capacity::bytes(0).expect("should not overflow"),
134+
&deposit_block.hash(),
135+
&withdrawing_block.hash(),
136+
);
137+
assert!(result.is_err());
138+
}
15139

16140
#[test]
17141
fn verify_valid_transaction_and_fee() {

0 commit comments

Comments
 (0)