Skip to content

Commit 8a30139

Browse files
authored
chore: add test coverage for cosmwasm ibc core (#850)
1 parent 670e92e commit 8a30139

13 files changed

+913
-249
lines changed

contracts/cosmwasm-vm/cw-ibc-core/tests/channel/test_acknowledgement.rs

+158-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
1+
use super::*;
2+
3+
use cosmwasm_std::to_vec;
14
use cw_ibc_core::conversions::to_ibc_channel_id;
25

3-
use super::*;
6+
use common::ibc::core::ics04_channel::commitment::AcknowledgementCommitment;
47

58
#[test]
69
fn test_acknowledgement_packet_validate_ordered() {
@@ -89,3 +92,157 @@ fn test_acknowledgement_packet_validate_fail_missing_channel() {
8992
.acknowledgement_packet_validate(deps.as_mut(), info, env, &msg)
9093
.unwrap();
9194
}
95+
96+
#[test]
97+
#[should_panic(expected = "ChannelClosed")]
98+
fn acknowledgement_packet_validate_fail_on_channel_close() {
99+
let msg = get_dummy_raw_msg_acknowledgement(10);
100+
let mut ctx = TestContext::for_acknowledge_packet(get_mock_env(), &msg);
101+
let mut deps = deps();
102+
let contract = CwIbcCoreContext::new();
103+
let info = create_mock_info("channel-creater", "umlg", 2000);
104+
105+
if let Some(chann_end) = &mut ctx.channel_end {
106+
chann_end.state = State::Closed
107+
}
108+
109+
ctx.init_acknowledge_packet(deps.as_mut().storage, &contract);
110+
mock_lightclient_query(ctx.mock_queries, &mut deps);
111+
112+
contract
113+
.acknowledgement_packet_validate(deps.as_mut(), info, ctx.env, &msg)
114+
.unwrap();
115+
}
116+
117+
#[test]
118+
#[should_panic(expected = "InvalidPacketCounterparty")]
119+
fn acknowledgement_packet_validate_fail_on_invalid_packet_counterparty() {
120+
let mut msg = get_dummy_raw_msg_acknowledgement(10);
121+
let mut ctx = TestContext::for_acknowledge_packet(get_mock_env(), &msg);
122+
let mut deps = deps();
123+
let contract = CwIbcCoreContext::new();
124+
let info = create_mock_info("channel-creater", "umlg", 2000);
125+
126+
ctx.init_acknowledge_packet(deps.as_mut().storage, &contract);
127+
mock_lightclient_query(ctx.mock_queries, &mut deps);
128+
129+
if let Some(packet) = &mut msg.packet {
130+
packet.destination_port = "different_port".to_string();
131+
}
132+
133+
contract
134+
.acknowledgement_packet_validate(deps.as_mut(), info, ctx.env, &msg)
135+
.unwrap();
136+
}
137+
138+
#[test]
139+
#[should_panic(
140+
expected = "IbcPacketError { error: IncorrectPacketCommitment { sequence: Sequence(1) } }"
141+
)]
142+
fn acknowledgement_packet_validate_fail_for_incorrect_packet_commitment() {
143+
let mut msg = get_dummy_raw_msg_acknowledgement(10);
144+
let mut ctx = TestContext::for_acknowledge_packet(get_mock_env(), &msg);
145+
let mut deps = deps();
146+
let contract = CwIbcCoreContext::new();
147+
let info = create_mock_info("channel-creater", "umlg", 2000);
148+
149+
ctx.init_acknowledge_packet(deps.as_mut().storage, &contract);
150+
mock_lightclient_query(ctx.mock_queries, &mut deps);
151+
152+
if let Some(packet) = &mut msg.packet {
153+
packet.timeout_height = Some(RawHeight {
154+
revision_height: 100,
155+
revision_number: 100,
156+
});
157+
}
158+
159+
contract
160+
.acknowledgement_packet_validate(deps.as_mut(), info, ctx.env, &msg)
161+
.unwrap();
162+
}
163+
164+
#[test]
165+
#[should_panic(expected = "InvalidPacketSequence")]
166+
fn acknowledgement_packet_validate_fail_for_invalid_packet_sequence() {
167+
let msg = get_dummy_raw_msg_acknowledgement(10);
168+
let mut ctx = TestContext::for_acknowledge_packet(get_mock_env(), &msg);
169+
let mut deps = deps();
170+
let contract = CwIbcCoreContext::new();
171+
let info = create_mock_info("channel-creater", "umlg", 2000);
172+
173+
if let Some(chann_end) = &mut ctx.channel_end {
174+
chann_end.ordering = Order::Ordered
175+
}
176+
177+
ctx.init_acknowledge_packet(deps.as_mut().storage, &contract);
178+
mock_lightclient_query(ctx.mock_queries, &mut deps);
179+
180+
let packet = msg.clone().packet.unwrap();
181+
let dest_port = to_ibc_port_id(&packet.source_port).unwrap();
182+
let dest_channel = to_ibc_channel_id(&packet.source_channel).unwrap();
183+
184+
contract
185+
.store_next_sequence_ack(
186+
deps.as_mut().storage,
187+
&dest_port,
188+
&dest_channel,
189+
&Sequence::from_str("2").unwrap(),
190+
)
191+
.unwrap();
192+
193+
contract
194+
.acknowledgement_packet_validate(deps.as_mut(), info, ctx.env, &msg)
195+
.unwrap();
196+
}
197+
198+
#[test]
199+
#[should_panic(expected = "FrozenClient")]
200+
fn acknowledgement_packet_validate_fail_for_frozen_client() {
201+
let msg = get_dummy_raw_msg_acknowledgement(10);
202+
let mut ctx = TestContext::for_acknowledge_packet(get_mock_env(), &msg);
203+
let mut deps = deps();
204+
let contract = CwIbcCoreContext::new();
205+
let info = create_mock_info("channel-creater", "umlg", 2000);
206+
207+
if let Some(client_state) = &mut ctx.client_state {
208+
client_state.frozen_height = 10
209+
}
210+
211+
ctx.init_acknowledge_packet(deps.as_mut().storage, &contract);
212+
mock_lightclient_query(ctx.mock_queries, &mut deps);
213+
214+
contract
215+
.acknowledgement_packet_validate(deps.as_mut(), info, ctx.env, &msg)
216+
.unwrap();
217+
}
218+
219+
#[test]
220+
fn test_get_packet_acknowledgement() {
221+
let ctx = TestContext::default(get_mock_env());
222+
let mut deps = deps();
223+
let contract = CwIbcCoreContext::new();
224+
225+
let sequence = Sequence::from_str("0").unwrap();
226+
let ack_commitment = AcknowledgementCommitment::from(to_vec("ack").unwrap());
227+
228+
contract
229+
.store_packet_acknowledgement(
230+
deps.as_mut().storage,
231+
&ctx.port_id,
232+
&ctx.channel_id,
233+
sequence,
234+
ack_commitment.clone(),
235+
)
236+
.unwrap();
237+
238+
let res = contract
239+
.get_packet_acknowledgement(
240+
deps.as_ref().storage,
241+
&ctx.port_id,
242+
&ctx.channel_id,
243+
sequence,
244+
)
245+
.unwrap();
246+
247+
assert_eq!(ack_commitment, res);
248+
}

