from common import * from trezor import io, sdcard fatfs = io.fatfs class TestTrezorSdcard(unittest.TestCase): def test_power(self): # sdcard.capacity() will return 0 if the card is not powered, # non-zero value otherwise self.assertEqual(sdcard.capacity(), 0) with sdcard.filesystem(mounted=False): self.assertTrue(sdcard.capacity() > 0) self.assertEqual(sdcard.capacity(), 0) def test_nomount(self): with sdcard.filesystem(mounted=False): self.assertFalse(fatfs.is_mounted()) def test_mount(self): # set up a filesystem first with sdcard.filesystem(mounted=False): fatfs.mkfs() with sdcard.filesystem(): self.assertTrue(fatfs.is_mounted()) self.assertFalse(fatfs.is_mounted()) def test_nesting(self): # set up a filesystem first with sdcard.filesystem(mounted=False): fatfs.mkfs() self.assertEqual(sdcard.capacity(), 0) with sdcard.filesystem(): self.assertTrue(sdcard.capacity() > 0) self.assertTrue(fatfs.is_mounted()) with sdcard.filesystem(): self.assertTrue(sdcard.capacity() > 0) self.assertTrue(fatfs.is_mounted()) self.assertTrue(sdcard.capacity() > 0) self.assertTrue(fatfs.is_mounted()) self.assertEqual(sdcard.capacity(), 0) self.assertFalse(fatfs.is_mounted()) def test_mount_nomount(self): with self.assertRaises(RuntimeError): with sdcard.filesystem(mounted=True): with sdcard.filesystem(mounted=False): pass with self.assertRaises(RuntimeError): with sdcard.filesystem(mounted=False): with sdcard.filesystem(mounted=True): pass def test_failed_mount(self): # set up a filesystem first with sdcard.filesystem(mounted=False): fatfs.mkfs() with sdcard.filesystem(): self.assertTrue(fatfs.is_mounted()) # trash filesystem io.sdcard.power_on() io.sdcard.write(0, bytes([0xFF] * io.sdcard.BLOCK_SIZE)) io.sdcard.power_off() # mounting should now fail with self.assertRaises(OSError): with sdcard.filesystem(): pass self.assertFalse(fatfs.is_mounted()) # it should be possible to create an unmounted instance with sdcard.filesystem(mounted=False): fatfs.mkfs() # mounting should now succeed with sdcard.filesystem(): self.assertTrue(fatfs.is_mounted()) if __name__ == "__main__": unittest.main()