public static void oneTimeSetUp() throws Exception {
    BundleContext context = TestActivator.getContext();
    packageAdminRef = context.getServiceReference(PackageAdmin.class);
    PackageAdmin pkgAdmin = context.getService(packageAdminRef);

    // Make sure these are not running
    stopTransient(pkgAdmin, BUNDLE_EQUINOX_HTTP);
    stopTransient(pkgAdmin, BUNDLE_TESTSERVER);

    // Get an available port and assign it the "org.osgi.service.http.port" property. The
    // server will listen to this port and all tests use it to connect.
    System.setProperty(PROP_TESTSERVER_PORT, Integer.toString(obtainFreePort()));

    // Now start them again (with our property settings)
    if (!startTransient(pkgAdmin, BUNDLE_EQUINOX_HTTP))
      throw new IllegalStateException("Unable to start bundle " + BUNDLE_EQUINOX_HTTP);
    if (!startTransient(pkgAdmin, BUNDLE_TESTSERVER))
      throw new IllegalStateException("Unable to start bundle " + BUNDLE_TESTSERVER);
    // We must ensure that our IServiceUI service wins because the SDK registers one declaratively
    Hashtable properties = new Hashtable(1);
    properties.put(
        org.osgi.framework.Constants.SERVICE_RANKING, Integer.valueOf(Integer.MAX_VALUE));

    certificateUIRegistration =
        context.registerService(
            UIServices.class.getName(), new DelegatingAuthService(), properties);
    setUpCounter = 1;
  }
 private String getValueFor(String property) {
   if (property == null) return null;
   String result = TestActivator.getContext().getProperty(property);
   if (result == null && archiveAndRepositoryProperties == null) return null;
   if (result == null) archiveAndRepositoryProperties.getProperty(property);
   if (result == null)
     result = archiveAndRepositoryProperties.getProperty(property + '.' + Platform.getOS());
   return result;
 }
 /*
  * Helper method to return the install location. Return null if it is unavailable.
  */
 public static File getInstallLocation() {
   Location installLocation =
       ServiceHelper.getService(
           TestActivator.getContext(), Location.class, Location.INSTALL_FILTER);
   if (installLocation == null || !installLocation.isSet()) return null;
   URL url = installLocation.getURL();
   if (url == null) return null;
   return URLUtil.toFile(url);
 }
 public static void oneTimeTearDown() throws Exception {
   BundleContext context = TestActivator.getContext();
   certificateUIRegistration.unregister();
   PackageAdmin pkgAdmin = context.getService(packageAdminRef);
   stopTransient(pkgAdmin, BUNDLE_TESTSERVER);
   stopTransient(pkgAdmin, BUNDLE_EQUINOX_HTTP);
   context.ungetService(packageAdminRef);
   setUpCounter = 0;
 }
 /*
  * Clean up the temporary data used to run the tests.
  * This method is not intended to be called by clients, it will be called
  * automatically when the clients use a ReconcilerTestSuite.
  */
 public void cleanup() throws Exception {
   // rm -rf eclipse sub-dir
   boolean leaveDirty =
       Boolean.parseBoolean(TestActivator.getContext().getProperty("p2.tests.doNotClean"));
   if (leaveDirty) return;
   for (Iterator iter = toRemove.iterator(); iter.hasNext(); ) {
     File next = (File) iter.next();
     delete(next);
   }
   output = null;
   toRemove.clear();
 }
 protected void parseExitdata(String message) {
   // if the exit data contains a message telling us the location of the log file, then get it
   String data = TestActivator.getContext().getProperty("eclipse.exitdata");
   if (data == null) return;
   String log = null;
   // big hack but for now assume the log file path is the last segment of the error message
   for (StringTokenizer tokenizer = new StringTokenizer(data); tokenizer.hasMoreTokens(); )
     log = tokenizer.nextToken();
   if (log == null) return;
   // remove trailing "."
   if (log.endsWith(".")) log = log.substring(0, log.length() - 1);
   String errors = read(log);
   if (errors == null) return;
   // fail using the text from the log file
   assertOK(message, new Status(IStatus.ERROR, TestActivator.PI_PROV_TESTS, errors));
 }
 /*
  * Copy the bundle with the given id to the specified location. (location
  * is parent directory)
  */
 public void copyBundle(String bundlename, File source, File destination) throws IOException {
   if (destination == null) destination = output;
   destination = new File(destination, "eclipse/plugins");
   if (source == null) {
     Bundle bundle = TestActivator.getBundle(bundlename);
     if (bundle == null) {
       throw new IOException("Could not find: " + bundlename);
     }
     String location = bundle.getLocation();
     if (location.startsWith("reference:")) location = location.substring("reference:".length());
     source = new File(FileLocator.toFileURL(new URL(location)).getFile());
   }
   destination = new File(destination, source.getName());
   if (destination.exists()) return;
   FileUtils.copy(source, destination, new File(""), false);
   // if the target of the copy doesn't exist, then signal an error
   assertTrue("Unable to copy " + source + " to " + destination, destination.exists());
 }
