/*******************************************************************************
 * Copyright (c) 2010, 2012 Oracle.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * and Apache License v2.0 which accompanies this distribution. 
 * The Eclipse Public License is available at
 *     http://www.eclipse.org/legal/epl-v10.html
 * and the Apache License v2.0 is available at 
 *     http://www.opensource.org/licenses/apache2.0.php.
 * You may elect to redistribute this code under either of these licenses.
 *
 * Contributors:
 *     Bob Nettleton (Oracle) - Initial Reference Implementation Unit Tests
 ******************************************************************************/

package org.eclipse.gemini.naming;

import junit.framework.TestCase;

public class OSGiURLParserTestCase extends TestCase {

	public void testCreate() throws Exception {
		new OSGiURLParser("osgi:service/com.oracle.TestService");
	}
	
	public void testBasicParse() throws Exception {
		OSGiURLParser urlParser = new OSGiURLParser("osgi:service/com.oracle.TestService");
		// should return without exception
		urlParser.parse();
		// verify correct information was parsed
		assertEquals("Parser did not correctly return service interface",
				     "com.oracle.TestService", urlParser.getServiceInterface());
		assertNull("Parser did not correctly return a null filter", urlParser.getFilter());
		assertFalse("Parser did not correctly parse URL, no filter present",
				    urlParser.hasFilter());
		assertFalse("Parser did not correctly interpret URL, no servicelist",
				    urlParser.isServiceListURL());

		
		OSGiURLParser urlParserServiceList = 
			new OSGiURLParser("osgi:servicelist/com.oracle.AnotherTestService");
		// should return without exception
		urlParserServiceList.parse();
		// verify correct information was parsed
		assertEquals("Parser did not correctly return service interface",
			     "com.oracle.AnotherTestService", urlParserServiceList.getServiceInterface());
		assertNull("Parser did not correctly return a null filter", urlParserServiceList.getFilter());
		assertFalse("Parser did not correctly parse URL, no filter present",
			    urlParserServiceList.hasFilter());
		assertTrue("Parser did not correctly interpret URL, servicelist",
			    urlParserServiceList.isServiceListURL());


		OSGiURLParser urlParserJndiName = 
			new OSGiURLParser("osgi:service/another/TestService");
		// should return without exception
		urlParserJndiName.parse();
		// verify correct information was parsed
		assertEquals("Parser did not correctly return service interface",
			     "another/TestService", urlParserJndiName.getServiceInterface());
		assertNull("Parser did not correctly return a null filter", urlParserJndiName.getFilter());
		assertFalse("Parser did not correctly parse URL, no filter present",
			    urlParserJndiName.hasFilter());
		assertFalse("Parser did not correctly interpret URL, servicelist",
			    urlParserJndiName.isServiceListURL());
	}
	
	public void testParseFilter() throws Exception {
		OSGiURLParser urlParser = new OSGiURLParser("osgi:service/com.oracle.TestService/(testFilter)");
		// should return without exception
		urlParser.parse();
		// verify correct information was parsed
		assertEquals("Parser did not correctly return service interface",
				     "com.oracle.TestService", urlParser.getServiceInterface());
		assertTrue("Parser did not correctly parse URL, filter present",
				    urlParser.hasFilter());
		assertEquals("Parser did not correctly return the expected filter", 
				     "(testFilter)", urlParser.getFilter());
		assertFalse("Parser did not correctly interpret URL, no servicelist",
				    urlParser.isServiceListURL());


		OSGiURLParser urlParserJndiName = new OSGiURLParser("osgi:service/another/TestService/(testFilter)");
		// should return without exception
		urlParserJndiName.parse();
		// verify correct information was parsed
		assertEquals("Parser did not correctly return service interface",
				     "another/TestService", urlParserJndiName.getServiceInterface());
		assertTrue("Parser did not correctly parse URL, filter present",
				    urlParserJndiName.hasFilter());
		assertEquals("Parser did not correctly return the expected filter", 
				     "(testFilter)", urlParserJndiName.getFilter());
		assertFalse("Parser did not correctly interpret URL, no servicelist",
				    urlParserJndiName.isServiceListURL());
	}
	
	public void testParseError() throws Exception {
		// "testURL" is not a supported URL
		OSGiURLParser urlParser = new OSGiURLParser("testURL:com.oracle.TestService");
		try {
			urlParser.parse();
			fail("IllegalStateException should have been thrown");
		} catch (IllegalStateException exception) {
			// expected Exception
		}
		
		// zero-length service interface is an error
		OSGiURLParser urlParser2 = new OSGiURLParser("osgi:service//testFilter");
		try {
			urlParser2.parse();
			fail("IllegalStateException should have been thrown");
		} catch (IllegalStateException exception) {
			// expected Exception
		}
	}
	
	public void testPreParseErrorChecks() throws Exception {
		OSGiURLParser urlParser = new OSGiURLParser("osgi:service/com.oracle.TestService");
		// verify that all accessor methods throw an IllegalStateException
		// prior to the parse() method being called
		try {
			urlParser.getServiceInterface();
			fail("IllegalStateException should have been thrown");
		} catch (IllegalStateException exception) {
			// expected Exception
		}
		
		try {
			urlParser.getFilter();
			fail("IllegalStateException should have been thrown");
		} catch (IllegalStateException exception) {
			// expected Exception
		}
		
		try {
			urlParser.hasFilter();
			fail("IllegalStateException should have been thrown");
		} catch (IllegalStateException exception) {
			// expected Exception
		}
		
		try {
			urlParser.isServiceListURL();
			fail("IllegalStateException should have been thrown");
		} catch (IllegalStateException exception) {
			// expected Exception
		}
	}
	
}
