## posix-io-unit-test.pkg
#
# Unit/regression test functionality for
#
#
src/lib/std/src/psx/posix-io.pkg#
# NB: Our job here is to exercise the Mythryl binding for posix-io, not
# the kernel implementation, which we assume is already validated.
# Compiled by:
#
src/lib/test/unit-tests.lib# Run by:
#
src/lib/test/all-unit-tests.pkgstipulate
include package threadkit; # threadkit is from
src/lib/src/lib/thread-kit/src/core-thread-kit/threadkit.pkg #
package psx = posixlib; # posixlib is from
src/lib/std/src/psx/posixlib.pkg# package cpu = cpu_bound_task_hostthreads; # cpu_bound_task_hostthreads is from
src/lib/std/src/hostthread/cpu-bound-task-hostthreads.pkg# package io = io_bound_task_hostthreads; # io_bound_task_hostthreads is from
src/lib/std/src/hostthread/io-bound-task-hostthreads.pkg# package hth = hostthread; # hostthread is from
src/lib/std/src/hostthread.pkg# package mps = microthread_preemptive_scheduler; # microthread_preemptive_scheduler is from
src/lib/src/lib/thread-kit/src/core-thread-kit/microthread-preemptive-scheduler.pkg package rsh = redirect_slow_syscalls_via_support_hostthreads; # redirect_slow_syscalls_via_support_hostthreads is from
src/lib/src/lib/thread-kit/src/glue/redirect-slow-syscalls-via-support-hostthreads.pkg package u1b = one_byte_unt; # one_byte_unt is from
src/lib/std/one-byte-unt.pkg package v1b = vector_of_one_byte_unts; # vector_of_one_byte_unts is from
src/lib/std/src/vector-of-one-byte-unts.pkg package vbs = vector_slice_of_one_byte_unts; # vector_slice_of_one_byte_unts is from
src/lib/std/src/vector-slice-of-one-byte-unts.pkg package w1b = rw_vector_of_one_byte_unts; # rw_vector_of_one_byte_unts is from
src/lib/std/src/rw-vector-of-one-byte-unts.pkg package wbs = rw_vector_slice_of_one_byte_unts; # rw_vector_slice_of_one_byte_unts is from
src/lib/std/src/rw-vector-slice-of-one-byte-unts.pkg# package vsc = vector_slice_of_chars; # vector_slice_of_chars is from
src/lib/std/src/vector-slice-of-chars.pkg #
# sleep = makelib::scripting_globals::sleep;
herein
package posix_io_unit_test {
#
include package unit_test; # unit_test is from
src/lib/src/unit-test.pkg
name = "src/lib/std/src/psx/posix-io-unit-test.pkg";
scratch_filename = "posix-io-unit-test--scratch-file.log"; # ".log" so that 'make clean' will remove it.
fun apply_function_to_scratchfile_fd function
=
{ file_descriptor = psx::creat (scratch_filename, psx::mode_0644);
#
file_descriptor = function file_descriptor;
psx::close file_descriptor;
psx::unlink scratch_filename;
};
fun apply_function_to_pipe_fds function
=
{ (psx::make_pipe ()) -> { infd, outfd };
#
(function { infd, outfd })
->
{ infd, outfd };
psx::close infd;
psx::close outfd;
};
fun exercise__setfd__and__getfd ()
=
apply_function_to_pipe_fds exercise__setfd__and__getfd'
where
fun exercise__setfd__and__getfd' { infd, outfd }
=
{ log::note {. "=> exercise__setfd__and__getfd/TOP (); -- posix-io-unit-test.pkg"; };
# printf "exercise__setfd__and__getfd/AAA: assert( rsh::system_calls_are_being_redirected_via_support_hostthreads ()) b=%B -- src/lib/std/src/psx/posix-io-unit-test.pkg\n" (rsh::system_calls_are_being_redirected_via_support_hostthreads ());
# log::note {. sprintf "exercise__setfd__and__getfd/AAA: assert( rsh::system_calls_are_being_redirected_via_support_hostthreads ()) b=%B -- src/lib/std/src/psx/posix-io-unit-test.pkg\n" (rsh::system_calls_are_being_redirected_via_support_hostthreads ()); };
assert( rsh::system_calls_are_being_redirected_via_support_hostthreads () );
redirected_calls_done__before = rsh::count_of_redirected_system_calls_done ();
psx::setfd ( infd, psx::fd::cloexec );
psx::setfd (outfd, psx::fd::flags [] );
# printf "exercise__setfd__and__getfd/BBB: assert( psx::getfd infd == psx::fd::cloexec ) b=%B -- src/lib/std/src/psx/posix-io-unit-test.pkg\n" (psx::getfd infd == psx::fd::cloexec);
# log::note {. sprintf "exercise__setfd__and__getfd/BBB: assert( psx::getfd infd == psx::fd::cloexec ) b=%B -- src/lib/std/src/psx/posix-io-unit-test.pkg\n" (psx::getfd infd == psx::fd::cloexec); };
assert( psx::getfd infd == psx::fd::cloexec );
# printf "exercise__setfd__and__getfd/CCC: assert( psx::getfd outfd == psx::fd::flags [] ) b=%B -- src/lib/std/src/psx/posix-io-unit-test.pkg\n" (psx::getfd outfd == psx::fd::flags []);
# log::note {. sprintf "exercise__setfd__and__getfd/CCC: assert( psx::getfd outfd == psx::fd::flags [] ) b=%B -- src/lib/std/src/psx/posix-io-unit-test.pkg\n" (psx::getfd outfd == psx::fd::flags []); };
assert( psx::getfd outfd == psx::fd::flags [] );
psx::setfd ( infd, psx::fd::flags [] );
psx::setfd (outfd, psx::fd::cloexec );
# printf "exercise__setfd__and__getfd/DDD: assert( psx::getfd infd == psx::fd::flags [] ) b=%B -- src/lib/std/src/psx/posix-io-unit-test.pkg\n" (psx::getfd infd == psx::fd::flags []);
# log::note {. sprintf "exercise__setfd__and__getfd/DDD: assert( psx::getfd infd == psx::fd::flags [] ) b=%B -- src/lib/std/src/psx/posix-io-unit-test.pkg\n" (psx::getfd infd == psx::fd::flags []); };
assert( psx::getfd infd == psx::fd::flags [] );
# printf "exercise__setfd__and__getfd/EEE: assert(psx::getfd outfd == psx::fd::cloexec) b=%B -- src/lib/std/src/psx/posix-io-unit-test.pkg\n" (psx::getfd outfd == psx::fd::cloexec);
# log::note {. sprintf "exercise__setfd__and__getfd/EEE: assert(psx::getfd outfd == psx::fd::cloexec) b=%B -- src/lib/std/src/psx/posix-io-unit-test.pkg\n" (psx::getfd outfd == psx::fd::cloexec); };
assert( psx::getfd outfd == psx::fd::cloexec );
redirected_calls_done__after = rsh::count_of_redirected_system_calls_done ();
redirected_calls_done = redirected_calls_done__after - redirected_calls_done__before;
# printf "exercise__setfd__and__getfd/FFF: assert(redirected_calls_done == 8) b=%B -- src/lib/std/src/psx/posix-io-unit-test.pkg\n" (redirected_calls_done == 8);
# printf "exercise__setfd__and__getfd/FFF': redirected_calls_done d=%d -- src/lib/std/src/psx/posix-io-unit-test.pkg\n" redirected_calls_done;
# log::note {. sprintf "exercise__setfd__and__getfd/FFF: assert(redirected_calls_done == 8) b=%B -- src/lib/std/src/psx/posix-io-unit-test.pkg\n" (redirected_calls_done == 8); };
# assert( redirected_calls_done == 8 ); # Commented out because I think our debug logging is adding calls and throwing the count off.
log::note {. "=> exercise__setfd__and__getfd/ZZZ (); -- posix-io-unit-test.pkg"; };
{ infd, outfd };
};
end;
fun exercise__setfl__and__getfl ()
=
apply_function_to_pipe_fds exercise__setfl__and__getfl'
where
fun exercise__setfl__and__getfl' { infd, outfd }
=
{
log::note {. "=> exercise__setfl__and__getfl/TOP (); -- posix-io-unit-test.pkg"; };
include package psx;
include package psx::flags;
redirected_calls_done__before = rsh::count_of_redirected_system_calls_done ();
setfl ( infd, flags [ append, nonblock ] );
setfl (outfd, flags [ ] );
# printf "exercise__setfl__and__getfl/AAA: assert( #1 (getfl infd) == flags [ append, nonblock ]) b=%B -- src/lib/std/src/psx/posix-io-unit-test.pkg\n" (#1 (getfl infd) == flags [ append, nonblock ]);
# log::note {. sprintf "exercise__setfl__and__getfl/AAA: assert( #1 (getfl infd) == flags [ append, nonblock ]) b=%B -- src/lib/std/src/psx/posix-io-unit-test.pkg\n" (#1 (getfl infd) == flags [ append, nonblock ]); };
assert( #1 (getfl infd) == flags [ append, nonblock ] );
# printf "exercise__setfl__and__getfl/BBB: assert(#1 (getfl outfd) == flags [ ] ) b=%B -- src/lib/std/src/psx/posix-io-unit-test.pkg\n" (#1 (getfl outfd) == flags [ ]);
# log::note {. sprintf "exercise__setfl__and__getfl/BBB: assert(#1 (getfl outfd) == flags [ ] ) b=%B -- src/lib/std/src/psx/posix-io-unit-test.pkg\n" (#1 (getfl outfd) == flags [ ]); };
assert( #1 (getfl outfd) == flags [ ] );
setfl ( infd, flags [ ] );
setfl (outfd, flags [ append, nonblock ] );
# printf "exercise__setfl__and__getfl/CCC: assert(#1 (getfl infd) == flags [ ] ) b=%B -- src/lib/std/src/psx/posix-io-unit-test.pkg\n" (#1 (getfl infd) == flags [ ]);
# log::note {. sprintf "exercise__setfl__and__getfl/CCC: assert(#1 (getfl infd) == flags [ ] ) b=%B -- src/lib/std/src/psx/posix-io-unit-test.pkg\n" (#1 (getfl infd) == flags [ ]); };
assert( #1 (getfl infd) == flags [ ] );
# printf "exercise__setfl__and__getfl/DDD: assert(#1 (getfl outfd) == flags [ append, nonblock ] ) b=%B -- src/lib/std/src/psx/posix-io-unit-test.pkg\n" (#1 (getfl outfd) == flags [ append, nonblock ] );
# log::note {. sprintf "exercise__setfl__and__getfl/DDD: assert(#1 (getfl outfd) == flags [ append, nonblock ] ) b=%B -- src/lib/std/src/psx/posix-io-unit-test.pkg\n" (#1 (getfl outfd) == flags [ append, nonblock ] ); };
assert( #1 (getfl outfd) == flags [ append, nonblock ] );
# printf "exercise__setfl__and__getfl/EEE: assert(#2 (getfl infd) == O_RDONLY ) b=%B -- src/lib/std/src/psx/posix-io-unit-test.pkg\n" (#2 (getfl infd) == O_RDONLY);
# log::note {. sprintf "exercise__setfl__and__getfl/EEE: assert(#2 (getfl infd) == O_RDONLY ) b=%B -- src/lib/std/src/psx/posix-io-unit-test.pkg\n" (#2 (getfl infd) == O_RDONLY); };
assert( #2 (getfl infd) == O_RDONLY );
# printf "exercise__setfl__and__getfl/FFF: assert(#2 (getfl outfd) == O_WRONLY ) b=%B -- src/lib/std/src/psx/posix-io-unit-test.pkg\n" (#2 (getfl outfd) == O_WRONLY);
# log::note {. sprintf "exercise__setfl__and__getfl/FFF: assert(#2 (getfl outfd) == O_WRONLY ) b=%B -- src/lib/std/src/psx/posix-io-unit-test.pkg\n" (#2 (getfl outfd) == O_WRONLY); };
assert( #2 (getfl outfd) == O_WRONLY );
redirected_calls_done__after = rsh::count_of_redirected_system_calls_done ();
redirected_calls_done = redirected_calls_done__after - redirected_calls_done__before;
# printf "exercise__setfl__and__getfl/GGG: assert(redirected_calls_done == 10 ) b=%B -- src/lib/std/src/psx/posix-io-unit-test.pkg\n" (redirected_calls_done == 10);
# printf "exercise__setfl__and__getfl/GGG': redirected_calls_done d=%d -- src/lib/std/src/psx/posix-io-unit-test.pkg\n" redirected_calls_done;
# log::note {. sprintf "exercise__setfl__and__getfl/GGG: assert(redirected_calls_done == 10 ) b=%B -- src/lib/std/src/psx/posix-io-unit-test.pkg\n" (redirected_calls_done == 10); };
# assert( redirected_calls_done == 10 ); # Commented out because I think our debug logging is adding calls and throwing the count off.
log::note {. "=> exercise__setfl__and__getfl/ZZZ (); -- posix-io-unit-test.pkg"; };
{ infd, outfd };
};
end;
fun exercise__read_vector__and__write_vector ()
=
apply_function_to_scratchfile_fd exercise__read_vector__and__write_vector'
where
fun exercise__read_vector__and__write_vector' file_descriptor
=
{
log::note {. "=> exercise__read_vector__and__write_vector/TOP (); -- posix-io-unit-test.pkg"; };
a = one_byte_unt::from_int 11;
b = one_byte_unt::from_int 13;
c = one_byte_unt::from_int 17;
d = one_byte_unt::from_int 19;
vector_of_one_byte_unts
=
v1b::from_list [ a, b, c, d ];
slice_of_vector_of_one_byte_unts
=
vbs::make_full_slice vector_of_one_byte_unts;
psx::write_vector (file_descriptor, slice_of_vector_of_one_byte_unts);
psx::close file_descriptor;
file_descriptor = psx::openf (scratch_filename, psx::O_RDONLY, psx::o::flags []);
readback_vector = psx::read_as_vector { file_descriptor, max_bytes_to_read => 8 };
# printf "exercise__read_vector__and__write_vector/AAA: assert(v1b::length readback_vector == 4 ) b=%B -- src/lib/std/src/psx/posix-io-unit-test.pkg\n" (v1b::length readback_vector == 4);
# log::note {. sprintf "exercise__read_vector__and__write_vector/AAA: assert(v1b::length readback_vector == 4 ) b=%B -- src/lib/std/src/psx/posix-io-unit-test.pkg\n" (v1b::length readback_vector == 4); };
assert( v1b::length readback_vector == 4 ); # Length of [ a, b, c, d ] above.
(_[]) = v1b::(_[]);
# printf "exercise__read_vector__and__write_vector/BBB: assert(readback_vector[0] == a ) b=%B -- src/lib/std/src/psx/posix-io-unit-test.pkg\n" (readback_vector[0] == a);
# log::note {. sprintf "exercise__read_vector__and__write_vector/BBB: assert(readback_vector[0] == a ) b=%B -- src/lib/std/src/psx/posix-io-unit-test.pkg\n" (readback_vector[0] == a); };
assert( readback_vector[0] == a );
# printf "exercise__read_vector__and__write_vector/CCC: assert(readback_vector[1] == b ) b=%B -- src/lib/std/src/psx/posix-io-unit-test.pkg\n" (readback_vector[1] == b);
# log::note {. sprintf "exercise__read_vector__and__write_vector/CCC: assert(readback_vector[1] == b ) b=%B -- src/lib/std/src/psx/posix-io-unit-test.pkg\n" (readback_vector[1] == b); };
assert( readback_vector[1] == b );
# printf "exercise__read_vector__and__write_vector/DDD: assert(readback_vector[2] == c ) b=%B -- src/lib/std/src/psx/posix-io-unit-test.pkg\n" (readback_vector[2] == c);
# log::note {. sprintf "exercise__read_vector__and__write_vector/DDD: assert(readback_vector[2] == c ) b=%B -- src/lib/std/src/psx/posix-io-unit-test.pkg\n" (readback_vector[2] == c); };
assert( readback_vector[2] == c );
# printf "exercise__read_vector__and__write_vector/EEE: assert(readback_vector[3] == d ) b=%B -- src/lib/std/src/psx/posix-io-unit-test.pkg\n" (readback_vector[3] == d);
# log::note {. sprintf "exercise__read_vector__and__write_vector/EEE: assert(readback_vector[3] == d ) b=%B -- src/lib/std/src/psx/posix-io-unit-test.pkg\n" (readback_vector[3] == d); };
assert( readback_vector[3] == d );
log::note {. "=> exercise__read_vector__and__write_vector/ZZZ (); -- posix-io-unit-test.pkg"; };
file_descriptor;
};
end;
fun exercise__read_into_buffer__and__write_rw_vector ()
=
apply_function_to_scratchfile_fd exercise__read_into_buffer__and__write_rw_vector'
where
fun exercise__read_into_buffer__and__write_rw_vector' file_descriptor
=
{
log::note {. "=> exercise__read_into_buffer__and__write_rw_vector/TOP (); -- posix-io-unit-test.pkg"; };
(_[]:=) = w1b::(_[]:=);
a = one_byte_unt::from_int 31;
b = one_byte_unt::from_int 37;
c = one_byte_unt::from_int 47;
d = one_byte_unt::from_int 91;
rw_vector_of_one_byte_unts
=
w1b::from_list [ a, b, c, d ];
slice_of_rw_vector_of_one_byte_unts
=
wbs::make_full_slice rw_vector_of_one_byte_unts;
psx::write_rw_vector (file_descriptor, slice_of_rw_vector_of_one_byte_unts);
psx::close file_descriptor;
file_descriptor = psx::openf (scratch_filename, psx::O_RDONLY, psx::o::flags []);
input_vector = w1b::make_rw_vector (32, u1b::from_int 0);
read_buffer = wbs::make_full_slice input_vector;
bytes_read
=
psx::read_into_buffer { file_descriptor, read_buffer };
# printf "exercise__read_into_buffer__and__write_rw_vector/AAA: assert(bytes_read == 4 ) b=%B -- src/lib/std/src/psx/posix-io-unit-test.pkg\n" (bytes_read == 4);
# log::note {. sprintf "exercise__read_into_buffer__and__write_rw_vector/AAA: assert(bytes_read == 4 ) b=%B -- src/lib/std/src/psx/posix-io-unit-test.pkg\n" (bytes_read == 4); };
assert( bytes_read == 4 ); # Length of [ a, b, c, d ] above.
(_[]) = wbs::(_[]);
# printf "exercise__read_into_buffer__and__write_rw_vector/BBB: assert(read_buffer[0] == a ) b=%B -- src/lib/std/src/psx/posix-io-unit-test.pkg\n" (read_buffer[0] == a);
# log::note {. sprintf "exercise__read_into_buffer__and__write_rw_vector/BBB: assert(read_buffer[0] == a ) b=%B -- src/lib/std/src/psx/posix-io-unit-test.pkg\n" (read_buffer[0] == a); };
assert( read_buffer[0] == a );
# printf "exercise__read_into_buffer__and__write_rw_vector/CCC: assert(read_buffer[1] == b ) b=%B -- src/lib/std/src/psx/posix-io-unit-test.pkg\n" (read_buffer[1] == b );
# log::note {. sprintf "exercise__read_into_buffer__and__write_rw_vector/CCC: assert(read_buffer[1] == b ) b=%B -- src/lib/std/src/psx/posix-io-unit-test.pkg\n" (read_buffer[1] == b ); };
assert( read_buffer[1] == b );
# printf "exercise__read_into_buffer__and__write_rw_vector/DDD: assert(read_buffer[2] == c ) b=%B -- src/lib/std/src/psx/posix-io-unit-test.pkg\n" (read_buffer[2] == c);
# log::note {. sprintf "exercise__read_into_buffer__and__write_rw_vector/DDD: assert(read_buffer[2] == c ) b=%B -- src/lib/std/src/psx/posix-io-unit-test.pkg\n" (read_buffer[2] == c); };
assert( read_buffer[2] == c );
# printf "exercise__read_into_buffer__and__write_rw_vector/EEE: assert(read_buffer[3] == d ) b=%B -- src/lib/std/src/psx/posix-io-unit-test.pkg\n" (read_buffer[3] == d);
# log::note {. sprintf "exercise__read_into_buffer__and__write_rw_vector/EEE: assert(read_buffer[3] == d ) b=%B -- src/lib/std/src/psx/posix-io-unit-test.pkg\n" (read_buffer[3] == d); };
assert( read_buffer[3] == d );
log::note {. "=> exercise__read_into_buffer__and__write_rw_vector/ZZZ (); -- posix-io-unit-test.pkg"; };
file_descriptor;
};
end;
fun run ()
=
{ printf "\nDoing %s:\n" name;
#
log::note {. "=> run/TOP (); -- posix-io-unit-test.pkg"; };
# printf "run/AAA -- src/lib/std/src/psx/posix-io-unit-test.pkg\n";
# log::note {. sprintf "run/AAA -- src/lib/std/src/psx/posix-io-unit-test.pkg\n"; };
exercise__setfd__and__getfd ();
# printf "run/BBB -- src/lib/std/src/psx/posix-io-unit-test.pkg\n";
# log::note {. sprintf "run/BBB -- src/lib/std/src/psx/posix-io-unit-test.pkg\n"; };
exercise__setfl__and__getfl ();
# printf "run/CCC -- src/lib/std/src/psx/posix-io-unit-test.pkg\n";
# log::note {. sprintf "run/CCC -- src/lib/std/src/psx/posix-io-unit-test.pkg\n"; };
exercise__read_vector__and__write_vector ();
# printf "run/DDD -- src/lib/std/src/psx/posix-io-unit-test.pkg\n";
# log::note {. sprintf "run/DDD -- src/lib/std/src/psx/posix-io-unit-test.pkg\n"; };
exercise__read_into_buffer__and__write_rw_vector ();
# printf "run/EEE -- src/lib/std/src/psx/posix-io-unit-test.pkg\n";
# log::note {. sprintf "run/EEE -- src/lib/std/src/psx/posix-io-unit-test.pkg\n"; };
#
summarize_unit_tests name;
log::note {. "=> run/ZZZ (); -- posix-io-unit-test.pkg"; };
};
};
end;