common: Implement Logger::remove_recording().
[gps-watch.git] / test / logger_test.rs
index a0308218e85d576a96fc665be73a8d48c39a49ab..784c04955cc567938e852abfbd7d3b8e8b0bb43c 100644 (file)
@@ -68,6 +68,19 @@ impl Storage for FakeStorage {
         Ok(())
     }
 
+    fn erase(&mut self, address: usize) -> Result<(), Error> {
+        if (address & 4095) != 0 {
+            return Err(Error::UnalignedAddress);
+        }
+
+        for i in 0..4096 {
+            self.actual[address + i] = 0xff;
+        }
+
+        Ok(())
+
+    }
+
     fn clear(&mut self) {
         self.actual = vec![0xff; MEMORY_SIZE].into_boxed_slice();
     }
@@ -501,3 +514,61 @@ fn list_recording1_multi_sector() {
     assert_eq!(String::from_utf8(expected_bytes.to_vec()).unwrap(),
                String::from_utf8(listing_raw[0..num_bytes_read].to_vec()).unwrap());
 }
+
+// Verifies that Logger::remove_recording() reports an error if there is no
+// recording with the given ID.
+#[test]
+fn remove_recording0() {
+    let mut fake_storage = FakeStorage::new();
+
+    let mut logger = Logger::new(&mut fake_storage);
+    logger.init();
+
+    let result = logger.remove_recording(42);
+    assert_eq!(LoggerError::NoSuchRecording, result.unwrap_err());
+}
+
+// Verifies that Logger::remove_recording() clears consecutive sectors
+// belonging to the recording identified by the given ID.
+#[test]
+fn remove_recording1() {
+    let mut fake_storage = FakeStorage::new();
+
+    // Mark first sector as in use.
+    let header0 = [
+        0x01, 0x00, 0x01, 0x00,
+        0xa2, 0xdb, 0x14, 0x5e,
+    ];
+
+    // Mark second sector as in use by the same recording.
+    let header1 = [
+        0x03, 0x00, 0x01, 0x00,
+        0x00, 0x00, 0x00, 0x00,
+    ];
+
+    // Mark third sector as in use by another recording.
+    let header2 = [
+        0x01, 0x00, 0x02, 0x00,
+        0xa2, 0xdb, 0x14, 0x5f,
+    ];
+
+    fake_storage.actual[0..header0.len()].copy_from_slice(&header0);
+    fake_storage.actual[4096..4096 + header1.len()].copy_from_slice(&header1);
+    fake_storage.actual[8192..8192 + header2.len()].copy_from_slice(&header2);
+
+    let mut logger = Logger::new(&mut fake_storage);
+    logger.init();
+
+    assert!(logger.remove_recording(1).is_ok());
+
+    let cleared = [
+        0xff, 0xff, 0xff, 0xff,
+        0xff, 0xff, 0xff, 0xff,
+    ];
+
+    fake_storage.expected[0..cleared.len()].copy_from_slice(&cleared);
+    fake_storage.expected[4096..4096 + header1.len()].copy_from_slice(&cleared);
+    fake_storage.expected[8192..8192 + header2.len()].copy_from_slice(&header2);
+
+    assert_eq!(fake_storage.expected, fake_storage.actual);
+}