@Override public CheckerResult check(List<Event> events) { Visitor visitor = new Visitor(); events.forEach(event -> event.accept(visitor)); return ImmutableCheckerResult.builder() .valid(visitor.valid()) .errors(visitor.errors()) .build(); }
@Test public void makeSureWeCanHaveNullValues() { Map<Keyword, Object> keywordMap = new HashMap<>(); keywordMap.put(Keyword.intern("type"), Keyword.intern("info")); keywordMap.put(Keyword.intern("f"), Keyword.intern(JepsenConstants.START_FUNCTION)); keywordMap.put(Keyword.intern("process"), Keyword.intern(JepsenConstants.NEMESIS_PROCESS_NAME)); keywordMap.put(Keyword.intern("time"), SOME_TIME); keywordMap.put(Keyword.intern("value"), null); Event event = Event.fromKeywordMap(keywordMap); assertThat(event).isInstanceOf(InfoEvent.class); assertThat(((InfoEvent) event).value().isPresent()).isFalse(); }
private Map<String, List<Event>> partitionEventsByInvokeValue(List<Event> events) { Map<String, List<Event>> partitionedEvents = new HashMap<>(); Map<Integer, String> lastInvokeValueForProcess = new HashMap<>(); for (Event event : events) { int process = event.process(); if (event instanceof InvokeEvent) { InvokeEvent invokeEvent = (InvokeEvent) event; lastInvokeValueForProcess.put(process, invokeEvent.value()); } String key = lastInvokeValueForProcess.getOrDefault(process, null); /* * Note that all InfoEvents get mapped to null */ if (event instanceof InfoEvent) { key = null; } List<Event> history = partitionedEvents.getOrDefault(key, new ArrayList<>()); history.add(event); partitionedEvents.put(key, history); } return partitionedEvents; }
@Test public void canSerialiseInfoEventWithoutValue() { Event infoEvent = ImmutableInfoEvent.builder() .function("foo") .process(SOME_PROCESS) .time(SOME_TIME) .build(); Map<Keyword, Object> expected = ImmutableMap.of( Keyword.intern("type"), "info", Keyword.intern("f"), "foo", Keyword.intern("process"), SOME_PROCESS, Keyword.intern("time"), SOME_TIME); assertThat(Event.toKeywordMap(infoEvent)).isEqualTo(expected); } }
case RequestType.UNLOCK: if (lastHeldLock.containsKey(process)) { long lastLockTime = lastHeldLock.get(process).time(); if (lastLockTime < invokeEvent.time()) { Range<Long> newRange = Range.closedOpen(lastLockTime, invokeEvent.time());
@Test public void canSerialiseInfoEventWithValue() { Event infoEvent = ImmutableInfoEvent.builder() .function("foo") .process(SOME_PROCESS) .time(SOME_TIME) .value("bar") .build(); Map<Keyword, Object> expected = ImmutableMap.of( Keyword.intern("type"), "info", Keyword.intern("f"), "foo", Keyword.intern("process"), SOME_PROCESS, Keyword.intern("time"), SOME_TIME, Keyword.intern("value"), "bar"); assertThat(Event.toKeywordMap(infoEvent)).isEqualTo(expected); }
@Test public void canDeserialiseInfoReadWithoutValue() { Map<Keyword, Object> keywordMap = new HashMap<>(); keywordMap.put(Keyword.intern("type"), Keyword.intern("info")); keywordMap.put(Keyword.intern("f"), Keyword.intern(JepsenConstants.START_FUNCTION)); keywordMap.put(Keyword.intern("process"), Keyword.intern(JepsenConstants.NEMESIS_PROCESS_NAME)); keywordMap.put(Keyword.intern("time"), SOME_TIME); Event event = Event.fromKeywordMap(keywordMap); assertThat(event).isInstanceOf(InfoEvent.class); }
@Override public CheckerResult check(List<Event> events) { Visitor visitor = new Visitor(); events.forEach(event -> event.accept(visitor)); return ImmutableCheckerResult.builder() .valid(visitor.valid()) .errors(visitor.errors()) .build(); }
@Test public void canDeserialiseFailEventWithStacktrace() { String exceptionString = new RuntimeException("Error").toString(); Map<Keyword, Object> keywordMap = new HashMap<>(); keywordMap.put(Keyword.intern("type"), Keyword.intern("fail")); keywordMap.put(Keyword.intern("process"), SOME_PROCESS); keywordMap.put(Keyword.intern("time"), SOME_TIME); keywordMap.put(Keyword.intern("error"), exceptionString); Event event = Event.fromKeywordMap(keywordMap); FailEvent expectedEvent = ImmutableFailEvent.builder() .process(SOME_PROCESS) .time(SOME_TIME) .error(exceptionString) .build(); assertThat(event).isEqualTo(expectedEvent); }
@Override public CheckerResult check(List<Event> events) { Visitor visitor = new Visitor(); events.forEach(event -> event.accept(visitor)); return ImmutableCheckerResult.builder() .valid(visitor.valid()) .errors(visitor.errors()) .build(); }
@Test public void canDeserialiseInfoReadWithValue() { Map<Keyword, Object> keywordMap = new HashMap<>(); keywordMap.put(Keyword.intern("type"), Keyword.intern("info")); keywordMap.put(Keyword.intern("f"), Keyword.intern(JepsenConstants.START_FUNCTION)); keywordMap.put(Keyword.intern("process"), Keyword.intern(JepsenConstants.NEMESIS_PROCESS_NAME)); keywordMap.put(Keyword.intern("time"), SOME_TIME); keywordMap.put(Keyword.intern("value"), Keyword.intern(SOME_LONG_AS_STRING)); Event event = Event.fromKeywordMap(keywordMap); assertThat(event).isInstanceOf(InfoEvent.class); }
@Override public CheckerResult check(List<Event> events) { Visitor visitor = new Visitor(); events.forEach(event -> event.accept(visitor)); return ImmutableCheckerResult.builder() .valid(visitor.valid()) .errors(visitor.errors()) .build(); }
@Test public void canDeserialiseFailEventWithTimeoutKeyword() { Map<Keyword, Object> keywordMap = new HashMap<>(); keywordMap.put(Keyword.intern("type"), Keyword.intern("fail")); keywordMap.put(Keyword.intern("process"), SOME_PROCESS); keywordMap.put(Keyword.intern("time"), SOME_TIME); keywordMap.put(Keyword.intern("error"), Keyword.intern("timeout")); Event event = Event.fromKeywordMap(keywordMap); FailEvent expectedEvent = ImmutableFailEvent.builder() .process(SOME_PROCESS) .time(SOME_TIME) .error("timeout") .build(); assertThat(event).isEqualTo(expectedEvent); }
@Override public CheckerResult check(List<Event> events) { Visitor visitor = new Visitor(); events.forEach(event -> event.accept(visitor)); return ImmutableCheckerResult.builder() .valid(visitor.valid()) .errors(visitor.errors()) .build(); }
@Test public void canDeserialiseInvokeEvent() { Map<Keyword, Object> keywordMap = new HashMap<>(); keywordMap.put(Keyword.intern("type"), Keyword.intern("invoke")); keywordMap.put(Keyword.intern("f"), Keyword.intern(READ_OPERATION)); keywordMap.put(Keyword.intern("value"), null); keywordMap.put(Keyword.intern("process"), SOME_PROCESS); keywordMap.put(Keyword.intern("time"), SOME_TIME); Event event = Event.fromKeywordMap(keywordMap); InvokeEvent expectedEvent = ImmutableInvokeEvent.builder() .process(SOME_PROCESS) .time(SOME_TIME) .function(READ_OPERATION) .build(); assertThat(event).isEqualTo(expectedEvent); }
@Override public CheckerResult check(List<Event> events) { Visitor visitor = new NemesisResilienceChecker.Visitor(); events.forEach(event -> event.accept(visitor)); return ImmutableCheckerResult.builder() .valid(visitor.valid()) .errors(visitor.errors()) .build(); }
@Test public void canDeserialiseOkReadWithValueAsAnyString() { Map<Keyword, Object> keywordMap = new HashMap<>(); keywordMap.put(Keyword.intern("type"), Keyword.intern("ok")); keywordMap.put(Keyword.intern("f"), Keyword.intern(READ_OPERATION)); keywordMap.put(Keyword.intern("value"), SOME_STRING); keywordMap.put(Keyword.intern("process"), SOME_PROCESS); keywordMap.put(Keyword.intern("time"), SOME_TIME); Event event = Event.fromKeywordMap(keywordMap); OkEvent expectedEvent = ImmutableOkEvent.builder() .value(SOME_STRING) .process(SOME_PROCESS) .time(SOME_TIME) .function(READ_OPERATION) .build(); assertThat(event).isEqualTo(expectedEvent); }
@Override public CheckerResult check(List<Event> events) { Visitor visitor = new Visitor(); events.forEach(event -> event.accept(visitor)); visitor.verifyLockCorrectness(); return ImmutableCheckerResult.builder() .valid(visitor.valid()) .errors(visitor.errors()) .build(); }
@Test public void canDeserialiseOkReadWithValueAsLong() { Map<Keyword, Object> keywordMap = new HashMap<>(); keywordMap.put(Keyword.intern("type"), Keyword.intern("ok")); keywordMap.put(Keyword.intern("f"), Keyword.intern(READ_OPERATION)); keywordMap.put(Keyword.intern("value"), SOME_LONG); keywordMap.put(Keyword.intern("process"), SOME_PROCESS); keywordMap.put(Keyword.intern("time"), SOME_TIME); Event event = Event.fromKeywordMap(keywordMap); OkEvent expectedEvent = ImmutableOkEvent.builder() .value(SOME_LONG.toString()) .process(SOME_PROCESS) .time(SOME_TIME) .function(READ_OPERATION) .build(); assertThat(event).isEqualTo(expectedEvent); }
@Test public void canDeserialiseOkReadWhenValueIsMissing() { Map<Keyword, Object> keywordMap = new HashMap<>(); keywordMap.put(Keyword.intern("type"), Keyword.intern("ok")); keywordMap.put(Keyword.intern("f"), Keyword.intern(READ_OPERATION)); keywordMap.put(Keyword.intern("process"), SOME_PROCESS); keywordMap.put(Keyword.intern("time"), SOME_TIME); Event event = Event.fromKeywordMap(keywordMap); OkEvent expectedEvent = ImmutableOkEvent.builder() .process(SOME_PROCESS) .time(SOME_TIME) .value(null) .function(READ_OPERATION) .build(); assertThat(event).isEqualTo(expectedEvent); }