From e0c2bc537d23344bd6f4eb329430da822804ab1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Hegerfors?= Date: Fri, 16 Jan 2015 14:43:09 +0100 Subject: [PATCH] Complete test coverage of SegmentRunner --- .../reaper/service/SegmentRunnerTest.java | 78 ++++++++++++++++++- 1 file changed, 75 insertions(+), 3 deletions(-) diff --git a/src/test/java/com/spotify/reaper/service/SegmentRunnerTest.java b/src/test/java/com/spotify/reaper/service/SegmentRunnerTest.java index ef23748f9..b78562d4d 100644 --- a/src/test/java/com/spotify/reaper/service/SegmentRunnerTest.java +++ b/src/test/java/com/spotify/reaper/service/SegmentRunnerTest.java @@ -51,7 +51,8 @@ public void timeoutTest() throws InterruptedException, ReaperException { new RepairRun.Builder("reaper", cf.getId(), DateTime.now(), 0.5)); storage.addRepairSegments(Collections.singleton( - new RepairSegment.Builder(run.getId(), new RingRange(BigInteger.ONE, BigInteger.ZERO), cf.getId())), run.getId()); + new RepairSegment.Builder(run.getId(), new RingRange(BigInteger.ONE, BigInteger.ZERO), + cf.getId())), run.getId()); final long segmentId = storage.getNextFreeSegment(run.getId()).getId(); SegmentRunner.triggerRepair(storage, segmentId, @@ -78,7 +79,8 @@ public void run() { handler.get().handle(1, ActiveRepairService.Status.STARTED, "Repair command 1 has started"); sleep(100); - assertEquals(RepairSegment.State.RUNNING, storage.getRepairSegment(segmentId).getState()); + assertEquals(RepairSegment.State.RUNNING, + storage.getRepairSegment(segmentId).getState()); } catch (InterruptedException e) { e.printStackTrace(); } @@ -103,7 +105,8 @@ public void successTest() throws InterruptedException, ReaperException { RepairRun run = storage.addRepairRun( new RepairRun.Builder("reaper", cf.getId(), DateTime.now(), 0.5)); storage.addRepairSegments(Collections.singleton( - new RepairSegment.Builder(run.getId(), new RingRange(BigInteger.ONE, BigInteger.ZERO), cf.getId())), run.getId()); + new RepairSegment.Builder(run.getId(), new RingRange(BigInteger.ONE, BigInteger.ZERO), + cf.getId())), run.getId()); final long segmentId = storage.getNextFreeSegment(run.getId()).getId(); SegmentRunner.triggerRepair(storage, segmentId, @@ -127,14 +130,22 @@ public void run() { System.out.println("Repair has been triggered"); try { sleep(10); + handler.get().handle(1, ActiveRepairService.Status.STARTED, "Repair command 1 has started"); sleep(100); assertEquals(RepairSegment.State.RUNNING, storage.getRepairSegment(segmentId).getState()); + + // report about an unrelated repair. Shouldn't affect anything. + handler.get().handle(2, ActiveRepairService.Status.SESSION_FAILED, + "Repair command 2 has failed"); handler.get().handle(1, ActiveRepairService.Status.SESSION_SUCCESS, "Repair session succeeded in command 1"); sleep(10); + + assertEquals(RepairSegment.State.RUNNING, + storage.getRepairSegment(segmentId).getState()); handler.get().handle(1, ActiveRepairService.Status.FINISHED, "Repair command 1 has finished"); } catch (InterruptedException e) { @@ -152,4 +163,65 @@ public void run() { assertEquals(RepairSegment.State.DONE, storage.getRepairSegment(segmentId).getState()); } + + @Test + public void failureTest() throws InterruptedException, ReaperException { + final IStorage storage = new MemoryStorage(); + ColumnFamily cf = + storage.addColumnFamily(new ColumnFamily.Builder("reaper", "reaper", "reaper", 1, false)); + RepairRun run = storage.addRepairRun( + new RepairRun.Builder("reaper", cf.getId(), DateTime.now(), 0.5)); + storage.addRepairSegments(Collections.singleton( + new RepairSegment.Builder(run.getId(), new RingRange(BigInteger.ONE, BigInteger.ZERO), + cf.getId())), run.getId()); + final long segmentId = storage.getNextFreeSegment(run.getId()).getId(); + + SegmentRunner.triggerRepair(storage, segmentId, + Collections.singleton(""), 500, new JmxConnectionFactory() { + @Override + public JmxProxy create(final Optional handler, String host) + throws ReaperException { + JmxProxy jmx = mock(JmxProxy.class); + when(jmx.getClusterName()).thenReturn("reaper"); + when(jmx.isConnectionAlive()).thenReturn(true); + when(jmx.tokenRangeToEndpoint(anyString(), any(RingRange.class))) + .thenReturn(Lists.newArrayList("")); + when(jmx.triggerRepair(any(BigInteger.class), any(BigInteger.class), anyString(), + anyString())) + .then(new Answer() { + @Override + public Integer answer(InvocationOnMock invocation) throws Throwable { + new Thread() { + @Override + public void run() { + System.out.println("Repair has been triggered"); + try { + sleep(10); + handler.get().handle(1, ActiveRepairService.Status.STARTED, + "Repair command 1 has started"); + sleep(100); + assertEquals(RepairSegment.State.RUNNING, + storage.getRepairSegment(segmentId).getState()); + handler.get().handle(1, ActiveRepairService.Status.SESSION_SUCCESS, + "Repair session succeeded in command 1"); + sleep(10); + assertEquals(RepairSegment.State.RUNNING, + storage.getRepairSegment(segmentId).getState()); + handler.get().handle(1, ActiveRepairService.Status.SESSION_FAILED, + "Repair command 1 has failed"); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + }.start(); + return 1; + } + }); + + return jmx; + } + }); + + assertEquals(RepairSegment.State.ERROR, storage.getRepairSegment(segmentId).getState()); + } }