summaryrefslogtreecommitdiffstats
path: root/mqtt-tester
diff options
context:
space:
mode:
authorMatthias Beyer <mail@beyermatthias.de>2023-01-13 08:55:04 +0100
committerMatthias Beyer <mail@beyermatthias.de>2023-01-18 09:07:19 +0100
commitdbf82eb15fa328b8aad1cc6ede36c575c0eaae8c (patch)
tree847db48cb7617c95662d8da73af2fd9928d7cf0e /mqtt-tester
parentc9d4d8da5f6fd0171bafdb52420f3e7caf663aec (diff)
Reimpl test as BehaviourTest: ConnackFlagsAreSetAsReserved
Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
Diffstat (limited to 'mqtt-tester')
-rw-r--r--mqtt-tester/src/behaviour/connack_flags_are_set_as_reserved.rs53
-rw-r--r--mqtt-tester/src/behaviour/mod.rs2
-rw-r--r--mqtt-tester/src/client_report.rs39
3 files changed, 56 insertions, 38 deletions
diff --git a/mqtt-tester/src/behaviour/connack_flags_are_set_as_reserved.rs b/mqtt-tester/src/behaviour/connack_flags_are_set_as_reserved.rs
new file mode 100644
index 0000000..49012c1
--- /dev/null
+++ b/mqtt-tester/src/behaviour/connack_flags_are_set_as_reserved.rs
@@ -0,0 +1,53 @@
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+//
+
+use crate::{
+ behaviour_test::BehaviourTest,
+ command::{Input, Output},
+ executable::ClientExecutableCommand,
+ report::ReportResult,
+};
+
+pub struct ConnackFlagsAreSetAsReserved;
+
+#[async_trait::async_trait]
+impl BehaviourTest for ConnackFlagsAreSetAsReserved {
+ fn commands(&self) -> Vec<Box<dyn ClientExecutableCommand>> {
+ vec![]
+ }
+
+ async fn execute(&self, mut input: Input, _output: Output) -> Result<(), miette::Error> {
+ input
+ .send(&[
+ 0b0010_0000 | 0b0000_1000, // CONNACK + garbage
+ 0b0000_0010, // Remaining length
+ 0b0000_0000, // No session present
+ 0b0000_0000, // Connection accepted
+ ])
+ .await?;
+ Ok(())
+ }
+
+ fn report_name(&self) -> &str {
+ "Flag-Bit is set to 1 where it should be 0"
+ }
+
+ fn report_desc(&self) -> &str {
+ "CONNACK flag bits are marked as Reserved and must be set accordingly to spec"
+ }
+
+ fn report_normative(&self) -> &str {
+ "[MQTT-2.2.2-1]"
+ }
+
+ fn translate_client_exit_code(&self, success: bool) -> ReportResult {
+ if success {
+ ReportResult::Failure
+ } else {
+ ReportResult::Success
+ }
+ }
+}
diff --git a/mqtt-tester/src/behaviour/mod.rs b/mqtt-tester/src/behaviour/mod.rs
index 94f917c..e831a05 100644
--- a/mqtt-tester/src/behaviour/mod.rs
+++ b/mqtt-tester/src/behaviour/mod.rs
@@ -4,12 +4,14 @@
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
//
+pub mod connack_flags_are_set_as_reserved;
pub mod invalid_first_packet_is_rejected;
pub mod invalid_utf8_is_rejected;
pub mod receiving_server_packet;
pub mod utf8_with_nullchar_is_rejected;
pub mod wait_for_connect;
+pub use self::connack_flags_are_set_as_reserved::ConnackFlagsAreSetAsReserved;
pub use self::invalid_first_packet_is_rejected::InvalidFirstPacketIsRejected;
pub use self::invalid_utf8_is_rejected::InvalidUtf8IsRejected;
pub use self::receiving_server_packet::ReceivingServerPacket;
diff --git a/mqtt-tester/src/client_report.rs b/mqtt-tester/src/client_report.rs
index d21240a..b83b519 100644
--- a/mqtt-tester/src/client_report.rs
+++ b/mqtt-tester/src/client_report.rs
@@ -11,7 +11,6 @@ use futures::FutureExt;
use miette::IntoDiagnostic;
use mqtt_format::v3::connect_return::MConnectReturnCode;
-use mqtt_format::v3::header::MPacketKind;
use mqtt_format::v3::identifier::MPacketIdentifier;
use mqtt_format::v3::packet::{MConnack, MConnect, MPacket, MPuback, MPublish};
@@ -33,7 +32,6 @@ pub async fn create_client_report(
let executable = ClientExecutable::new(client_exe_path);
let reports = vec![
- check_connack_flags_are_set_as_reserved(&executable).boxed_local(),
check_publish_qos_zero_with_ident_fails(&executable).boxed_local(),
check_publish_qos_2_is_acked(&executable).boxed_local(),
check_first_packet_from_client_is_connect(&executable).boxed_local(),
@@ -50,6 +48,7 @@ pub async fn create_client_report(
Box::new(crate::behaviour::ReceivingServerPacket),
Box::new(crate::behaviour::InvalidFirstPacketIsRejected),
Box::new(crate::behaviour::Utf8WithNullcharIsRejected),
+ Box::new(crate::behaviour::ConnackFlagsAreSetAsReserved),
];
let invariants: Vec<Arc<dyn PacketInvariant>> = vec![Arc::new(NoUsernameMeansNoPassword)];
@@ -156,42 +155,6 @@ macro_rules! wait_for_output {
}};
}
-async fn check_connack_flags_are_set_as_reserved(
- executable: &ClientExecutable,
-) -> miette::Result<Report> {
- let (client, mut input, _output) = executable
- .call(&[])
- .map(crate::command::Command::new)?
- .spawn()?;
-
- input
- .send(&[
- 0b0010_0000 | 0b0000_1000, // CONNACK + garbage
- 0b0000_0010, // Remaining length
- 0b0000_0000, // No session present
- 0b0000_0000, // Connection accepted
- ])
- .await?;
-
- let output = client.wait_with_output();
- let (result, output) = wait_for_output! {
- output,
- timeout_ms: 100,
- out_success => { ReportResult::Failure },
- out_failure => { ReportResult::Success }
- };
-
- Ok(Report {
- name: String::from("Flag-Bit is set to 1 where it should be 0"),
- description: String::from(
- "CONNACK flag bits are marked as Reserved and must be set accordingly to spec",
- ),
- normative_statement_number: String::from("[MQTT-2.2.2-1]"),
- result,
- output,
- })
-}
-
async fn check_publish_qos_zero_with_ident_fails(
executable: &ClientExecutable,
) -> miette::Result<Report> {