contracts/cosmwasm-vm/cw-ibc-core/tests/channel/test_channel_closeinit.rs

+21
Original file line numberDiff line numberDiff line change
@@ -228,3 +228,24 @@ fn test_on_chan_close_init_submessage() {
228228
channel_close_init_validate.channel().order
229229
);
230230
}
231+
232+
#[test]
233+
#[should_panic(expected = "ClientFrozen")]
234+
fn fail_test_validate_chanel_close_init_for_frozen_client() {
235+
let msg = get_dummy_raw_msg_chan_close_init();
236+
let mut ctx = TestContext::for_channel_close_init(get_mock_env(), &msg);
237+
let mut deps = deps();
238+
let contract = CwIbcCoreContext::default();
239+
let info = create_mock_info("channel-creater", "umlg", 2000);
240+
241+
if let Some(client_state) = &mut ctx.client_state {
242+
client_state.frozen_height = 1
243+
}
244+
245+
ctx.init_channel_close_init(deps.as_mut().storage, &contract);
246+
mock_lightclient_query(ctx.mock_queries, &mut deps);
247+
248+
contract
249+
.validate_channel_close_init(deps.as_mut(), info, &msg)
250+
.unwrap();
251+
}

contracts/cosmwasm-vm/cw-ibc-core/tests/channel/test_close_confirm.rs

