mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 12:01:16 +00:00
117 lines
2.6 KiB
Plaintext
117 lines
2.6 KiB
Plaintext
module std::io::file @if(env::LIBC &&& env::POSIX);
|
|
import std::math, libc, std::io::path;
|
|
|
|
tlocal char[1024] buf;
|
|
|
|
fn String random_name()
|
|
{
|
|
String filename = string::tformat("c3_test_file_%x", rand(0xFFFFFFF));
|
|
Path temp_dir = path::temp_directory(tmem).tappend(filename)!!;
|
|
return temp_dir.str_view();
|
|
}
|
|
|
|
fn void map_read_only() @test
|
|
{
|
|
String fname = random_name();
|
|
char[] msg = "Hello, world";
|
|
file::save(fname, msg)!!;
|
|
|
|
File f = file::open(fname, "rb")!!;
|
|
defer f.close()!!;
|
|
|
|
FileMmap mapped_file = file::mmap_file(f, 0, 0, vm::VirtualMemoryAccess.READ)!!;
|
|
defer mapped_file.destroy()!!;
|
|
|
|
char[] view = mapped_file.bytes();
|
|
assert(view.len == msg.len);
|
|
for (usz i = 0; i < view.len; i += 1)
|
|
{
|
|
assert(view[i] == msg[i]);
|
|
}
|
|
}
|
|
|
|
fn void map_read_write() @test
|
|
{
|
|
String fname = random_name();
|
|
char[4] data = "ABCD";
|
|
file::save(fname, &data)!!;
|
|
|
|
bool shared = true;
|
|
File f = file::open(fname, "r+")!!;
|
|
mmap::FileMmap region = file::mmap_file(f, 0, 0, vm::VirtualMemoryAccess.READWRITE, shared)!!;
|
|
|
|
region.bytes()[1] = 'Z';
|
|
|
|
region.destroy()!!;
|
|
f.close()!!;
|
|
|
|
File fr = file::open(fname, "r")!!;
|
|
defer fr.close()!!;
|
|
char[4] check;
|
|
fr.read(check[..])!!;
|
|
assert(check[0] == 'A' && check[1] == 'Z' && check[2] == 'C');
|
|
}
|
|
|
|
fn void map_with_offset(String fname, usz offset, usz size, char[] reference_msg)
|
|
{
|
|
File f = file::open(fname, "r")!!;
|
|
defer f.close()!!;
|
|
|
|
mmap::FileMmap mapped_file = file::mmap_file(f, offset, size, vm::VirtualMemoryAccess.READ)!!;
|
|
defer mapped_file.destroy()!!;
|
|
|
|
usz expected_size = size;
|
|
if (size == 0)
|
|
{
|
|
expected_size = reference_msg.len - offset;
|
|
}
|
|
char[] view = mapped_file.bytes();
|
|
assert(view.len == expected_size);
|
|
assert(view[0] == reference_msg[offset]);
|
|
}
|
|
|
|
fn void map_read_only_with_offset_and_size_zero() @test
|
|
{
|
|
String fname = random_name();
|
|
char[] msg = "Hello, world";
|
|
file::save(fname, msg)!!;
|
|
|
|
usz map_size = 0;
|
|
for (usz i = 0; i < msg.len; i += 1)
|
|
{
|
|
map_with_offset(fname, i, map_size, msg);
|
|
}
|
|
}
|
|
|
|
fn void map_read_only_with_offset() @test
|
|
{
|
|
String fname = random_name();
|
|
char[] msg = "Hello, world";
|
|
file::save(fname, msg)!!;
|
|
|
|
usz map_size = 3;
|
|
for (usz i = 0; i < msg.len - map_size; i++)
|
|
{
|
|
map_with_offset(fname, i, map_size, msg);
|
|
}
|
|
}
|
|
|
|
|
|
fn void map_from_filename() @test
|
|
{
|
|
String fname = random_name();
|
|
char[] msg = "Hello, world";
|
|
file::save(fname, msg)!!;
|
|
|
|
mmap::FileMmap mapped_file = file::mmap_open(fname, "rb", 0, 0, vm::VirtualMemoryAccess.READ)!!;
|
|
defer mapped_file.destroy()!!;
|
|
|
|
char[] view = mapped_file.bytes();
|
|
test::eq(view.len, msg.len);
|
|
for (usz i = 0; i < view.len; i++)
|
|
{
|
|
test::eq(view[i], msg[i]);
|
|
}
|
|
}
|
|
|