/******************************************************************************* * Copyright (c) 2011, 2013 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.equinox.region.tests.system; import junit.framework.TestCase; import org.eclipse.core.tests.harness.PerformanceTestRunner; import org.eclipse.equinox.region.*; import org.eclipse.equinox.region.tests.BundleInstaller; import org.osgi.framework.*; public class RegionPerformanceTests extends TestCase { Bundle testBundle; private ServiceReference<RegionDigraph> digraphReference; private RegionDigraph digraph; private BundleInstaller bundleInstaller; private Bundle testsBundle; private BundleContext context; @Override protected void setUp() throws Exception { testsBundle = FrameworkUtil.getBundle(this.getClass()); context = testsBundle.getBundleContext(); digraphReference = context.getServiceReference(RegionDigraph.class); assertNotNull("No digraph found", digraphReference); digraph = context.getService(digraphReference); assertNotNull("No digraph found", digraph); bundleInstaller = new BundleInstaller("bundle_tests", testsBundle); //$NON-NLS-1$ testBundle = bundleInstaller.installBundle(AbstractRegionSystemTest.PP1); testBundle.start(); } @Override protected void tearDown() throws Exception { for (Region region : digraph) { if (!region.contains(0)) { digraph.removeRegion(region); } } bundleInstaller.shutdown(); if (digraphReference != null) context.ungetService(digraphReference); } private void doTestGetBundles(String fingerPrintName, String degradation) { final BundleContext bundleContext = testBundle.getBundleContext(); PerformanceTestRunner runner = new PerformanceTestRunner() { protected void test() { Bundle[] bundles = bundleContext.getBundles(); for (Bundle bundle : bundles) { bundleContext.getBundle(bundle.getBundleId()); } } }; runner.setRegressionReason(degradation); runner.run(this, fingerPrintName, 10, 300); } public void testGetBundlesNoRegions() { doTestGetBundles(null, null); } public void testGetBundles10Regions() throws BundleException { createRegions(10); doTestGetBundles(null, null); } public void testGetBundles100Regions() throws BundleException { createRegions(100); doTestGetBundles(null, null); } public void testGetBundles1000Regions() throws BundleException { createRegions(1000); doTestGetBundles(null, null); } public void testGetServicesNoRegions() { doTestGetServices(null, null); } public void testGetServices10Regions() throws BundleException { createRegions(10); doTestGetServices(null, null); } public void testGetServices100Regions() throws BundleException { createRegions(100); doTestGetServices(null, null); } public void testGetServices1000Regions() throws BundleException { createRegions(1000); doTestGetServices(null, null); } public void testGetRegionByNameNoRegions() { doTestGetRegionByName(null, null); } public void testGetRegionByName10Regions() throws BundleException { createRegions(10); doTestGetRegionByName(null, null); } public void testGetRegionByName100Regions() throws BundleException { createRegions(100); doTestGetRegionByName(null, null); } public void testGetRegionByName1000Regions() throws BundleException { createRegions(1000); doTestGetRegionByName(null, null); } private void doTestGetServices(String fingerPrintName, String degradation) { final BundleContext bundleContext = testBundle.getBundleContext(); PerformanceTestRunner runner = new PerformanceTestRunner() { protected void test() { try { bundleContext.getServiceReferences(RegionDigraph.class, null); } catch (InvalidSyntaxException e) { fail(e.getMessage()); } } }; runner.setRegressionReason(degradation); runner.run(this, fingerPrintName, 10, 2000); } private void doTestGetRegionByName(String fingerPrintName, String degradation) { final RegionDigraph current = digraph; final Region[] regions = current.getRegions().toArray(new Region[0]); PerformanceTestRunner runner = new PerformanceTestRunner() { protected void test() { for (Region region : regions) { current.getRegion(region.getName()); } } }; runner.setRegressionReason(degradation); runner.run(this, fingerPrintName, 10, 2000); } private void createRegions(final int numRegions) throws BundleException { System.out.println("Starting region create: " + numRegions); long time = System.currentTimeMillis(); Region system = digraph.getRegion(0); RegionFilterBuilder builder = digraph.createRegionFilterBuilder(); builder.allowAll(RegionFilter.VISIBLE_BUNDLE_NAMESPACE); builder.allowAll(RegionFilter.VISIBLE_HOST_NAMESPACE); builder.allowAll(RegionFilter.VISIBLE_PACKAGE_NAMESPACE); builder.allowAll(RegionFilter.VISIBLE_REQUIRE_NAMESPACE); builder.allowAll(RegionFilter.VISIBLE_SERVICE_NAMESPACE); RegionFilter filter = builder.build(); for (int i = 0; i < numRegions; i++) { Region r = digraph.createRegion(getName() + i); digraph.connect(system, filter, r); } System.out.println("Done creating region: " + (System.currentTimeMillis() - time)); } }