package com.vmware.vcloud.nclient;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.TimeZone;
import java.util.Date;
import com.rabbitmq.client.AMQP.BasicProperties;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.MessageProperties;
import org.codehaus.jackson.JsonEncoding;
import org.codehaus.jackson.JsonFactory;
import org.codehaus.jackson.JsonGenerator;
import org.testng.annotations.Test;
import static com.vmware.vcloud.nclient.NotificationMessage.JSON_CONTENT_TYPE;
import static com.vmware.vcloud.nclient.NotificationMessage.XML_CONTENT_TYPE;
import static org.testng.Assert.assertEquals;
@Test(groups = {"unit"})
public class NotificationMessageTest {
public static final String KEY_ID = "eventId";
public static final String KEY_TYPE = "type";
public static final String KEY_STATUS = "operationSuccess";
public static final String KEY_TIMESTAMP = "timestamp";
public static final String KEY_ENTITY = "entity";
public static final String KEY_USER = "user";
public static final String KEY_ORG = "org";
public static final String KEY_TASK = "task";
public static final String KEY_TASK_OWNER = "taskOwner";
@Test
public void testXmlParsing() throws Exception {
String payload = getXmlPayload();
NotificationMessage msg = NotificationMessage.createFromPayloadAndHeaders(payload, null);
assertEquals(msg.getType(), "com/vmware/vcloud/event/blockingtask/create");
assertEquals(msg.getEntityType(), "blockingTask");
assertEquals(msg.getEntityName(), "vappUpdateVm");
assertEquals(msg.getEntityHref(), "https://10.23.6.35/api/entity/urn:vcloud:blockingTask:41aaf964-7452-42e6-9b8d-772e5f8421d8");
assertEquals(msg.getOrgName(), "Default");
assertEquals(msg.getUserName(), "vcloud");
Calendar cal = Calendar.getInstance();
cal.set(2011, 5, 10, 10, 4, 49);
cal.set(Calendar.MILLISECOND, 47);
cal.setTimeZone(TimeZone.getTimeZone("GMT+1"));
assertEquals(msg.getTimestamp(), cal.getTime());
}
@Test
public void testJsonParsing() throws Exception {
String payload = getJsonPayload();
NotificationMessage msg = NotificationMessage.createFromPayloadAndHeaders(payload, null);
assertEquals(msg.getType(), "com/vmware/foobar");
assertEquals(msg.getEntityType(), "blockingTask");
assertEquals(msg.getEntityName(), "");
assertEquals(msg.getEntityHref(), "");
assertEquals(msg.getOrgName(), "");
assertEquals(msg.getUserName(), "");
Calendar cal = Calendar.getInstance();
cal.set(2012, 9, 8, 16, 23, 8);
cal.set(Calendar.MILLISECOND, 842);
assertEquals(msg.getTimestamp(), cal.getTime());
}
@Test(enabled=false)
public void createJsonNotification() throws IOException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
JsonFactory jsonFactory = new JsonFactory();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
JsonGenerator jg = jsonFactory.createJsonGenerator(baos, JsonEncoding.UTF8);
jg.writeStartObject();
jg.writeStringField(KEY_ID, "1234567");
jg.writeStringField(KEY_TYPE, "com/vmware/fira");
jg.writeBooleanField(KEY_STATUS, true);
String timestamp = sdf.format(new Date());
jg.writeStringField(KEY_TIMESTAMP, timestamp);
jg.writeStringField(KEY_USER, "urn:vcloud:user:74a39795-2307-4667-ba2a-2eddc7e52325");
jg.writeStringField(KEY_ORG, "urn:vcloud:org:251ae0f6-9780-429d-a8cf-9495c036eef2");
jg.writeStringField(KEY_ENTITY, "urn:vcloud:blockingTask:41aaf964-7452-42e6-9b8d-772e5f8421d8");
jg.close();
String json = new String(baos.toByteArray(), "UTF-8");
System.out.println(json);
}
@Test(enabled=false)
public void publish() throws IOException {
ConnectionFactory factory = new ConnectionFactory();
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
BasicProperties props = MessageProperties.PERSISTENT_BASIC;
props.setContentEncoding("UTF-8");
props.setContentType(XML_CONTENT_TYPE);
channel.basicPublish("systemExchange", "foo", props, getXmlPayload().getBytes("UTF-8"));
props.setContentType(JSON_CONTENT_TYPE);
channel.basicPublish("systemExchange", "foo", props, getJsonPayload().getBytes("UTF-8"));
channel.close();
connection.close();
}
String getXmlPayload() {
return "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n" +
"<vmext:Notification xmlns:vmext=\"http://www.vmware.com/vcloud/extension/v1.5\" type=\"com/vmware/vcloud/event/blockingtask/create\" eventId=\"55aba16e-427c-431a-9949-00db6aa78e5a\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://www.vmware.com/vcloud/extension/v1.5 http://10.23.6.35/api/v1.5/schema/vmwextensions.xsd\">\r\n" +
" <vmext:Link rel=\"entityResolver\" href=\"https://10.23.6.35/api/entity/\"/>\r\n" +
" <vmext:EntityLink rel=\"entity\" type=\"vcloud:blockingTask\" name=\"vappUpdateVm\" id=\"urn:vcloud:blockingTask:41aaf964-7452-42e6-9b8d-772e5f8421d8\"/>\r\n" +
" <vmext:EntityLink rel=\"down\" type=\"vcloud:user\" name=\"vcloud\" id=\"urn:vcloud:user:74a39795-2307-4667-ba2a-2eddc7e52325\"/>\r\n" +
" <vmext:EntityLink rel=\"up\" type=\"vcloud:org\" name=\"Default\" id=\"urn:vcloud:org:251ae0f6-9780-429d-a8cf-9495c036eef2\"/>\r\n" +
" <vmext:EntityLink rel=\"task\" type=\"vcloud:task\" name=\"vappUpdateVm\" id=\"urn:vcloud:task:a56be2f7-2cb4-4561-a7ef-ee2fdd2d3a15\"/>\r\n" +
" <vmext:EntityLink rel=\"task:owner\" type=\"vcloud:vm\" id=\"urn:vcloud:vm:26839d04-5050-4702-a602-0667be86dad6\"/>\r\n" +
" <vmext:Timestamp>2011-06-10T10:04:49.047+01:00</vmext:Timestamp>\r\n" +
" <vmext:OperationSuccess>true</vmext:OperationSuccess>\r\n" +
"</vmext:Notification>";
}
String getJsonPayload() {
return "{\"eventId\":\"55aba16e-427c-431a-9949-00db6aa78e5b\",\"type\":\"com/vmware/foobar\",\"operationSuccess\":true,\"timestamp\":\"2012-10-08 16:23:08.842\",\"user\":\"urn:vcloud:user:74a39795-2307-4667-ba2a-2eddc7e52325\",\"org\":\"urn:vcloud:org:251ae0f6-9780-429d-a8cf-9495c036eef2\",\"entity\":\"urn:vcloud:blockingTask:41aaf964-7452-42e6-9b8d-772e5f8421d8\"}";
}
}