@SuppressWarnings({"unchecked"})
public class ANYConfigCUsActionTest extends ActionTest {
  private static final String BUNDLE_VERSION = "5.0.0"; // $NON-NLS-1$
  private static final String ORG_ECLIPSE_CORE_COMMANDS =
      "org.eclipse.core.commands"; //$NON-NLS-1$
  private static File configLocation =
      new File(
          TestActivator.getTestDataFolder(),
          "ConfigCUsActionTest/level1/level2/config.ini"); //$NON-NLS-1$
  private static File executableLocation =
      new File(
          TestActivator.getTestDataFolder(), "ConfigCUsActionTest/level1/run.exe"); // $NON-NLS-1$
  private static Version version = Version.create("1.0.0"); // $NON-NLS-1$
  private static String id = "id"; // $NON-NLS-1$
  private static String flavor = "tooling"; // $NON-NLS-1$
  private IMetadataRepository metadataRepo;
  private DataLoader loader;

  public void setUp() throws Exception {

    // configuration spec for creation of filterless CUs
    String[] cfgSpecs = AbstractPublisherAction.parseConfigSpec("ANY"); // $NON-NLS-1$
    configSpec = AbstractPublisherAction.createConfigSpec(cfgSpecs[0], cfgSpecs[1], cfgSpecs[2]);
    setupPublisherInfo();
    setupPublisherResult();
    testAction = new ConfigCUsAction(publisherInfo, flavor, id, version);
  }

  public void testAction() throws Exception {
    testAction.perform(publisherInfo, publisherResult, new NullProgressMonitor());
    verifyAction();
    debug("Completed ConfigCUsAction test."); // $NON-NLS-1$
  }

  private void verifyAction() {
    ArrayList IUs = new ArrayList(publisherResult.getIUs(null, IPublisherResult.ROOT));
    assertTrue(IUs.size() == 1);
    InstallableUnit iu = (InstallableUnit) IUs.get(0);
    assertTrue(iu.getId().equalsIgnoreCase(flavor + id + ".configuration")); // $NON-NLS-1$

    // verify ProvidedCapabilities
    Collection<IProvidedCapability> providedCapabilities = iu.getProvidedCapabilities();
    verifyProvidedCapability(
        providedCapabilities, "org.eclipse.equinox.p2.iu", iu.getId(), version); // $NON-NLS-1$
    assertTrue(providedCapabilities.size() == 1);

    // verify RequiredCapabilities
    List<IRequirement> requiredCapability = iu.getRequirements();
    assertTrue(requiredCapability.size() == 3);
    verifyRequiredCapability(
        requiredCapability,
        IInstallableUnit.NAMESPACE_IU_ID,
        flavor + id + ".config." + configSpec,
        new VersionRange(version, true, version, true)); // $NON-NLS-1$
    verifyRequiredCapability(
        requiredCapability,
        IInstallableUnit.NAMESPACE_IU_ID,
        flavor + id + ".ini." + configSpec,
        new VersionRange(version, true, version, true)); // $NON-NLS-1$
    verifyRequiredCapability(
        requiredCapability,
        IInstallableUnit.NAMESPACE_IU_ID,
        flavor + configSpec + ORG_ECLIPSE_CORE_COMMANDS,
        new VersionRange(version, true, version, true));

    // verify non root IUs
    verifyFragment("ini"); // $NON-NLS-1$
    verifyFragment("config"); // $NON-NLS-1$
    verifyBundleCU();
  }