+21
Original file line numberDiff line numberDiff line change
@@ -234,3 +234,24 @@ pub fn test_channel_close_confirm_validate_fail_connection_hops() {
234234
};
235235
channel_close_confirm_validate(&channel_id, &channel_end).unwrap();
236236
}
237+
238+
#[test]
239+
#[should_panic(expected = "FrozenClient")]
240+
fn fail_test_validate_channel_close_confirm_for_frozen_client() {
241+
let msg = get_dummy_raw_msg_chan_close_confirm(10);
242+
let mut ctx = TestContext::for_channel_close_confirm(get_mock_env(), &msg);
243+
let mut deps = deps();
244+
let contract = CwIbcCoreContext::default();
245+
let info = create_mock_info("channel-creater", "umlg", 2000);
246+
247+
if let Some(client_state) = &mut ctx.client_state {
248+
client_state.frozen_height = 1
249+
}
250+
251+
ctx.init_channel_close_confirm(deps.as_mut().storage, &contract);
252+
mock_lightclient_query(ctx.mock_queries, &mut deps);
253+
254+
contract
255+
.validate_channel_close_confirm(deps.as_mut(), info, &msg)
256+
.unwrap();
257+
}

contracts/cosmwasm-vm/cw-ibc-core/tests/channel/test_handler.rs

+114
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
use super::*;
22

