diff --git a/test/src/apps/Makefile b/test/src/apps/Makefile index 86a37cbe4..ba34f2e87 100644 --- a/test/src/apps/Makefile +++ b/test/src/apps/Makefile @@ -22,6 +22,7 @@ TEST_APPS := \ eventfd2 \ execve \ exit \ + ext2 \ fdatasync \ file_io \ fork_c \ diff --git a/test/src/apps/ext2/Makefile b/test/src/apps/ext2/Makefile new file mode 100644 index 000000000..a24f8189d --- /dev/null +++ b/test/src/apps/ext2/Makefile @@ -0,0 +1,3 @@ +# SPDX-License-Identifier: MPL-2.0 + +include ../test_common.mk \ No newline at end of file diff --git a/test/src/apps/ext2/mknod.c b/test/src/apps/ext2/mknod.c new file mode 100644 index 000000000..490244945 --- /dev/null +++ b/test/src/apps/ext2/mknod.c @@ -0,0 +1,63 @@ +// SPDX-License-Identifier: MPL-2.0 + +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include +#include "../test.h" + +#define NULL_DEVICE_PATH "/ext2/my_null_device" +#define ZERO_DEVICE_PATH "/ext2/my_zero_device" +#define FIFO_PATH "/ext2/myfifo.fifo" + +FN_TEST(make_device_node) +{ + char buffer[1] = { 'a' }; + + TEST_SUCC(mknod(NULL_DEVICE_PATH, S_IFCHR | 0666, makedev(1, 3))); + int null_fd = TEST_SUCC(open(NULL_DEVICE_PATH, O_RDWR)); + TEST_RES(write(null_fd, buffer, sizeof(buffer)), + _ret == sizeof(buffer)); + TEST_RES(read(null_fd, buffer, sizeof(buffer)), _ret == 0); + TEST_SUCC(close(null_fd)); + TEST_SUCC(unlink(NULL_DEVICE_PATH)); + + TEST_SUCC(mknod(ZERO_DEVICE_PATH, S_IFCHR | 0666, makedev(1, 5))); + int zero_fd = TEST_SUCC(open(ZERO_DEVICE_PATH, O_RDWR)); + TEST_RES(write(zero_fd, buffer, sizeof(buffer)), + _ret == sizeof(buffer)); + TEST_RES(read(zero_fd, buffer, sizeof(buffer)), + _ret == sizeof(buffer) && buffer[0] == 0); + TEST_SUCC(close(zero_fd)); + TEST_SUCC(unlink(ZERO_DEVICE_PATH)); +} +END_TEST() + +FN_TEST(make_fifo_node) +{ + char write_buffer[2] = { 'a', 'b' }; + char read_buffer[1] = { 0 }; + + TEST_SUCC(mkfifo(FIFO_PATH, 0666)); + + TEST_ERRNO(open(FIFO_PATH, O_WRONLY | O_NONBLOCK), ENXIO); + int reader_fd = TEST_SUCC(open(FIFO_PATH, O_RDONLY | O_NONBLOCK)); + int writer_fd = TEST_SUCC(open(FIFO_PATH, O_WRONLY)); + + TEST_RES(write(writer_fd, write_buffer, sizeof(write_buffer)), + _ret == sizeof(write_buffer)); + TEST_RES(read(reader_fd, read_buffer, sizeof(read_buffer)), + _ret == sizeof(read_buffer) && read_buffer[0] == 'a'); + TEST_RES(read(reader_fd, read_buffer, sizeof(read_buffer)), + _ret == sizeof(read_buffer) && read_buffer[0] == 'b'); + + TEST_SUCC(close(reader_fd)); + TEST_SUCC(close(writer_fd)); + TEST_SUCC(unlink(FIFO_PATH)); +} +END_TEST() \ No newline at end of file diff --git a/test/src/apps/ext2/unix_socket.c b/test/src/apps/ext2/unix_socket.c new file mode 100644 index 000000000..0297f1d50 --- /dev/null +++ b/test/src/apps/ext2/unix_socket.c @@ -0,0 +1,54 @@ +// SPDX-License-Identifier: MPL-2.0 + +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include "../test.h" + +#define SERVER_ADDRESS "/ext2/my_unix_server" + +FN_TEST(ext2_unix_socket) +{ + int sk_server = TEST_SUCC(socket(AF_UNIX, SOCK_STREAM, 0)); + struct sockaddr_un server_addr; + + memset(&server_addr, 0, sizeof(server_addr)); + server_addr.sun_family = AF_UNIX; + strncpy(server_addr.sun_path, SERVER_ADDRESS, + sizeof(server_addr.sun_path) - 1); + + TEST_SUCC(bind(sk_server, (struct sockaddr *)&server_addr, + sizeof(server_addr))); + TEST_SUCC(listen(sk_server, 3)); + + if (TEST_SUCC(fork()) == 0) { + int sk_client = CHECK(socket(AF_UNIX, SOCK_STREAM, 0)); + CHECK(connect(sk_client, (struct sockaddr *)&server_addr, + sizeof(server_addr))); + + char buf[1]; + CHECK_WITH(read(sk_client, buf, sizeof(buf)), + _ret == 1 && buf[0] == 'a'); + buf[0] = 'b'; + CHECK_WITH(write(sk_client, buf, sizeof(buf)), _ret == 1); + close(sk_client); + + exit(EXIT_SUCCESS); + } + + int sk_accepted = TEST_SUCC(accept(sk_server, NULL, NULL)); + char buf[1] = { 'a' }; + TEST_RES(write(sk_accepted, buf, sizeof(buf)), _ret == 1); + TEST_RES(read(sk_accepted, buf, sizeof(buf)), + _ret == 1 && buf[0] == 'b'); + + TEST_SUCC(close(sk_accepted)); + TEST_SUCC(close(sk_server)); + TEST_SUCC(unlink(SERVER_ADDRESS)); +} +END_TEST() \ No newline at end of file diff --git a/test/src/apps/scripts/fs.sh b/test/src/apps/scripts/fs.sh index f2f2cd10d..6e0a83358 100755 --- a/test/src/apps/scripts/fs.sh +++ b/test/src/apps/scripts/fs.sh @@ -88,6 +88,8 @@ test_mount_bind_file() { echo "Start ext2 fs test......" test_ext2 "/ext2" "test_file.txt" +ext2/mknod +ext2/unix_socket echo "All ext2 fs test passed." echo "Start fdatasync test......"