@Test public void testJoinsAndWatchesSurviveExpiredSession() throws Exception { onLoseMembership.execute(); replay(onLoseMembership); assertEmptyMembershipObserved(); Membership membership = joinGroup.join(onLoseMembership); String originalMemberId = membership.getMemberId(); assertMembershipObserved(originalMemberId); expireSession(zkClient); // We should have lost our group membership and then re-gained it with a new ephemeral node. // We may or may-not see the intermediate state change but we must see the final state Iterable<String> members = listener.take(); if (Iterables.isEmpty(members)) { members = listener.take(); } assertEquals(1, Iterables.size(members)); assertNotEqual(originalMemberId, Iterables.getOnlyElement(members)); assertNotEqual(originalMemberId, membership.getMemberId()); listener.assertEmpty(); verify(onLoseMembership); reset(onLoseMembership); // Turn off expectations during ZK server shutdown. }
@Test public void testMemoryCapacityFires() { CacheConfiguration config = new CacheConfiguration(); RecordingListener listener = new RecordingListener(); config.addConfigurationListener(listener); assertRegistered(listener, config); listener.clearFiredEvents(); for (int i = 0; i < 10; i++) { config.setMaxElementsInMemory(i + 1); } List<Event> events = listener.getFiredEvents(); Assert.assertEquals(10, events.size()); for (int i = 0; i < events.size(); i++) { Event e = events.get(i); Assert.assertEquals("mem", e.type); Assert.assertEquals(Integer.valueOf(i), e.oldValue); Assert.assertEquals(Integer.valueOf(i + 1), e.newValue); } }
public void testManualServiceStopWhileStarting() throws Exception { ManualSwitchedService service = new ManualSwitchedService(); RecordingListener listener = RecordingListener.record(service); service.start(); assertEquals(State.STARTING, service.state()); assertFalse(service.isRunning()); assertTrue(service.doStartCalled); service.stop(); assertEquals(State.STOPPING, service.state()); assertFalse(service.isRunning()); assertFalse(service.doStopCalled); service.notifyStarted(); assertEquals(State.STOPPING, service.state()); assertFalse(service.isRunning()); assertTrue(service.doStopCalled); service.notifyStopped(); assertEquals(State.TERMINATED, service.state()); assertFalse(service.isRunning()); assertEquals( ImmutableList.of(State.STARTING, State.STOPPING, State.TERMINATED), listener.getStateHistory()); }
public void testManualServiceFailWhileStarting() throws Exception { ManualSwitchedService service = new ManualSwitchedService(); RecordingListener listener = RecordingListener.record(service); service.start(); service.notifyFailed(EXCEPTION); assertEquals(ImmutableList.of(State.STARTING, State.FAILED), listener.getStateHistory()); }
@Test public void testTtlFires() { CacheConfiguration config = new CacheConfiguration(); RecordingListener listener = new RecordingListener(); config.addConfigurationListener(listener); assertRegistered(listener, config); listener.clearFiredEvents(); for (int i = 0; i < 10; i++) { config.setTimeToLiveSeconds(i + 1); } List<Event> events = listener.getFiredEvents(); Assert.assertEquals(10, events.size()); for (int i = 0; i < events.size(); i++) { Event e = events.get(i); Assert.assertEquals("ttl", e.type); Assert.assertEquals(Long.valueOf(i), e.oldValue); Assert.assertEquals(Long.valueOf(i + 1), e.newValue); } }
@Test public void testLoggingEnableDisable() { CacheConfiguration config = new CacheConfiguration(); RecordingListener listener = new RecordingListener(); config.addConfigurationListener(listener); assertRegistered(listener, config); listener.clearFiredEvents(); config.setLogging(true); List<Event> events = listener.getFiredEvents(); Assert.assertEquals(1, events.size()); config.setLogging(false); events = listener.getFiredEvents(); Assert.assertEquals(2, events.size()); for (int i = 0; i < events.size(); i++) { Event e = events.get(i); Assert.assertEquals("logging", e.type); Assert.assertEquals(Boolean.valueOf(i != 0), e.oldValue); Assert.assertEquals(Boolean.valueOf(i == 0), e.newValue); } }
public void testThrowingServiceStartAndWait() throws Exception { StartThrowingService service = new StartThrowingService(); RecordingListener listener = RecordingListener.record(service); try { service.startAndWait(); fail(); } catch (UncheckedExecutionException e) { assertEquals(service.exception, e.getCause()); } assertEquals(ImmutableList.of(State.STARTING, State.FAILED), listener.getStateHistory()); }
public void testStopUnstartedService() throws Exception { NoOpService service = new NoOpService(); RecordingListener listener = RecordingListener.record(service); Future<State> stopResult = service.stop(); assertEquals(State.TERMINATED, service.state()); assertEquals(State.TERMINATED, stopResult.get()); Future<State> startResult = service.start(); assertEquals(State.TERMINATED, service.state()); assertEquals(State.TERMINATED, startResult.get()); assertEquals(State.TERMINATED, Iterables.getOnlyElement(listener.getStateHistory())); }
@Test public void testMultipleListeners() { CacheConfiguration config = new CacheConfiguration(); RecordingListener listener1 = new RecordingListener(); RecordingListener listener2 = new RecordingListener(); config.addConfigurationListener(listener1); config.addConfigurationListener(listener2); assertRegistered(listener1, config); assertRegistered(listener2, config); listener1.clearFiredEvents(); listener2.clearFiredEvents(); for (int i = 0; i < 10; i++) { config.setTimeToIdleSeconds(i); config.setTimeToLiveSeconds(i); config.setMaxElementsInMemory(i); config.setMaxElementsOnDisk(i); } // 36 not 40 since the first four events don't change anything... Assert.assertEquals(36, listener1.getFiredEvents().size()); Assert.assertEquals(36, listener2.getFiredEvents().size()); Assert.assertEquals(listener1.getFiredEvents(), listener2.getFiredEvents()); }
public void testNoOpServiceStartStopIdempotence() throws Exception { NoOpService service = new NoOpService(); RecordingListener listener = RecordingListener.record(service); service.start(); service.start(); assertEquals(State.RUNNING, service.state()); service.stop(); service.stop(); assertEquals(State.TERMINATED, service.state()); assertEquals( ImmutableList.of(State.STARTING, State.RUNNING, State.STOPPING, State.TERMINATED), listener.getStateHistory()); }
public void testFailingServiceStopAndWait_runFailinging() throws Exception { RunFailingService service = new RunFailingService(); RecordingListener listener = RecordingListener.record(service); service.startAndWait(); try { service.stopAndWait(); fail(); } catch (UncheckedExecutionException e) { assertEquals(EXCEPTION, e.getCause().getCause()); } assertEquals( ImmutableList.of(State.STARTING, State.RUNNING, State.FAILED), listener.getStateHistory()); }
@Test public void testJoinsAndWatchesSurviveDisconnect() throws Exception { replay(onLoseMembership); assertEmptyMembershipObserved(); Membership membership = joinGroup.join(); String originalMemberId = membership.getMemberId(); assertMembershipObserved(originalMemberId); shutdownNetwork(); restartNetwork(); // The member should still be present under existing ephemeral node since session did not // expire. watchGroup.watch(listener); assertMembershipObserved(originalMemberId); membership.cancel(); assertEmptyMembershipObserved(); assertEmptyMembershipObserved(); // and again for 2nd listener listener.assertEmpty(); verify(onLoseMembership); reset(onLoseMembership); // Turn off expectations during ZK server shutdown. }
public void testThreadedServiceStartAndWaitStopAndWait() throws Throwable { ThreadedService service = new ThreadedService(); RecordingListener listener = RecordingListener.record(service); service.start().get(); assertEquals(State.RUNNING, service.state()); service.awaitRunChecks(); service.stopAndWait(); assertEquals(State.TERMINATED, service.state()); throwIfSet(thrownByExecutionThread); assertEquals( ImmutableList.of(State.STARTING, State.RUNNING, State.STOPPING, State.TERMINATED), listener.getStateHistory()); }
public void testManualServiceFailureIdempotence() { ManualSwitchedService service = new ManualSwitchedService(); RecordingListener.record(service); service.start(); service.notifyFailed(new Exception("1")); service.notifyFailed(new Exception("2")); try { service.startAndWait(); fail(); } catch (UncheckedExecutionException e) { assertEquals("1", e.getCause().getMessage()); } }
@Test public void testRemovingListeners() { CacheConfiguration config = new CacheConfiguration(); RecordingListener listener1 = new RecordingListener(); RecordingListener listener2 = new RecordingListener(); config.addConfigurationListener(listener1); config.addConfigurationListener(listener2); assertRegistered(listener1, config); assertRegistered(listener2, config); listener1.clearFiredEvents(); listener2.clearFiredEvents(); for (int i = 0; i < 5; i++) { config.setTimeToIdleSeconds(i); config.setTimeToLiveSeconds(i); config.setMaxElementsInMemory(i); config.setMaxElementsOnDisk(i); } config.removeConfigurationListener(listener1); assertDeregistered(listener1, config); for (int i = 5; i < 10; i++) { config.setTimeToIdleSeconds(i); config.setTimeToLiveSeconds(i); config.setMaxElementsInMemory(i); config.setMaxElementsOnDisk(i); } config.removeConfigurationListener(listener2); assertDeregistered(listener2, config); List<Event> events1 = listener1.getFiredEvents(); List<Event> events2 = listener2.getFiredEvents(); // 17 not 21 since the first four events don't change anything... Assert.assertEquals(17, events1.size()); // 37 not 41 since the first four events don't change anything... Assert.assertEquals(37, events2.size()); for (Event e : events1) { Assert.assertTrue(events2.contains(e)); } }
@Test public void testStopWatching() throws Exception { replay(onLoseMembership); assertEmptyMembershipObserved(); Membership member1 = joinGroup.join(); String memberId1 = member1.getMemberId(); assertMembershipObserved(memberId1); Membership member2 = joinGroup.join(); String memberId2 = member2.getMemberId(); assertMembershipObserved(memberId1, memberId2); stopWatching.execute(); member1.cancel(); Membership member3 = joinGroup.join(); member2.cancel(); member3.cancel(); listener.assertEmpty(); }
private void assertDeregistered(RecordingListener listener, CacheConfiguration config) { List<Event> events = listener.getFiredEvents(); Assert.assertTrue(events.contains(new Event("deregistered", config, null))); }
private void assertMembershipObserved(RecordingListener listener, String... expectedMemberIds) throws InterruptedException { assertEquals(ImmutableSet.copyOf(expectedMemberIds), ImmutableSet.copyOf(listener.take())); }