use std::pin::Pin;
use bytes::Bytes;
use cloudmqtt::{client::MqttClient, client::MqttConnectionParams, error::MqttError};
use mqtt_format::v3::{
connect_return::MConnectReturnCode,
packet::{MConnack, MPacket},
strings::MString,
};
use tokio::io::AsyncWriteExt;
#[tokio::test]
async fn check_simple_connect() {
let (mut duplex, client_duplex) = tokio::io::duplex(512);
let client = MqttClient::connect_v3_duplex(
client_duplex,
MqttConnectionParams {
clean_session: false,
will: None,
username: None,
password: None,
keep_alive: 16,
client_id: MString {
value: "check_simple_connect",
},
},
);
let response = MPacket::Connack(MConnack {
session_present: false,
connect_return_code: mqtt_format::v3::connect_return::MConnectReturnCode::Accepted,
});
let mut buf = Vec::new();
response
.write_to(Pin::new(&mut buf))
.await
.expect("to create response CONNACK");
duplex
.write_all_buf(&mut Bytes::from(buf))
.await
.expect("to write response CONNACK");
client.await.unwrap();
}
#[tokio::test]
async fn check_invalid_connect() {
let (mut duplex, client_duplex) = tokio::io::duplex(512);
let client = MqttClient::connect_v3_duplex(
client_duplex,
MqttConnectionParams {
clean_session: false,
will: None,
username: None,
password: None,
keep_alive: 16,
client_id: MString {
value: "check_invalid_connect",
},
},
);
let response = MPacket::Connack(MConnack {
session_present: false,
connect_return_code: mqtt_format::v3::connect_return::MConnectReturnCode::NotAuthorized,
});
let mut buf = Vec::new();
response
.write_to(Pin::new(&mut buf))
.await
.expect("to create response CONNACK");
duplex
.write_all_buf(&mut Bytes::from(buf))
.await
.expect("to write response CONNACK");
match client.await {
Err(MqttError::ConnectionRejected(MConnectReturnCode::NotAuthorized)) => {
}
Ok(_) => panic!("Should not have succeeded"),
Err(e) => panic!("Should have errored: {}", e),
}
}