package eu.dnetlib.enabling.tools.registration;

import static org.junit.Assert.*; // NOPMD

import javax.annotation.Resource;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import eu.dnetlib.enabling.is.registry.rmi.ISRegistryException;
import eu.dnetlib.enabling.is.registry.rmi.ISRegistryService;
import eu.dnetlib.enabling.tools.OpaqueResource;
import eu.dnetlib.enabling.tools.ServiceLocator;
import eu.dnetlib.test.AbstractIntegrationContainerTest;
import eu.dnetlib.test.SpringContextSharer;

/**
 * service profile registration manager test.
 * 
 * @author marko
 * 
 */
@RunWith(SpringJUnit4ClassRunner.class)
public class ServiceRegistrationManagerTest extends AbstractIntegrationContainerTest {
	
	/**
	 * wait = time step * TIMES.
	 */
	private static final int TIMES = 600;
	
	/**
	 * wait timestep.
	 */
	private static final int TIMESTEP = 100;

	/**
	 * logger.
	 */
	private static final Log log = LogFactory.getLog(ServiceRegistrationManagerTest.class); // NOPMD

	/**
	 * registration manager.
	 */
	private transient ServiceRegistrationManagerImpl manager;

	/**
	 * registry service locator.
	 */
	@Resource(name = "registryLocator")
	private transient ServiceLocator<ISRegistryService> registryLocator;

	/**
	 * common setup.
	 */
	@Before
	public void setUp() {
		log.debug("setting up a child context");

		final ApplicationContext context = new ClassPathXmlApplicationContext(
				new String[] { "eu/dnetlib/enabling/tools/registration/ServiceRegistrationManagerTest-context.xml" }, SpringContextSharer.getGlobalContext());
		manager = (ServiceRegistrationManagerImpl) context.getBean("serviceRegistrationManager", ServiceRegistrationManagerImpl.class);
	}

	/**
	 * registration manager.
	 * 
	 * @throws InterruptedException shouldn't happen
	 * @throws ISRegistryException shouldn't happen
	 */
	@Test
	public void testRegistrationManager() throws InterruptedException, ISRegistryException {
		
		for (int i = 0; i < TIMES; i++) {
			Thread.sleep(TIMESTEP);
			if (manager.getProfileId() != null)
				break;
		}

		// registryLocator.getService().validateProfile(manager.getServiceProfile().getResourceId());

		for (int i = 0; i < TIMES; i++) {
			Thread.sleep(TIMESTEP);
			if (manager.getState() == ServiceRegistrationManagerImpl.State.REGISTERED)
				break;
		}

		final OpaqueResource res = manager.getServiceProfile();
				
		assertNotNull("check successfull registration", res);
		assertEquals("check correct state", ServiceRegistrationManagerImpl.State.REGISTERED, manager.getState());
		assertEquals("checking successful validation", "ServiceResources", res.getResourceKind());
		
		registryLocator.getService().deleteProfile(res.getResourceId());
	}
}
