diff --git a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/ValidatorCli.java b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/ValidatorCli.java index 34c319b0a..924a2bf5f 100644 --- a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/ValidatorCli.java +++ b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/ValidatorCli.java @@ -1,10 +1,7 @@ package org.hl7.fhir.validation; -import java.io.File; -import java.io.IOException; import java.net.Authenticator; import java.net.PasswordAuthentication; -import java.net.URISyntaxException; import java.util.ArrayList; import java.util.List; import java.util.Locale; @@ -67,28 +64,17 @@ POSSIBILITY OF SUCH DAMAGE. */ -import org.hl7.fhir.r5.model.ImplementationGuide; -import org.hl7.fhir.r5.model.StructureDefinition; import org.hl7.fhir.r5.terminologies.JurisdictionUtilities; import org.hl7.fhir.utilities.FileFormat; import org.hl7.fhir.utilities.TimeTracker; import org.hl7.fhir.utilities.Utilities; import org.hl7.fhir.utilities.VersionUtilities; -import org.hl7.fhir.utilities.json.JsonException; -import org.hl7.fhir.utilities.npm.CommonPackages; import org.hl7.fhir.utilities.settings.FhirSettings; import org.hl7.fhir.validation.cli.model.CliContext; -import org.hl7.fhir.validation.cli.services.ComparisonService; import org.hl7.fhir.validation.cli.services.ValidationService; import org.hl7.fhir.validation.cli.tasks.*; import org.hl7.fhir.validation.cli.utils.Display; -import org.hl7.fhir.validation.cli.utils.EngineMode; import org.hl7.fhir.validation.cli.utils.Params; -import org.hl7.fhir.validation.special.R4R5MapTester; -import org.hl7.fhir.validation.special.TxTester; -import org.hl7.fhir.validation.special.TxTester.InternalTxLoader; -import org.hl7.fhir.validation.testexecutor.TestExecutor; -import org.hl7.fhir.validation.testexecutor.TestExecutorParams; /** * A executable class that will validate one or more FHIR resources against @@ -131,7 +117,7 @@ public class ValidatorCli { protected List getCliTasks() { return List.of( - + new CompareTask(), new CompileTask(), new FhirpathTask(), new InstallTask(), @@ -141,6 +127,8 @@ public class ValidatorCli { new SnapshotTask(), new SpecialTask(), new SpreadsheetTask(), + new TestsTask(), + new TxTestsTask(), new TransformTask(), new VersionTask(), defaultCliTask); @@ -163,18 +151,13 @@ public class ValidatorCli { FileFormat.checkCharsetAndWarnIfNotUTF8(System.out); if (shouldDisplayHelpToUser(args)) { + String helpTarget = Params.getParam(args, Params.HELP); Display.displayHelpDetails("help.txt"); - } else if (Params.hasParam(args, Params.COMPARE)) { - if (destinationDirectoryValid(Params.getParam(args, Params.DESTINATION))) { - doLeftRightComparison(args, cliContext, tt); - } - } else if (Params.hasParam(args, Params.TEST) || Params.hasParam(args, Params.TX_TESTS)) { - parseTestParamsAndExecute(args); - } - else { - Display.printCliArgumentsAndInfo(args); - doValidation(tt, tts, cliContext, args); + return; } + + + readParamsAndExecuteTask(tt, tts, cliContext, args); } public static void main(String[] args) throws Exception { @@ -182,7 +165,7 @@ public class ValidatorCli { final CliContext cliContext = Params.loadCliContext(args); validatorCli.readParamsAndExecuteTask(cliContext, args); } - + private static void setJavaSystemProxyParamsFromParams(String[] args) { setJavaSystemProxyHostFromParams(args, Params.PROXY, HTTP_PROXY_HOST, HTTP_PROXY_PORT); @@ -232,31 +215,6 @@ public class ValidatorCli { } } - protected static void parseTestParamsAndExecute(String[] args) throws IOException, URISyntaxException { - if (Params.hasParam(args, Params.TX_TESTS)) { - final String source = Params.getParam(args, Params.SOURCE); - final String output = Params.getParam(args, Params.OUTPUT); - final String version = Params.getParam(args, Params.VERSION); - final String tx = Params.getParam(args, Params.TERMINOLOGY); - final String filter = Params.getParam(args, Params.FILTER); - boolean ok = new TxTester(new InternalTxLoader(source, output), tx).setOutput(output).execute(version, filter); - System.exit(ok ? 1 : 0); - } else { - final String testModuleParam = Params.getParam(args, Params.TEST_MODULES); - final String testClassnameFilter = Params.getParam(args, Params.TEST_NAME_FILTER); - final String testCasesDirectory = Params.getParam(args, Params.TEST); - final String txCacheDirectory = Params.getParam(args, Params.TERMINOLOGY_CACHE); - assert TestExecutorParams.isValidModuleParam(testModuleParam) : "Invalid test module param: " + testModuleParam; - final String[] moduleNamesArg = TestExecutorParams.parseModuleParam(testModuleParam); - - assert TestExecutorParams.isValidClassnameFilterParam(testClassnameFilter) : "Invalid regex for test classname filter: " + testClassnameFilter; - - new TestExecutor(moduleNamesArg).executeTests(testClassnameFilter, txCacheDirectory, testCasesDirectory); - - System.exit(0); - } - } - private static String[] addAdditionalParamsForIpsParam(String[] args) { // ips$branch --> -version 4.0 -ig hl7.fhir.uv.ips#current$connectathon-2 -profile http://hl7.org/fhir/uv/ips/StructureDefinition/Bundle-uv-ips List res = new ArrayList<>(); @@ -286,21 +244,9 @@ public class ValidatorCli { return r; } - private static boolean destinationDirectoryValid(String dest) { - if (dest == null) { - System.out.println("no -dest parameter provided"); - return false; - } else if (!new File(dest).isDirectory()) { - System.out.println("Specified destination (-dest parameter) is not valid: \"" + dest + "\")"); - return false; - } else { - System.out.println("Valid destination directory provided: \"" + dest + "\")"); - return true; - } - } + private static boolean shouldDisplayHelpToUser(String[] args) { - String helpTarget = Params.getParam(args, Params.HELP); return (args.length == 0 || Params.hasParam(args, Params.HELP) || Params.hasParam(args, "?") @@ -308,33 +254,16 @@ public class ValidatorCli { || Params.hasParam(args, "/?")); } - private static void doLeftRightComparison(String[] args, CliContext cliContext, TimeTracker tt) throws Exception { - Display.printCliArgumentsAndInfo(args); - if (cliContext.getSv() == null) { - cliContext.setSv(validationService.determineVersion(cliContext)); - } - String v = VersionUtilities.getCurrentVersion(cliContext.getSv()); - String definitions = VersionUtilities.packageForVersion(v) + "#" + v; - ValidationEngine validator = validationService.initializeValidator(cliContext, definitions, tt); - validator.loadPackage(CommonPackages.ID_PUBPACK, null); - ComparisonService.doLeftRightComparison(args, Params.getParam(args, Params.DESTINATION), validator); - } + private void readParamsAndExecuteTask(TimeTracker tt, TimeTracker.Session tts, CliContext cliContext, String[] params) throws Exception { + Display.printCliParamsAndInfo(params); - private void doValidation(TimeTracker tt, TimeTracker.Session tts, CliContext cliContext, String[] params) throws Exception { if (cliContext.getSv() == null) { cliContext.setSv(myValidationService.determineVersion(cliContext)); } - CliTask cliTask = null; - for(CliTask candidateTask : cliTasks) { - if (candidateTask.shouldExecuteTask(cliContext, params)) { - cliTask = candidateTask; - } - } - if (cliTask == null) - cliTask = defaultCliTask; + final CliTask cliTask = selectCliTask(cliContext, params); - if (cliTask instanceof ValidationServiceTask) { + if (cliTask instanceof ValidationServiceTask) { ValidationEngine validationEngine = getValidationEngine(tt, cliContext); tts.end(); ((ValidationServiceTask) cliTask).executeTask(myValidationService, validationEngine, cliContext, params, tt, tts); @@ -345,6 +274,18 @@ public class ValidatorCli { System.out.println("Done. " + tt.report()+". Max Memory = "+Utilities.describeSize(Runtime.getRuntime().maxMemory())); } + private CliTask selectCliTask(CliContext cliContext, String[] params) { + CliTask cliTask = null; + for(CliTask candidateTask : cliTasks) { + if (candidateTask.shouldExecuteTask(cliContext, params)) { + cliTask = candidateTask; + } + } + if (cliTask == null) + cliTask = defaultCliTask; + return cliTask; + } + private ValidationEngine getValidationEngine(TimeTracker tt, CliContext cliContext) throws Exception { ValidationEngine validationEngine; System.out.println(" Locale: "+Locale.getDefault().getDisplayCountry()+"/"+Locale.getDefault().getCountry()); diff --git a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/cli/tasks/CliTask.java b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/cli/tasks/CliTask.java index 2c8d22861..b3b8122f5 100644 --- a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/cli/tasks/CliTask.java +++ b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/cli/tasks/CliTask.java @@ -9,9 +9,6 @@ import java.io.IOException; public abstract class CliTask { public abstract String getName(); - public final String getTaskParam() { - return "-" + getName(); - } public abstract boolean shouldExecuteTask(CliContext cliContext, String[] args); public abstract void printHelp(java.io.PrintStream out); diff --git a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/cli/tasks/CompareTask.java b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/cli/tasks/CompareTask.java new file mode 100644 index 000000000..dca2e41ee --- /dev/null +++ b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/cli/tasks/CompareTask.java @@ -0,0 +1,60 @@ +package org.hl7.fhir.validation.cli.tasks; + +import org.hl7.fhir.utilities.TimeTracker; +import org.hl7.fhir.utilities.VersionUtilities; +import org.hl7.fhir.utilities.npm.CommonPackages; +import org.hl7.fhir.validation.ValidationEngine; +import org.hl7.fhir.validation.cli.model.CliContext; +import org.hl7.fhir.validation.cli.services.ComparisonService; +import org.hl7.fhir.validation.cli.services.ValidationService; +import org.hl7.fhir.validation.cli.utils.Display; +import org.hl7.fhir.validation.cli.utils.Params; + +import java.io.File; +import java.io.PrintStream; + +public class CompareTask extends ValidationServiceTask{ + @Override + public String getName() { + return "compare"; + } + + @Override + public boolean shouldExecuteTask(CliContext cliContext, String[] args) { + return Params.hasParam(args, Params.COMPARE); + } + + @Override + public void printHelp(PrintStream out) { + + } + + @Override + public void executeTask(ValidationService validationService, ValidationEngine validationEngine, CliContext cliContext, String[] args, TimeTracker tt, TimeTracker.Session tts) throws Exception { + Display.printCliParamsAndInfo(args); + if (!destinationDirectoryValid(Params.getParam(args, Params.DESTINATION))) { + return; + } + if (cliContext.getSv() == null) { + cliContext.setSv(validationService.determineVersion(cliContext)); + } + String v = VersionUtilities.getCurrentVersion(cliContext.getSv()); + String definitions = VersionUtilities.packageForVersion(v) + "#" + v; + ValidationEngine validator = validationService.initializeValidator(cliContext, definitions, tt); + validator.loadPackage(CommonPackages.ID_PUBPACK, null); + ComparisonService.doLeftRightComparison(args, Params.getParam(args, Params.DESTINATION), validator); + } + + private boolean destinationDirectoryValid(String dest) { + if (dest == null) { + System.out.println("no -dest parameter provided"); + return false; + } else if (!new File(dest).isDirectory()) { + System.out.println("Specified destination (-dest parameter) is not valid: \"" + dest + "\")"); + return false; + } else { + System.out.println("Valid destination directory provided: \"" + dest + "\")"); + return true; + } + } +} diff --git a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/cli/tasks/TestsTask.java b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/cli/tasks/TestsTask.java new file mode 100644 index 000000000..240c60a82 --- /dev/null +++ b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/cli/tasks/TestsTask.java @@ -0,0 +1,45 @@ +package org.hl7.fhir.validation.cli.tasks; + +import org.hl7.fhir.utilities.TimeTracker; +import org.hl7.fhir.validation.cli.model.CliContext; +import org.hl7.fhir.validation.cli.utils.Params; +import org.hl7.fhir.validation.special.R4R5MapTester; +import org.hl7.fhir.validation.special.TxTester; +import org.hl7.fhir.validation.testexecutor.TestExecutor; +import org.hl7.fhir.validation.testexecutor.TestExecutorParams; + +import java.io.File; +import java.io.PrintStream; + +public class TestsTask extends StandaloneTask{ + @Override + public String getName() { + return "tests"; + } + + @Override + public boolean shouldExecuteTask(CliContext cliContext, String[] args) { + return Params.hasParam(args, Params.TEST); + } + + @Override + public void printHelp(PrintStream out) { + + } + + @Override + public void executeTask(CliContext cliContext, String[] args, TimeTracker tt, TimeTracker.Session tts) throws Exception { + final String testModuleParam = Params.getParam(args, Params.TEST_MODULES); + final String testClassnameFilter = Params.getParam(args, Params.TEST_NAME_FILTER); + final String testCasesDirectory = Params.getParam(args, Params.TEST); + final String txCacheDirectory = Params.getParam(args, Params.TERMINOLOGY_CACHE); + assert TestExecutorParams.isValidModuleParam(testModuleParam) : "Invalid test module param: " + testModuleParam; + final String[] moduleNamesArg = TestExecutorParams.parseModuleParam(testModuleParam); + + assert TestExecutorParams.isValidClassnameFilterParam(testClassnameFilter) : "Invalid regex for test classname filter: " + testClassnameFilter; + + new TestExecutor(moduleNamesArg).executeTests(testClassnameFilter, txCacheDirectory, testCasesDirectory); + + System.exit(0); + } +} diff --git a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/cli/tasks/TxTestsTask.java b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/cli/tasks/TxTestsTask.java new file mode 100644 index 000000000..ac57cd8a0 --- /dev/null +++ b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/cli/tasks/TxTestsTask.java @@ -0,0 +1,38 @@ +package org.hl7.fhir.validation.cli.tasks; + +import org.hl7.fhir.utilities.TimeTracker; +import org.hl7.fhir.validation.cli.model.CliContext; +import org.hl7.fhir.validation.cli.utils.Params; +import org.hl7.fhir.validation.special.TxTester; +import org.hl7.fhir.validation.testexecutor.TestExecutor; +import org.hl7.fhir.validation.testexecutor.TestExecutorParams; + +import java.io.PrintStream; + +public class TxTestsTask extends StandaloneTask{ + @Override + public String getName() { + return "txTests"; + } + + @Override + public boolean shouldExecuteTask(CliContext cliContext, String[] args) { + return Params.hasParam(args, Params.TX_TESTS); + } + + @Override + public void printHelp(PrintStream out) { + + } + + @Override + public void executeTask(CliContext cliContext, String[] args, TimeTracker tt, TimeTracker.Session tts) throws Exception { + final String source = Params.getParam(args, Params.SOURCE); + final String output = Params.getParam(args, Params.OUTPUT); + final String version = Params.getParam(args, Params.VERSION); + final String tx = Params.getParam(args, Params.TERMINOLOGY); + final String filter = Params.getParam(args, Params.FILTER); + boolean ok = new TxTester(new TxTester.InternalTxLoader(source, output), tx).setOutput(output).execute(version, filter); + System.exit(ok ? 1 : 0); + } +} diff --git a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/cli/utils/Display.java b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/cli/utils/Display.java index 42857323c..b64ecec3a 100644 --- a/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/cli/utils/Display.java +++ b/org.hl7.fhir.validation/src/main/java/org/hl7/fhir/validation/cli/utils/Display.java @@ -19,7 +19,7 @@ public class Display { return Long.toString(maxMemory / (1024 * 1024)); } - public static void printCliArgumentsAndInfo(String[] args) throws IOException { + public static void printCliParamsAndInfo(String[] args) throws IOException { System.out.println(" Paths: Current = " + System.getProperty("user.dir") + ", Package Cache = " + new FilesystemPackageCacheManager(org.hl7.fhir.utilities.npm.FilesystemPackageCacheManager.FilesystemPackageCacheMode.USER).getFolder()); System.out.print(" Params:"); for (String s : args) { diff --git a/org.hl7.fhir.validation/src/test/java/org/hl7/fhir/validation/ValidatorCliTests.java b/org.hl7.fhir.validation/src/test/java/org/hl7/fhir/validation/ValidatorCliTests.java index dc7fffd20..da8b75e4d 100644 --- a/org.hl7.fhir.validation/src/test/java/org/hl7/fhir/validation/ValidatorCliTests.java +++ b/org.hl7.fhir.validation/src/test/java/org/hl7/fhir/validation/ValidatorCliTests.java @@ -1,13 +1,11 @@ package org.hl7.fhir.validation; -import org.apache.commons.compress.archivers.sevenz.CLI; import org.hl7.fhir.utilities.TimeTracker; import org.hl7.fhir.validation.cli.model.CliContext; import org.hl7.fhir.validation.cli.services.ValidationService; import org.hl7.fhir.validation.cli.tasks.*; import org.hl7.fhir.validation.cli.utils.Params; - import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; @@ -31,6 +29,9 @@ public class ValidatorCliTests { @Mock ValidationEngine validationEngine; + @Spy + CompareTask compareTask; + @Spy CompileTask compileTask; @@ -49,6 +50,18 @@ public class ValidatorCliTests { SnapshotTask snapshotTask; @Spy SpreadsheetTask spreadsheetTask; + + @Spy + TestsTask testsTask = new TestsTask() { + @Override + public void executeTask(CliContext cliContext, String[] args, TimeTracker tt, TimeTracker.Session tts) {} + }; + + @Spy + TxTestsTask txTestsTask = new TxTestsTask() { + @Override + public void executeTask(CliContext cliContext, String[] args, TimeTracker tt, TimeTracker.Session tts) {} + }; @Spy TransformTask transformTask; @@ -76,6 +89,7 @@ public class ValidatorCliTests { protected List getCliTasks() { return List.of( + compareTask, compileTask, fhirpathTask, installTask, @@ -85,6 +99,8 @@ public class ValidatorCliTests { snapshotTask, specialTask, spreadsheetTask, + testsTask, + txTestsTask, transformTask, versionTask, //validate is the default @@ -241,4 +257,34 @@ public class ValidatorCliTests { Mockito.verify(specialTask).executeTask(same(cliContext), eq(args), any(TimeTracker.class), any(TimeTracker.Session.class)); } + + @Test + public void compareTest() throws Exception { + final String[] args = new String[]{"-compare"}; + CliContext cliContext = Params.loadCliContext(args); + ValidatorCli cli = mockValidatorCliWithService(cliContext); + cli.readParamsAndExecuteTask(cliContext, args); + Mockito.verify(validationService).determineVersion(same(cliContext)); + Mockito.verify(compareTask).executeTask(same(validationService), same(validationEngine), same(cliContext), eq(args), any(TimeTracker.class), any(TimeTracker.Session.class)); + } + + @Test + public void txTestsTest() throws Exception { + final String[] args = new String[]{"-txTests"}; + CliContext cliContext = Params.loadCliContext(args); + ValidatorCli cli = mockValidatorCli(); + cli.readParamsAndExecuteTask(cliContext, args); + + Mockito.verify(txTestsTask).executeTask(same(cliContext), eq(args), any(TimeTracker.class), any(TimeTracker.Session.class)); + } + + @Test + public void testsTest() throws Exception { + final String[] args = new String[]{"-tests"}; + CliContext cliContext = Params.loadCliContext(args); + ValidatorCli cli = mockValidatorCli(); + cli.readParamsAndExecuteTask(cliContext, args); + + Mockito.verify(testsTask).executeTask(same(cliContext), eq(args), any(TimeTracker.class), any(TimeTracker.Session.class)); + } }