diff options
author | Claudius 'keldu' Holeksa <mail@keldu.de> | 2024-08-14 14:24:20 +0200 |
---|---|---|
committer | Claudius 'keldu' Holeksa <mail@keldu.de> | 2024-08-14 14:24:20 +0200 |
commit | fb6cd9ca585c4194a5b88053f6861151919c02df (patch) | |
tree | 31ac3411254680d85b90ac4962b4b67e969b091b /modules/remote-filesystem | |
parent | 991a5cbfea6b4ae6551a17e3e8ec375aec1a2a62 (diff) |
wip
Diffstat (limited to 'modules/remote-filesystem')
-rw-r--r-- | modules/remote-filesystem/.nix/derivation.nix | 8 | ||||
-rw-r--r-- | modules/remote-filesystem/c++/transfer.hpp | 53 | ||||
-rw-r--r-- | modules/remote-filesystem/tests/transport.cpp | 34 |
3 files changed, 88 insertions, 7 deletions
diff --git a/modules/remote-filesystem/.nix/derivation.nix b/modules/remote-filesystem/.nix/derivation.nix index f1d4421..806dc0b 100644 --- a/modules/remote-filesystem/.nix/derivation.nix +++ b/modules/remote-filesystem/.nix/derivation.nix @@ -39,5 +39,11 @@ stdenv.mkDerivation { installPhase = '' scons prefix=$out build_examples=${build_examples} install - ''; + ''; + + doCheck = true; + checkPhase = '' + scons test + ./bin/tests + ''; } diff --git a/modules/remote-filesystem/c++/transfer.hpp b/modules/remote-filesystem/c++/transfer.hpp index e3df023..1e42cf5 100644 --- a/modules/remote-filesystem/c++/transfer.hpp +++ b/modules/remote-filesystem/c++/transfer.hpp @@ -2,14 +2,21 @@ #include "remote.hpp" +#include <forstio/buffer.hpp> #include <forstio/remote/transfer.hpp> +#include <fstream> + namespace saw { template<typename Schema, typename Encoding> class data_server<Schema, Encoding, rmt::File> final : public i_data_server<rmt::File> { private: ptr<remote<rmt::File>> remote_; remote_address<rmt::File> addr_; + + static error generate_invalid_id_error() { + return make_error<err::invalid_state>("rmt::File data_server only supports Id 0."); + } public: static constexpr std::pair<uint32_t,uint32_t> class_id{schema_hash<Schema>::apply(), schema_hash<Encoding>::apply()}; @@ -29,21 +36,59 @@ public: return class_id; } - error_or<void> send(const data<Schema, Encoding>& dat, id<Schema> store_id){ - return make_error<err::not_implemented>(); + error_or<void> send(data<Schema, Encoding>& dat, id<Schema> store_id){ + if(store_id.get_value() > 0u){ + return generate_invalid_id_error(); + } + + std::basic_fstream<uint8_t> s{addr_.get_path(), s.binary | s.out}; + if(!s.is_open()){ + return make_error<err::not_found>("Couldn't open file"); + } + + auto& buff = dat.get_buffer(); + buffer_view buff_v{buff}; + while(buff_v.read_segment_length() > 0u){ + s.write(&buff_v.read(), buff_v.read_segment_length()); + + buff_v.read_advance(buff_v.read_segment_length()); + } + return make_void(); } error_or<void> allocate(data<typename meta_schema<Schema>::MetaSchema, Encoding> meta, id<Schema> store_id){ + if(store_id.get_value() > 0u){ + return generate_invalid_id_error(); + } return make_error<err::not_implemented>(); } error_or<void> erase(id<Schema> store_id){ + if(store_id.get_value() > 0u){ + return generate_invalid_id_error(); + } return make_error<err::not_implemented>(); } error_or<data<Schema,Encoding>> receive(id<Schema> store_id){ - return make_error<err::not_implemented>(); - } + if(store_id.get_value() > 0u){ + return generate_invalid_id_error(); + } + data<Schema, Encoding> dat{heap<array_buffer>(1u)}; + std::basic_fstream<uint8_t> s{addr_.get_path(), s.binary | s.in}; + if(!s.is_open()){ + return make_error<err::not_found>("Couldn't open file"); + } + uint8_t ele{}; + while(s.readsome(&ele, 1u) > 0u){ + auto err = dat.get_buffer().push(ele); + if(err.failed()){ + return err; + } + } + + return dat; + } }; } diff --git a/modules/remote-filesystem/tests/transport.cpp b/modules/remote-filesystem/tests/transport.cpp index e8df294..7472220 100644 --- a/modules/remote-filesystem/tests/transport.cpp +++ b/modules/remote-filesystem/tests/transport.cpp @@ -26,7 +26,37 @@ SAW_TEST("File Remote"){ SAW_EOV_EXPECT(eo_dat_srv, "Couldn't setup data server."); auto& dat_srv = eo_dat_srv.get_value(); - + std::string a = "blafoobla"; + int64_t b = 42; + + { + data<sch::Foo> nat_foo; + nat_foo.template get<"a">().set(a); + nat_foo.template get<"b">().set(b); + + data<sch::Foo, encode::KelSimple> smp_foo; + + codec<sch::Foo, encode::KelSimple> smp_cod; + auto eov = smp_cod.encode(nat_foo,smp_foo); + SAW_EOV_EXPECT(eov, "Failed to encode."); + + id<sch::Foo> foo_id{0u}; + auto eo_send = dat_srv->send(smp_foo, foo_id); + SAW_EOV_EXPECT(eo_send, "Failed to send."); + } + { + data<sch::Foo> nat_foo; + + id<sch::Foo> foo_id{0u}; + auto eo_recv = dat_srv->receive(foo_id); + SAW_EOV_EXPECT(eo_recv, "Failed to receive"); + auto& recv = eo_recv.get_value(); + + codec<sch::Foo, encode::KelSimple> smp_cod; + auto eov = smp_cod.decode(recv, nat_foo); + SAW_EOV_EXPECT(eov, "Failed to decode."); + + SAW_EXPECT(nat_foo.template get<"b">().get() == b, "Wrong value."); + } } - } |