/**
 * 
 */
package net.onrc.onos.util;

import static org.junit.Assert.*;

import java.util.Iterator;

import junit.framework.Assert;

import net.floodlightcontroller.core.INetMapTopologyObjects.ISwitchObject;
import net.floodlightcontroller.core.ISwitchStorage.SwitchState;
import net.floodlightcontroller.core.internal.TestDatabaseManager;
import net.onrc.onos.util.GraphDBConnection.Transaction;

import org.easymock.EasyMock;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.easymock.PowerMock;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

import com.thinkaurelius.titan.core.TitanFactory;
import com.thinkaurelius.titan.core.TitanGraph;
import com.tinkerpop.blueprints.Vertex;

/**
 * @author Toshio Koide
 *
 */
@RunWith(PowerMockRunner.class)
@PrepareForTest({TitanFactory.class})
public class GraphDBOperationTest {
	private static TitanGraph testdb;
	private static GraphDBConnection conn;
	private static GraphDBOperation op;

	/**
	 * @throws java.lang.Exception
	 */
	@BeforeClass
	public static void setUpBeforeClass() throws Exception {
	}

	/**
	 * @throws java.lang.Exception
	 */
	@AfterClass
	public static void tearDownAfterClass() throws Exception {
	}

	/**
	 * @throws java.lang.Exception
	 */
	@Before
	public void setUp() throws Exception {
		TestDatabaseManager.deleteTestDatabase();
		testdb = TestDatabaseManager.getTestDatabase();
//		TestDatabaseManager.populateTestData(titanGraph);
		
		// replace return value of TitanFactory.open() to dummy DB created above
		PowerMock.mockStatic(TitanFactory.class);
		EasyMock.expect(TitanFactory.open((String)EasyMock.anyObject())).andReturn(testdb);
		PowerMock.replay(TitanFactory.class);
		
		conn = GraphDBConnection.getInstance("/dummy/to/conf");
		op = new GraphDBOperation(conn);
	}

	/**
	 * @throws java.lang.Exception
	 */
	@After
	public void tearDown() throws Exception {
		conn.close();
		testdb.shutdown();
	}

	private Iterator<Vertex> enumerateVertices(String vertexType) {
		return testdb.getVertices("type", vertexType).iterator();
	}
	
	/**
	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#newSwitch(net.onrc.onos.util.GraphDBConnection)}.
	 */
	@Test
	public final void testNewSwitch() {
		Iterator<Vertex> vertices;
		assertFalse(enumerateVertices("switch").hasNext());

		ISwitchObject sw = op.newSwitch("123");
		
		assertEquals("123", sw.getDPID());
		op.commit();

		vertices = enumerateVertices("switch");
		assertTrue(vertices.hasNext());
		assertEquals(vertices.next().getProperty("dpid").toString(), "123");		
	}

	/**
	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#searchSwitch(net.onrc.onos.util.GraphDBConnection, java.lang.String)}.
	 */
	@Test
	public final void testSearchSwitch() {
		ISwitchObject sw = op.newSwitch("123");
		op.commit();
		
		sw = op.searchSwitch("123");
		
		assertNotNull(sw);
		assertEquals("123", sw.getDPID());
	}

	/**
	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#searchActiveSwitch(net.onrc.onos.util.GraphDBConnection, java.lang.String)}.
	 */
	@Test
	public final void testSearchActiveSwitch() {
		ISwitchObject sw = op.newSwitch("111");
		sw.setState(SwitchState.ACTIVE.toString());
		sw = op.newSwitch("222");
		sw.setState(SwitchState.INACTIVE.toString());
		op.commit();
		
		sw = op.searchActiveSwitch("111");
		assertNotNull(sw);
		assertEquals("111", sw.getDPID());
		
		sw = op.searchActiveSwitch("222");
		assertNull(sw);	
	}

	/**
	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#getActiveSwitches(net.onrc.onos.util.GraphDBConnection)}.
	 */
	@Test
	public final void testGetActiveSwitches() {
		ISwitchObject sw = op.newSwitch("111");
		sw.setState(SwitchState.ACTIVE.toString());
		sw = op.newSwitch("222");
		sw.setState(SwitchState.INACTIVE.toString());
		op.commit();
		
		Iterator<ISwitchObject> i = op.getActiveSwitches().iterator();
		assertTrue(i.hasNext());
		assertEquals("111", i.next().getDPID());
		assertFalse(i.hasNext());		
	}