  private void verifyFragment(String cuType) {
    ArrayList IUs = new ArrayList(publisherResult.getIUs(null, IPublisherResult.NON_ROOT));
    for (int i = 0; i < IUs.size(); i++) {
      InstallableUnit iu = (InstallableUnit) IUs.get(i);
      if (iu.getId()
          .equals(flavor + id + "." + cuType + "." + configSpec)) { // $NON-NLS-1$ //$NON-NLS-2$

        assertNull(iu.getFilter()); // no filter if config spec is ANY

        assertTrue(iu.getVersion().equals(version));

        assertFalse(iu.isSingleton());

        Collection<IProvidedCapability> providedCapabilities = iu.getProvidedCapabilities();
        verifyProvidedCapability(
            providedCapabilities,
            IInstallableUnit.NAMESPACE_IU_ID,
            flavor + id + "." + cuType + "." + configSpec,
            version); //$NON-NLS-1$//$NON-NLS-2$
        verifyProvidedCapability(
            providedCapabilities, flavor + id, id + "." + cuType, version); // $NON-NLS-1$
        assertTrue(providedCapabilities.size() == 2);

        assertTrue(iu.getRequirements().size() == 0);

        if (cuType.equals("ini")) // $NON-NLS-1$
        verifyLauncherArgs(iu);
        if (cuType.equals("config")) // $NON-NLS-1$
        verifyConfigProperties(iu);
        return; // pass
      }
    }
    fail(
        "Configuration unit of type "
            + cuType
            + " was not enocuntered among fragments"); //$NON-NLS-1$
  }

  private void verifyBundleCU() {

    final String bundleCUId = flavor + configSpec + ORG_ECLIPSE_CORE_COMMANDS;
    IQueryResult queryResult =
        publisherResult.query(QueryUtil.createIUQuery(bundleCUId), new NullProgressMonitor());
    assertEquals(1, queryResultSize(queryResult));
    IInstallableUnitFragment fragment = (IInstallableUnitFragment) queryResult.iterator().next();

    assertNull(fragment.getFilter()); // no filter if config spec is ANY

    assertTrue(fragment.getVersion().equals(version));

    assertFalse(fragment.isSingleton());

    final Collection<IProvidedCapability> providedCapabilities = fragment.getProvidedCapabilities();
    verifyProvidedCapability(
        providedCapabilities, IInstallableUnit.NAMESPACE_IU_ID, bundleCUId, version);
    verifyProvidedCapability(
        providedCapabilities,
        "org.eclipse.equinox.p2.flavor",
        flavor + configSpec,
        version); //$NON-NLS-1$
    assertEquals(2, providedCapabilities.size());

    assertEquals(0, fragment.getRequirements().size());

    final Collection<IRequirement> hostRequirements = fragment.getHost();
    verifyRequiredCapability(
        hostRequirements,
        "osgi.bundle",
        ORG_ECLIPSE_CORE_COMMANDS,
        new VersionRange(BUNDLE_VERSION)); // $NON-NLS-1$
    verifyRequiredCapability(
        hostRequirements,
        "org.eclipse.equinox.p2.eclipse.type",
        "bundle",
        new VersionRange(Version.create("1.0.0"), true, Version.create("2.0.0"), false),
        1,
        1,
        false); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
    assertTrue(hostRequirements.size() == 2);

    final Collection<ITouchpointData> touchpointData = fragment.getTouchpointData();
    assertEquals(1, touchpointData.size());
    ITouchpointData data = touchpointData.iterator().next();
    ITouchpointInstruction instruction = data.getInstruction("install"); // $NON-NLS-1$
    assertEquals("installBundle(bundle:${artifact})", instruction.getBody()); // $NON-NLS-1$
    instruction = data.getInstruction("uninstall"); // $NON-NLS-1$
    assertEquals("uninstallBundle(bundle:${artifact})", instruction.getBody()); // $NON-NLS-1$
    instruction = data.getInstruction("configure"); // $NON-NLS-1$
    assertEquals("setStartLevel(startLevel:2);", instruction.getBody()); // $NON-NLS-1$
    instruction = data.getInstruction("unconfigure"); // $NON-NLS-1$
    assertEquals("setStartLevel(startLevel:-1);", instruction.getBody()); // $NON-NLS-1$
  }

