/*******************************************************************************
 * Copyright (c) 2013 SAP AG
 * 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:
 *   SAP AG - initial contribution
 *******************************************************************************/

package org.eclipse.virgo.web.enterprise.javax.persistence.extension;

import java.io.File;
import java.io.PrintWriter;
import java.util.List;

import javax.persistence.spi.PersistenceProvider;

import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

public class DefaultPersistenceProviderResolverTest {
		
	@Before
	public void prepare() throws Exception {
		clean();
	}
	
	@Test
	public void testGetPersistenceProvidersPositive() throws Exception {
		prepareServicesFile(new String[] {"org.eclipse.virgo.web.enterprise.javax.persistence.extension.TestPersistenceProvider"});
		DefaultPersistenceProviderResolver resolver = new DefaultPersistenceProviderResolver();
		List<PersistenceProvider> persistenceProviders = resolver.getPersistenceProviders();
		Assert.assertEquals("Found Persistence Providers are not the correct number", 1, persistenceProviders.size());
		Assert.assertEquals("Provider not Test Persistence Provider", persistenceProviders.get(0).getClass(),  TestPersistenceProvider.class);
	}
	
	@Test
	public void testGetPersistenceProvidersNoPersistenceProviderDefined() {
		DefaultPersistenceProviderResolver resolver = new DefaultPersistenceProviderResolver();
		List<PersistenceProvider> persistenceProviders = resolver.getPersistenceProviders();
		Assert.assertEquals("No Persistence Providers should be found", 0, persistenceProviders.size());
	}
	
	@Test
	public void testGetPersistenceProvidersNonexistentPersistenceProviderDefined() throws Exception {
		prepareServicesFile(new String[] {"com.sap.core.non.existent.PersistenceProvider"});
		DefaultPersistenceProviderResolver resolver = new DefaultPersistenceProviderResolver();
		List<PersistenceProvider> persistenceProviders = resolver.getPersistenceProviders();
		Assert.assertEquals("No Persistence Providers should be found", 0, persistenceProviders.size());
	}
	
	private void prepareServicesFile(String[] persistenceProviderNames) throws Exception {
		new File("./build/classes/test/META-INF").mkdir();
		File servicesDir = new File("./build/classes/test/META-INF/services");
		servicesDir.mkdir();
		
		File persistenceProviderFile = new File("./build/classes/test//META-INF/services/javax.persistence.spi.PersistenceProvider");
		
		PrintWriter writer = null; 
		try {
			writer = new PrintWriter(persistenceProviderFile);
			for(String persistenceProviderName : persistenceProviderNames) {
				writer.println(persistenceProviderName);
			}
			writer.flush();
		} finally {
			if (writer != null) {
				try {
					writer.close();
				} catch (Exception e) {
					// nothing
				}
			}
			
		}	
	}
	
	@After
	public void clean() {
		File persistenceProviderFile = new File("./build/classes/test/META-INF/services/javax.persistence.spi.PersistenceProvider");
		if (persistenceProviderFile.exists()) {
			persistenceProviderFile.delete();
		}
		
		File servicesDir = new File("./build/classes/test/META-INF/services");
		if (servicesDir.exists()) {
			servicesDir.delete();
		}
		
		File metaInfDir = new File("./build/classes/test/META-INF");
		if (metaInfDir.exists()) {
			metaInfDir.delete();
		}
	}
}
