From dbf82eb15fa328b8aad1cc6ede36c575c0eaae8c Mon Sep 17 00:00:00 2001 From: Matthias Beyer Date: Fri, 13 Jan 2023 08:55:04 +0100 Subject: Reimpl test as BehaviourTest: ConnackFlagsAreSetAsReserved Signed-off-by: Matthias Beyer --- .../behaviour/connack_flags_are_set_as_reserved.rs | 53 ++++++++++++++++++++++ mqtt-tester/src/behaviour/mod.rs | 2 + mqtt-tester/src/client_report.rs | 39 +--------------- 3 files changed, 56 insertions(+), 38 deletions(-) create mode 100644 mqtt-tester/src/behaviour/connack_flags_are_set_as_reserved.rs (limited to 'mqtt-tester') 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> { + 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> = 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 { - 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 { -- cgit v1.2.3