001package org.hl7.fhir.utilities.tests;
002
003import org.apache.commons.io.IOUtils;
004import org.hl7.fhir.utilities.CSFile;
005import org.hl7.fhir.utilities.TextFile;
006import org.hl7.fhir.utilities.ToolGlobalSettings;
007import org.hl7.fhir.utilities.Utilities;
008
009import java.io.*;
010import java.nio.file.Path;
011
012public class BaseTestingUtilities {
013
014  static public boolean silent;
015
016
017  public static String loadTestResource(String... paths) throws IOException {
018    /**
019     * This 'if' condition checks to see if the fhir-test-cases project (https://github.com/FHIR/fhir-test-cases) is
020     * installed locally at the same directory level as the core library project is. If so, the test case data is read
021     * directly from that project, instead of the imported maven dependency jar. It is important, that if you want to
022     * test against the dependency imported from sonatype nexus, instead of your local copy, you need to either change
023     * the name of the project directory to something other than 'fhir-test-cases', or move it to another location, not
024     * at the same directory level as the core project.
025     */
026
027    String dir = TestConfig.getInstance().getFhirTestCasesDirectory();
028    if (dir == null && ToolGlobalSettings.hasTestsPath()) {
029      dir = ToolGlobalSettings.getTestsPath();
030    }
031    if (dir != null && new CSFile(dir).exists()) {
032      String n = Utilities.path(dir, Utilities.path(paths));
033      // ok, we'll resolve this locally
034      return TextFile.fileToString(new CSFile(n));
035    } else {
036      // resolve from the package
037      String contents;
038      String classpath = ("/org/hl7/fhir/testcases/" + Utilities.pathURL(paths));
039      try (InputStream inputStream = BaseTestingUtilities.class.getResourceAsStream(classpath)) {
040        if (inputStream == null) {
041          throw new IOException("Can't find file on classpath: " + classpath);
042        }
043        contents = IOUtils.toString(inputStream, java.nio.charset.StandardCharsets.UTF_8);
044      }
045      return contents;
046    }
047  }
048
049  
050  public static InputStream loadTestResourceStream(String... paths) throws IOException {
051    String dir = TestConfig.getInstance().getFhirTestCasesDirectory();
052    if (dir == null && ToolGlobalSettings.hasTestsPath()) {
053      dir = ToolGlobalSettings.getTestsPath();
054    }
055    if (dir != null && new File(dir).exists()) {
056      String n = Utilities.path(dir, Utilities.path(paths));
057      return new FileInputStream(n);
058    } else {
059      String classpath = ("/org/hl7/fhir/testcases/" + Utilities.pathURL(paths));
060      InputStream s = BaseTestingUtilities.class.getResourceAsStream(classpath);
061      if (s == null) {
062        throw new Error("unable to find resource " + classpath);
063      }
064      return s;
065    }
066  }
067
068  public static byte[] loadTestResourceBytes(String... paths) throws IOException {
069    String dir = TestConfig.getInstance().getFhirTestCasesDirectory();
070    if (dir == null && ToolGlobalSettings.hasTestsPath()) {
071      dir = ToolGlobalSettings.getTestsPath();
072    }
073    if (dir != null && new File(dir).exists()) {
074      String n = Utilities.path(dir, Utilities.path(paths));
075      return TextFile.fileToBytes(n);
076    } else {
077      String classpath = ("/org/hl7/fhir/testcases/" + Utilities.pathURL(paths));
078      InputStream s = BaseTestingUtilities.class.getResourceAsStream(classpath);
079      if (s == null) {
080        throw new Error("unable to find resource " + classpath);
081      }
082      return TextFile.streamToBytes(s);
083    }
084  }
085
086  public static boolean findTestResource(String... paths) throws IOException {
087    String dir = TestConfig.getInstance().getFhirTestCasesDirectory();
088    if (dir == null && ToolGlobalSettings.hasTestsPath()) {
089      dir = ToolGlobalSettings.getTestsPath();
090    }
091    if (dir != null && new File(dir).exists()) {
092      String n = Utilities.path(dir, Utilities.path(paths));
093      return new File(n).exists();
094    } else {
095      String classpath = ("/org/hl7/fhir/testcases/" + Utilities.pathURL(paths));
096      try {
097        InputStream inputStream = BaseTestingUtilities.class.getResourceAsStream(classpath);
098        return inputStream != null;
099      } catch (Throwable t) {
100        return false;
101      }
102    }
103  }
104
105  public static String tempFile(String folder, String name) throws IOException {
106    String tmp = tempFolder(folder);
107    return Utilities.path(tmp, name);
108  }
109
110  public static String tempFolder(String name) throws IOException {
111    String path = Utilities.path(ToolGlobalSettings.hasTempPath() ? ToolGlobalSettings.getTempPath() : "[tmp]", name);
112    Utilities.createDirectory(path);
113    return path;
114  }
115
116    public static void setFhirTestCasesDirectory(String s) {
117    }
118
119  public static void createParentDirIfNotExists(Path target) {
120    Path parent = target.getParent();
121    if (!parent.toFile().exists()) {
122      parent.toFile().mkdirs();
123    }
124  }
125}