@Test
public void distributedAfterWithLogs() throws IOException {

    JsonSecurityAnalysisResultExporter exporter = new JsonSecurityAnalysisResultExporter();
    Set<String> expectedLogs = ImmutableSet.of("logs_0.zip",
            "security-analysis-task_0.out",
            "security-analysis-task_0.err",
            "logs_1.zip",
            "security-analysis-task_1.out",
            "security-analysis-task_1.err");
    for (String logFileName : expectedLogs) {
        Files.write(workingDir.resolve(logFileName), "logs".getBytes(StandardCharsets.UTF_8));
    }
    SecurityAnalysisExecutionInput input = new SecurityAnalysisExecutionInput();
    ExecutionHandler<SecurityAnalysisResultWithLog> handler2 = SecurityAnalysisExecutionHandlers.distributedWithLog(input, 2);
    try {
        handler2.after(workingDir, new DefaultExecutionReport());
        fail();
    } catch (ComputationException ce) {
        assertEquals("logs", ce.getErrLogs().get("security-analysis-task_0.err"));
        assertEquals("logs", ce.getErrLogs().get("security-analysis-task_1.err"));
        assertEquals("logs", ce.getOutLogs().get("security-analysis-task_0.out"));
        assertEquals("logs", ce.getOutLogs().get("security-analysis-task_1.out"));
    }
    try {
        Command cmd = Mockito.mock(Command.class);
        handler2.after(workingDir, new DefaultExecutionReport(Collections.singletonList(new ExecutionError(cmd, 0, 42))));
        fail();
    } catch (Exception e) {
        // ignored
        assertTrue(e instanceof ComputationException);
    }
    try (Writer writer = Files.newBufferedWriter(workingDir.resolve("task_0_result.json"))) {
        exporter.export(resultForContingency("c1"), writer);
    }
    try (Writer writer = Files.newBufferedWriter(workingDir.resolve("task_1_result.json"))) {
        exporter.export(resultForContingency("c2"), writer);
    }
    ExecutionHandler<SecurityAnalysisResultWithLog> handler = SecurityAnalysisExecutionHandlers.distributedWithLog(input, 2);
    SecurityAnalysisResultWithLog resultWithLog = handler.after(workingDir, new DefaultExecutionReport());
    SecurityAnalysisResult result = resultWithLog.getResult();
    assertNotNull(result);
    assertTrue(result.getPreContingencyResult().isComputationOk());
    assertTrue(result.getPreContingencyResult().getLimitViolations().isEmpty());
    assertEquals(2, result.getPostContingencyResults().size());
    assertEquals("c1", result.getPostContingencyResults().get(0).getContingency().getId());
    assertEquals("c2", result.getPostContingencyResults().get(1).getContingency().getId());
    byte[] logBytes = resultWithLog.getLogBytes()
            .orElseThrow(AssertionError::new);
    Set<String> foundNames = getFileNamesFromZip(logBytes);
    assertEquals(expectedLogs, foundNames);
}