Files
sausage/userland/ssh-client/src/ssh_channel_tests.inc
T

44 lines
2.6 KiB
C++

#[cfg(test)]
mod channel_tests {
use super::*;
use std::io::Cursor;
struct Wire { input: Cursor<Vec<u8>>, output: Vec<u8> }
impl Read for Wire { fn read(&mut self, b: &mut [u8]) -> io::Result<usize> { self.input.read(b) } }
impl Write for Wire {
fn write(&mut self, b: &[u8]) -> io::Result<usize> { self.output.extend(b); Ok(b.len()) }
fn flush(&mut self) -> io::Result<()> { Ok(()) }
}
fn session() -> Session<Wire> {
Session { packets: Packets::new(Wire { input: Cursor::new(vec![]), output: vec![] }), version: vec![], id: vec![],
host: "fake.example".into(), port: 22, accept_new: false, remote: 42, send_window: 10, send_max: 4, receive_window: WINDOW,
data: VecDeque::new(), eof: false, closed: false, exit: None,
capture: None, capture_limit: 0, deadline: None }
}
fn channel(kind: u8, data: &[u8]) -> Vec<u8> {
let mut p = vec![kind]; uint(&mut p, 0); p.extend(data); p
}
#[test]
fn channel_data_stderr_window_eof_close() {
let mut s = session();
let mut data = vec![]; string(&mut data, b"hello"); s.handle(channel(94, &data)).unwrap();
assert_eq!(s.receive_window, WINDOW-5);
let mut stderr = vec![]; uint(&mut stderr, 1); string(&mut stderr, b"discarded stderr"); s.handle(channel(95, &stderr)).unwrap();
assert_eq!(s.receive_window, WINDOW-5);
s.handle(channel(96, &[])).unwrap();
let mut buffer = [0;10]; assert_eq!(s.read_data(&mut buffer).unwrap(),5); assert_eq!(&buffer[..5], b"hello");
assert_eq!(s.receive_window, WINDOW); assert_eq!(s.read_data(&mut buffer).unwrap(), 0);
assert!(s.handle(channel(94, &data)).is_err());
s.handle(channel(97, &[])).unwrap(); assert!(s.closed); assert!(s.write_data(b"after close").is_err());
}
#[test]
fn channel_send_chunks_reject_overflow_and_failed_exit() {
let mut s = session(); assert_eq!(s.write_data(b"0123456789").unwrap(), 4); assert_eq!(s.send_window, 6);
let mut wrong = vec![93]; uint(&mut wrong, 99); uint(&mut wrong, 1); assert!(s.handle(wrong).is_err());
let mut adjustment = vec![]; uint(&mut adjustment, u32::MAX); assert!(s.handle(channel(93,&adjustment)).is_err());
let mut s = session(); s.receive_window = 1;
let mut data = vec![]; string(&mut data, b"over window"); assert!(s.handle(channel(94,&data)).is_err());
let mut status = vec![]; string(&mut status, b"exit-status"); status.push(0); uint(&mut status, 1);
s.handle(channel(98,&status)).unwrap(); assert!(s.read_data(&mut [0]).is_err());
}
}