From d2757b8d109d987233204b2def343be110fad5e8 Mon Sep 17 00:00:00 2001 From: Kevin Smith Date: Tue, 7 Jan 2025 12:35:12 -0800 Subject: [PATCH] Run VdypConsole as an oracle and store output and intermediate results for testing --- .../nrs/vdyp/test_oracle/OracleRunner.java | 378 +++++++++--------- .../vdyp/test_oracle/OracleRunnerTest.java | 372 ++++++++--------- 2 files changed, 382 insertions(+), 368 deletions(-) diff --git a/vdyp-test-oracle/src/main/java/ca/bc/gov/nrs/vdyp/test_oracle/OracleRunner.java b/vdyp-test-oracle/src/main/java/ca/bc/gov/nrs/vdyp/test_oracle/OracleRunner.java index 907ff7a3f..03c40502f 100644 --- a/vdyp-test-oracle/src/main/java/ca/bc/gov/nrs/vdyp/test_oracle/OracleRunner.java +++ b/vdyp-test-oracle/src/main/java/ca/bc/gov/nrs/vdyp/test_oracle/OracleRunner.java @@ -1,182 +1,196 @@ -package ca.bc.gov.nrs.vdyp.test_oracle; - -import org.apache.commons.cli.Options; -import org.apache.commons.cli.ParseException; -import org.apache.commons.io.FileUtils; - -import java.io.IOException; -import java.io.UncheckedIOException; -import java.nio.file.DirectoryStream; -import java.nio.file.Files; -import java.nio.file.LinkOption; -import java.nio.file.Path; -import java.nio.file.StandardOpenOption; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutionException; -import java.util.function.Predicate; -import java.util.stream.Stream; - -import org.apache.commons.cli.CommandLine; -import org.apache.commons.cli.CommandLineParser; -import org.apache.commons.cli.DefaultParser; - -public class OracleRunner { - - static final String INPUT_DIR_OPT = "input-dir"; - static final String OUTPUT_DIR_OPT = "output-dir"; - static final String INSTALL_DIR_OPT = "install-dir"; - static final String TEMP_DIR_OPT = "temp-dir"; - - static final String INPUT_DIR_ENV = "InputFileDir"; - static final String OUTPUT_DIR_ENV = "OutputFileDir"; - static final String INSTALL_DIR_ENV = "InstallDir"; - static final String PARAM_DIR_ENV = "ParmsFileDir"; - - public static void main(String[] args) throws InterruptedException { - try { - var app = new OracleRunner(); - app.run(args); - } catch (ParseException | IOException | ExecutionException e) { - System.err.println(e.getMessage()); - } - } - - public void run(String[] args) throws InterruptedException, ParseException, IOException, ExecutionException { - var options = new Options(); - - options.addRequiredOption("i", INPUT_DIR_OPT, true, "Directory containing input sets"); - options.addRequiredOption("o", OUTPUT_DIR_OPT, true, "Directory in which to write output sets"); - options.addRequiredOption("t", TEMP_DIR_OPT, true, "Directory to use for temporary data"); - options.addRequiredOption("d", INSTALL_DIR_OPT, true, "Directory containing the installation of VDYP7"); - - CommandLineParser parser = new DefaultParser(); - - CommandLine cmd = parser.parse(options, args); - - var inputDir = Path.of(cmd.getOptionValue(INPUT_DIR_OPT)); - var outputDir = Path.of(cmd.getOptionValue(OUTPUT_DIR_OPT)); - var installDir = Path.of(cmd.getOptionValue(INSTALL_DIR_OPT)); - var tempDir = Path.of(cmd.getOptionValue(TEMP_DIR_OPT)); - - if (Files.notExists(tempDir)) - Files.createDirectory(tempDir); - if (Files.notExists(outputDir)) - Files.createDirectory(outputDir); - - // loop over children of inputDir - for (var originalSubdir : Files.newDirectoryStream(inputDir, (d) -> Files.isDirectory(d))) { - - var dirname = originalSubdir.getFileName(); - var tempSubdir = tempDir.resolve(dirname); - var inputSubdir = tempSubdir.resolve("input"); - var paramSubdir = inputSubdir; - var outputSubdir = tempSubdir.resolve("output"); - var finalSubdir = outputDir.resolve(dirname); - - deleteDir(tempSubdir); - Files.createDirectory(tempSubdir); - copyDir(originalSubdir, inputSubdir); - - // Make sure the params file includes the flag to save the intermediate data - var paramFile = paramSubdir.resolve("parms.txt"); - boolean hasSaveIntermediariesParam; - try (Stream stream = Files.lines(paramFile)) { - hasSaveIntermediariesParam = stream.anyMatch(line -> line.matches("\\-v7save yes")); - } - if (!hasSaveIntermediariesParam) { - Files.write(paramFile, "-v7save yes\r\n".getBytes(), StandardOpenOption.APPEND); - } - - var builder = new ProcessBuilder(); - - builder.directory(inputSubdir.toFile()); - - builder.environment().put(INPUT_DIR_ENV, inputSubdir.toAbsolutePath().toString()); - builder.environment().put(OUTPUT_DIR_ENV, outputSubdir.toAbsolutePath().toString()); - builder.environment().put(INSTALL_DIR_ENV, installDir.toAbsolutePath().toString()); - builder.environment().put(PARAM_DIR_ENV, paramSubdir.toAbsolutePath().toString()); - - builder.command("RunVDYP7.cmd"); - - System.out.format("Running %s", builder.command()); - System.out.format("PWD=%s", builder.directory()); - System.out.format("ENV=%s", builder.environment()); - - run(builder).get(); - - copyOutput(originalSubdir, inputSubdir, outputSubdir, finalSubdir); - } - - } - - /** - * Create the final output - * - * @param originalSubdir - * @param inputSubdir - * @param outputSubdir - * @param finalSubdir - * @throws IOException - */ - void copyOutput(Path originalSubdir, Path inputSubdir, Path outputSubdir, Path finalSubdir) throws IOException { - deleteDir(finalSubdir); - Files.createDirectory(finalSubdir); - - var inputDir = finalSubdir.resolve("input"); - var fipDir = finalSubdir.resolve("fipInput"); - var vriDir = finalSubdir.resolve("vriInput"); - var adjustDir = finalSubdir.resolve("adjustInput"); - var forwardDir = finalSubdir.resolve("forwardInput"); - var backDir = finalSubdir.resolve("backInput"); - var forwardOutDir = finalSubdir.resolve("forwardOutput"); - var backOutDir = finalSubdir.resolve("backOutput"); - var outputDir = finalSubdir.resolve("output"); - var otherDir = finalSubdir.resolve("other"); - - Files.createDirectory(inputDir); - Files.createDirectory(fipDir); - Files.createDirectory(vriDir); - Files.createDirectory(adjustDir); - Files.createDirectory(forwardDir); - Files.createDirectory(backDir); - Files.createDirectory(forwardOutDir); - Files.createDirectory(backOutDir); - Files.createDirectory(outputDir); - Files.createDirectory(otherDir); - - copyDir(inputSubdir, inputDir); - - copyFiles(outputSubdir, fipDir, file -> file.getFileName().toString().contains("_FIP")); - copyFiles(outputSubdir, vriDir, file -> file.getFileName().toString().contains("_VRI")); - copyFiles(outputSubdir, adjustDir, file -> file.getFileName().toString().contains("_AJST")); - copyFiles(outputSubdir, forwardDir, file -> file.getFileName().toString().contains("_7INP")); - copyFiles(outputSubdir, forwardOutDir, file -> file.getFileName().toString().contains("_7OUT")); - copyFiles(outputSubdir, backDir, file -> file.getFileName().toString().contains("_BINP")); - copyFiles(outputSubdir, backOutDir, file -> file.getFileName().toString().contains("_BOUT")); - copyFiles(outputSubdir, backOutDir, file -> file.getFileName().toString().contains("_BOUT")); - copyFiles(outputSubdir, otherDir, file -> file.getFileName().toString().contains("_GROW")); - - copyFiles(outputSubdir, outputDir, file -> file.getFileName().toString().startsWith("Output_")); - } - - void copyFiles(Path source, Path destination, DirectoryStream.Filter filter) throws IOException { - try (var dirStream = Files.newDirectoryStream(source, filter)) { - for (var file : dirStream) { - FileUtils.copyFileToDirectory(file.toFile(), destination.toFile()); - } - } - } - - void copyDir(Path source, Path destination) throws IOException { - FileUtils.copyDirectory(source.toFile(), destination.toFile()); - } - - void deleteDir(Path dir) throws IOException { - FileUtils.deleteDirectory(dir.toFile()); - } - - protected CompletableFuture run(ProcessBuilder builder) throws IOException { - return builder.start().onExit().thenAccept(proc -> { - }); - } -} +package ca.bc.gov.nrs.vdyp.test_oracle; + +import org.apache.commons.cli.Options; +import org.apache.commons.cli.ParseException; +import org.apache.commons.io.FileUtils; + +import java.io.IOException; +import java.io.UncheckedIOException; +import java.nio.file.DirectoryStream; +import java.nio.file.Files; +import java.nio.file.LinkOption; +import java.nio.file.Path; +import java.nio.file.StandardOpenOption; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; +import java.util.function.Predicate; +import java.util.stream.Stream; + +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.CommandLineParser; +import org.apache.commons.cli.DefaultParser; + +public class OracleRunner { + + static final String INPUT_DIR_OPT = "input-dir"; + static final String OUTPUT_DIR_OPT = "output-dir"; + static final String INSTALL_DIR_OPT = "install-dir"; + static final String TEMP_DIR_OPT = "temp-dir"; + + static final String INPUT_DIR_ENV = "InputFileDir"; + static final String OUTPUT_DIR_ENV = "OutputFileDir"; + static final String INSTALL_DIR_ENV = "InstallDir"; + static final String PARAM_DIR_ENV = "ParmsFileDir"; + + public static void main(String[] args) throws InterruptedException { + try { + var app = new OracleRunner(); + app.run(args); + } catch (ParseException | IOException | ExecutionException e) { + System.err.println(e.getMessage()); + } + } + + public void run(String[] args) throws InterruptedException, ParseException, IOException, ExecutionException { + var options = new Options(); + + options.addRequiredOption("i", INPUT_DIR_OPT, true, "Directory containing input sets"); + options.addRequiredOption("o", OUTPUT_DIR_OPT, true, "Directory in which to write output sets"); + options.addRequiredOption("t", TEMP_DIR_OPT, true, "Directory to use for temporary data"); + options.addRequiredOption("d", INSTALL_DIR_OPT, true, "Directory containing the installation of VDYP7"); + + CommandLineParser parser = new DefaultParser(); + + CommandLine cmd = parser.parse(options, args); + + var inputDir = Path.of(cmd.getOptionValue(INPUT_DIR_OPT)); + var outputDir = Path.of(cmd.getOptionValue(OUTPUT_DIR_OPT)); + var installDir = Path.of(cmd.getOptionValue(INSTALL_DIR_OPT)); + var tempDir = Path.of(cmd.getOptionValue(TEMP_DIR_OPT)); + + if (Files.notExists(tempDir)) + Files.createDirectory(tempDir); + if (Files.notExists(outputDir)) + Files.createDirectory(outputDir); + + // loop over children of inputDir + for (var originalSubdir : Files.newDirectoryStream(inputDir, (d) -> Files.isDirectory(d))) { + + var dirname = originalSubdir.getFileName(); + var tempSubdir = tempDir.resolve(dirname); + var inputSubdir = tempSubdir.resolve("input"); + var paramSubdir = inputSubdir; + var outputSubdir = tempSubdir.resolve("output"); + var finalSubdir = outputDir.resolve(dirname); + + deleteDir(tempSubdir); + Files.createDirectory(tempSubdir); + Files.createDirectory(outputSubdir); + copyDir(originalSubdir, inputSubdir); + + // Make sure the params file includes the flag to save the intermediate data + var paramFile = paramSubdir.resolve("parms.txt"); + boolean hasSaveIntermediariesParam; + try (Stream stream = Files.lines(paramFile)) { + hasSaveIntermediariesParam = stream.anyMatch(line -> line.matches("\\-v7save yes")); + } + if (!hasSaveIntermediariesParam) { + Files.write(paramFile, "-v7save yes\r\n".getBytes(), StandardOpenOption.APPEND); + } + + var builder = new ProcessBuilder(); + + builder.directory(inputSubdir.toFile()); + + builder.environment().put(INPUT_DIR_ENV, inputSubdir.toAbsolutePath().toString()); + builder.environment().put(OUTPUT_DIR_ENV, outputSubdir.toAbsolutePath().toString()); + builder.environment().put(INSTALL_DIR_ENV, installDir.toAbsolutePath().toString()); + builder.environment().put(PARAM_DIR_ENV, paramSubdir.toAbsolutePath().toString()); + + //builder.command(inputSubdir.resolve("RunVDYP7.cmd").toAbsolutePath().toString()); + builder.command(installDir.resolve("VDYP7Console.exe").toAbsolutePath().toString(), "-p", paramSubdir.resolve("parms.txt").toAbsolutePath().toString()); + + System.out.format("Running %s\n", builder.command()); + System.out.format("PWD=%s\n", builder.directory()); + System.out.format("ENV=%s\n", builder.environment()); + + Path intermediateDir = installDir.resolve("VDYP_CFG"); + deleteFiles(intermediateDir, file->file.getFileName().toString().startsWith("P-SAVE_VDYP")); + + run(builder).get(); + + copyOutput(originalSubdir, inputSubdir, intermediateDir, outputSubdir, finalSubdir); + } + + } + + /** + * Create the final output + * + * @param originalSubdir + * @param inputSubdir + * @param outputSubdir + * @param finalSubdir + * @throws IOException + */ + void copyOutput(Path originalSubdir, Path inputSubdir, Path intermediateDir, Path outputSubdir, Path finalSubdir) throws IOException { + deleteDir(finalSubdir); + Files.createDirectory(finalSubdir); + + var inputDir = finalSubdir.resolve("input"); + var fipDir = finalSubdir.resolve("fipInput"); + var vriDir = finalSubdir.resolve("vriInput"); + var adjustDir = finalSubdir.resolve("adjustInput"); + var forwardDir = finalSubdir.resolve("forwardInput"); + var backDir = finalSubdir.resolve("backInput"); + var forwardOutDir = finalSubdir.resolve("forwardOutput"); + var backOutDir = finalSubdir.resolve("backOutput"); + var outputDir = finalSubdir.resolve("output"); + var otherDir = finalSubdir.resolve("other"); + + Files.createDirectory(inputDir); + Files.createDirectory(fipDir); + Files.createDirectory(vriDir); + Files.createDirectory(adjustDir); + Files.createDirectory(forwardDir); + Files.createDirectory(backDir); + Files.createDirectory(forwardOutDir); + Files.createDirectory(backOutDir); + Files.createDirectory(outputDir); + Files.createDirectory(otherDir); + + copyDir(inputSubdir, inputDir); + + + copyFiles(intermediateDir, fipDir, file -> file.getFileName().toString().contains("_FIP")); + copyFiles(intermediateDir, vriDir, file -> file.getFileName().toString().contains("_VRI")); + copyFiles(intermediateDir, adjustDir, file -> file.getFileName().toString().contains("_AJST")); + copyFiles(intermediateDir, forwardDir, file -> file.getFileName().toString().contains("_7INP")); + copyFiles(intermediateDir, forwardOutDir, file -> file.getFileName().toString().contains("_7OUT")); + copyFiles(intermediateDir, backDir, file -> file.getFileName().toString().contains("_BINP")); + copyFiles(intermediateDir, backOutDir, file -> file.getFileName().toString().contains("_BOUT")); + copyFiles(intermediateDir, backOutDir, file -> file.getFileName().toString().contains("_BOUT")); + copyFiles(intermediateDir, otherDir, file -> file.getFileName().toString().contains("_GROW")); + + copyFiles(outputSubdir, outputDir, file -> file.getFileName().toString().startsWith("Output_")); + } + + void copyFiles(Path source, Path destination, DirectoryStream.Filter filter) throws IOException { + try (var dirStream = Files.newDirectoryStream(source, filter)) { + for (var file : dirStream) { + FileUtils.copyFileToDirectory(file.toFile(), destination.toFile()); + } + } + } + + void deleteFiles(Path parent, DirectoryStream.Filter filter) throws IOException { + try (var dirStream = Files.newDirectoryStream(parent, filter)) { + for (var file : dirStream) { + FileUtils.deleteQuietly(file.toFile()); + } + } + } + + void copyDir(Path source, Path destination) throws IOException { + FileUtils.copyDirectory(source.toFile(), destination.toFile()); + } + + void deleteDir(Path dir) throws IOException { + FileUtils.deleteDirectory(dir.toFile()); + } + + protected CompletableFuture run(ProcessBuilder builder) throws IOException { + return builder.start().onExit().thenAccept(proc -> { + }); + } +} diff --git a/vdyp-test-oracle/src/test/java/ca/bc/gov/nrs/vdyp/test_oracle/OracleRunnerTest.java b/vdyp-test-oracle/src/test/java/ca/bc/gov/nrs/vdyp/test_oracle/OracleRunnerTest.java index 5a7c1b365..e1161bc9d 100644 --- a/vdyp-test-oracle/src/test/java/ca/bc/gov/nrs/vdyp/test_oracle/OracleRunnerTest.java +++ b/vdyp-test-oracle/src/test/java/ca/bc/gov/nrs/vdyp/test_oracle/OracleRunnerTest.java @@ -1,186 +1,186 @@ -package ca.bc.gov.nrs.vdyp.test_oracle; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.contains; -import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.Matchers.hasEntry; -import static org.junit.jupiter.api.Assertions.assertTrue; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.concurrent.CompletableFuture; - -import org.apache.commons.io.FileUtils; -import org.easymock.EasyMock; -import org.hamcrest.Description; -import org.hamcrest.Matcher; -import org.hamcrest.TypeSafeDiagnosingMatcher; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.io.CleanupMode; -import org.junit.jupiter.api.io.TempDir; - -class OracleRunnerTest { - - @TempDir - Path installDir; - - @TempDir - Path inputDir; - - @TempDir(cleanup = CleanupMode.ON_SUCCESS) - Path tempDir; - - @TempDir(cleanup = CleanupMode.ON_SUCCESS) - Path outputDir; - - static Path copyResource(Class klazz, String context, String path, Path destination) throws IOException { - Path result = destination.resolve(path); - - try (var is = klazz.getResourceAsStream(context + path)) { - Files.copy(is, result); - } - - return result; - - } - - String[] FILES = new String[] { "parms.txt", "RunVDYP7.cmd", "VDYP7_INPUT_LAYER.csv", "VDYP7_INPUT_POLY.csv" }; - String[] INPUT1_TESTS = new String[] { "test1" }; - String[] INPUT2_TESTS = new String[] { "test1", "test2" }; - - void setupInput1() throws IOException { - for (String testName : INPUT1_TESTS) { - Files.createDirectories(inputDir.resolve(testName)); - for (String filename : FILES) { - copyResource(OracleRunnerTest.class, "input1/", testName + "/" + filename, inputDir); - } - } - } - - @Test - void testSingleTest() throws Exception { - - setupInput1(); - - var em = EasyMock.createControl(); - - CompletableFuture mockFuture = em.createMock(CompletableFuture.class); - - EasyMock.expect(mockFuture.get()).andReturn(null).once(); - - em.replay(); - - var app = new OracleRunner() { - - @Override - protected CompletableFuture run(ProcessBuilder builder) throws IOException { - assertThat(builder.command(), contains(equalTo("RunVDYP7.cmd"))); - assertThat(builder.directory(), equalTo(tempDir.resolve("test1/input").toAbsolutePath().toFile())); - assertThat( - builder.environment(), - hasEntry( - equalTo(OracleRunner.INPUT_DIR_ENV), - equalTo(tempDir.resolve("test1/input").toAbsolutePath().toString()) - ) - ); - assertThat( - builder.environment(), - hasEntry( - equalTo(OracleRunner.OUTPUT_DIR_ENV), - equalTo(tempDir.resolve("test1/output").toAbsolutePath().toString()) - ) - ); - assertThat( - builder.environment(), - hasEntry( - equalTo(OracleRunner.PARAM_DIR_ENV), - equalTo( - tempDir.resolve("test1/input").toAbsolutePath().toString() // Same as input dir - ) - ) - ); - assertThat( - builder.environment(), - hasEntry(equalTo(OracleRunner.INSTALL_DIR_ENV), equalTo(installDir.toAbsolutePath().toString())) - ); - - assertThat(tempDir, fileExists("test1/input/RunVDYP7.cmd")); - assertThat(tempDir, fileExists("test1/input/parms.txt")); - assertThat(tempDir, fileExists("test1/input/VDYP7_INPUT_POLY.csv")); - assertThat(tempDir, fileExists("test1/input/VDYP7_INPUT_LAYER.csv")); - - for (var tag : new String[] { "7INPP", "7INPS", "7INPU", // - "7OUTP", "7OUTS", "7OUTU", "7OUTC", // - "AJSTA", "AJSTP", "AJSTS", "AJSTU", // - "BINPP", "BINPS", "BINPU", // - "BOUTP", "BOUTS", "BOUTU", "BOUTC", // - "GROW", // - "VRII", "VRIL", "VRIP", "VRIS" // - }) { - FileUtils.touch(tempDir.resolve("test1/output/P-SAVE_VDYP7_" + tag + ".dat").toFile()); - } - - return mockFuture; - } - - }; - - app.run(new String[] { "-i" + inputDir, "-o" + outputDir, "-d" + installDir, "-t" + tempDir }); - - em.verify(); - - assertThat(outputDir, fileExists("test1/input/RunVDYP7.cmd")); - assertThat(outputDir, fileExists("test1/input/parms.txt")); - assertThat(outputDir, fileExists("test1/input/VDYP7_INPUT_POLY.csv")); - assertThat(outputDir, fileExists("test1/input/VDYP7_INPUT_LAYER.csv")); - - for (var tag : new String[] { "7INPP", "7INPS", "7INPU" }) { - assertThat(outputDir, fileExists("test1/forwardInput/P-SAVE_VDYP7_" + tag + ".dat")); - } - for (var tag : new String[] { "7OUTP", "7OUTS", "7OUTU", "7OUTC" }) { - assertThat(outputDir, fileExists("test1/forwardOutput/P-SAVE_VDYP7_" + tag + ".dat")); - } - for (var tag : new String[] { "AJSTA", "AJSTP", "AJSTS", "AJSTU" }) { - assertThat(outputDir, fileExists("test1/adjustInput/P-SAVE_VDYP7_" + tag + ".dat")); - } - for (var tag : new String[] { "BINPP", "BINPS", "BINPU" }) { - assertThat(outputDir, fileExists("test1/backInput/P-SAVE_VDYP7_" + tag + ".dat")); - } - for (var tag : new String[] { "BOUTP", "BOUTS", "BOUTU", "BOUTC" }) { - assertThat(outputDir, fileExists("test1/backOutput/P-SAVE_VDYP7_" + tag + ".dat")); - } - for (var tag : new String[] { "GROW" }) { - assertThat(outputDir, fileExists("test1/other/P-SAVE_VDYP7_" + tag + ".dat")); - } - for (var tag : new String[] { "VRII", "VRIL", "VRIP", "VRIS" }) { - assertThat(outputDir, fileExists("test1/vriInput/P-SAVE_VDYP7_" + tag + ".dat")); - } - - assertThat(outputDir, fileExists("test1/input/RunVDYP7.cmd")); - assertThat(outputDir, fileExists("test1/input/parms.txt")); - assertThat(outputDir, fileExists("test1/input/VDYP7_INPUT_POLY.csv")); - assertThat(outputDir, fileExists("test1/input/VDYP7_INPUT_LAYER.csv")); - - } - - Matcher fileExists(String path) { - return new TypeSafeDiagnosingMatcher() { - - @Override - public void describeTo(Description description) { - description.appendText("contains a file at ").appendValue(path); - } - - @Override - protected boolean matchesSafely(Path item, Description mismatchDescription) { - if (Files.exists(item.resolve(path))) - return true; - - mismatchDescription.appendValue("does not exist"); - return false; - } - - }; - } -} +package ca.bc.gov.nrs.vdyp.test_oracle; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.contains; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.hasEntry; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.concurrent.CompletableFuture; + +import org.apache.commons.io.FileUtils; +import org.easymock.EasyMock; +import org.hamcrest.Description; +import org.hamcrest.Matcher; +import org.hamcrest.TypeSafeDiagnosingMatcher; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.CleanupMode; +import org.junit.jupiter.api.io.TempDir; + +class OracleRunnerTest { + + @TempDir + Path installDir; + + @TempDir + Path inputDir; + + @TempDir(cleanup = CleanupMode.ON_SUCCESS) + Path tempDir; + + @TempDir(cleanup = CleanupMode.ON_SUCCESS) + Path outputDir; + + static Path copyResource(Class klazz, String context, String path, Path destination) throws IOException { + Path result = destination.resolve(path); + + try (var is = klazz.getResourceAsStream(context + path)) { + Files.copy(is, result); + } + + return result; + + } + + String[] FILES = new String[] { "parms.txt", "RunVDYP7.cmd", "VDYP7_INPUT_LAYER.csv", "VDYP7_INPUT_POLY.csv" }; + String[] INPUT1_TESTS = new String[] { "test1" }; + String[] INPUT2_TESTS = new String[] { "test1", "test2" }; + + void setupInput1() throws IOException { + for (String testName : INPUT1_TESTS) { + Files.createDirectories(inputDir.resolve(testName)); + for (String filename : FILES) { + copyResource(OracleRunnerTest.class, "input1/", testName + "/" + filename, inputDir); + } + } + } + + @Test + void testSingleTest() throws Exception { + + setupInput1(); + + var em = EasyMock.createControl(); + + CompletableFuture mockFuture = em.createMock(CompletableFuture.class); + + EasyMock.expect(mockFuture.get()).andReturn(null).once(); + + em.replay(); + + var app = new OracleRunner() { + + @Override + protected CompletableFuture run(ProcessBuilder builder) throws IOException { + assertThat(builder.command(), contains(equalTo("RunVDYP7.cmd"))); + assertThat(builder.directory(), equalTo(tempDir.resolve("test1/input").toAbsolutePath().toFile())); + assertThat( + builder.environment(), + hasEntry( + equalTo(OracleRunner.INPUT_DIR_ENV), + equalTo(tempDir.resolve("test1/input").toAbsolutePath().toString()) + ) + ); + assertThat( + builder.environment(), + hasEntry( + equalTo(OracleRunner.OUTPUT_DIR_ENV), + equalTo(tempDir.resolve("test1/output").toAbsolutePath().toString()) + ) + ); + assertThat( + builder.environment(), + hasEntry( + equalTo(OracleRunner.PARAM_DIR_ENV), + equalTo( + tempDir.resolve("test1/input").toAbsolutePath().toString() // Same as input dir + ) + ) + ); + assertThat( + builder.environment(), + hasEntry(equalTo(OracleRunner.INSTALL_DIR_ENV), equalTo(installDir.toAbsolutePath().toString())) + ); + + assertThat(tempDir, fileExists("test1/input/RunVDYP7.cmd")); + assertThat(tempDir, fileExists("test1/input/parms.txt")); + assertThat(tempDir, fileExists("test1/input/VDYP7_INPUT_POLY.csv")); + assertThat(tempDir, fileExists("test1/input/VDYP7_INPUT_LAYER.csv")); + + for (var tag : new String[] { "7INPP", "7INPS", "7INPU", // + "7OUTP", "7OUTS", "7OUTU", "7OUTC", // + "AJSTA", "AJSTP", "AJSTS", "AJSTU", // + "BINPP", "BINPS", "BINPU", // + "BOUTP", "BOUTS", "BOUTU", "BOUTC", // + "GROW", // + "VRII", "VRIL", "VRIP", "VRIS" // + }) { + FileUtils.touch(tempDir.resolve("test1/output/P-SAVE_VDYP7_" + tag + ".dat").toFile()); + } + + return mockFuture; + } + + }; + + app.run(new String[] { "-i" + inputDir, "-o" + outputDir, "-d" + installDir, "-t" + tempDir }); + + em.verify(); + + assertThat(outputDir, fileExists("test1/input/RunVDYP7.cmd")); + assertThat(outputDir, fileExists("test1/input/parms.txt")); + assertThat(outputDir, fileExists("test1/input/VDYP7_INPUT_POLY.csv")); + assertThat(outputDir, fileExists("test1/input/VDYP7_INPUT_LAYER.csv")); + + for (var tag : new String[] { "7INPP", "7INPS", "7INPU" }) { + assertThat(outputDir, fileExists("test1/forwardInput/P-SAVE_VDYP7_" + tag + ".dat")); + } + for (var tag : new String[] { "7OUTP", "7OUTS", "7OUTU", "7OUTC" }) { + assertThat(outputDir, fileExists("test1/forwardOutput/P-SAVE_VDYP7_" + tag + ".dat")); + } + for (var tag : new String[] { "AJSTA", "AJSTP", "AJSTS", "AJSTU" }) { + assertThat(outputDir, fileExists("test1/adjustInput/P-SAVE_VDYP7_" + tag + ".dat")); + } + for (var tag : new String[] { "BINPP", "BINPS", "BINPU" }) { + assertThat(outputDir, fileExists("test1/backInput/P-SAVE_VDYP7_" + tag + ".dat")); + } + for (var tag : new String[] { "BOUTP", "BOUTS", "BOUTU", "BOUTC" }) { + assertThat(outputDir, fileExists("test1/backOutput/P-SAVE_VDYP7_" + tag + ".dat")); + } + for (var tag : new String[] { "GROW" }) { + assertThat(outputDir, fileExists("test1/other/P-SAVE_VDYP7_" + tag + ".dat")); + } + for (var tag : new String[] { "VRII", "VRIL", "VRIP", "VRIS" }) { + assertThat(outputDir, fileExists("test1/vriInput/P-SAVE_VDYP7_" + tag + ".dat")); + } + + assertThat(outputDir, fileExists("test1/input/RunVDYP7.cmd")); + assertThat(outputDir, fileExists("test1/input/parms.txt")); + assertThat(outputDir, fileExists("test1/input/VDYP7_INPUT_POLY.csv")); + assertThat(outputDir, fileExists("test1/input/VDYP7_INPUT_LAYER.csv")); + + } + + Matcher fileExists(String path) { + return new TypeSafeDiagnosingMatcher() { + + @Override + public void describeTo(Description description) { + description.appendText("contains a file at ").appendValue(path); + } + + @Override + protected boolean matchesSafely(Path item, Description mismatchDescription) { + if (Files.exists(item.resolve(path))) + return true; + + mismatchDescription.appendValue("does not exist"); + return false; + } + + }; + } +}