Loading tests/integration/data/test_io.py→tests/integration/data/test_data_integrity.py +16 −12 Original line number Diff line number Diff line Loading @@ -20,16 +20,24 @@ import ctypes import sh import sys import pytest import string import random from harness.logger import logger nonexisting = "nonexisting" chunksize_start = 128192 chunksize_end = 2097153 step = 4096*9 def generate_random_data(size): return ''.join([random.choice(string.ascii_letters + string.digits) for _ in range(size)]) #@pytest.mark.xfail(reason="invalid errno returned on success") def test_io(gkfs_daemon, gkfs_client): """Test several statx commands""" def test_data_integrity(gkfs_daemon, gkfs_client): """Test several data write-read commands and check that the data is correct""" topdir = gkfs_daemon.mountdir / "top" file_a = topdir / "file_a" Loading Loading @@ -63,20 +71,15 @@ def test_io(gkfs_daemon, gkfs_client): assert (ret.statbuf.stx_size == 0) # Phase 1 # from 1 to n data # Step 1 - small sizes # Generate writes # Read data # Compare buffer # delete data # from 1 to 2M +1 for i in range (1, 512, 64): buf = b'' for k in range (0,i): value = str(k%10) buf += bytes(value, sys.stdout.encoding) buf = bytes(generate_random_data(i), sys.stdout.encoding) ret = gkfs_client.write(file_a, buf, i) Loading @@ -91,8 +94,9 @@ def test_io(gkfs_daemon, gkfs_client): assert ret.buf == buf for i in range (128192, 2097153, 4096*9): ret = gkfs_client.write_read(file_a, i) # Step 2 - Compare bigger sizes exceeding typical chunksize for i in range (chunksize_start, chunksize_end, step): ret = gkfs_client.write_validate(file_a, i) assert ret.retval == 1 Loading tests/integration/harness/CMakeLists.txt +1 −1 Original line number Diff line number Diff line Loading @@ -26,7 +26,7 @@ add_executable(gkfs.io gkfs.io/pwritev.cpp gkfs.io/statx.cpp gkfs.io/lseek.cpp gkfs.io/write_read.cpp gkfs.io/write_validate.cpp ) include(FetchContent) Loading tests/integration/harness/gkfs.io/commands.hpp +1 −1 Original line number Diff line number Diff line Loading @@ -68,6 +68,6 @@ void lseek_init(CLI::App& app); void write_read_init(CLI::App& app); write_validate_init(CLI::App& app); #endif // IO_COMMANDS_HPP tests/integration/harness/gkfs.io/main.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -38,7 +38,7 @@ init_commands(CLI::App& app) { statx_init(app); #endif lseek_init(app); write_read_init(app); write_validate_init(app); } Loading tests/integration/harness/gkfs.io/write_read.cpp→tests/integration/harness/gkfs.io/write_validate.cpp +17 −17 Original line number Diff line number Diff line Loading @@ -29,23 +29,23 @@ using json = nlohmann::json; struct write_read_options { struct write_validate_options { bool verbose; std::string pathname; ::size_t count; REFL_DECL_STRUCT(write_read_options, REFL_DECL_STRUCT(write_validate_options, REFL_DECL_MEMBER(bool, verbose), REFL_DECL_MEMBER(std::string, pathname), REFL_DECL_MEMBER(::size_t, count) ); }; struct write_read_output { struct write_validate_output { int retval; int errnum; REFL_DECL_STRUCT(write_read_output, REFL_DECL_STRUCT(write_validate_output, REFL_DECL_MEMBER(int, retval), REFL_DECL_MEMBER(int, errnum) ); Loading @@ -53,23 +53,23 @@ struct write_read_output { void to_json(json& record, const write_read_output& out) { const write_validate_output& out) { record = serialize(out); } void write_read_exec(const write_read_options& opts) { write_validate_exec(const write_validate_options& opts) { int fd = ::open(opts.pathname.c_str(), O_WRONLY); if(fd == -1) { if(opts.verbose) { fmt::print("write(pathname=\"{}\", count={}) = {}, errno: {} [{}]\n", fmt::print("write_validate(pathname=\"{}\", count={}) = {}, errno: {} [{}]\n", opts.pathname, opts.count, fd, errno, ::strerror(errno)); return; } json out = write_read_output{fd, errno}; json out = write_validate_output{fd, errno}; fmt::print("{}\n", out.dump(2)); return; Loading @@ -87,13 +87,13 @@ write_read_exec(const write_read_options& opts) { auto rv = ::write(fd, buf.data(), opts.count); if(opts.verbose) { fmt::print("write_read(pathname=\"{}\", count={}) = {}, errno: {} [{}]\n", fmt::print("write_validate(pathname=\"{}\", count={}) = {}, errno: {} [{}]\n", opts.pathname, opts.count, rv, errno, ::strerror(errno)); return; } if (rv < 0 or ::size_t(rv) != opts.count) { json out = write_read_output{(int)rv, errno}; json out = write_validate_output{(int)rv, errno}; fmt::print("{}\n", out.dump(2)); return; } Loading @@ -108,7 +108,7 @@ write_read_exec(const write_read_options& opts) { } while (rv > 0 and total < opts.count); if (rv < 0 and total != opts.count) { json out = write_read_output{(int)rv, errno}; json out = write_validate_output{(int)rv, errno}; fmt::print("{}\n", out.dump(2)); return; } Loading @@ -116,26 +116,26 @@ write_read_exec(const write_read_options& opts) { if ( memcmp(buf.data(),bufread.data(),opts.count) ) { rv = 1; errno = 0; json out = write_read_output{(int)rv, errno}; json out = write_validate_output{(int)rv, errno}; fmt::print("{}\n", out.dump(2)); return; } else { rv = 2; errno = EINVAL; json out = write_read_output{(int)-1, errno}; json out = write_validate_output{(int)-1, errno}; fmt::print("{}\n", out.dump(2)); } } void write_read_init(CLI::App& app) { write_validate_init(CLI::App& app) { // Create the option and subcommand objects auto opts = std::make_shared<write_read_options>(); auto opts = std::make_shared<write_validate_options>(); auto* cmd = app.add_subcommand( "write_read", "write_validate", "Execute the write()-read() system call and compare the content of the buffer"); // Add options to cmd, binding them to opts Loading @@ -162,7 +162,7 @@ write_read_init(CLI::App& app) { ->type_name(""); cmd->callback([opts]() { write_read_exec(*opts); write_validate_exec(*opts); }); } Loading Loading
tests/integration/data/test_io.py→tests/integration/data/test_data_integrity.py +16 −12 Original line number Diff line number Diff line Loading @@ -20,16 +20,24 @@ import ctypes import sh import sys import pytest import string import random from harness.logger import logger nonexisting = "nonexisting" chunksize_start = 128192 chunksize_end = 2097153 step = 4096*9 def generate_random_data(size): return ''.join([random.choice(string.ascii_letters + string.digits) for _ in range(size)]) #@pytest.mark.xfail(reason="invalid errno returned on success") def test_io(gkfs_daemon, gkfs_client): """Test several statx commands""" def test_data_integrity(gkfs_daemon, gkfs_client): """Test several data write-read commands and check that the data is correct""" topdir = gkfs_daemon.mountdir / "top" file_a = topdir / "file_a" Loading Loading @@ -63,20 +71,15 @@ def test_io(gkfs_daemon, gkfs_client): assert (ret.statbuf.stx_size == 0) # Phase 1 # from 1 to n data # Step 1 - small sizes # Generate writes # Read data # Compare buffer # delete data # from 1 to 2M +1 for i in range (1, 512, 64): buf = b'' for k in range (0,i): value = str(k%10) buf += bytes(value, sys.stdout.encoding) buf = bytes(generate_random_data(i), sys.stdout.encoding) ret = gkfs_client.write(file_a, buf, i) Loading @@ -91,8 +94,9 @@ def test_io(gkfs_daemon, gkfs_client): assert ret.buf == buf for i in range (128192, 2097153, 4096*9): ret = gkfs_client.write_read(file_a, i) # Step 2 - Compare bigger sizes exceeding typical chunksize for i in range (chunksize_start, chunksize_end, step): ret = gkfs_client.write_validate(file_a, i) assert ret.retval == 1 Loading
tests/integration/harness/CMakeLists.txt +1 −1 Original line number Diff line number Diff line Loading @@ -26,7 +26,7 @@ add_executable(gkfs.io gkfs.io/pwritev.cpp gkfs.io/statx.cpp gkfs.io/lseek.cpp gkfs.io/write_read.cpp gkfs.io/write_validate.cpp ) include(FetchContent) Loading
tests/integration/harness/gkfs.io/commands.hpp +1 −1 Original line number Diff line number Diff line Loading @@ -68,6 +68,6 @@ void lseek_init(CLI::App& app); void write_read_init(CLI::App& app); write_validate_init(CLI::App& app); #endif // IO_COMMANDS_HPP
tests/integration/harness/gkfs.io/main.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -38,7 +38,7 @@ init_commands(CLI::App& app) { statx_init(app); #endif lseek_init(app); write_read_init(app); write_validate_init(app); } Loading
tests/integration/harness/gkfs.io/write_read.cpp→tests/integration/harness/gkfs.io/write_validate.cpp +17 −17 Original line number Diff line number Diff line Loading @@ -29,23 +29,23 @@ using json = nlohmann::json; struct write_read_options { struct write_validate_options { bool verbose; std::string pathname; ::size_t count; REFL_DECL_STRUCT(write_read_options, REFL_DECL_STRUCT(write_validate_options, REFL_DECL_MEMBER(bool, verbose), REFL_DECL_MEMBER(std::string, pathname), REFL_DECL_MEMBER(::size_t, count) ); }; struct write_read_output { struct write_validate_output { int retval; int errnum; REFL_DECL_STRUCT(write_read_output, REFL_DECL_STRUCT(write_validate_output, REFL_DECL_MEMBER(int, retval), REFL_DECL_MEMBER(int, errnum) ); Loading @@ -53,23 +53,23 @@ struct write_read_output { void to_json(json& record, const write_read_output& out) { const write_validate_output& out) { record = serialize(out); } void write_read_exec(const write_read_options& opts) { write_validate_exec(const write_validate_options& opts) { int fd = ::open(opts.pathname.c_str(), O_WRONLY); if(fd == -1) { if(opts.verbose) { fmt::print("write(pathname=\"{}\", count={}) = {}, errno: {} [{}]\n", fmt::print("write_validate(pathname=\"{}\", count={}) = {}, errno: {} [{}]\n", opts.pathname, opts.count, fd, errno, ::strerror(errno)); return; } json out = write_read_output{fd, errno}; json out = write_validate_output{fd, errno}; fmt::print("{}\n", out.dump(2)); return; Loading @@ -87,13 +87,13 @@ write_read_exec(const write_read_options& opts) { auto rv = ::write(fd, buf.data(), opts.count); if(opts.verbose) { fmt::print("write_read(pathname=\"{}\", count={}) = {}, errno: {} [{}]\n", fmt::print("write_validate(pathname=\"{}\", count={}) = {}, errno: {} [{}]\n", opts.pathname, opts.count, rv, errno, ::strerror(errno)); return; } if (rv < 0 or ::size_t(rv) != opts.count) { json out = write_read_output{(int)rv, errno}; json out = write_validate_output{(int)rv, errno}; fmt::print("{}\n", out.dump(2)); return; } Loading @@ -108,7 +108,7 @@ write_read_exec(const write_read_options& opts) { } while (rv > 0 and total < opts.count); if (rv < 0 and total != opts.count) { json out = write_read_output{(int)rv, errno}; json out = write_validate_output{(int)rv, errno}; fmt::print("{}\n", out.dump(2)); return; } Loading @@ -116,26 +116,26 @@ write_read_exec(const write_read_options& opts) { if ( memcmp(buf.data(),bufread.data(),opts.count) ) { rv = 1; errno = 0; json out = write_read_output{(int)rv, errno}; json out = write_validate_output{(int)rv, errno}; fmt::print("{}\n", out.dump(2)); return; } else { rv = 2; errno = EINVAL; json out = write_read_output{(int)-1, errno}; json out = write_validate_output{(int)-1, errno}; fmt::print("{}\n", out.dump(2)); } } void write_read_init(CLI::App& app) { write_validate_init(CLI::App& app) { // Create the option and subcommand objects auto opts = std::make_shared<write_read_options>(); auto opts = std::make_shared<write_validate_options>(); auto* cmd = app.add_subcommand( "write_read", "write_validate", "Execute the write()-read() system call and compare the content of the buffer"); // Add options to cmd, binding them to opts Loading @@ -162,7 +162,7 @@ write_read_init(CLI::App& app) { ->type_name(""); cmd->callback([opts]() { write_read_exec(*opts); write_validate_exec(*opts); }); } Loading