vfs_basic.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. # test VFS functionality without any particular filesystem type
  2. try:
  3. import uos
  4. uos.mount
  5. except (ImportError, AttributeError):
  6. print("SKIP")
  7. raise SystemExit
  8. class Filesystem:
  9. def __init__(self, id):
  10. self.id = id
  11. def mount(self, readonly, mkfs):
  12. print(self.id, 'mount', readonly, mkfs)
  13. def umount(self):
  14. print(self.id, 'umount')
  15. def ilistdir(self, dir):
  16. print(self.id, 'ilistdir', dir)
  17. return iter([('a%d' % self.id, 0, 0)])
  18. def chdir(self, dir):
  19. print(self.id, 'chdir', dir)
  20. def getcwd(self):
  21. print(self.id, 'getcwd')
  22. return 'dir%d' % self.id
  23. def mkdir(self, path):
  24. print(self.id, 'mkdir', path)
  25. def remove(self, path):
  26. print(self.id, 'remove', path)
  27. def rename(self, old_path, new_path):
  28. print(self.id, 'rename', old_path, new_path)
  29. def rmdir(self, path):
  30. print(self.id, 'rmdir', path)
  31. def stat(self, path):
  32. print(self.id, 'stat', path)
  33. return (self.id,)
  34. def statvfs(self, path):
  35. print(self.id, 'statvfs', path)
  36. return (self.id,)
  37. def open(self, file, mode):
  38. print(self.id, 'open', file, mode)
  39. # first we umount any existing mount points the target may have
  40. try:
  41. uos.umount('/')
  42. except OSError:
  43. pass
  44. for path in uos.listdir('/'):
  45. uos.umount('/' + path)
  46. # stat root dir
  47. print(uos.stat('/'))
  48. # statvfs root dir; verify that f_namemax has a sensible size
  49. print(uos.statvfs('/')[9] >= 32)
  50. # getcwd when in root dir
  51. print(uos.getcwd())
  52. # basic mounting and listdir
  53. uos.mount(Filesystem(1), '/test_mnt')
  54. print(uos.listdir())
  55. # ilistdir
  56. i = uos.ilistdir()
  57. print(next(i))
  58. try:
  59. next(i)
  60. except StopIteration:
  61. print('StopIteration')
  62. try:
  63. next(i)
  64. except StopIteration:
  65. print('StopIteration')
  66. # referencing the mount point in different ways
  67. print(uos.listdir('test_mnt'))
  68. print(uos.listdir('/test_mnt'))
  69. # mounting another filesystem
  70. uos.mount(Filesystem(2), '/test_mnt2', readonly=True)
  71. print(uos.listdir())
  72. print(uos.listdir('/test_mnt2'))
  73. # mounting over an existing mount point
  74. try:
  75. uos.mount(Filesystem(3), '/test_mnt2')
  76. except OSError:
  77. print('OSError')
  78. # mkdir of a mount point
  79. try:
  80. uos.mkdir('/test_mnt')
  81. except OSError:
  82. print('OSError')
  83. # rename across a filesystem
  84. try:
  85. uos.rename('/test_mnt/a', '/test_mnt2/b')
  86. except OSError:
  87. print('OSError')
  88. # delegating to mounted filesystem
  89. uos.chdir('test_mnt')
  90. print(uos.listdir())
  91. print(uos.getcwd())
  92. uos.mkdir('test_dir')
  93. uos.remove('test_file')
  94. uos.rename('test_file', 'test_file2')
  95. uos.rmdir('test_dir')
  96. print(uos.stat('test_file'))
  97. print(uos.statvfs('/test_mnt'))
  98. open('test_file')
  99. open('test_file', 'wb')
  100. # umount
  101. uos.umount('/test_mnt')
  102. uos.umount('/test_mnt2')
  103. # umount a non-existent mount point
  104. try:
  105. uos.umount('/test_mnt')
  106. except OSError:
  107. print('OSError')
  108. # root dir
  109. uos.mount(Filesystem(3), '/')
  110. print(uos.stat('/'))
  111. print(uos.statvfs('/'))
  112. print(uos.listdir())
  113. open('test')
  114. uos.mount(Filesystem(4), '/mnt')
  115. print(uos.listdir())
  116. print(uos.listdir('/mnt'))
  117. uos.chdir('/mnt')
  118. print(uos.listdir())
  119. # chdir to a subdir within root-mounted vfs, and then listdir
  120. uos.chdir('/subdir')
  121. print(uos.listdir())
  122. uos.chdir('/')
  123. uos.umount('/')
  124. print(uos.listdir('/'))
  125. uos.umount('/mnt')