Skip to content

Commit 19c47cb

Browse files
committed
add tests for max_name_len and fix one bug.
1 parent 0417764 commit 19c47cb

File tree

5 files changed

+97
-16
lines changed

5 files changed

+97
-16
lines changed

questdb-rs/src/ingress/http.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
******************************************************************************/
2424

2525
use super::conf::ConfigSetting;
26-
use super::MAX_NAME_LEN_DEFAULT;
2726
use crate::error::fmt;
2827
use crate::{error, Error};
2928
use base64ct::Base64;
@@ -441,6 +440,7 @@ pub(super) fn http_send_with_retries(
441440
pub(super) fn read_server_settings(
442441
state: &HttpHandlerState,
443442
settings_url: &str,
443+
default_max_name_len: usize,
444444
) -> Result<(Vec<ProtocolVersion>, usize), Error> {
445445
let default_protocol_version = ProtocolVersion::V1;
446446

@@ -455,7 +455,7 @@ pub(super) fn read_server_settings(
455455
let status = res.status();
456456
_ = res.into_body().read_to_vec();
457457
if status.as_u16() == 404 {
458-
return Ok((vec![default_protocol_version], MAX_NAME_LEN_DEFAULT));
458+
return Ok((vec![default_protocol_version], default_max_name_len));
459459
}
460460
return Err(fmt!(
461461
ProtocolVersionError,
@@ -471,7 +471,7 @@ pub(super) fn read_server_settings(
471471
let e = match err {
472472
ureq::Error::StatusCode(code) => {
473473
if code == 404 {
474-
return Ok((vec![default_protocol_version], MAX_NAME_LEN_DEFAULT));
474+
return Ok((vec![default_protocol_version], default_max_name_len));
475475
} else {
476476
fmt!(
477477
ProtocolVersionError,
@@ -528,7 +528,7 @@ pub(super) fn read_server_settings(
528528
.get("config")
529529
.and_then(|v| v.get("cairo.max.file.name.length"))
530530
.and_then(|v| v.as_u64())
531-
.unwrap_or(MAX_NAME_LEN_DEFAULT as u64) as usize;
531+
.unwrap_or(default_max_name_len as u64) as usize;
532532
Ok((support_versions, max_name_length))
533533
} else {
534534
Err(error::fmt!(

questdb-rs/src/ingress/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ use ring::{
5757
signature::{EcdsaKeyPair, ECDSA_P256_SHA256_FIXED_SIGNING},
5858
};
5959

60-
pub(crate) const MAX_NAME_LEN_DEFAULT: usize = 127;
60+
const MAX_NAME_LEN_DEFAULT: usize = 127;
6161

6262
/// The maximum allowed dimensions for arrays.
6363
pub const MAX_ARRAY_DIMS: usize = 32;
@@ -2618,7 +2618,7 @@ impl SenderBuilder {
26182618
self.port.deref()
26192619
);
26202620
let (protocol_versions, server_max_name_len) =
2621-
read_server_settings(http_state, settings_url)?;
2621+
read_server_settings(http_state, settings_url, max_name_len)?;
26222622
max_name_len = server_max_name_len;
26232623
if protocol_versions.contains(&ProtocolVersion::V2) {
26242624
ProtocolVersion::V2

questdb-rs/src/tests/http.rs

Lines changed: 80 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -701,10 +701,12 @@ fn test_transactional(
701701
fn _test_sender_auto_detect_protocol_version(
702702
supported_versions: Option<Vec<u16>>,
703703
expect_version: ProtocolVersion,
704+
max_name_len: usize,
705+
expect_max_name_len: usize,
704706
) -> TestResult {
705707
let supported_versions1 = supported_versions.clone();
706708
let mut server = MockServer::new()?
707-
.configure_settings_response(supported_versions.as_deref().unwrap_or(&[]));
709+
.configure_settings_response(supported_versions.as_deref().unwrap_or(&[]), max_name_len);
708710
let sender_builder = server.lsb_http();
709711

710712
let server_thread = std::thread::spawn(move || -> io::Result<MockServer> {
@@ -735,6 +737,7 @@ fn _test_sender_auto_detect_protocol_version(
735737

736738
let mut sender = sender_builder.build()?;
737739
assert_eq!(sender.protocol_version(), expect_version);
740+
assert_eq!(sender.max_name_len(), expect_max_name_len);
738741
let mut buffer = sender.new_buffer();
739742
buffer
740743
.table("test")?
@@ -749,32 +752,32 @@ fn _test_sender_auto_detect_protocol_version(
749752

750753
#[test]
751754
fn test_sender_auto_protocol_version_basic() -> TestResult {
752-
_test_sender_auto_detect_protocol_version(Some(vec![1, 2]), ProtocolVersion::V2)
755+
_test_sender_auto_detect_protocol_version(Some(vec![1, 2]), ProtocolVersion::V2, 130, 130)
753756
}
754757

755758
#[test]
756759
fn test_sender_auto_protocol_version_old_server1() -> TestResult {
757-
_test_sender_auto_detect_protocol_version(Some(vec![]), ProtocolVersion::V1)
760+
_test_sender_auto_detect_protocol_version(Some(vec![]), ProtocolVersion::V1, 0, 127)
758761
}
759762

760763
#[test]
761764
fn test_sender_auto_protocol_version_old_server2() -> TestResult {
762-
_test_sender_auto_detect_protocol_version(None, ProtocolVersion::V1)
765+
_test_sender_auto_detect_protocol_version(None, ProtocolVersion::V1, 0, 127)
763766
}
764767

765768
#[test]
766769
fn test_sender_auto_protocol_version_only_v1() -> TestResult {
767-
_test_sender_auto_detect_protocol_version(Some(vec![1]), ProtocolVersion::V1)
770+
_test_sender_auto_detect_protocol_version(Some(vec![1]), ProtocolVersion::V1, 127, 127)
768771
}
769772

770773
#[test]
771774
fn test_sender_auto_protocol_version_only_v2() -> TestResult {
772-
_test_sender_auto_detect_protocol_version(Some(vec![2]), ProtocolVersion::V2)
775+
_test_sender_auto_detect_protocol_version(Some(vec![2]), ProtocolVersion::V2, 127, 127)
773776
}
774777

775778
#[test]
776779
fn test_sender_auto_protocol_version_unsupported_client() -> TestResult {
777-
let mut server = MockServer::new()?.configure_settings_response(&[3, 4]);
780+
let mut server = MockServer::new()?.configure_settings_response(&[3, 4], 127);
778781
let sender_builder = server.lsb_http();
779782
let server_thread = std::thread::spawn(move || -> io::Result<MockServer> {
780783
server.accept()?;
@@ -792,6 +795,76 @@ fn test_sender_auto_protocol_version_unsupported_client() -> TestResult {
792795
Ok(())
793796
}
794797

798+
#[test]
799+
fn test_sender_short_max_name_len() -> TestResult {
800+
_test_sender_max_name_len(4, 4, 0)
801+
}
802+
803+
#[test]
804+
fn test_sender_specify_max_name_len_with_response() -> TestResult {
805+
_test_sender_max_name_len(4, 4, 127)
806+
}
807+
808+
#[test]
809+
fn test_sender_long_max_name_len() -> TestResult {
810+
_test_sender_max_name_len(130, 130, 0)
811+
}
812+
813+
#[test]
814+
fn test_sender_specify_max_name_len_without_response() -> TestResult {
815+
_test_sender_max_name_len(0, 16, 16)
816+
}
817+
818+
#[test]
819+
fn test_sender_default_max_name_len() -> TestResult {
820+
_test_sender_max_name_len(0, 127, 0)
821+
}
822+
823+
fn _test_sender_max_name_len(
824+
response_max_name_len: usize,
825+
expect_max_name_len: usize,
826+
sender_specify_max_name_len: usize,
827+
) -> TestResult {
828+
let mut server = MockServer::new()?;
829+
if response_max_name_len != 0 {
830+
server = server.configure_settings_response(&[1, 2], response_max_name_len);
831+
}
832+
833+
let mut sender_builder = server.lsb_http();
834+
if sender_specify_max_name_len != 0 {
835+
sender_builder = sender_builder.max_name_len(sender_specify_max_name_len)?;
836+
}
837+
let server_thread = std::thread::spawn(move || -> io::Result<MockServer> {
838+
server.accept()?;
839+
match response_max_name_len {
840+
0 => server.send_http_response_q(
841+
HttpResponse::empty()
842+
.with_status(404, "Not Found")
843+
.with_header("content-type", "text/plain")
844+
.with_body_str("Not Found"),
845+
)?,
846+
_ => server.send_settings_response()?,
847+
}
848+
Ok(server)
849+
});
850+
let sender = sender_builder.build()?;
851+
assert_eq!(sender.max_name_len(), expect_max_name_len);
852+
let mut buffer = sender.new_buffer();
853+
let name = "a name too long";
854+
if expect_max_name_len < name.len() {
855+
assert_err_contains(
856+
buffer.table(name),
857+
ErrorCode::InvalidName,
858+
r#"Bad name: "a name too long": Too long (max 4 characters)"#,
859+
);
860+
} else {
861+
assert!(buffer.table(name).is_ok());
862+
}
863+
// We keep the server around til the end of the test to ensure that the response is fully received.
864+
_ = server_thread.join().unwrap()?;
865+
Ok(())
866+
}
867+
795868
#[test]
796869
fn test_buffer_protocol_version1_not_support_array() -> TestResult {
797870
let mut buffer = Buffer::new(ProtocolVersion::V1);

questdb-rs/src/tests/mock.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,11 @@ impl MockServer {
310310
}
311311

312312
#[cfg(feature = "ilp-over-http")]
313-
pub fn configure_settings_response(mut self, supported_versions: &[u16]) -> Self {
313+
pub fn configure_settings_response(
314+
mut self,
315+
supported_versions: &[u16],
316+
max_name_len: usize,
317+
) -> Self {
314318
if supported_versions.is_empty() {
315319
self.settings_response = serde_json::json!({"version": "8.1.2"});
316320
} else {
@@ -320,7 +324,7 @@ impl MockServer {
320324
"ilp.proto.transports":["tcp", "http"],
321325
"posthog.enabled":false,
322326
"posthog.api.key":null,
323-
"cairo.max.file.name.length":127},
327+
"cairo.max.file.name.length": max_name_len},
324328
"preferences.version":0,
325329
"preferences":{}}
326330
);

system_test/test.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@
5454
BUILD_MODE = None
5555

5656
# The first QuestDB version that supports array types.
57-
FIRST_ARRAYS_RELEASE = (8, 3, 1)
57+
FIRST_ARRAYS_RELEASE = (8, 3, 3)
5858

5959

6060
def retry_check_table(*args, **kwargs):
@@ -137,6 +137,10 @@ def _expect_eventual_disconnect(self, sender):
137137
.at_now())
138138
sender.flush()
139139

140+
def test_default_max_name_len(self):
141+
with self._mk_linesender() as sender:
142+
self.assertEqual(sender.max_name_len, 127)
143+
140144
def test_insert_three_rows(self):
141145
table_name = uuid.uuid4().hex
142146
pending = None

0 commit comments

Comments
 (0)