libmodbus-rs 0.8.3

libmodbus bindings for Rust
extern crate libmodbus_rs;

use libmodbus_rs::{Modbus, Timeout, ModbusTCP};


#[test]
fn connect() {
    // create server
    match Modbus::new_tcp("127.0.0.1", 1502) {
            Ok(mut server) => server.tcp_listen(1),
            Err(err) => panic!("Could not create server: {}", err),
        }
        .unwrap();

    // connect client
    match Modbus::new_tcp("127.0.0.1", 1502) {
        Ok(modbus) => assert!(modbus.connect().is_ok()),
        _ => panic!("could not connect"),
    }
}

#[test]
fn flush() {
    let modbus = Modbus::new_tcp("127.0.0.1", 1502).unwrap();
    assert!(modbus.flush().is_ok());
}

#[test]
fn set_slave() {
    let mut modbus = Modbus::new_tcp("127.0.0.1", 1502).unwrap();
    assert!(modbus.set_slave(0).is_ok());
    assert!(modbus.set_slave(1).is_ok());
    // FIXME: rust silent overflow, allows invalid slave ID
    // assert!(modbus.set_slave(266).is_ok());
}

#[test]
fn set_debug() {
    let mut modbus = Modbus::new_tcp("127.0.0.1", 1502).unwrap();
    assert!(modbus.set_debug(true).is_ok());
}

#[test]
fn get_byte_timeout() {
    let modbus = Modbus::new_tcp("127.0.0.1", 1502).unwrap();
    assert_eq!(modbus.get_byte_timeout().unwrap(),
               libmodbus_rs::Timeout {
                   sec: 0,
                   usec: 500000,
               });
}

#[test]
fn set_byte_timeout() {
    let mut modbus = Modbus::new_tcp("127.0.0.1", 1502).unwrap();
    assert_eq!(modbus.get_byte_timeout().unwrap(),
               Timeout {
                   sec: 0,
                   usec: 500000,
               });

    let timeout = Timeout {
        sec: 1,
        usec: 500000,
    };
    assert!(modbus.set_byte_timeout(timeout).is_ok());
    assert_eq!(modbus.get_byte_timeout().unwrap(),
               Timeout {
                   sec: 1,
                   usec: 500000,
               });
}

#[test]
fn get_response_timeout() {
    let modbus = Modbus::new_tcp("127.0.0.1", 1502).unwrap();
    assert_eq!(modbus.get_response_timeout().unwrap(),
               Timeout {
                   sec: 0,
                   usec: 500000,
               });
}

#[test]
fn set_response_timeout() {
    let mut modbus = Modbus::new_tcp("127.0.0.1", 1502).unwrap();
    assert_eq!(modbus.get_response_timeout().unwrap(),
               Timeout {
                   sec: 0,
                   usec: 500000,
               });

    let timeout = Timeout {
        sec: 1,
        usec: 500000,
    };
    assert!(modbus.set_response_timeout(timeout).is_ok());
    assert_eq!(modbus.get_response_timeout().unwrap(),
               Timeout {
                   sec: 1,
                   usec: 500000,
               });
}

#[test]
fn set_error_recovery() {
    use libmodbus_rs::ErrorRecoveryMode;
    let mut modbus = Modbus::new_tcp("127.0.0.1", 1502).unwrap();

    assert!(modbus.set_error_recovery(None).is_ok());
    assert!(modbus.set_error_recovery(Some(&[ErrorRecoveryMode::Link])).is_ok());
    assert!(modbus.set_error_recovery(Some(&[ErrorRecoveryMode::Protocol])).is_ok());
    assert!(modbus.set_error_recovery(Some(&[ErrorRecoveryMode::Link, ErrorRecoveryMode::Protocol])).is_ok());
}

#[test]
fn set_socket() {
    let mut modbus = Modbus::new_tcp("127.0.0.1", 1502).unwrap();
    assert!(modbus.set_socket(1337).is_ok());
}

#[test]
fn get_socket() {
    let mut modbus = Modbus::new_tcp("127.0.0.1", 1502).unwrap();
    modbus.set_socket(1337).expect("could not set socket");
    assert_eq!(modbus.get_socket().unwrap(), 1337);
}

#[test]
fn get_header_length() {
    let modbus = Modbus::new_tcp("127.0.0.1", 1502).unwrap();
    assert_eq!(modbus.get_header_length(), 7);
}


#[test]
#[ignore]
fn reply_exception() {
    // create server
    match Modbus::new_tcp("127.0.0.1", 1502) {
            Ok(mut server) => server.tcp_listen(1),
            Err(err) => panic!("Could not create server: {}", err),
        }
        .unwrap();

    // connect client
    match Modbus::new_tcp("127.0.0.1", 1502) {
        Ok(modbus) => assert!(modbus.connect().is_ok()),
        _ => panic!("could not connect"),
    }
}


#[test]
#[ignore]
fn close() {
    let modbus = Modbus::new_tcp("127.0.0.1", 1502).unwrap();
    modbus.close();
}

#[test]
#[ignore]
fn free() {
    let mut modbus = Modbus::new_tcp("127.0.0.1", 1502).unwrap();
    modbus.free();
}

// Timeout tests
#[test]
fn timeout_default() {
    let timeout: Timeout = Default::default();
    assert_eq!(timeout, Timeout { sec: 0, usec: 0});
}

#[test]
fn timeout_new() {
    let timeout = Timeout::new(1, 2);
    assert_eq!(timeout, Timeout { sec: 1, usec: 2});
}

#[test]
fn timeout_new_sec() {
    let timeout = Timeout::new_sec(1);
    assert_eq!(timeout, Timeout { sec: 1, usec: 0});
}

#[test]
fn timeout_new_usec() {
    let timeout = Timeout::new_usec(2);
    assert_eq!(timeout, Timeout { sec: 0, usec: 2});
}