private <T> boolean listenForServiceType(
      final ServiceReference serviceReference,
      final int eventType,
      final Class<T> claz,
      final OSGIServiceRegistration<T> registration) {
    // Make sure we can retrieve the plugin name
    final String serviceName =
        (String) serviceReference.getProperty(OSGIPluginProperties.PLUGIN_NAME_PROP);
    if (serviceName == null || !checkSanityPluginRegistrationName(serviceName)) {
      // Quite common for non Killbill bundles
      logger.debug(
          "Ignoring registered OSGI service {} with no {} property",
          claz.getName(),
          OSGIPluginProperties.PLUGIN_NAME_PROP);
      return true;
    }

    final Object theServiceObject = context.getService(serviceReference);
    // Is that for us? We look for a subclass here for greater flexibility (e.g. HttpServlet for a
    // Servlet service)
    if (theServiceObject == null || !claz.isAssignableFrom(theServiceObject.getClass())) {
      return false;
    }
    final T theService = (T) theServiceObject;

    final OSGIServiceDescriptor desc =
        new DefaultOSGIServiceDescriptor(
            serviceReference.getBundle().getSymbolicName(),
            bundleRegistry.getPluginName(serviceReference.getBundle()),
            serviceName);
    switch (eventType) {
      case ServiceEvent.REGISTERED:
        final T wrappedService =
            ContextClassLoaderHelper.getWrappedServiceWithCorrectContextClassLoader(
                theService, registration.getServiceType(), serviceName, metricsRegistry);
        registration.registerService(desc, wrappedService);
        bundleRegistry.registerService(desc, registration.getServiceType().getName());
        break;
      case ServiceEvent.UNREGISTERING:
        registration.unregisterService(desc.getRegistrationName());
        bundleRegistry.unregisterService(desc, registration.getServiceType().getName());
        break;
      default:
        break;
    }
    return true;
  }
  @BeforeClass(groups = "slow")
  public void beforeClass() throws Exception {
    super.beforeClass();

    this.testInvoicePluginApi = new TestInvoicePluginApi();
    pluginRegistry.registerService(
        new OSGIServiceDescriptor() {
          @Override
          public String getPluginSymbolicName() {
            return "TaxInvoicePluginApi";
          }

          @Override
          public String getRegistrationName() {
            return "TaxInvoicePluginApi";
          }
        },
        testInvoicePluginApi);
  }
  @BeforeMethod(groups = "fast")
  public void beforeMethod() throws Exception {

    super.beforeMethod();

    account = testHelper.createTestAccount("*****@*****.**", true);

    paymentOptions =
        new PaymentOptions() {
          @Override
          public boolean isExternalPayment() {
            return false;
          }

          @Override
          public List<String> getPaymentControlPluginNames() {
            return ImmutableList.of(
                TestPaymentGatewayApiControlPlugin.PLUGIN_NAME,
                TestPaymentGatewayApiValidationPlugin.VALIDATION_PLUGIN_NAME);
          }
        };

    plugin = new TestPaymentGatewayApiControlPlugin();

    controlPluginRegistry.registerService(
        new OSGIServiceDescriptor() {
          @Override
          public String getPluginSymbolicName() {
            return null;
          }

          @Override
          public String getPluginName() {
            return TestPaymentGatewayApiControlPlugin.PLUGIN_NAME;
          }

          @Override
          public String getRegistrationName() {
            return TestPaymentGatewayApiControlPlugin.PLUGIN_NAME;
          }
        },
        plugin);

    validationPlugin = new TestPaymentGatewayApiValidationPlugin();
    controlPluginRegistry.registerService(
        new OSGIServiceDescriptor() {
          @Override
          public String getPluginSymbolicName() {
            return null;
          }

          @Override
          public String getPluginName() {
            return TestPaymentGatewayApiValidationPlugin.VALIDATION_PLUGIN_NAME;
          }

          @Override
          public String getRegistrationName() {
            return TestPaymentGatewayApiValidationPlugin.VALIDATION_PLUGIN_NAME;
          }
        },
        validationPlugin);
  }