Package org.example.tests.osgi

Source Code of org.example.tests.osgi.TestOSGiServices

package org.example.tests.osgi;

import static org.example.tests.utils.Utils.copyToTempFile;
import static org.example.tests.utils.Utils.createTempDir;
import static org.example.tests.utils.Utils.deleteWithException;
import static org.example.tests.utils.Utils.readStream;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;

import java.io.File;
import java.io.StringWriter;
import java.util.Collections;
import java.util.Dictionary;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import junit.framework.TestCase;

import org.example.tests.utils.WibbleAnalyzer;
import org.mockito.ArgumentCaptor;
import org.osgi.framework.BundleContext;
import org.osgi.framework.FrameworkUtil;
import org.osgi.framework.ServiceReference;
import org.osgi.framework.ServiceRegistration;
import org.osgi.service.indexer.Capability;
import org.osgi.service.indexer.Requirement;
import org.osgi.service.indexer.Resource;
import org.osgi.service.indexer.ResourceAnalyzer;
import org.osgi.service.indexer.ResourceIndexer;
import org.osgi.service.log.LogService;

public class TestOSGiServices extends TestCase {

  private final BundleContext context = FrameworkUtil.getBundle(this.getClass()).getBundleContext();

  private File tempDir;

  @Override
  protected void setUp() throws Exception {
    tempDir = createTempDir();
  }

  @Override
  protected void tearDown() throws Exception {
    deleteWithException(tempDir);
  }

  public void testBasicServiceInvocation() throws Exception {
    ServiceReference ref = context.getServiceReference(ResourceIndexer.class.getName());
    ResourceIndexer indexer = (ResourceIndexer) context.getService(ref);

    StringWriter writer = new StringWriter();

    Map<String, String> config = new HashMap<String, String>();
    config.put(ResourceIndexer.ROOT_URL, tempDir.getAbsoluteFile().toURI().toString());
    indexer.indexFragment(Collections.singleton(copyToTempFile(tempDir, "testdata/01-bsn+version.jar")), writer, config);

    assertEquals(readStream(TestOSGiServices.class.getResourceAsStream("/testdata/fragment-basic.txt")), writer.toString().trim());

    context.ungetService(ref);
  }

  // Test whiteboard registration of Resource Analyzers.
  public void testWhiteboardAnalyzer() throws Exception {
    ServiceRegistration reg = context.registerService(ResourceAnalyzer.class.getName(), new WibbleAnalyzer(), null);

    ServiceReference ref = context.getServiceReference(ResourceIndexer.class.getName());
    ResourceIndexer indexer = (ResourceIndexer) context.getService(ref);
    StringWriter writer = new StringWriter();

    Map<String, String> config = new HashMap<String, String>();
    config.put(ResourceIndexer.ROOT_URL, tempDir.getAbsoluteFile().toURI().toString());
    indexer.indexFragment(Collections.singleton(copyToTempFile(tempDir, "testdata/01-bsn+version.jar")), writer, config);

    assertEquals(readStream(TestOSGiServices.class.getResourceAsStream("/testdata/fragment-wibble.txt")), writer.toString().trim());

    context.ungetService(ref);
    reg.unregister();
  }

  // Test whiteboard registration of Resource Analyzers, with resource filter
  // property.
  public void testWhiteboardAnalyzerWithFilter() throws Exception {
    Dictionary<String, Object> analyzerProps = new Hashtable<String, Object>();
    analyzerProps.put(ResourceAnalyzer.FILTER, "(location=*sion.jar)");
    ServiceRegistration reg = context.registerService(ResourceAnalyzer.class.getName(), new WibbleAnalyzer(), analyzerProps);

    ServiceReference ref = context.getServiceReference(ResourceIndexer.class.getName());
    ResourceIndexer indexer = (ResourceIndexer) context.getService(ref);
    StringWriter writer = new StringWriter();

    Set<File> files = new LinkedHashSet<File>();
    files.add(copyToTempFile(tempDir, "testdata/01-bsn+version.jar"));
    files.add(copyToTempFile(tempDir, "testdata/02-localization.jar"));

    Map<String, String> config = new HashMap<String, String>();
    config.put(ResourceIndexer.ROOT_URL, tempDir.getAbsoluteFile().toURI().toString());
    indexer.indexFragment(files, writer, config);

    assertEquals(readStream(TestOSGiServices.class.getResourceAsStream("/testdata/fragment-wibble-filtered.txt")), writer.toString().trim());

    context.ungetService(ref);
    reg.unregister();
  }

  // Test that exceptions thrown by analyzers are forwarded to the OSGi Log
  // Service
  public void testLogNotification() throws Exception {
    // Register mock LogService, to receive notifications
    LogService mockLog = mock(LogService.class);
    ServiceRegistration mockLogReg = context.registerService(LogService.class.getName(), mockLog, null);

    // Register a broken analyzer that throws exceptions
    ResourceAnalyzer brokenAnalyzer = new ResourceAnalyzer() {
      public void analyzeResource(Resource resource, List<Capability> capabilities, List<Requirement> requirements) throws Exception {
        throw new Exception("Bang!");
      }
    };
    ServiceRegistration mockAnalyzerReg = context.registerService(ResourceAnalyzer.class.getName(), brokenAnalyzer, null);

    // Call the indexer
    ServiceReference ref = context.getServiceReference(ResourceIndexer.class.getName());
    ResourceIndexer indexer = (ResourceIndexer) context.getService(ref);
    StringWriter writer = new StringWriter();
    Set<File> files = Collections.singleton(copyToTempFile(tempDir, "testdata/01-bsn+version.jar"));
    Map<String, String> config = new HashMap<String, String>();
    config.put(ResourceIndexer.ROOT_URL, tempDir.getAbsoluteFile().toURI().toString());
    indexer.indexFragment(files, writer, config);

    // Verify log output
    ArgumentCaptor<Exception> exceptionCaptor = ArgumentCaptor.forClass(Exception.class);
    verify(mockLog).log(any(ServiceReference.class), eq(LogService.LOG_ERROR), anyString(), exceptionCaptor.capture());
    assertEquals("Bang!", exceptionCaptor.getValue().getMessage());

    mockAnalyzerReg.unregister();
    mockLogReg.unregister();
  }

}
TOP

Related Classes of org.example.tests.osgi.TestOSGiServices

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.