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 | |
parent | 991a5cbfea6b4ae6551a17e3e8ec375aec1a2a62 (diff) |
wip
-rw-r--r-- | modules/core/c++/test/suite.hpp | 6 | ||||
-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 |
4 files changed, 93 insertions, 8 deletions
diff --git a/modules/core/c++/test/suite.hpp b/modules/core/c++/test/suite.hpp index 88d741a..52ef71d 100644 --- a/modules/core/c++/test/suite.hpp +++ b/modules/core/c++/test/suite.hpp @@ -47,6 +47,10 @@ public: if( (eov_expr.is_error()) ){ \ auto& err = eov_expr.get_error(); \ std::stringstream sstr; \ - sstr<<msg_split<<" [Category] "<<err.get_category()<<" [Message] "<<err.get_message(); \ + sstr<<msg_split<<" [Category] "<<err.get_category(); \ + auto err_msg = err.get_message(); \ + if(err_msg.size() > 0u){ \ + sstr<<" [Message] "<<err_msg; \ + } \ throw std::runtime_error{sstr.str()}; \ } 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."); + } } - } |