package net.onrc.onos.core.intent;

import static org.junit.Assert.assertEquals;
import net.onrc.onos.core.intent.ConstrainedShortestPathIntent;
import net.onrc.onos.core.intent.Intent;
import net.onrc.onos.core.intent.IntentOperation;
import net.onrc.onos.core.intent.IntentOperationList;
import net.onrc.onos.core.intent.PathIntent;
import net.onrc.onos.core.topology.LinkEvent;
import net.onrc.onos.core.topology.Path;
import net.onrc.onos.core.util.serializers.KryoFactory;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.esotericsoftware.kryo.Kryo;
import com.esotericsoftware.kryo.io.Input;
import com.esotericsoftware.kryo.io.Output;

/**
 * @author Toshio Koide (t-koide@onlab.us)
 */
public class IntentOperationListTest {

	@Before
	public void setUp() throws Exception {
	}

	@After
	public void tearDown() throws Exception {
	}

	@Test
	public void test() {
		IntentOperationList opList = new IntentOperationList();

		ConstrainedShortestPathIntent cspIntent1 =
				new ConstrainedShortestPathIntent("1", 2L, 3L, 4L, 5L, 6L, 7L, 1000.0);

		Path path = new Path();
		path.add(new LinkEvent(1L, 2L, 3L, 4L));
		path.add(new LinkEvent(5L, 6L, 7L, 8L));
		path.add(new LinkEvent(9L, 0L, 1L, 2L));

		PathIntent pathIntent1 = new PathIntent("11", path, 123.45, cspIntent1);
		opList.add(IntentOperation.Operator.ADD, pathIntent1);
		opList.add(IntentOperation.Operator.REMOVE, new Intent("22"));

		KryoFactory factory = new KryoFactory();
		Kryo kryo = factory.newKryo();
		Output output = new Output(1024);
		kryo.writeObject(output, opList);
		output.close();

		byte[] bytes = output.toBytes();

		Input input = new Input(bytes);
		IntentOperationList rcvOpList = kryo.readObject(input, IntentOperationList.class);

		assertEquals(2, rcvOpList.size());

		IntentOperation op1 = rcvOpList.get(0);
		IntentOperation op2 = rcvOpList.get(1);

		assertEquals(IntentOperation.Operator.ADD, op1.operator);
		PathIntent intent1 = (PathIntent) op1.intent;
		assertEquals("11", intent1.getId());
		assertEquals(3, intent1.getPath().size());

		assertEquals(IntentOperation.Operator.REMOVE, op2.operator);
		Intent intent2 = op2.intent;
		assertEquals("22", intent2.getId());
	}
}
