+
+extern "C" fn flush_write_buffer(user_data: *mut BufferUserData,
+ buf: *const u8,
+ _bufsiz: usize,
+ count: usize) -> isize {
+ let _final_buffer = user_data as *mut [u8; 8192];
+ let final_buffer = unsafe { &mut * _final_buffer };
+
+ unsafe {
+ core::ptr::copy_nonoverlapping(buf, final_buffer.as_mut_ptr(), count);
+ }
+
+ count as isize
+}
+
+// Verifies that Logger::get_recording() detects unknown recording IDs.
+#[test]
+fn get_recording_invalid() {
+ let mut final_buffer = [0u8; 8192];
+
+ let mut yenc_buffer_space = [0u8; 8192];
+ let mut yenc_buffer = Buffer::alloc();
+
+ let user_data = (&mut final_buffer as *mut [u8; 8192]) 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 mut final_buffer = [0u8; 8192];
+
+ let mut yenc_buffer_space = [0u8; 8192];
+ let mut yenc_buffer = Buffer::alloc();
+
+ let user_data = (&mut final_buffer as *mut [u8; 8192]) 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());
+}