X-Git-Url: http://git.code-monkey.de/?a=blobdiff_plain;f=test%2Flogger_test.rs;h=614108bf5eb2cc5bd5c70a8e72a017cfe1a51145;hb=4e82712727981c944f56d4ada62dc54ad8542d94;hp=ee0b30b92b749fbb61ea73dd3918b1613143baa5;hpb=3582479d2c11b4969514e321086acf7d6d8d503f;p=gps-watch.git diff --git a/test/logger_test.rs b/test/logger_test.rs index ee0b30b..614108b 100644 --- a/test/logger_test.rs +++ b/test/logger_test.rs @@ -21,9 +21,10 @@ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +use common::buffer::{Buffer, BufferUserData}; use common::gps; use common::storage::{Storage, Error}; -use common::logger::*; +use common::logger::{MEMORY_SIZE, Logger, Error as LoggerError}; struct FakeStorage { expected: Box<[u8]>, @@ -67,6 +68,36 @@ impl Storage for FakeStorage { } } +struct Pipe { + pipe_fd: [i32; 2], +} + +impl Pipe { + fn new() -> Pipe { + let mut pipe_fd = [-1i32; 2]; + + unsafe { + extern { + fn pipe(pipefd: *mut i32) -> i32; + } + + pipe(pipe_fd.as_mut_ptr()); + } + + Pipe { + pipe_fd: pipe_fd, + } + } + + fn read_fd(&self) -> i32 { + self.pipe_fd[0] + } + + fn write_fd(&self) -> i32 { + self.pipe_fd[1] + } +} + // Runs a couple of recordings on fully erased flash memory. #[test] fn first_recording() { @@ -213,3 +244,105 @@ fn multi_sector_recording() { assert_eq!(header0, fake_storage.actual[0..(0 + header0.len())]); assert_eq!(header1, fake_storage.actual[4096..(4096 + header1.len())]); } + +extern "C" fn flush_write_buffer(user_data: *mut BufferUserData, + buf: *const u8, + _bufsiz: usize, + count: usize) -> isize { + let _file = user_data as *mut std::fs::File; + + unsafe { + let file = &mut * _file; + + file.write_all(std::slice::from_raw_parts(buf, count)).unwrap(); + } + + count as isize +} + +// Verifies that Logger::get_recording() detects unknown recording IDs. +#[test] +fn get_recording_invalid() { + let pipe = Pipe::new(); + + let mut file = unsafe { std::fs::File::from_raw_fd(pipe.write_fd()) }; + + let mut yenc_buffer_space = [0u8; 8192]; + let mut yenc_buffer = Buffer::alloc(); + + let user_data = (&mut file as *mut std::fs::File) as *mut BufferUserData; + + yenc_buffer.init(yenc_buffer_space.as_mut_ptr(), + yenc_buffer_space.len(), + flush_write_buffer, + user_data); + + let mut fake_storage = FakeStorage::new(); + + let mut logger = Logger::new(&mut fake_storage); + logger.init(); + + // Zero is never a valid recording id. + let result = logger.get_recording(0, &mut yenc_buffer); + assert_eq!(LoggerError::NoSuchRecording, result.unwrap_err()); + + let result = logger.get_recording(1, &mut yenc_buffer); + assert_eq!(LoggerError::NoSuchRecording, result.unwrap_err()); +} + +// Verifies that Logger::get_recording() can retrieve finished recordings. +#[test] +fn get_recording_valid() { + let pipe = Pipe::new(); + + let mut file = unsafe { std::fs::File::from_raw_fd(pipe.write_fd()) }; + + let mut yenc_buffer_space = [0u8; 8192]; + let mut yenc_buffer = Buffer::alloc(); + + let user_data = (&mut file as *mut std::fs::File) as *mut BufferUserData; + + yenc_buffer.init(yenc_buffer_space.as_mut_ptr(), + yenc_buffer_space.len(), + flush_write_buffer, + user_data); + + let mut fake_storage = FakeStorage::new(); + + let mut logger = Logger::new(&mut fake_storage); + logger.init(); + + let result = logger.get_recording(1, &mut yenc_buffer); + assert_eq!(LoggerError::NoSuchRecording, result.unwrap_err()); + + let tap0 = gps::TimeAndPos { + system_time: 0, + unix_time: 1478026311, + latitude: 0x73234e, + longitude: 0x73234f, + }; + + logger.start_recording(&tap0); + + let tap1 = gps::TimeAndPos { + system_time: 0, + unix_time: 1478026311 + 1, + latitude: 0x73234e + 5, + longitude: 0x73234f + 5, + }; + + logger.log(&tap0, &tap1); + + let tap2 = gps::TimeAndPos { + system_time: 0, + unix_time: 1478026311 + 2, + latitude: 0x73234e + 10, + longitude: 0x73234f + 10, + }; + + logger.log(&tap1, &tap2); + + logger.stop_recording(&tap2); + + assert!(logger.get_recording(1, &mut yenc_buffer).is_ok()); +}