1
0
mirror of https://github.com/vlang/v.git synced 2023-08-10 21:13:21 +03:00
v/vlib/os/os_test.v
2020-03-10 14:25:16 +01:00

331 lines
7.4 KiB
V

import os
fn testsuite_begin() {
cleanup_leftovers()
}
fn testsuite_end() {
cleanup_leftovers()
}
fn test_open_file() {
filename := './test1.txt'
hello := 'hello world!'
os.open_file(filename, "r+", 0o666) or {
assert err == "No such file or directory"
}
mut file := os.open_file(filename, "w+", 0o666) or { panic(err) }
file.write(hello)
file.close()
assert hello.len == os.file_size(filename)
read_hello := os.read_file(filename) or {
panic('error reading file $filename')
}
assert hello == read_hello
os.rm(filename)
}
fn test_create_file() {
filename := './test1.txt'
hello := 'hello world!'
mut f := os.create(filename) or { panic(err)}
f.write(hello)
f.close()
assert hello.len == os.file_size(filename)
os.rm(filename)
}
fn test_write_and_read_string_to_file() {
filename := './test1.txt'
hello := 'hello world!'
os.write_file(filename, hello)
assert hello.len == os.file_size(filename)
read_hello := os.read_file(filename) or {
panic('error reading file $filename')
}
assert hello == read_hello
os.rm(filename)
}
// test_write_and_read_bytes checks for regressions made in the functions
// read_bytes, read_bytes_at and write_bytes.
/*
fn test_write_and_read_bytes() {
file_name := './byte_reader_writer.tst'
payload := [`I`, `D`, `D`, `Q`, `D`]
mut file_write := os.create(os.realpath(file_name)) or {
eprintln('failed to create file $file_name')
return
}
// We use the standard write_bytes function to write the payload and
// compare the length of the array with the file size (have to match).
file_write.write_bytes(payload.data, 5)
file_write.close()
assert payload.len == os.file_size(file_name)
mut file_read := os.open(os.realpath(file_name)) or {
eprintln('failed to open file $file_name')
return
}
// We only need to test read_bytes because this function calls
// read_bytes_at with second parameter zeroed (size, 0).
red_bytes := file_read.read_bytes(5)
file_read.close()
assert red_bytes.str() == payload.str()
// We finally delete the test file.
os.rm(file_name)
}
*/
fn test_create_and_delete_folder() {
folder := './test1'
os.mkdir(folder) or { panic(err) }
assert os.is_dir(folder)
folder_contents := os.ls(folder) or { panic(err) }
assert folder_contents.len == 0
os.rmdir(folder)
folder_exists := os.is_dir(folder)
assert folder_exists == false
}
fn walk_callback(file string) {
if file == '.' || file == '..' {
return
}
assert file == 'test_walk' + os.path_separator + 'test1'
}
fn test_walk() {
folder := 'test_walk'
os.mkdir(folder) or { panic(err) }
file1 := folder + os.path_separator + 'test1'
os.write_file(file1,'test-1')
os.walk(folder, walk_callback)
os.rm(file1)
os.rmdir(folder)
}
fn test_cp() {
old_file_name := 'cp_example.txt'
new_file_name := 'cp_new_example.txt'
os.write_file(old_file_name, 'Test data 1 2 3, V is awesome #$%^[]!~')
os.cp(old_file_name, new_file_name) or { panic('$err: errcode: $errcode') }
old_file := os.read_file(old_file_name) or { panic(err) }
new_file := os.read_file(new_file_name) or { panic(err) }
assert old_file == new_file
os.rm(old_file_name)
os.rm(new_file_name)
}
fn test_cp_r() {
//fileX -> dir/fileX
// NB: clean up of the files happens inside the cleanup_leftovers function
os.write_file('ex1.txt', 'wow!')
os.mkdir('ex') or { panic(err) }
os.cp_all('ex1.txt', 'ex', false) or { panic(err) }
old := os.read_file('ex1.txt') or { panic(err) }
new := os.read_file('ex/ex1.txt') or { panic(err) }
assert old == new
os.mkdir('ex/ex2') or { panic(err) }
os.write_file('ex2.txt', 'great!')
os.cp_all('ex2.txt', 'ex/ex2', false) or { panic(err) }
old2 := os.read_file('ex2.txt') or { panic(err) }
new2 := os.read_file('ex/ex2/ex2.txt') or { panic(err) }
assert old2 == new2
//recurring on dir -> local dir
os.cp_all('ex', './', true) or { panic(err) }
}
fn test_tmpdir(){
t := os.tmpdir()
assert t.len > 0
assert os.is_dir(t)
tfile := t + os.path_separator + 'tmpfile.txt'
os.rm(tfile) // just in case
tfile_content := 'this is a temporary file'
os.write_file(tfile, tfile_content)
tfile_content_read := os.read_file(tfile) or { panic(err) }
assert tfile_content_read == tfile_content
os.rm(tfile)
}
fn test_make_symlink_check_is_link_and_remove_symlink() {
$if windows {
// TODO
assert true
return
}
folder := 'tfolder'
symlink := 'tsymlink'
os.rm(symlink)
os.rm(folder)
os.mkdir(folder) or { panic(err) }
folder_contents := os.ls(folder) or { panic(err) }
assert folder_contents.len == 0
os.system('ln -s $folder $symlink')
assert os.is_link(symlink) == true
os.rm(symlink)
os.rm(folder)
folder_exists := os.is_dir(folder)
assert folder_exists == false
symlink_exists := os.is_link(symlink)
assert symlink_exists == false
}
//fn test_fork() {
// pid := os.fork()
// if pid == 0 {
// println('Child')
// }
// else {
// println('Parent')
// }
//}
//fn test_wait() {
// pid := os.fork()
// if pid == 0 {
// println('Child')
// exit(0)
// }
// else {
// cpid := os.wait()
// println('Parent')
// println(cpid)
// }
//}
fn test_symlink() {
$if windows { return }
os.mkdir('symlink') or { panic(err) }
os.symlink('symlink', 'symlink2') or { panic(err) }
assert os.exists('symlink2')
// cleanup
os.rm('symlink')
os.rm('symlink2')
}
fn test_is_executable_writable_readable() {
file_name := os.tmpdir() + os.path_separator + 'rwxfile.exe'
mut f := os.create(file_name) or {
eprintln('failed to create file $file_name')
return
}
f.close()
$if !windows {
os.chmod(file_name, 0o600) // mark as readable && writable, but NOT executable
assert os.is_writable(file_name)
assert os.is_readable(file_name)
assert !os.is_executable(file_name)
os.chmod(file_name, 0o700) // mark as executable too
assert os.is_executable(file_name)
} $else {
assert os.is_writable(file_name)
assert os.is_readable(file_name)
assert os.is_executable(file_name)
}
// We finally delete the test file.
os.rm(file_name)
}
fn test_ext() {
assert os.ext('file.v') == '.v'
assert os.ext('file') == ''
}
fn test_is_abs() {
assert os.is_abs('/home/user') == true
assert os.is_abs('v/vlib') == false
$if windows {
assert os.is_abs('C:\\Windows\\') == true
}
}
fn test_join() {
$if windows {
assert os.join_path('v', 'vlib', 'os') == 'v\\vlib\\os'
} $else {
assert os.join_path('v', 'vlib', 'os') == 'v/vlib/os'
}
}
fn test_dir() {
$if windows {
assert os.dir('C:\\a\\b\\c') == 'C:\\a\\b'
} $else {
assert os.dir('/var/tmp/foo') == '/var/tmp'
}
assert os.dir('os') == '.'
}
fn test_basedir() {
$if windows {
assert os.base_dir('v\\vlib\\os') == 'v\\vlib'
} $else {
assert os.base_dir('v/vlib/os') == 'v/vlib'
}
assert os.base_dir('filename') == 'filename'
}
// this function is called by both test_aaa_setup & test_zzz_cleanup
// it ensures that os tests do not polute the filesystem with leftover
// files so that they can be run several times in a row.
fn cleanup_leftovers() {
// possible leftovers from test_cp
os.rm('cp_example.txt')
os.rm('cp_new_example.txt')
// possible leftovers from test_cp_r
os.rmdir_all('ex')
os.rmdir_all('ex2')
os.rm('ex1.txt')
os.rm('ex2.txt')
}