@Test
  public void testCheckCompatibleEdition() {
    Properties props = dummyModuleProperties();
    ModuleDetails installingModuleDetails = new ModuleDetailsImpl(props);
    TFile theWar = getFile(".war", "module/test.war"); // Community Edition

    // Test for no edition specified
    this.checkCompatibleEdition(theWar, installingModuleDetails); // does not throw exception

    // Test for invalid edition
    props.setProperty(ModuleDetails.PROP_EDITIONS, "CommuniT");
    installingModuleDetails = new ModuleDetailsImpl(props);

    try {
      this.checkCompatibleEdition(theWar, installingModuleDetails);
      fail(); // should never get here
    } catch (ModuleManagementToolException exception) {
      assertTrue(
          exception
              .getMessage()
              .endsWith("can only be installed in one of the following editions[CommuniT]"));
    }

    props.setProperty(ModuleDetails.PROP_EDITIONS, ("CoMMunity")); // should ignore case
    installingModuleDetails = new ModuleDetailsImpl(props);
    this.checkCompatibleEdition(theWar, installingModuleDetails); // does not throw exception

    props.setProperty(
        ModuleDetails.PROP_EDITIONS, ("enterprise,community,bob")); // should ignore case
    installingModuleDetails = new ModuleDetailsImpl(props);
    this.checkCompatibleEdition(theWar, installingModuleDetails); // does not throw exception

    props.setProperty(ModuleDetails.PROP_EDITIONS, ("enterprise,Community")); // should ignore case
    installingModuleDetails = new ModuleDetailsImpl(props);
    this.checkCompatibleVersion(theWar, installingModuleDetails); // does not throw exception
  }
  @Test
  public void testCheckCompatibleVersion() {
    TFile theWar = getFile(".war", "module/test.war"); // Version 4.1.0

    ModuleDetails installingModuleDetails =
        new ModuleDetailsImpl(
            "test_it", new ModuleVersionNumber("9999"), "Test Mod", "Testing module");
    installingModuleDetails.setRepoVersionMin(new VersionNumber("10.1"));
    try {
      this.checkCompatibleVersion(theWar, installingModuleDetails);
      fail(); // should never get here
    } catch (ModuleManagementToolException exception) {
      assertTrue(
          exception.getMessage().contains("must be installed on a war version greater than 10.1"));
    }

    installingModuleDetails.setRepoVersionMin(new VersionNumber("1.1"));
    this.checkCompatibleVersion(theWar, installingModuleDetails); // does not throw exception

    installingModuleDetails.setRepoVersionMax(new VersionNumber("3.0"));
    try {
      this.checkCompatibleVersion(theWar, installingModuleDetails);
      fail(); // should never get here
    } catch (ModuleManagementToolException exception) {
      assertTrue(
          exception.getMessage().contains("cannot be installed on a war version greater than 3.0"));
    }

    installingModuleDetails.setRepoVersionMax(new VersionNumber("99"));
    this.checkCompatibleVersion(theWar, installingModuleDetails); // does not throw exception

    installingModuleDetails.setRepoVersionMin(new VersionNumber("4.1.0")); // current war version
    installingModuleDetails.setRepoVersionMax(new VersionNumber("4.1.0")); // current war version
    this.checkCompatibleVersion(theWar, installingModuleDetails); // does not throw exception

    installingModuleDetails.setRepoVersionMin(new VersionNumber("3.4.0")); // current war version
    installingModuleDetails.setRepoVersionMax(new VersionNumber("4.1.0")); // current war version
    this.checkCompatibleVersion(theWar, installingModuleDetails); // does not throw exception

    try {
      installingModuleDetails.setRepoVersionMin(new VersionNumber("3.4.0")); // current war version
      installingModuleDetails.setRepoVersionMax(
          new VersionNumber("4.0.999")); // current war version
      this.checkCompatibleVersion(theWar, installingModuleDetails); // does not throw exception
      fail(
          "Should not pass as current version is 4.1.0 and the max value is 4.0.999"); // should
                                                                                       // never get
                                                                                       // here
    } catch (ModuleManagementToolException exception) {
      assertTrue(
          exception
              .getMessage()
              .contains("cannot be installed on a war version greater than 4.0.999"));
    }
  }
  @Test
  public void testCheckCompatibleEditionUsingManifest() throws IOException {
    Properties props = dummyModuleProperties();
    ModuleDetails installingModuleDetails = new ModuleDetailsImpl(props);
    TFile theWar = getFile(".war", "module/share-3.4.11.war"); // enterprise edition

    // Test for no edition specified
    this.checkCompatibleEditionUsingManifest(
        theWar, installingModuleDetails); // does not throw exception

    // Test for invalid edition
    props.setProperty(ModuleDetails.PROP_EDITIONS, "CommuniT");
    installingModuleDetails = new ModuleDetailsImpl(props);
    try {
      this.checkCompatibleEditionUsingManifest(theWar, installingModuleDetails);
      fail(); // should never get here
    } catch (ModuleManagementToolException exception) {
      assertTrue(
          exception
              .getMessage()
              .endsWith("can only be installed in one of the following editions[CommuniT]"));
    }

    props.setProperty(ModuleDetails.PROP_EDITIONS, ("Enterprise")); // should ignore case
    installingModuleDetails = new ModuleDetailsImpl(props);
    this.checkCompatibleEditionUsingManifest(
        theWar, installingModuleDetails); // does not throw exception

    props.setProperty(ModuleDetails.PROP_EDITIONS, ("Community")); // should ignore case
    installingModuleDetails = new ModuleDetailsImpl(props);
    try {
      this.checkCompatibleEditionUsingManifest(theWar, installingModuleDetails);
      fail(); // should never get here
    } catch (ModuleManagementToolException exception) {
      assertTrue(
          exception
              .getMessage()
              .endsWith("can only be installed in one of the following editions[Community]"));
    }

    theWar = getFile(".war", "module/share-4.2.a.war");
    this.checkCompatibleEditionUsingManifest(theWar, installingModuleDetails);

    String propertiesLocation = getFile(".amp", "module/test_v5.amp") + "/module.properties";
    installingModuleDetails =
        ModuleDetailsHelper.createModuleDetailsFromPropertyLocation(propertiesLocation);

    try {
      this.checkCompatibleEdition(theWar, installingModuleDetails);
      fail(); // should never get here
    } catch (ModuleManagementToolException exception) {
      assertTrue(
          exception
              .getMessage()
              .endsWith("can only be installed in one of the following editions[Enterprise]"));
    }

    theWar = getFile(".war", "module/share-3.4.11.war");
    this.checkCompatibleEdition(theWar, installingModuleDetails); // should succeed

    try {
      theWar = getFile(".war", "module/share-4.2.a.war");
      this.checkCompatibleEdition(theWar, installingModuleDetails);
      fail(); // should never get here
    } catch (ModuleManagementToolException exception) {
      assertTrue(
          exception
              .getMessage()
              .endsWith("can only be installed in one of the following editions[Enterprise]"));
    }
  }
  @Test
  public void testCheckCompatibleVersionUsingManifest() throws IOException {
    // Now check the compatible versions using the manifest
    TFile theWar = getFile(".war", "module/share-3.4.11.war");
    ModuleDetails installingModuleDetails =
        new ModuleDetailsImpl(
            "test_it", new ModuleVersionNumber("9999"), "Test Mod", "Testing module");
    installingModuleDetails.setRepoVersionMin(new VersionNumber("10.1"));
    try {
      this.checkCompatibleVersionUsingManifest(theWar, installingModuleDetails);
      fail(); // should never get here
    } catch (ModuleManagementToolException exception) {
      assertTrue(
          exception.getMessage().contains("must be installed on a war version greater than 10.1"));
    }

    installingModuleDetails.setRepoVersionMin(new VersionNumber("1.1"));
    this.checkCompatibleVersionUsingManifest(
        theWar, installingModuleDetails); // does not throw exception

    installingModuleDetails.setRepoVersionMax(new VersionNumber("3.0"));
    try {
      this.checkCompatibleVersionUsingManifest(theWar, installingModuleDetails);
      fail(); // should never get here
    } catch (ModuleManagementToolException exception) {
      assertTrue(
          exception.getMessage().contains("cannot be installed on a war version greater than 3.0"));
    }

    installingModuleDetails.setRepoVersionMax(new VersionNumber("99"));
    this.checkCompatibleVersionUsingManifest(
        theWar, installingModuleDetails); // does not throw exception

    installingModuleDetails.setRepoVersionMin(new VersionNumber("3.4.11")); // current war version
    installingModuleDetails.setRepoVersionMax(new VersionNumber("3.4.11")); // current war version
    this.checkCompatibleVersionUsingManifest(
        theWar, installingModuleDetails); // does not throw exception

    installingModuleDetails.setRepoVersionMin(new VersionNumber("3.4.7")); // current war version
    installingModuleDetails.setRepoVersionMax(new VersionNumber("3.4.11")); // current war version
    this.checkCompatibleVersionUsingManifest(
        theWar, installingModuleDetails); // does not throw exception

    try {
      installingModuleDetails.setRepoVersionMin(new VersionNumber("3.4.0")); // current war version
      installingModuleDetails.setRepoVersionMax(new VersionNumber("3.4.10")); // current war version
      this.checkCompatibleVersionUsingManifest(
          theWar, installingModuleDetails); // does not throw exception
      fail(
          "Should not pass as current version is 3.4.11 and the max value is 3.4.10"); // should
                                                                                       // never get
                                                                                       // here
    } catch (ModuleManagementToolException exception) {
      assertTrue(
          exception
              .getMessage()
              .contains("cannot be installed on a war version greater than 3.4.10"));
    }

    theWar = getFile(".war", "module/share-4.2.a.war");
    installingModuleDetails =
        new ModuleDetailsImpl(
            "test_it", new ModuleVersionNumber("9999"), "Test Mod", "Testing module");
    installingModuleDetails.setRepoVersionMin(new VersionNumber("101.1"));
    // this should fail BUT we are using a non-numeric version number so instead it passes without
    // validation
    this.checkCompatibleVersionUsingManifest(theWar, installingModuleDetails);

    theWar = getFile(".war", "module/alfresco-4.2.a.war");
    // this should fail BUT we are using a non-numeric version number so instead it passes without
    // validation
    this.checkCompatibleVersionUsingManifest(theWar, installingModuleDetails);
  }