package test.serviceloader;

import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;

import org.testng.Assert;
import org.testng.TestNG;
import org.testng.annotations.Test;

import test.SimpleBaseTest;
import test.listeners.ListenerAssert;

public class ServiceLoaderTest extends SimpleBaseTest {

  @Test
  public void serviceLoaderShouldWork() throws MalformedURLException {
    TestNG tng = create(ServiceLoaderSampleTest.class);
    URL url = getClass().getClassLoader().getResource("serviceloader.jar");
    URLClassLoader ucl = URLClassLoader.newInstance(new URL[] { url });
    tng.setServiceLoaderClassLoader(ucl);
    tng.run();

    ListenerAssert.assertListenerType(tng.getServiceLoaderListeners(), TmpSuiteListener.class);
  }

  @Test
  public void serviceLoaderWithNoClassLoader() {
    //Here ServiceLoader is expected to rely on the current context class loader to load the service loader file
    //Since serviceloader.jar doesn't seem to be visible to the current thread's contextual class loader
    //resorting to pushing in a class loader into the current thread that can load the resource
    URL url = getClass().getClassLoader().getResource("serviceloader.jar");
    URLClassLoader ucl = URLClassLoader.newInstance(new URL[] { url });
    Thread.currentThread().setContextClassLoader(ucl);
    TestNG tng = create(ServiceLoaderSampleTest.class);
    tng.run();

    ListenerAssert.assertListenerType(tng.getServiceLoaderListeners(), TmpSuiteListener.class);
  }

  @Test(description = "GITHUB-491")
  public void serviceLoaderShouldWorkWithConfigurationListener() {
    TestNG tng = create(ServiceLoaderSampleTest.class);
    tng.run();

    Assert.assertEquals(2, tng.getServiceLoaderListeners().size());
    ListenerAssert.assertListenerType(tng.getServiceLoaderListeners(), MyConfigurationListener.class);
  }
}
