Verified Commit c70a106d authored by Ramon Nou's avatar Ramon Nou Committed by Marc Vef
Browse files

Modified write-read to write validate and random string generation

parent 8e0da961
Loading
Loading
Loading
Loading
Loading
+16 −12
Original line number Diff line number Diff line
@@ -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"

@@ -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)

@@ -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


+1 −1
Original line number Diff line number Diff line
@@ -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)
+1 −1
Original line number Diff line number Diff line
@@ -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
+1 −1
Original line number Diff line number Diff line
@@ -38,7 +38,7 @@ init_commands(CLI::App& app) {
    statx_init(app);
    #endif
    lseek_init(app);
    write_read_init(app);
    write_validate_init(app);
}


+17 −17
Original line number Diff line number Diff line
@@ -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)
    );
@@ -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;
@@ -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;
    }
@@ -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;
    }
@@ -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
@@ -162,7 +162,7 @@ write_read_init(CLI::App& app) {
        ->type_name("");

    cmd->callback([opts]() { 
        write_read_exec(*opts); 
        write_validate_exec(*opts); 
    });
}

Loading