package uk.ac.ox.zoo.seeg.abraid.mp.modelwrapper.model; import org.apache.commons.io.FileUtils; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; import org.mockito.ArgumentCaptor; import uk.ac.ox.zoo.seeg.abraid.mp.modelwrapper.config.run.ExecutionRunConfiguration; import uk.ac.ox.zoo.seeg.abraid.mp.modelwrapper.config.run.RunConfiguration; import java.io.File; import java.io.IOException; import java.nio.file.Paths; import java.util.Map; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.anyMapOf; import static org.mockito.Mockito.eq; import static org.mockito.Mockito.*; import static uk.ac.ox.zoo.seeg.abraid.mp.testutils.GeneralTestUtils.captorForClass; import static uk.ac.ox.zoo.seeg.abraid.mp.testutils.GeneralTestUtils.captorForMapClass; /** * Tests the ModelRunnerImpl class. * Copyright (c) 2014 University of Oxford */ public class ModelRunnerTest { @Rule public TemporaryFolder testFolder = new TemporaryFolder(); ///CHECKSTYLE:SUPPRESS VisibilityModifier @Test public void runModelTriggersProcess() throws Exception { // Arrange ProcessRunner mockProcessRunner = mock(ProcessRunner.class); ProcessRunnerFactory mockProcessRunnerFactory = mock(ProcessRunnerFactory.class); when(mockProcessRunnerFactory.createProcessRunner(any(File.class), any(File.class), any(String[].class), anyMapOf(String.class, File.class), anyInt())) .thenReturn(mockProcessRunner); ModelRunnerImpl target = new ModelRunnerImpl(mockProcessRunnerFactory); RunConfiguration config = createBasicRunConfiguration(); // Act target.runModel(config, null); // Assert verify(mockProcessRunner).run(any(ModelProcessHandler.class)); } @Test public void runModelCreatesANewProcessRunnerWithCorrectParameters() throws Exception { // Arrange ProcessRunner mockProcessRunner = mock(ProcessRunner.class); ProcessRunnerFactory mockProcessRunnerFactory = mock(ProcessRunnerFactory.class); when(mockProcessRunnerFactory.createProcessRunner(any(File.class), any(File.class), any(String[].class), anyMapOf(String.class, File.class), anyInt())) .thenReturn(mockProcessRunner); ModelRunnerImpl target = new ModelRunnerImpl(mockProcessRunnerFactory); File expectedR = new File("e1"); File expectedBase = testFolder.newFolder(); String runName = "name"; FileUtils.writeStringToFile(Paths.get(expectedBase.toString(), runName, "modelRun.R").toFile(), "\"Hello, World\""); int expectedTimeout = 10; RunConfiguration config = new RunConfiguration(runName, expectedBase, true, new ExecutionRunConfiguration(expectedR, expectedTimeout)); // Act target.runModel(config, null); // Assert ArgumentCaptor<String[]> stringArgsCaptor = captorForClass(String[].class); ArgumentCaptor<Map<String, File>> fileArgsCaptor = captorForMapClass(); verify(mockProcessRunnerFactory) .createProcessRunner(eq(Paths.get(expectedBase.toString(), runName).toFile()), eq(expectedR), stringArgsCaptor.capture(), fileArgsCaptor.capture(), eq(expectedTimeout)); String[] stringArgs = stringArgsCaptor.getValue(); Map<String, File> fileArgs = fileArgsCaptor.getValue(); assertThat(stringArgs).hasSize(4); assertThat(stringArgs[0]).isEqualTo("--no-save"); assertThat(stringArgs[1]).isEqualTo("--slave"); assertThat(stringArgs[2]).isEqualTo("-f"); String key = stringArgs[3].substring(2, stringArgs[3].length() - 1); assertThat(fileArgs).containsKey(key); assertThat(fileArgs.get(key)).isEqualTo(Paths.get(expectedBase.toString(), runName, "modelRun.R").toFile()); } private RunConfiguration createBasicRunConfiguration() throws IOException { File baseDir = testFolder.newFolder(); String run = "foo"; FileUtils.writeStringToFile(Paths.get(baseDir.toString(), run, "modelRun.R").toFile(), "\"Hello, World\""); return new RunConfiguration( run, baseDir, true, new ExecutionRunConfiguration(new File(""), 60000)); } }