3+
use common::ibc::core::ics04_channel::channel::Order;
4+
use common::ibc::core::ics24_host::identifier::PortId;
5+
6+
use cw_ibc_core::ics03_connection::State as ConnectionState;
7+
use cw_ibc_core::ics04_channel::{open_init, open_try};
8+
use cw_ibc_core::{context::CwIbcCoreContext, ConnectionEnd};
9+
310
#[test]
411
#[should_panic(expected = "UndefinedConnectionCounterparty")]
512
fn test_validate_open_try_channel_fail_missing_counterparty() {
@@ -20,3 +27,110 @@ fn test_validate_open_try_channel_fail_missing_counterparty() {
2027
.validate_channel_open_try(deps.as_mut(), info, &raw)
2128
.unwrap();
2229
}
30+
31+
#[test]
32+
#[should_panic(expected = "InvalidConnectionHopsLength")]
33+
fn fail_test_validate_open_init_channel_on_invalid_connection_hops_length() {
34+
let mut deps = deps();
35+
let contract = CwIbcCoreContext::default();
36+
let info = create_mock_info("channel-creater", "umlg", 2000);
37+
38+
let mut raw_channel = get_dummy_raw_channel_end(Some(0));
39+
raw_channel.connection_hops = Vec::new();
40+
41+
let msg = RawMsgChannelOpenInit {
42+
port_id: PortId::default().to_string(),
43+
channel: Some(raw_channel),
44+
signer: get_dummy_bech32_account(),
45+
};
46+
contract
47+
.validate_channel_open_init(deps.as_mut(), info, &msg)
48+
.unwrap();
49+
}
50+
51+
#[test]
52+
#[should_panic(expected = "InvalidVersionLengthConnection")]
53+
fn fail_channel_open_init_msg_validate_on_invalid_version_length_of_connection() {
54+
let ctx = TestContext::default(get_mock_env());
55+
56+
let conn_end = ConnectionEnd::new(
57+
ctx.connection_end().state.clone(),
58+
ctx.client_id.clone(),
59+
ctx.connection_end().counterparty().clone(),
60+
Vec::new(),
61+
ctx.connection_end().delay_period().clone(),
62+
);
63+
open_init::channel_open_init_msg_validate(&ctx.channel_end(), conn_end).unwrap();
64+
}
65+
66+
#[test]
67+
#[should_panic(expected = "ChannelFeatureNotSupportedByConnection")]
68+
fn fail_channel_open_init_msg_validate_on_channel_feature_not_supported() {
69+
let mut ctx = TestContext::default(get_mock_env());
70+
if let Some(chann_end) = &mut ctx.channel_end {
71+
chann_end.ordering = Order::None
72+
}
73+
74+
open_init::channel_open_init_msg_validate(&ctx.channel_end(), ctx.connection_end()).unwrap();
75+
}
76+
77+
#[test]
78+
#[should_panic(expected = "ConnectionNotOpen")]
79+
fn fail_channel_open_try_msg_validate_on_invalid_connection_state() {
80+
let mut ctx = TestContext::default(get_mock_env());
81+
if let Some(conn_end) = &mut ctx.connection_end {
82+
conn_end.state = ConnectionState::Init;
83+
}
84+
85+
open_try::channel_open_try_msg_validate(&ctx.channel_end(), &ctx.connection_end()).unwrap();
86+
}
87+
88+
#[test]
89+
#[should_panic(expected = "ChannelFeatureNotSupportedByConnection")]
90+
fn fail_channel_open_try_msg_validate_on_feature_not_supported() {
91+
let mut ctx = TestContext::default(get_mock_env());
92+
if let Some(chann_end) = &mut ctx.channel_end {
93+
chann_end.ordering = Order::None
94+
}
95+
96+
open_try::channel_open_try_msg_validate(&ctx.channel_end(), &ctx.connection_end()).unwrap();
97+
}
98+
99+
#[test]
100+
#[should_panic(expected = "ClientFrozen")]
101+
fn fail_test_validate_open_init_channel_for_frozen_client() {
102+
let mut ctx = TestContext::default(get_mock_env());
103+
let mut deps = deps();
104+
let contract = CwIbcCoreContext::default();
105+
let info = create_mock_info("channel-creater", "umlg", 2000);
106+
107+
if let Some(client_state) = &mut ctx.client_state {
108+
client_state.frozen_height = 1
109+
}
110+
111+
ctx.init_channel_open_init(deps.as_mut().storage, &contract);
112+
mock_lightclient_query(ctx.mock_queries, &mut deps);
113+
114+
let msg = get_dummy_raw_msg_chan_open_init(Some(0));
115+
contract
116+
.validate_channel_open_init(deps.as_mut(), info, &msg)
117+
.unwrap();
118+
}
119+
120+
#[test]
121+
#[should_panic(expected = "InvalidConnectionHopsLength")]
122+
fn fail_test_validate_open_try_channel_on_invalid_connection_hops_length() {
123+
let mut deps = deps();
124+
let contract = CwIbcCoreContext::default();
125+
let info = create_mock_info("channel-creater", "umlg", 2000);
126+
127+
let mut raw_channel = get_dummy_raw_channel_end(Some(0));
128+
raw_channel.connection_hops = Vec::new();
129+
130+
let mut msg = get_dummy_raw_msg_chan_open_try(0);
131+
msg.channel = Some(raw_channel);
132+
133+
contract
134+
.validate_channel_open_try(deps.as_mut(), info, &msg)
135+
.unwrap();
136+
}

0 commit comments

Comments
 (0)