  private void verifyLauncherArgs(IInstallableUnit iu) {
    Collection<ITouchpointData> touchpointData = iu.getTouchpointData();
    assertEquals(1, touchpointData.size());
    ITouchpointData data = touchpointData.iterator().next();
    ITouchpointInstruction instruction = data.getInstruction("configure"); // $NON-NLS-1$
    String body = instruction.getBody();
    assertTrue(
        "arg -foo bar",
        body.indexOf("addProgramArg(programArg:-foo bar);") > -1); // $NON-NLS-1$ //$NON-NLS-2$
    assertTrue(
        "vmarg -agentlib",
        body.indexOf(
                "addJvmArg(jvmArg:-agentlib${#58}jdwp=transport=dt_socket${#44}server=y${#44}suspend=n${#44}address=8272);")
            > -1); //$NON-NLS-1$ //$NON-NLS-2$
    assertTrue(
        "arg -product com,ma",
        body.indexOf("addProgramArg(programArg:-product);addProgramArg(programArg:com${#44}ma);")
            > -1); //$NON-NLS-1$ //$NON-NLS-2$
  }

  private void verifyConfigProperties(IInstallableUnit iu) {
    Collection<ITouchpointData> touchpointData = iu.getTouchpointData();
    assertEquals(1, touchpointData.size());
    ITouchpointData data = touchpointData.iterator().next();
    ITouchpointInstruction instruction = data.getInstruction("configure"); // $NON-NLS-1$
    String body = instruction.getBody();
    assertTrue(
        "eclipse.product",
        body.indexOf(
                "setProgramProperty(propName:eclipse.product,propValue:org.eclipse.platform.ide);")
            > -1); //$NON-NLS-1$ //$NON-NLS-2$
    assertTrue(
        "eclipse.buildId",
        body.indexOf("setProgramProperty(propName:eclipse.buildId,propValue:TEST-ID);")
            > -1); //$NON-NLS-1$ //$NON-NLS-2$
    assertTrue(
        "my.property",
        body.indexOf(
                "setProgramProperty(propName:my.property,propValue:${#123}a${#44}b${#58}c${#59}${#36}d${#125});")
            > -1); //$NON-NLS-1$ //$NON-NLS-2$
  }

  protected void insertPublisherInfoBehavior() {
    loader = new DataLoader(configLocation, executableLocation);

    // configure IExecutableAdvice
    LauncherData launcherData = loader.getLauncherData();
    LaunchingAdvice launchingAdvice = new LaunchingAdvice(launcherData, configSpec);

    ArrayList launchingList = new ArrayList();
    launchingList.add(launchingAdvice);

    ProductFileAdvice productAdvice = null;

    try {
      String productFileLocation =
          TestData.getFile("ProductActionTest", "productFileActionTest.product")
              .toString(); //$NON-NLS-1$ //$NON-NLS-2$
      productAdvice = new ProductFileAdvice(new ProductFile(productFileLocation), configSpec);
      launchingList.add(productAdvice);
    } catch (Exception e) {
      fail("Unable to create product file advice", e); // $NON-NLS-1$
    }

    expect(
            publisherInfo.getAdvice(
                EasyMock.matches(configSpec),
                EasyMock.eq(false),
                (String) EasyMock.anyObject(),
                (Version) EasyMock.anyObject(),
                EasyMock.eq(IExecutableAdvice.class)))
        .andReturn(launchingList)
        .anyTimes();

    // configure IConfigAdvice
    ConfigData configData = loader.getConfigData();
    ConfigAdvice configAdvice = new ConfigAdvice(configData, configSpec);
    ArrayList configList = new ArrayList();
    configList.add(configAdvice);
    configList.add(productAdvice);
    expect(
            publisherInfo.getAdvice(
                EasyMock.matches(configSpec),
                EasyMock.eq(false),
                (String) EasyMock.anyObject(),
                (Version) EasyMock.anyObject(),
                EasyMock.eq(IConfigAdvice.class)))
        .andReturn(configList)
        .anyTimes();

    // setup metadata repository
    IInstallableUnit[] ius = {
      mockIU("foo", null), mockIU("bar", null)
    }; //$NON-NLS-1$ //$NON-NLS-2$

    metadataRepo = new TestMetadataRepository(getAgent(), ius);
    expect(publisherInfo.getMetadataRepository()).andReturn(metadataRepo).anyTimes();
    expect(publisherInfo.getContextMetadataRepository()).andReturn(null).anyTimes();
  }

  @Override
  public void setupPublisherResult() {
    super.setupPublisherResult();

    InstallableUnitDescription iuDescription = new InstallableUnitDescription();
    iuDescription.setId(ORG_ECLIPSE_CORE_COMMANDS);
    iuDescription.setVersion(Version.create(BUNDLE_VERSION));
    IInstallableUnit iu = MetadataFactory.createInstallableUnit(iuDescription);

    publisherResult.addIU(iu, IPublisherResult.NON_ROOT);
  }
}