mirror of
https://github.com/licsber/micropython.git
synced 2024-09-20 00:50:24 +08:00
5f7065f57a
These tests test an unrealistic situation and only pass by accident due to a bug. The upcoming fix for the bug would make them fail. The unrealistic situation is that VfsPosix methods are called with relative paths while the current working directory is somewhere outside of the root of the VFS. In the intended use of VFS objects via os.mount() (as opposed to calling methods directly as the tests do), this never happens, as mp_vfs_lookup_path() directs incoming calls to the VFS that contains the CWD. Make the testing situation realistic by changing the working directory to the root of the VFS before calling methods on it, as the subsequent relative path accesses expect. Thanks to the preceding commit, the tests still pass, but still for the wrong reason. The following commit "Fix relative paths on non-root VFS" will make them pass for the correct reason. Signed-off-by: Christian Walther <cwalther@gmx.ch>
144 lines
3.0 KiB
Python
144 lines
3.0 KiB
Python
# Test for VfsPosix
|
|
|
|
try:
|
|
import gc
|
|
import os
|
|
|
|
os.VfsPosix
|
|
except (ImportError, AttributeError):
|
|
print("SKIP")
|
|
raise SystemExit
|
|
|
|
# We need a directory for testing that doesn't already exist.
|
|
# Skip the test if it does exist.
|
|
temp_dir = "micropy_test_dir"
|
|
try:
|
|
import os
|
|
|
|
os.stat(temp_dir)
|
|
print("SKIP")
|
|
raise SystemExit
|
|
except OSError:
|
|
pass
|
|
|
|
# getcwd and chdir
|
|
curdir = os.getcwd()
|
|
os.chdir("/")
|
|
print(os.getcwd())
|
|
os.chdir(curdir)
|
|
print(os.getcwd() == curdir)
|
|
|
|
# stat
|
|
print(type(os.stat("/")))
|
|
|
|
# listdir and ilistdir
|
|
print(type(os.listdir("/")))
|
|
|
|
# mkdir
|
|
os.mkdir(temp_dir)
|
|
|
|
# file create
|
|
f = open(temp_dir + "/test", "w")
|
|
f.write("hello")
|
|
f.close()
|
|
|
|
# close on a closed file should succeed
|
|
f.close()
|
|
|
|
# construct a file object with a raw fileno
|
|
f = open(2)
|
|
print(f)
|
|
|
|
# file read
|
|
f = open(temp_dir + "/test", "r")
|
|
print(f.read())
|
|
f.close()
|
|
|
|
# file finaliser, also see vfs_fat_finaliser.py
|
|
names = [temp_dir + "/x%d" % i for i in range(4)]
|
|
basefd = temp_dir + "/nextfd1"
|
|
nextfd = temp_dir + "/nextfd2"
|
|
|
|
with open(basefd, "w") as f:
|
|
base_file_no = f.fileno()
|
|
|
|
for i in range(1024): # move GC head forwards by allocating a lot of single blocks
|
|
[]
|
|
|
|
|
|
def write_files_without_closing():
|
|
for n in names:
|
|
open(n, "w").write(n)
|
|
sorted(list(range(128)), key=lambda x: x) # use up Python and C stack so f is really gone
|
|
|
|
|
|
write_files_without_closing()
|
|
gc.collect()
|
|
|
|
with open(nextfd, "w") as f:
|
|
next_file_no = f.fileno()
|
|
print("next_file_no <= base_file_no", next_file_no <= base_file_no)
|
|
|
|
for n in names + [basefd, nextfd]:
|
|
os.remove(n)
|
|
|
|
# rename
|
|
os.rename(temp_dir + "/test", temp_dir + "/test2")
|
|
print(os.listdir(temp_dir))
|
|
|
|
# construct new VfsPosix with path argument
|
|
vfs = os.VfsPosix(temp_dir)
|
|
# when VfsPosix is used the intended way via os.mount(), it can only be called
|
|
# with relative paths when the CWD is inside or at its root, so simulate that
|
|
os.chdir(temp_dir)
|
|
print(list(i[0] for i in vfs.ilistdir(".")))
|
|
|
|
# stat, statvfs (statvfs may not exist)
|
|
print(type(vfs.stat(".")))
|
|
if hasattr(vfs, "statvfs"):
|
|
assert type(vfs.statvfs(".")) is tuple
|
|
|
|
# check types of ilistdir with str/bytes arguments
|
|
print(type(list(vfs.ilistdir("."))[0][0]))
|
|
print(type(list(vfs.ilistdir(b"."))[0][0]))
|
|
|
|
# chdir should not affect absolute paths (regression test)
|
|
vfs.mkdir("/subdir")
|
|
vfs.mkdir("/subdir/micropy_test_dir")
|
|
with vfs.open("/subdir/micropy_test_dir/test2", "w") as f:
|
|
f.write("wrong")
|
|
vfs.chdir("/subdir")
|
|
with vfs.open("/test2", "r") as f:
|
|
print(f.read())
|
|
os.chdir(curdir)
|
|
vfs.remove("/subdir/micropy_test_dir/test2")
|
|
vfs.rmdir("/subdir/micropy_test_dir")
|
|
vfs.rmdir("/subdir")
|
|
|
|
# done with vfs, restore CWD
|
|
os.chdir(curdir)
|
|
|
|
# remove
|
|
os.remove(temp_dir + "/test2")
|
|
print(os.listdir(temp_dir))
|
|
|
|
# remove with error
|
|
try:
|
|
import os
|
|
|
|
os.remove(temp_dir + "/test2")
|
|
except OSError:
|
|
print("remove OSError")
|
|
|
|
# rmdir
|
|
os.rmdir(temp_dir)
|
|
print(temp_dir in os.listdir())
|
|
|
|
# rmdir with error
|
|
try:
|
|
import os
|
|
|
|
os.rmdir(temp_dir)
|
|
except OSError:
|
|
print("rmdir OSError")
|