Skip to content

Commit 12ed9f0

Browse files
committed
integration: move silent_prepare_query() to unprepared.rs
The test is strictly about unprepared statements, so it's moved to the corresponding module.
1 parent 8ef8b57 commit 12ed9f0

File tree

3 files changed

+114
-119
lines changed

3 files changed

+114
-119
lines changed

scylla/tests/integration/statements/mod.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ mod execution_profiles;
55
mod named_bind_markers;
66
mod prepared;
77
mod request_timeout;
8-
mod silent_prepare_query;
98
mod skip_metadata_optimization;
109
mod timestamps;
1110
mod transparent_reprepare;

scylla/tests/integration/statements/silent_prepare_query.rs

Lines changed: 0 additions & 112 deletions
This file was deleted.

scylla/tests/integration/statements/unprepared.rs

Lines changed: 114 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,17 @@
1-
use scylla::{
2-
response::{PagingState, PagingStateResponse},
3-
statement::Statement,
4-
};
5-
61
use crate::utils::{
7-
create_new_session_builder, setup_tracing, unique_keyspace_name, PerformDDL as _,
2+
create_new_session_builder, setup_tracing, test_with_3_node_cluster, unique_keyspace_name,
3+
PerformDDL as _,
4+
};
5+
use scylla::client::session::Session;
6+
use scylla::client::session_builder::SessionBuilder;
7+
use scylla::response::{PagingState, PagingStateResponse};
8+
use scylla::statement::unprepared::Statement;
9+
use scylla_proxy::{
10+
Condition, ProxyError, Reaction, RequestOpcode, RequestReaction, RequestRule, ShardAwareness,
11+
WorkerError,
812
};
13+
use std::sync::Arc;
14+
use std::time::Duration;
915

1016
#[tokio::test]
1117
async fn test_unprepared_statement() {
@@ -110,3 +116,105 @@ async fn test_unprepared_statement() {
110116
}
111117
assert_eq!(results_from_manual_paging, results);
112118
}
119+
120+
#[tokio::test]
121+
#[ntest::timeout(30000)]
122+
#[cfg_attr(scylla_cloud_tests, ignore)]
123+
async fn test_prepare_query_with_values() {
124+
setup_tracing();
125+
// unprepared query with non empty values should be prepared
126+
const TIMEOUT_PER_REQUEST: Duration = Duration::from_millis(1000);
127+
128+
let res = test_with_3_node_cluster(ShardAwareness::QueryNode, |proxy_uris, translation_map, mut running_proxy| async move {
129+
// DB preparation phase
130+
let session: Session = SessionBuilder::new()
131+
.known_node(proxy_uris[0].as_str())
132+
.address_translator(Arc::new(translation_map))
133+
.build()
134+
.await
135+
.unwrap();
136+
137+
let ks = unique_keyspace_name();
138+
session.ddl(format!("CREATE KEYSPACE IF NOT EXISTS {} WITH REPLICATION = {{'class' : 'NetworkTopologyStrategy', 'replication_factor' : 3}}", ks)).await.unwrap();
139+
session.use_keyspace(ks, false).await.unwrap();
140+
session
141+
.ddl("CREATE TABLE t (a int primary key)")
142+
.await
143+
.unwrap();
144+
145+
let s: Statement = Statement::from("INSERT INTO t (a) VALUES (?)");
146+
147+
let drop_unprepared_frame_rule = RequestRule(
148+
Condition::RequestOpcode(RequestOpcode::Query)
149+
.and(Condition::BodyContainsCaseSensitive(Box::new(*b"t"))),
150+
RequestReaction::drop_frame(),
151+
);
152+
153+
running_proxy.running_nodes[2]
154+
.change_request_rules(Some(vec![drop_unprepared_frame_rule]));
155+
156+
tokio::select! {
157+
_res = session.query_unpaged(s, (0,)) => (),
158+
_ = tokio::time::sleep(TIMEOUT_PER_REQUEST) => panic!("Rules did not work: no received response"),
159+
};
160+
161+
running_proxy
162+
}).await;
163+
164+
match res {
165+
Ok(()) => (),
166+
Err(ProxyError::Worker(WorkerError::DriverDisconnected(_))) => (),
167+
Err(err) => panic!("{}", err),
168+
}
169+
}
170+
171+
#[tokio::test]
172+
#[ntest::timeout(30000)]
173+
#[cfg_attr(scylla_cloud_tests, ignore)]
174+
async fn test_query_with_no_values() {
175+
setup_tracing();
176+
// unprepared query with empty values should not be prepared
177+
const TIMEOUT_PER_REQUEST: Duration = Duration::from_millis(1000);
178+
179+
let res = test_with_3_node_cluster(ShardAwareness::QueryNode, |proxy_uris, translation_map, mut running_proxy| async move {
180+
// DB preparation phase
181+
let session: Session = SessionBuilder::new()
182+
.known_node(proxy_uris[0].as_str())
183+
.address_translator(Arc::new(translation_map))
184+
.build()
185+
.await
186+
.unwrap();
187+
188+
let ks = unique_keyspace_name();
189+
session.ddl(format!("CREATE KEYSPACE IF NOT EXISTS {} WITH REPLICATION = {{'class' : 'NetworkTopologyStrategy', 'replication_factor' : 3}}", ks)).await.unwrap();
190+
session.use_keyspace(ks, false).await.unwrap();
191+
session
192+
.ddl("CREATE TABLE t (a int primary key)")
193+
.await
194+
.unwrap();
195+
196+
let s: Statement = Statement::from("INSERT INTO t (a) VALUES (1)");
197+
198+
let drop_prepared_frame_rule = RequestRule(
199+
Condition::RequestOpcode(RequestOpcode::Prepare)
200+
.and(Condition::BodyContainsCaseSensitive(Box::new(*b"t"))),
201+
RequestReaction::drop_frame(),
202+
);
203+
204+
running_proxy.running_nodes[2]
205+
.change_request_rules(Some(vec![drop_prepared_frame_rule]));
206+
207+
tokio::select! {
208+
_res = session.query_unpaged(s, ()) => (),
209+
_ = tokio::time::sleep(TIMEOUT_PER_REQUEST) => panic!("Rules did not work: no received response"),
210+
};
211+
212+
running_proxy
213+
}).await;
214+
215+
match res {
216+
Ok(()) => (),
217+
Err(ProxyError::Worker(WorkerError::DriverDisconnected(_))) => (),
218+
Err(err) => panic!("{}", err),
219+
}
220+
}

0 commit comments

Comments
 (0)