package com.thalesgroup.hudson.plugins.xunit.transformer;
import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Stage;
import com.thalesgroup.hudson.plugins.xunit.service.XUnitConversionService;
import com.thalesgroup.hudson.plugins.xunit.service.XUnitLog;
import com.thalesgroup.hudson.plugins.xunit.service.XUnitReportProcessingService;
import com.thalesgroup.hudson.plugins.xunit.service.XUnitValidationService;
import hudson.Util;
import hudson.model.BuildListener;
import hudson.remoting.VirtualChannel;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.mockito.InOrder;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import java.io.*;
import java.util.Arrays;
import java.util.List;
import static org.mockito.Mockito.*;
public class XUnitTransformerTest {
@Mock
@SuppressWarnings("unused")
private BuildListener buildListenerMock;
@Mock
@SuppressWarnings("unused")
private XUnitReportProcessingService xUnitReportProcessingServiceMock;
@Mock
@SuppressWarnings("unused")
private XUnitConversionService xUnitConversionServiceMock;
@Mock
@SuppressWarnings("unused")
private XUnitValidationService xUnitValidationServiceMock;
private File workspace;
private XUnitTransformer xUnitTransformer;
@Before
public void beforeTest() throws IOException {
MockitoAnnotations.initMocks(this);
workspace = Util.createTempDir();
when(buildListenerMock.getLogger()).thenReturn(new PrintStream(new ByteArrayOutputStream()));
xUnitTransformer = Guice.createInjector(Stage.DEVELOPMENT, new AbstractModule() {
@Override
protected void configure() {
bind(BuildListener.class).toInstance(buildListenerMock);
bind(XUnitToolInfo.class).toInstance(mock(XUnitToolInfo.class));
bind(XUnitConversionService.class).toInstance(xUnitConversionServiceMock);
bind(XUnitValidationService.class).toInstance(xUnitValidationServiceMock);
bind(XUnitReportProcessingService.class).toInstance(xUnitReportProcessingServiceMock);
}
}).getInstance(XUnitTransformer.class);
}
@After
@SuppressWarnings("ResultOfMethodCallIgnored")
public void afterTest() {
workspace.delete();
}
@Test
public void emptyResultFiles() throws Exception {
//Test result
Assert.assertFalse(xUnitTransformer.invoke(workspace, mock(VirtualChannel.class)));
//Verifying mock interactions
verify(xUnitReportProcessingServiceMock).findReports(any(XUnitToolInfo.class), any(File.class), anyString());
verify(xUnitValidationServiceMock, never()).validateInputFile(any(XUnitToolInfo.class), any(File.class));
verify(xUnitConversionServiceMock, never()).convert(any(XUnitToolInfo.class), any(File.class), any(File.class));
verify(xUnitValidationServiceMock, never()).validateOutputFile(any(XUnitToolInfo.class), any(File.class), any(File.class));
}
@Test
public void checkFailedNewFiles() throws Exception {
//Recording behaviour : testing not empty result files found and a false check
List<String> resultFiles = Arrays.asList("a.txt");
when(xUnitReportProcessingServiceMock.findReports(any(XUnitToolInfo.class), any(File.class), anyString())).thenReturn(resultFiles);
when(xUnitReportProcessingServiceMock.checkIfFindsFilesNewFiles(any(XUnitToolInfo.class), eq(resultFiles), any(File.class))).thenReturn(false);
//Test result
Assert.assertFalse(xUnitTransformer.invoke(workspace, mock(VirtualChannel.class)));
//Verifying
verify(xUnitValidationServiceMock, never()).validateInputFile(any(XUnitToolInfo.class), any(File.class));
verify(xUnitConversionServiceMock, never()).convert(any(XUnitToolInfo.class), any(File.class), any(File.class));
verify(xUnitValidationServiceMock, never()).validateOutputFile(any(XUnitToolInfo.class), any(File.class), any(File.class));
InOrder inOrder = inOrder(xUnitReportProcessingServiceMock);
inOrder.verify(xUnitReportProcessingServiceMock).findReports(any(XUnitToolInfo.class), any(File.class), anyString());
inOrder.verify(xUnitReportProcessingServiceMock).checkIfFindsFilesNewFiles(any(XUnitToolInfo.class), eq(resultFiles), any(File.class));
}
@Test
public void oneFileEmpty() throws Exception {
//One result file
List<String> resultFiles = Arrays.asList("a.txt");
when(xUnitReportProcessingServiceMock.findReports(any(XUnitToolInfo.class), any(File.class), anyString())).thenReturn(resultFiles);
//Check OK
when(xUnitReportProcessingServiceMock.checkIfFindsFilesNewFiles(any(XUnitToolInfo.class), eq(resultFiles), any(File.class))).thenReturn(true);
//Wants to call the real method checkFileIsNotEmpty
when(xUnitValidationServiceMock.checkFileIsNotEmpty(any(File.class))).thenCallRealMethod();
//Create a empty file
//Test the process continues and prints a message
File myInputFile = new File(workspace, "a.txt");
when(xUnitReportProcessingServiceMock.getCurrentReport(any(File.class), anyString())).thenReturn(myInputFile);
//The process exits on false
Assert.assertFalse(xUnitTransformer.invoke(workspace, mock(VirtualChannel.class)));
//Verifying mock interactions
InOrder inOrder = inOrder(xUnitReportProcessingServiceMock);
inOrder.verify(xUnitReportProcessingServiceMock).findReports(any(XUnitToolInfo.class), any(File.class), anyString());
inOrder.verify(xUnitReportProcessingServiceMock).checkIfFindsFilesNewFiles(any(XUnitToolInfo.class), eq(resultFiles), any(File.class));
inOrder.verify(xUnitReportProcessingServiceMock).getCurrentReport(any(File.class), anyString());
// Theses methods are never call
verify(xUnitValidationServiceMock, never()).validateInputFile(any(XUnitToolInfo.class), any(File.class));
verify(xUnitConversionServiceMock, never()).convert(any(XUnitToolInfo.class), any(File.class), any(File.class));
verify(xUnitValidationServiceMock, never()).validateOutputFile(any(XUnitToolInfo.class), any(File.class), any(File.class));
}
@Test
public void oneFileNotEmpty() throws Exception {
//One result file
List<String> resultFiles = Arrays.asList("a.txt");
when(xUnitReportProcessingServiceMock.findReports(any(XUnitToolInfo.class), any(File.class), anyString())).thenReturn(resultFiles);
//Check OK
when(xUnitReportProcessingServiceMock.checkIfFindsFilesNewFiles(any(XUnitToolInfo.class), eq(resultFiles), any(File.class))).thenReturn(true);
when(xUnitValidationServiceMock.checkFileIsNotEmpty(any(File.class))).thenReturn(true);
//Create a non empty file
File myInputFile = new File(workspace, "a.txt");
FileOutputStream fos = new FileOutputStream(myInputFile);
fos.write("bidon".getBytes());
fos.close();
when(xUnitReportProcessingServiceMock.getCurrentReport(any(File.class), anyString())).thenReturn(myInputFile);
//Case: Right input validation, conversion and right output validation
when(xUnitValidationServiceMock.validateInputFile(any(XUnitToolInfo.class), any(File.class))).thenReturn(true);
when(xUnitConversionServiceMock.convert(any(XUnitToolInfo.class), any(File.class), any(File.class))).thenReturn(new File(workspace, "output"));
when(xUnitValidationServiceMock.validateOutputFile(any(XUnitToolInfo.class), any(File.class), any(File.class))).thenReturn(true);
//The process exits on true
Assert.assertTrue(xUnitTransformer.invoke(workspace, mock(VirtualChannel.class)));
//Verifying mock interactions
InOrder inOrderReport = inOrder(xUnitReportProcessingServiceMock);
inOrderReport.verify(xUnitReportProcessingServiceMock).findReports(any(XUnitToolInfo.class), any(File.class), anyString());
inOrderReport.verify(xUnitReportProcessingServiceMock).checkIfFindsFilesNewFiles(any(XUnitToolInfo.class), eq(resultFiles), any(File.class));
inOrderReport.verify(xUnitReportProcessingServiceMock).getCurrentReport(any(File.class), anyString());
verify(xUnitValidationServiceMock).validateInputFile(any(XUnitToolInfo.class), any(File.class));
verify(xUnitConversionServiceMock).convert(any(XUnitToolInfo.class), any(File.class), any(File.class));
verify(xUnitValidationServiceMock).validateOutputFile(any(XUnitToolInfo.class), any(File.class), any(File.class));
}
@Test
public void oneFileNotEmptyWithOneFileEmpty() throws Exception {
//One result file
List<String> resultFiles = Arrays.asList("a.txt", "b.txt");
when(xUnitReportProcessingServiceMock.findReports(any(XUnitToolInfo.class), any(File.class), anyString())).thenReturn(resultFiles);
//Check OK
when(xUnitReportProcessingServiceMock.checkIfFindsFilesNewFiles(any(XUnitToolInfo.class), eq(resultFiles), any(File.class))).thenReturn(true);
when(xUnitValidationServiceMock.checkFileIsNotEmpty(any(File.class))).thenReturn(true);
//Wants to call the real method checkFileIsNotEmpty
when(xUnitValidationServiceMock.checkFileIsNotEmpty(any(File.class))).thenCallRealMethod();
//Create a non empty file
File myInputFileNotEmpty = new File(workspace, "dummyFile");
FileOutputStream fos = new FileOutputStream(myInputFileNotEmpty);
fos.write("bidon".getBytes());
fos.close();
File myInputFileEmpty = new File(workspace, "b.txt");
when(xUnitReportProcessingServiceMock.getCurrentReport(any(File.class), eq("a.txt"))).thenReturn(myInputFileNotEmpty);
when(xUnitReportProcessingServiceMock.getCurrentReport(any(File.class), eq("b.txt"))).thenReturn(myInputFileEmpty);
//Case: Right input validation, conversion and right output validation
when(xUnitValidationServiceMock.validateInputFile(any(XUnitToolInfo.class), any(File.class))).thenReturn(true);
when(xUnitConversionServiceMock.convert(any(XUnitToolInfo.class), any(File.class), any(File.class))).thenReturn(new File(workspace, "output"));
when(xUnitValidationServiceMock.validateOutputFile(any(XUnitToolInfo.class), any(File.class), any(File.class))).thenReturn(true);
//The process exits on false
Assert.assertFalse(xUnitTransformer.invoke(workspace, mock(VirtualChannel.class)));
//Verifying mock interactions
verify(xUnitReportProcessingServiceMock).findReports(any(XUnitToolInfo.class), any(File.class), anyString());
verify(xUnitReportProcessingServiceMock).checkIfFindsFilesNewFiles(any(XUnitToolInfo.class), eq(resultFiles), any(File.class));
verify(xUnitReportProcessingServiceMock, times(2)).getCurrentReport(any(File.class), anyString());
verify(xUnitValidationServiceMock).validateInputFile(any(XUnitToolInfo.class), any(File.class));
verify(xUnitConversionServiceMock).convert(any(XUnitToolInfo.class), any(File.class), any(File.class));
verify(xUnitValidationServiceMock).validateOutputFile(any(XUnitToolInfo.class), any(File.class), any(File.class));
}
@Test
public void twoFilesNotEmpty() throws Exception {
//One result file
List<String> resultFiles = Arrays.asList("a.txt", "b.txt");
when(xUnitReportProcessingServiceMock.findReports(any(XUnitToolInfo.class), any(File.class), anyString())).thenReturn(resultFiles);
//Check OK
when(xUnitReportProcessingServiceMock.checkIfFindsFilesNewFiles(any(XUnitToolInfo.class), eq(resultFiles), any(File.class))).thenReturn(true);
when(xUnitValidationServiceMock.checkFileIsNotEmpty(any(File.class))).thenReturn(true);
//Create a dummy non empty file
File myInputFile = new File(workspace, "dummyFile");
FileOutputStream fos = new FileOutputStream(myInputFile);
fos.write("bidon".getBytes());
fos.close();
when(xUnitReportProcessingServiceMock.getCurrentReport(any(File.class), anyString())).thenReturn(myInputFile);
//Case: Right input validation, conversion and right output validation
when(xUnitValidationServiceMock.validateInputFile(any(XUnitToolInfo.class), any(File.class))).thenReturn(true);
when(xUnitConversionServiceMock.convert(any(XUnitToolInfo.class), any(File.class), any(File.class))).thenReturn(new File(workspace, "output"));
when(xUnitValidationServiceMock.validateOutputFile(any(XUnitToolInfo.class), any(File.class), any(File.class))).thenReturn(true);
//The process exits on true
Assert.assertTrue(xUnitTransformer.invoke(workspace, mock(VirtualChannel.class)));
//Verifying mock interactions
InOrder inOrder = inOrder(xUnitReportProcessingServiceMock);
inOrder.verify(xUnitReportProcessingServiceMock).findReports(any(XUnitToolInfo.class), any(File.class), anyString());
inOrder.verify(xUnitReportProcessingServiceMock).checkIfFindsFilesNewFiles(any(XUnitToolInfo.class), eq(resultFiles), any(File.class));
verify(xUnitReportProcessingServiceMock, times(2)).getCurrentReport(any(File.class), anyString());
verify(xUnitValidationServiceMock, times(2)).validateInputFile(any(XUnitToolInfo.class), any(File.class));
verify(xUnitConversionServiceMock, times(2)).convert(any(XUnitToolInfo.class), any(File.class), any(File.class));
verify(xUnitValidationServiceMock, times(2)).validateOutputFile(any(XUnitToolInfo.class), any(File.class), any(File.class));
}
@Test
public void checkedFailedValidationInputWihOneFile() throws Exception {
//One result file
List<String> resultFiles = Arrays.asList("a.txt");
when(xUnitReportProcessingServiceMock.findReports(any(XUnitToolInfo.class), any(File.class), anyString())).thenReturn(resultFiles);
//Check OK
when(xUnitReportProcessingServiceMock.checkIfFindsFilesNewFiles(any(XUnitToolInfo.class), eq(resultFiles), any(File.class))).thenReturn(true);
when(xUnitValidationServiceMock.checkFileIsNotEmpty(any(File.class))).thenReturn(true);
//Create a non empty file
File myInputFile = new File(workspace, "dummyFile");
FileOutputStream fos = new FileOutputStream(myInputFile);
fos.write("bidon".getBytes());
fos.close();
when(xUnitReportProcessingServiceMock.getCurrentReport(any(File.class), anyString())).thenReturn(myInputFile);
//Case: Wrong input validation
when(xUnitValidationServiceMock.validateInputFile(any(XUnitToolInfo.class), any(File.class))).thenReturn(false);
//The process must exit on false
Assert.assertFalse(xUnitTransformer.invoke(workspace, mock(VirtualChannel.class)));
//Verifying mock interactions
InOrder inOrder = inOrder(xUnitReportProcessingServiceMock);
inOrder.verify(xUnitReportProcessingServiceMock).findReports(any(XUnitToolInfo.class), any(File.class), anyString());
inOrder.verify(xUnitReportProcessingServiceMock).checkIfFindsFilesNewFiles(any(XUnitToolInfo.class), eq(resultFiles), any(File.class));
inOrder.verify(xUnitReportProcessingServiceMock).getCurrentReport(any(File.class), anyString());
verify(xUnitValidationServiceMock).validateInputFile(any(XUnitToolInfo.class), any(File.class));
verify(xUnitConversionServiceMock, never()).convert(any(XUnitToolInfo.class), any(File.class), any(File.class));
verify(xUnitValidationServiceMock, never()).validateOutputFile(any(XUnitToolInfo.class), any(File.class), any(File.class));
}
@Test
public void checkedFailedValidationInputWihOneFileFollowedByOneValidFile() throws Exception {
//One result file
List<String> resultFiles = Arrays.asList("a.txt", "b.txt");
when(xUnitReportProcessingServiceMock.findReports(any(XUnitToolInfo.class), any(File.class), anyString())).thenReturn(resultFiles);
//Check OK
when(xUnitReportProcessingServiceMock.checkIfFindsFilesNewFiles(any(XUnitToolInfo.class), eq(resultFiles), any(File.class))).thenReturn(true);
when(xUnitValidationServiceMock.checkFileIsNotEmpty(any(File.class))).thenReturn(true);
//Create a non empty file
File myInputFile1 = new File(workspace, "a.txt");
FileOutputStream fos1 = new FileOutputStream(myInputFile1);
fos1.write("bidon1".getBytes());
fos1.close();
File myInputFile2 = new File(workspace, "b.txt");
FileOutputStream fos2 = new FileOutputStream(myInputFile2);
fos2.write("bidon2".getBytes());
fos2.close();
when(xUnitReportProcessingServiceMock.getCurrentReport(any(File.class), eq("a.txt"))).thenReturn(myInputFile1);
when(xUnitReportProcessingServiceMock.getCurrentReport(any(File.class), eq("b.txt"))).thenReturn(myInputFile2);
//Case: Wrong input validation on first file and right on second
when(xUnitValidationServiceMock.validateInputFile(any(XUnitToolInfo.class), eq(myInputFile1))).thenReturn(false);
when(xUnitValidationServiceMock.validateInputFile(any(XUnitToolInfo.class), eq(myInputFile2))).thenReturn(true);
//Right conversion and output validation
when(xUnitConversionServiceMock.convert(any(XUnitToolInfo.class), any(File.class), any(File.class))).thenReturn(new File(workspace, "output"));
when(xUnitValidationServiceMock.validateOutputFile(any(XUnitToolInfo.class), any(File.class), any(File.class))).thenReturn(true);
//The process must exit on false
Assert.assertFalse(xUnitTransformer.invoke(workspace, mock(VirtualChannel.class)));
//Verifying mock interactions
// The method for the second must never be called
verify(xUnitReportProcessingServiceMock).findReports(any(XUnitToolInfo.class), any(File.class), anyString());
verify(xUnitReportProcessingServiceMock).checkIfFindsFilesNewFiles(any(XUnitToolInfo.class), eq(resultFiles), any(File.class));
verify(xUnitReportProcessingServiceMock).getCurrentReport(any(File.class), anyString());
verify(xUnitValidationServiceMock).validateInputFile(any(XUnitToolInfo.class), any(File.class));
verify(xUnitConversionServiceMock, never()).convert(any(XUnitToolInfo.class), any(File.class), any(File.class));
verify(xUnitValidationServiceMock, never()).validateOutputFile(any(XUnitToolInfo.class), any(File.class), any(File.class));
}
@Test
public void checkedFailedValidationOutputWihOneFile() throws Exception {
//One result file
List<String> resultFiles = Arrays.asList("a.txt");
when(xUnitReportProcessingServiceMock.findReports(any(XUnitToolInfo.class), any(File.class), anyString())).thenReturn(resultFiles);
//Check OK
when(xUnitReportProcessingServiceMock.checkIfFindsFilesNewFiles(any(XUnitToolInfo.class), eq(resultFiles), any(File.class))).thenReturn(true);
when(xUnitValidationServiceMock.checkFileIsNotEmpty(any(File.class))).thenReturn(true);
//Create a non empty file
File myInputFile = new File(workspace, "dummyFile");
FileOutputStream fos = new FileOutputStream(myInputFile);
fos.write("bidon".getBytes());
fos.close();
when(xUnitReportProcessingServiceMock.getCurrentReport(any(File.class), anyString())).thenReturn(myInputFile);
//Case: Right input validation and conversion
when(xUnitValidationServiceMock.validateInputFile(any(XUnitToolInfo.class), any(File.class))).thenReturn(true);
when(xUnitConversionServiceMock.convert(any(XUnitToolInfo.class), any(File.class), any(File.class))).thenReturn(new File(workspace, "output"));
//Wrong output validation
when(xUnitValidationServiceMock.validateOutputFile(any(XUnitToolInfo.class), any(File.class), any(File.class))).thenReturn(false);
//The process exits on false
Assert.assertFalse(xUnitTransformer.invoke(workspace, mock(VirtualChannel.class)));
//Verifying mock interactions
InOrder inOrder = inOrder(xUnitReportProcessingServiceMock);
inOrder.verify(xUnitReportProcessingServiceMock).findReports(any(XUnitToolInfo.class), any(File.class), anyString());
inOrder.verify(xUnitReportProcessingServiceMock).checkIfFindsFilesNewFiles(any(XUnitToolInfo.class), eq(resultFiles), any(File.class));
inOrder.verify(xUnitReportProcessingServiceMock).getCurrentReport(any(File.class), anyString());
verify(xUnitValidationServiceMock).validateInputFile(any(XUnitToolInfo.class), any(File.class));
verify(xUnitConversionServiceMock).convert(any(XUnitToolInfo.class), any(File.class), any(File.class));
verify(xUnitValidationServiceMock).validateOutputFile(any(XUnitToolInfo.class), any(File.class), any(File.class));
}
@Test
public void checkedFailedValidationOutputWihTwoFiles() throws Exception {
//One result file
List<String> resultFiles = Arrays.asList("a.txt", "b.txt");
when(xUnitReportProcessingServiceMock.findReports(any(XUnitToolInfo.class), any(File.class), anyString())).thenReturn(resultFiles);
//Check OK
when(xUnitReportProcessingServiceMock.checkIfFindsFilesNewFiles(any(XUnitToolInfo.class), eq(resultFiles), any(File.class))).thenReturn(true);
when(xUnitValidationServiceMock.checkFileIsNotEmpty(any(File.class))).thenReturn(true);
//Create a non empty file
File myInputFile = new File(workspace, "dummyFile");
FileOutputStream fos = new FileOutputStream(myInputFile);
fos.write("bidon".getBytes());
fos.close();
when(xUnitReportProcessingServiceMock.getCurrentReport(any(File.class), anyString())).thenReturn(myInputFile);
//Case: Right input validation and conversion
when(xUnitValidationServiceMock.validateInputFile(any(XUnitToolInfo.class), any(File.class))).thenReturn(true);
when(xUnitConversionServiceMock.convert(any(XUnitToolInfo.class), any(File.class), any(File.class))).thenReturn(new File(workspace, "output"));
//Wrong output validation
when(xUnitValidationServiceMock.validateOutputFile(any(XUnitToolInfo.class), any(File.class), any(File.class))).thenReturn(false);
//The process exits on false
Assert.assertFalse(xUnitTransformer.invoke(workspace, mock(VirtualChannel.class)));
//Verifying mock interactions
//Exit at the first validation output error
InOrder inOrder = inOrder(xUnitReportProcessingServiceMock);
inOrder.verify(xUnitReportProcessingServiceMock).findReports(any(XUnitToolInfo.class), any(File.class), anyString());
inOrder.verify(xUnitReportProcessingServiceMock).checkIfFindsFilesNewFiles(any(XUnitToolInfo.class), eq(resultFiles), any(File.class));
inOrder.verify(xUnitReportProcessingServiceMock).getCurrentReport(any(File.class), anyString());
verify(xUnitValidationServiceMock).validateInputFile(any(XUnitToolInfo.class), any(File.class));
verify(xUnitConversionServiceMock).convert(any(XUnitToolInfo.class), any(File.class), any(File.class));
verify(xUnitValidationServiceMock).validateOutputFile(any(XUnitToolInfo.class), any(File.class), any(File.class));
}
}