	/**
	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#removeSwitch(net.onrc.onos.util.GraphDBConnection, net.floodlightcontroller.core.INetMapTopologyObjects.ISwitchObject)}.
	 */
	@Test
	public final void testRemoveSwitch() {
		ISwitchObject sw = op.newSwitch("123");
		op.commit();	
		sw = op.searchSwitch("123");
		
		op.removeSwitch(sw);

		assertFalse(enumerateVertices("switch").hasNext());
	}

	/**
	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#searchDevice(net.onrc.onos.util.GraphDBConnection, java.lang.String)}.
	 */
	@Test
	public final void testSearchDevice() {
		fail("Not yet implemented");
	}

	/**
	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#searchPort(net.onrc.onos.util.GraphDBConnection, java.lang.String, short)}.
	 */
	@Test
	public final void testSearchPort() {
		fail("Not yet implemented");
	}

	/**
	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#newPort(net.onrc.onos.util.GraphDBConnection)}.
	 */
	@Test
	public final void testNewPort() {
		fail("Not yet implemented");
	}

	/**
	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#newDevice(net.onrc.onos.util.GraphDBConnection)}.
	 */
	@Test
	public final void testNewDevice() {
		fail("Not yet implemented");
	}

	/**
	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#removePort(net.onrc.onos.util.GraphDBConnection, net.floodlightcontroller.core.INetMapTopologyObjects.IPortObject)}.
	 */
	@Test
	public final void testRemovePort() {
		fail("Not yet implemented");
	}

	/**
	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#removeDevice(net.onrc.onos.util.GraphDBConnection, net.floodlightcontroller.core.INetMapTopologyObjects.IDeviceObject)}.
	 */
	@Test
	public final void testRemoveDevice() {
		fail("Not yet implemented");
	}

	/**
	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#getDevices(net.onrc.onos.util.GraphDBConnection)}.
	 */
	@Test
	public final void testGetDevices() {
		fail("Not yet implemented");
	}

	/**
	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#searchFlowPath(net.onrc.onos.util.GraphDBConnection, net.floodlightcontroller.util.FlowId)}.
	 */
	@Test
	public final void testSearchFlowPath() {
		fail("Not yet implemented");
	}

	/**
	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#newFlowPath(net.onrc.onos.util.GraphDBConnection)}.
	 */
	@Test
	public final void testNewFlowPath() {
		fail("Not yet implemented");
	}

	/**
	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#removeFlowPath(net.onrc.onos.util.GraphDBConnection, net.floodlightcontroller.core.INetMapTopologyObjects.IFlowPath)}.
	 */
	@Test
	public final void testRemoveFlowPath() {
		fail("Not yet implemented");
	}

	/**
	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#getFlowPathByFlowEntry(net.onrc.onos.util.GraphDBConnection, net.floodlightcontroller.core.INetMapTopologyObjects.IFlowEntry)}.
	 */
	@Test
	public final void testGetFlowPathByFlowEntry() {
		fail("Not yet implemented");
	}

	/**
	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#getAllFlowPaths(net.onrc.onos.util.GraphDBConnection)}.
	 */
	@Test
	public final void testGetAllFlowPaths() {
		fail("Not yet implemented");
	}

	/**
	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#searchFlowEntry(net.onrc.onos.util.GraphDBConnection, net.floodlightcontroller.util.FlowEntryId)}.
	 */
	@Test
	public final void testSearchFlowEntry() {
		fail("Not yet implemented");
	}

	/**
	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#newFlowEntry(net.onrc.onos.util.GraphDBConnection)}.
	 */
	@Test
	public final void testNewFlowEntry() {
		fail("Not yet implemented");
	}

	/**
	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#removeFlowEntry(net.onrc.onos.util.GraphDBConnection, net.floodlightcontroller.core.INetMapTopologyObjects.IFlowEntry)}.
	 */
	@Test
	public final void testRemoveFlowEntry() {
		fail("Not yet implemented");
	}

	/**
	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#getAllFlowEntries(net.onrc.onos.util.GraphDBConnection)}.
	 */
	@Test
	public final void testGetAllFlowEntries() {
		fail("Not yet implemented");
	}

	/**
	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#getAllSwitchNotUpdatedFlowEntries(net.onrc.onos.util.GraphDBConnection)}.
	 */
	@Test
	public final void testGetAllSwitchNotUpdatedFlowEntries() {
		fail("Not yet implemented");
	}

	/**
	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#getAllSwitches(net.onrc.onos.util.GraphDBConnection)}.
	 */
	@Test
	public final void testGetAllSwitches() {
		fail("Not yet implemented");
	}

	/**
	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#getInactiveSwitches(net.onrc.onos.util.GraphDBConnection)}.
	 */
	@Test
	public final void testGetInactiveSwitches() {
		fail("Not yet implemented");
	}

}
