diff options
| -rw-r--r-- | src/main.cpp | 44 | ||||
| -rw-r--r-- | test/sync.test | 45 | 
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([¶ms] (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 |