From b256d125695da6b2a8eedd6f59ad07e94bd2b0bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kjetil=20=C3=98rbekk?= Date: Tue, 13 Mar 2012 14:05:38 +0100 Subject: Clients can control their master. Add failing test. --- same/src/main/java/com/orbekk/same/Client.java | 12 ++++++++++- .../main/java/com/orbekk/same/SameController.java | 1 + .../test/java/com/orbekk/same/FunctionalTest.java | 24 ++++++++++++++++++++++ 3 files changed, 36 insertions(+), 1 deletion(-) (limited to 'same') diff --git a/same/src/main/java/com/orbekk/same/Client.java b/same/src/main/java/com/orbekk/same/Client.java index 4d5965b..d4ec19e 100644 --- a/same/src/main/java/com/orbekk/same/Client.java +++ b/same/src/main/java/com/orbekk/same/Client.java @@ -23,6 +23,7 @@ public class Client implements DiscoveryListener { private String myUrl; String masterUrl; private int masterId = -1; + private MasterController masterController = null; private List stateListeners = new ArrayList(); @@ -160,6 +161,10 @@ public class Client implements DiscoveryListener { return connectionState; } + public void setMasterController(MasterController masterController) { + this.masterController = masterController; + } + public void joinNetwork(String masterUrl) { logger.info("joinNetwork({})", masterUrl); connectionState = ConnectionState.UNSTABLE; @@ -233,10 +238,15 @@ public class Client implements DiscoveryListener { return paxosUrls; } - private void startMasterElection() { + public void startMasterElection() { + if (masterController == null) { + logger.warn("Could not become master: No master controller."); + return; + } List paxosUrls = getPaxosUrls(); MasterProposer proposer = new MasterProposer(getUrl(), paxosUrls, connections); // TODO: Run election. + masterController.enableMaster(state); } } diff --git a/same/src/main/java/com/orbekk/same/SameController.java b/same/src/main/java/com/orbekk/same/SameController.java index c4bdfe7..a9b389c 100644 --- a/same/src/main/java/com/orbekk/same/SameController.java +++ b/same/src/main/java/com/orbekk/same/SameController.java @@ -130,6 +130,7 @@ public class SameController { public void start() throws Exception { server.start(); + client.setMasterController(masterController); client.start(); if (discoveryService != null) { discoveryService.start(); diff --git a/same/src/test/java/com/orbekk/same/FunctionalTest.java b/same/src/test/java/com/orbekk/same/FunctionalTest.java index 3707581..215efd9 100644 --- a/same/src/test/java/com/orbekk/same/FunctionalTest.java +++ b/same/src/test/java/com/orbekk/same/FunctionalTest.java @@ -1,6 +1,8 @@ package com.orbekk.same; import static org.junit.Assert.*; +import static org.mockito.Mockito.*; + import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*; @@ -95,4 +97,26 @@ public class FunctionalTest { assertThat(x1.get(), is("TestValue1")); assertThat(x2.get(), is("TestValue1")); } + + @Test public void clientBecomesMaster() { + String newMasterUrl = "http://newMaster/MasterService.json"; + final Master newMaster = Master.create(connections, + broadcaster, newMasterUrl, "TestMaster"); + connections.masterMap.put(newMasterUrl, newMaster.getService()); + joinClients(); + MasterController controller = new MasterController() { + @Override + public void enableMaster(State lastKnownState) { + newMaster.resumeFrom(lastKnownState); + } + @Override + public void disableMaster() { + } + }; + client1.setMasterController(controller); + client1.startMasterElection(); + newMaster.performWork(); + assertThat(client1.masterUrl, is(newMasterUrl)); + assertThat(client2.masterUrl, is(newMasterUrl)); + } } -- cgit v1.2.3