common: Make Logger::read_sector_header() read the start_time field.
[gps-watch.git] / test / logger_test.rs
index ee0b30b92b749fbb61ea73dd3918b1613143baa5..614108bf5eb2cc5bd5c70a8e72a017cfe1a51145 100644 (file)
  * 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());
+}