summaryrefslogtreecommitdiff
path: root/modules/remote-filesystem
diff options
context:
space:
mode:
authorClaudius 'keldu' Holeksa <mail@keldu.de>2024-08-14 14:24:20 +0200
committerClaudius 'keldu' Holeksa <mail@keldu.de>2024-08-14 14:24:20 +0200
commitfb6cd9ca585c4194a5b88053f6861151919c02df (patch)
tree31ac3411254680d85b90ac4962b4b67e969b091b /modules/remote-filesystem
parent991a5cbfea6b4ae6551a17e3e8ec375aec1a2a62 (diff)
wip
Diffstat (limited to 'modules/remote-filesystem')
-rw-r--r--modules/remote-filesystem/.nix/derivation.nix8
-rw-r--r--modules/remote-filesystem/c++/transfer.hpp53
-rw-r--r--modules/remote-filesystem/tests/transport.cpp34
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.");
+ }
}
-
}