private String buildJson(final String[] traces, final String[] related, String planClass, Long planId) { final StringBuilder sb = new StringBuilder(); sb.append("{") .append(quote(JsonTraceCodec.PLAN_CLASS)).append(": ").append(quote(planClass)).append(",") .append(quote(JsonTraceCodec.PLAN_ID)).append(": ").append(planId).append(",") .append(arrayFieldStr(JsonTraceCodec.TRACES, traces)).append(",") .append(arrayFieldStr(JsonTraceCodec.RELATIONSHIPS, related)) .append("}"); return sb.toString(); }
private void assertReversible(final Trace trace) throws IOException { assertReversibleStream(trace); assertReversibleString(trace); }
@Test public void testDocWitInvalidChildReference() throws IOException { final String json = buildJson(new String[] { traceStr(1, "name", ResultType.UNFINISHED, false) }, new String[] { hierStr(1, 2) }, "test", 0L); try { decodeString(json); fail("Expected IOException"); } catch (IOException e) { // expected case } }
@Test public void testReversibleUnstartedTrace() throws IOException { final ShallowTraceBuilder test = new ShallowTraceBuilder(IdGenerator.getNextId()).setName("test").setResultType(ResultType.UNFINISHED) .setTaskType(TaskType.FUSION.getName()); final Trace trace = Trace.single(test.build(), "test", 0L); assertReversible(trace); }
@Test public void testDocWithTraceHavingTaskType() throws IOException { final String json = buildJson(new String[] {traceStr(1, "name", ResultType.UNFINISHED, false, TaskType.FUSION.getName())}, new String[0], "test", 0L); Trace decodedTrace = decodeString(json); assertEquals(decodedTrace.getTraceMap().get(1L).getTaskType(), TaskType.FUSION.getName()); }
@Test public void testDocWithNoTraces() throws IOException { final String json = buildJson(new String[0], new String[0], "test", 0L); Trace trace = decodeString(json); assertEquals(0, trace.getTraceMap().size()); assertEquals(0, trace.getRelationships().size()); }
private String orderStr(final int predecessorId, final int successorId) { final StringBuilder sb = new StringBuilder(); sb.append("{").append(quote(JsonTraceCodec.RELATIONSHIP_RELATIONSHIP)).append(": ") .append(quote(Relationship.SUCCESSOR_OF.name())).append(",").append(quote(JsonTraceCodec.RELATIONSHIP_FROM)) .append(": ").append(successorId).append(",").append(quote(JsonTraceCodec.RELATIONSHIP_TO)).append(": ") .append(predecessorId).append("}"); return sb.toString(); }
private String traceStr(final int id, final String name, final ResultType resultType, final boolean hidden) { return traceStr(id, name, resultType, hidden, null); }
@Test public void testEmptyDocument() throws IOException { try { decodeString("{}"); fail("Expected IOException"); } catch (IOException e) { // expected case } }
@Test public void testReversibleSuccessfulTraceWithNullValue() throws IOException { final ShallowTraceBuilder test = new ShallowTraceBuilder(IdGenerator.getNextId()).setName("test") .setResultType(ResultType.SUCCESS).setStartNanos(0L).setPendingNanos(50L).setEndNanos(100L); final Trace trace = Trace.single(test.build(), "test", 0L); assertReversible(trace); }
private String hierStr(final int parentId, final int childId) { final StringBuilder sb = new StringBuilder(); sb.append("{").append(quote(JsonTraceCodec.RELATIONSHIP_RELATIONSHIP)).append(": ") .append(quote(Relationship.PARENT_OF.name())).append(",").append(quote(JsonTraceCodec.RELATIONSHIP_FROM)) .append(": ").append(parentId).append(",").append(quote(JsonTraceCodec.RELATIONSHIP_TO)).append(": ") .append(childId).append("}"); return sb.toString(); }
@Test public void testDocWitInvalidSuccessorReference() { final String json = buildJson(new String[] { traceStr(1, "name", ResultType.UNFINISHED, false) }, new String[] { orderStr(1, 2) }, "test", 0L); try { decodeString(json); fail("Expected IOException"); } catch (IOException e) { // expected case } }
@Test public void testReversibleUnfinishedTrace() throws IOException { // If we have started a task we also must set the end time final ShallowTraceBuilder test = new ShallowTraceBuilder(IdGenerator.getNextId()).setName("test") .setResultType(ResultType.UNFINISHED).setStartNanos(0L).setPendingNanos(50L).setEndNanos(100L); final Trace trace = Trace.single(test.build(), "test", 0L); assertReversible(trace); }
private String traceStr(final int id, final String name, final ResultType resultType, final boolean hidden, final String taskType) { final StringBuilder sb = new StringBuilder(); sb.append("{").append(quote(JsonTraceCodec.TRACE_ID)).append(": ").append(id).append(",") .append(quote(JsonTraceCodec.TRACE_NAME)).append(": ").append(quote(name)).append(",") .append(quote(JsonTraceCodec.TRACE_HIDDEN)).append(": ").append(hidden).append(",") .append(quote(JsonTraceCodec.TRACE_RESULT_TYPE)).append(": ").append(quote(resultType.toString())); if (taskType != null) { sb.append(",").append(quote(JsonTraceCodec.TRACE_TASK_TYPE)).append(": ").append(quote(taskType)); } sb.append("}"); return sb.toString(); }
@Test public void testDocWitInvalidPredecessorReference() throws IOException { final String json = buildJson(new String[] { traceStr(1, "name", ResultType.UNFINISHED, false) }, new String[] { orderStr(2, 1) }, "test", 0L); try { decodeString(json); fail("Expected IOException"); } catch (IOException e) { // expected case } }
@Test public void testReversibleErrorTrace() throws IOException { // If we have started a task we also must set the end time final ShallowTraceBuilder test = new ShallowTraceBuilder(IdGenerator.getNextId()).setName("test").setResultType(ResultType.ERROR) .setValue("error value").setStartNanos(0L).setPendingNanos(50L).setEndNanos(100L); final Trace trace = Trace.single(test.build(), "test", 0L); assertReversible(trace); }
@Test public void testDocWitInvalidParentReference() throws IOException { final String json = buildJson(new String[] { traceStr(1, "name", ResultType.UNFINISHED, false) }, new String[] { hierStr(2, 1) }, "test", 0L); try { decodeString(json); fail("Expected IOException"); } catch (IOException e) { // expected case } }
@Test public void testReversibleWithSingleAttributes() throws IOException { final ShallowTraceBuilder test = new ShallowTraceBuilder(IdGenerator.getNextId()).setName("test").setResultType(ResultType.SUCCESS) .setStartNanos(0L).setPendingNanos(50L).addAttribute("key1", "value1").setEndNanos(100L); final Trace trace = Trace.single(test.build(), "test", 0L); assertReversible(trace); }
@Test public void testCustomBuilding() throws IOException { final String json = buildJson( new String[] { traceStr(1, "parent", ResultType.UNFINISHED, false), traceStr(2, "child", ResultType.UNFINISHED, false), traceStr(3, "predecessor", ResultType.UNFINISHED, false) }, new String[] { hierStr(1, 2), orderStr(3, 1) }, "test", 0L); final Trace trace; try { trace = decodeString(json); } catch (IOException e) { fail("JSON parse failed. Document:\n" + json + "\nError: " + e.toString()); return; } assertEquals("parent", trace.getTraceMap().get(1L).getName()); assertEquals(ResultType.UNFINISHED, trace.getTraceMap().get(1L).getResultType()); assertEquals(2, trace.getRelationships().size()); String childName = null; String predecessorName = null; for (TraceRelationship rel : trace.getRelationships()) { if (rel.getRelationhsip() == Relationship.PARENT_OF) { childName = trace.getTraceMap().get(rel.getTo()).getName(); } else if (rel.getRelationhsip() == Relationship.SUCCESSOR_OF) { predecessorName = trace.getTraceMap().get(rel.getTo()).getName(); } } assertEquals("child", childName); assertEquals("predecessor", predecessorName); }
@Test public void testReversibleSuccessfulTrace() throws IOException { final ShallowTraceBuilder test = new ShallowTraceBuilder(IdGenerator.getNextId()).setName("test").setResultType(ResultType.SUCCESS) .setValue("test value").setStartNanos(0L).setPendingNanos(50L).setEndNanos(100L); final Trace trace = Trace.single(test.build(), "test", 0L); assertReversible(trace); }