summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoman Smrž <roman.smrz@seznam.cz>2021-11-23 21:09:51 +0100
committerRoman Smrž <roman.smrz@seznam.cz>2021-11-23 21:09:51 +0100
commit6810c0e213226a62db1179a7c55bd351eb71ffe9 (patch)
tree6a7be6647f95ea1e7fa0f47987b2fdcaf6450d9c
parent39f11bb10f8b0f8797110a6d8ce70b8c975e112f (diff)
Test sync service
-rw-r--r--src/main.cpp44
-rw-r--r--test/sync.test45
2 files changed, 88 insertions, 1 deletions
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 <erebos/identity.h>
#include <erebos/network.h>
#include <erebos/storage.h>
+#include <erebos/sync.h>
#include <filesystem>
#include <functional>
@@ -92,7 +93,10 @@ void createIdentity(const vector<string> & 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<optional<Identity>>(identity->finalOwner());
+ return st.store(ret);
});
if (nh)
*h = *nh;
@@ -130,6 +134,8 @@ void startServer(const vector<string> &)
atts->onResponse(confirmAttach);
services.push_back(move(atts));
+ services.push_back(make_unique<SyncService>());
+
server.emplace(*h, move(services));
server->peerList().onUpdate([](size_t idx, const Peer * peer) {
@@ -165,6 +171,40 @@ void watchLocalIdentity(const vector<string> &)
});
}
+void watchSharedIdentity(const vector<string> &)
+{
+ auto bhv = h->behavior().lens<SharedState>().lens<optional<Identity>>();
+ static auto watchedSharedIdentity = bhv.watch([] (const optional<Identity> & idt) {
+ if (idt) {
+ ostringstream ss;
+ ss << "shared-identity";
+ for (optional<Identity> i = idt; i; i = i->owner())
+ ss << " " << i->name().value();
+ printLine(ss.str());
+ }
+ });
+}
+
+void updateSharedIdentity(const vector<string> & params)
+{
+ if (params.size() != 1) {
+ throw invalid_argument("usage: update-shared-identity <name>");
+ }
+
+ auto nh = h->update([&params] (const Stored<LocalState> & loc) {
+ auto st = loc.ref().storage();
+ auto mbid = loc->shared<optional<Identity>>();
+ if (!mbid)
+ return loc;
+
+ auto b = mbid->modify();
+ b.name(params[0]);
+ return st.store(loc->shared<optional<Identity>>(optional(b.commit())));
+ });
+ if (nh)
+ *h = *nh;
+}
+
void attach(const vector<string> & params)
{
server->svc<AttachService>().attachTo(getPeer(params.at(0)));
@@ -181,6 +221,8 @@ vector<Command> 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