fn main()

in mqtt/mqtt3-fuzz/build.rs [6:140]


fn main() -> Result<(), Box<dyn std::error::Error>> {
    let in_dir = std::path::Path::new(env!("CARGO_MANIFEST_DIR")).join("in");
    if in_dir.exists() {
        std::fs::remove_dir_all(&in_dir)?;
    }
    std::fs::create_dir(&in_dir)?;

    let packets = vec![
        (
            "connack",
            mqtt3::proto::Packet::ConnAck(mqtt3::proto::ConnAck {
                session_present: true,
                return_code: mqtt3::proto::ConnectReturnCode::Accepted,
            }),
        ),
        (
            "connect",
            mqtt3::proto::Packet::Connect(mqtt3::proto::Connect {
                username: Some("username".to_string()),
                password: Some("password".to_string()),
                will: Some(mqtt3::proto::Publication {
                    topic_name: "will-topic".to_string(),
                    qos: mqtt3::proto::QoS::ExactlyOnce,
                    retain: true,
                    payload: b"\x00\x01\x02\xFF\xFE\xFD"[..].into(),
                }),
                client_id: mqtt3::proto::ClientId::IdWithExistingSession("id".to_string()),
                keep_alive: std::time::Duration::from_secs(5),
                protocol_name: mqtt3::PROTOCOL_NAME.to_string(),
                protocol_level: mqtt3::PROTOCOL_LEVEL,
            }),
        ),
        (
            "disconnect",
            mqtt3::proto::Packet::Disconnect(mqtt3::proto::Disconnect),
        ),
        (
            "pingreq",
            mqtt3::proto::Packet::PingReq(mqtt3::proto::PingReq),
        ),
        (
            "pingresp",
            mqtt3::proto::Packet::PingResp(mqtt3::proto::PingResp),
        ),
        (
            "puback",
            mqtt3::proto::Packet::PubAck(mqtt3::proto::PubAck {
                packet_identifier: mqtt3::proto::PacketIdentifier::new(5).unwrap(),
            }),
        ),
        (
            "pubcomp",
            mqtt3::proto::Packet::PubComp(mqtt3::proto::PubComp {
                packet_identifier: mqtt3::proto::PacketIdentifier::new(5).unwrap(),
            }),
        ),
        (
            "publish",
            mqtt3::proto::Packet::Publish(mqtt3::proto::Publish {
                packet_identifier_dup_qos: mqtt3::proto::PacketIdentifierDupQoS::ExactlyOnce(
                    mqtt3::proto::PacketIdentifier::new(5).unwrap(),
                    true,
                ),
                retain: true,
                topic_name: "publish-topic".to_string(),
                payload: b"\x00\x01\x02\xFF\xFE\xFD"[..].into(),
            }),
        ),
        (
            "pubrec",
            mqtt3::proto::Packet::PubRec(mqtt3::proto::PubRec {
                packet_identifier: mqtt3::proto::PacketIdentifier::new(5).unwrap(),
            }),
        ),
        (
            "pubrel",
            mqtt3::proto::Packet::PubRel(mqtt3::proto::PubRel {
                packet_identifier: mqtt3::proto::PacketIdentifier::new(5).unwrap(),
            }),
        ),
        (
            "suback",
            mqtt3::proto::Packet::SubAck(mqtt3::proto::SubAck {
                packet_identifier: mqtt3::proto::PacketIdentifier::new(5).unwrap(),
                qos: vec![
                    mqtt3::proto::SubAckQos::Success(mqtt3::proto::QoS::ExactlyOnce),
                    mqtt3::proto::SubAckQos::Failure,
                ],
            }),
        ),
        (
            "subscribe",
            mqtt3::proto::Packet::Subscribe(mqtt3::proto::Subscribe {
                packet_identifier: mqtt3::proto::PacketIdentifier::new(5).unwrap(),
                subscribe_to: vec![mqtt3::proto::SubscribeTo {
                    topic_filter: "subscribe-topic".to_string(),
                    qos: mqtt3::proto::QoS::ExactlyOnce,
                }],
            }),
        ),
        (
            "unsuback",
            mqtt3::proto::Packet::UnsubAck(mqtt3::proto::UnsubAck {
                packet_identifier: mqtt3::proto::PacketIdentifier::new(5).unwrap(),
            }),
        ),
        (
            "unsubscribe",
            mqtt3::proto::Packet::Unsubscribe(mqtt3::proto::Unsubscribe {
                packet_identifier: mqtt3::proto::PacketIdentifier::new(5).unwrap(),
                unsubscribe_from: vec!["unsubscribe-topic".to_string()],
            }),
        ),
    ];

    for (filename, packet) in packets {
        let file = std::fs::OpenOptions::new()
            .create(true)
            .write(true)
            .open(in_dir.join(filename))?;
        let mut file = std::io::BufWriter::new(file);

        let mut codec: mqtt3::proto::PacketCodec = Default::default();

        let mut bytes = bytes::BytesMut::new();

        codec.encode(packet, &mut bytes)?;

        file.write_all(&bytes)?;

        file.flush()?;
    }

    Ok(())
}