From 6810c0e213226a62db1179a7c55bd351eb71ffe9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roman=20Smr=C5=BE?= Date: Tue, 23 Nov 2021 21:09:51 +0100 Subject: Test sync service --- src/main.cpp | 44 +++++++++++++++++++++++++++++++++++++++++++- test/sync.test | 45 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 test/sync.test diff --git a/src/main.cpp b/src/main.cpp index 0c786e2..a3805e0 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include #include @@ -92,7 +93,10 @@ void createIdentity(const vector & args) if (identity) { auto nh = h->update([&identity] (const auto & loc) { - return st.store(loc->identity(*identity)); + auto ret = loc->identity(*identity); + if (identity->owner()) + ret = ret.template shared>(identity->finalOwner()); + return st.store(ret); }); if (nh) *h = *nh; @@ -130,6 +134,8 @@ void startServer(const vector &) atts->onResponse(confirmAttach); services.push_back(move(atts)); + services.push_back(make_unique()); + server.emplace(*h, move(services)); server->peerList().onUpdate([](size_t idx, const Peer * peer) { @@ -165,6 +171,40 @@ void watchLocalIdentity(const vector &) }); } +void watchSharedIdentity(const vector &) +{ + auto bhv = h->behavior().lens().lens>(); + static auto watchedSharedIdentity = bhv.watch([] (const optional & idt) { + if (idt) { + ostringstream ss; + ss << "shared-identity"; + for (optional i = idt; i; i = i->owner()) + ss << " " << i->name().value(); + printLine(ss.str()); + } + }); +} + +void updateSharedIdentity(const vector & params) +{ + if (params.size() != 1) { + throw invalid_argument("usage: update-shared-identity "); + } + + auto nh = h->update([¶ms] (const Stored & loc) { + auto st = loc.ref().storage(); + auto mbid = loc->shared>(); + if (!mbid) + return loc; + + auto b = mbid->modify(); + b.name(params[0]); + return st.store(loc->shared>(optional(b.commit()))); + }); + if (nh) + *h = *nh; +} + void attach(const vector & params) { server->svc().attachTo(getPeer(params.at(0))); @@ -181,6 +221,8 @@ vector commands = { { "start-server", startServer }, { "stop-server", stopServer }, { "watch-local-identity", watchLocalIdentity }, + { "watch-shared-identity", watchSharedIdentity }, + { "update-shared-identity", updateSharedIdentity }, { "attach", attach }, { "attach-accept", attachAccept }, }; diff --git a/test/sync.test b/test/sync.test new file mode 100644 index 0000000..1b243c2 --- /dev/null +++ b/test/sync.test @@ -0,0 +1,45 @@ +test: + spawn on node1 as p1 + spawn on node2 as p2 + send "watch-local-identity" to p1 + send "watch-local-identity" to p2 + send "watch-shared-identity" to p1 + send "watch-shared-identity" to p2 + send "create-identity Device1 Owner" to p1 + send "create-identity Device2" to p2 + send "start-server" to p1 + send "start-server" to p2 + expect /local-identity Device1 Owner/ from p1 + expect /local-identity Device2/ from p2 + expect /shared-identity Owner/ from p1 + expect /peer [0-9]+ 192.168.0.11:29665/ from p1 + expect /peer [0-9]+ 192.168.0.12:29665/ from p1 + expect /peer [0-9]+ 192.168.0.12:29665/ from p2 + expect /peer [0-9]+ 192.168.0.11:29665/ from p2 + expect /peer [0-9]+ Device2 Device2/ from p1 + expect /peer [0-9]+ Owner Device1/ from p2 + + send "attach Owner" to p2 + expect /attach-confirm .*/ from p1 + expect /attach-confirm .*/ from p2 + # TODO: check code match + + send "attach-accept Device2 1" to p1 + send "attach-accept Owner 1" to p2 + expect /attach-result Device2 1/ from p1 + expect /attach-result Owner 1/ from p2 + expect /local-identity Device2 Owner/ from p2 + expect /shared-identity Owner/ from p2 + expect /peer [0-9]+ Owner Device2/ from p1 + + send "update-shared-identity NewOwner" to p1 + expect /shared-identity NewOwner/ from p1 + expect /shared-identity NewOwner/ from p2 + + send "update-shared-identity NewOwner2" to p2 + expect /shared-identity NewOwner2/ from p1 + expect /shared-identity NewOwner2/ from p2 + + send "update-shared-identity NewOwner3" to p1 + expect /shared-identity NewOwner3/ from p1 + expect /shared-identity NewOwner3/ from p2 -- cgit v1.2.3