/*
* MessageTest.java
*
* Created on Jun 30, 2008, 2:33:34 PM
*
* Description: .
*
* Copyright (C) Feb 3, 2010 reed.
*
* This program is free software; you can redistribute it and/or modify it under the terms
* of the GNU General Public License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with this program;
* if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
package org.texai.ahcsSupport;
import java.io.Serializable;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.PrivateKey;
import java.security.SignatureException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import javax.net.ssl.X509KeyManager;
import org.apache.log4j.Logger;
import org.joda.time.DateTime;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.openrdf.model.URI;
import org.openrdf.model.impl.URIImpl;
import org.texai.kb.Constants;
import org.texai.util.ByteUtils;
import org.texai.x509.KeyStoreTestUtils;
import org.texai.x509.X509SecurityInfo;
import org.texai.x509.X509Utils;
import static org.junit.Assert.*;
/**
*
* @author reed
*/
public class MessageTest {
/** the logger */
private static final Logger LOGGER = Logger.getLogger(MessageTest.class);
public MessageTest() {
}
@BeforeClass
public static void setUpClass() throws Exception {
}
@AfterClass
public static void tearDownClass() throws Exception {
}
@Before
public void setUp() {
}
@After
public void tearDown() {
}
public static URI randomURI() {
return new URIImpl(Constants.TEXAI_NAMESPACE + UUID.randomUUID().toString());
}
/**
* Test of getOperation method, of class Message.
*/
@Test
public void testGetOperation() {
LOGGER.info("getOperation");
final URI senderRoleId = randomURI();
final URI recipientRoleId = randomURI();
final UUID conversationId = UUID.randomUUID();
final UUID replyWith = UUID.randomUUID();
final UUID inReplyTo = UUID.randomUUID();
final DateTime replyByDateTime = null;
final String service = "MyService";
final String operation = "ABC_Task";
final Map<String, Object> parameterDictionary = new HashMap<>();
Message instance = new Message(
senderRoleId,
"SenderService", // senderService
recipientRoleId,
conversationId,
replyWith,
inReplyTo,
replyByDateTime,
service,
operation,
parameterDictionary,
"1.0.0");
String result = instance.getOperation();
assertEquals("ABC_Task", result);
}
/**
* Test of isInfo method, of class Message.
*/
@Test
public void testIsInfo() {
LOGGER.info("isInfo");
final URI senderRoleId = randomURI();
final URI recipientRoleId = randomURI();
final UUID conversationId = UUID.randomUUID();
final UUID replyWith = UUID.randomUUID();
final UUID inReplyTo = UUID.randomUUID();
final DateTime replyByDateTime = null;
final String service = "MyService";
final Map<String, Object> parameterDictionary = new HashMap<>();
Message instance = new Message(
senderRoleId,
"SenderService", // senderService
recipientRoleId,
conversationId,
replyWith,
inReplyTo,
replyByDateTime,
service,
"ABC_Task", // operation
parameterDictionary,
"1.0.0");
assertEquals(false, instance.isInfo());
instance = new Message(
senderRoleId,
"SenderService", // senderService
recipientRoleId,
conversationId,
replyWith,
inReplyTo,
replyByDateTime,
service,
"ABC_Info", // operation
parameterDictionary,
"1.0.0");
assertEquals(true, instance.isInfo());
instance = new Message(
senderRoleId,
"SenderService", // senderService
recipientRoleId,
conversationId,
replyWith,
inReplyTo,
replyByDateTime,
service,
"ABC_Sensation", // operation
parameterDictionary,
"1.0.0");
assertEquals(false, instance.isInfo());
}
/**
* Test of isSensation method, of class Message.
*/
@Test
public void testIsSensation() {
LOGGER.info("isSensation");
final URI senderRoleId = randomURI();
final URI recipientRoleId = randomURI();
final UUID conversationId = UUID.randomUUID();
final UUID replyWith = UUID.randomUUID();
final UUID inReplyTo = UUID.randomUUID();
final DateTime replyByDateTime = null;
final String service = "MyService";
final Map<String, Object> parameterDictionary = new HashMap<>();
Message instance = new Message(
senderRoleId,
"SenderService", // senderService
recipientRoleId,
conversationId,
replyWith,
inReplyTo,
replyByDateTime,
service,
"ABC_Task", // operation
parameterDictionary,
"1.0.0");
assertEquals(false, instance.isInfo());
instance = new Message(
senderRoleId,
"SenderService", // senderService
recipientRoleId,
conversationId,
replyWith,
inReplyTo,
replyByDateTime,
service,
"ABC_Info", // operation
parameterDictionary,
"1.0.0");
assertEquals(true, instance.isInfo());
instance = new Message(
senderRoleId,
"SenderService", // senderService
recipientRoleId,
conversationId,
replyWith,
inReplyTo,
replyByDateTime,
service,
"ABC_Sensation", // operation
parameterDictionary,
"1.0.0");
assertEquals(false, instance.isInfo());
}
/**
* Test of isTask method, of class Message.
*/
@Test
public void testIsTask() {
LOGGER.info("isTask");
final URI senderRoleId = randomURI();
final URI recipientRoleId = randomURI();
final UUID conversationId = UUID.randomUUID();
final UUID replyWith = UUID.randomUUID();
final UUID inReplyTo = UUID.randomUUID();
final DateTime replyByDateTime = null;
final String service = "MyService";
final Map<String, Object> parameterDictionary = new HashMap<>();
Message instance = new Message(
senderRoleId,
"SenderService", // senderService
recipientRoleId,
conversationId,
replyWith,
inReplyTo,
replyByDateTime,
service,
"ABC_Task", // operation
parameterDictionary,
"1.0.0");
assertEquals(true, instance.isTask());
instance = new Message(
senderRoleId,
"SenderService", // senderService
recipientRoleId,
conversationId,
replyWith,
inReplyTo,
replyByDateTime,
service,
"ABC_Info", // operation
parameterDictionary,
"1.0.0");
assertEquals(false, instance.isTask());
instance = new Message(
senderRoleId,
"SenderService", // senderService
recipientRoleId,
conversationId,
replyWith,
inReplyTo,
replyByDateTime,
service,
"ABC_Sensation", // operation
parameterDictionary,
"1.0.0");
assertEquals(false, instance.isTask());
}
/**
* Test of get method, of class Message.
*/
@Test
public void testGet() {
LOGGER.info("get");
final URI senderRoleId = randomURI();
final URI recipientRoleId = randomURI();
final UUID conversationId = UUID.randomUUID();
final UUID replyWith = UUID.randomUUID();
final UUID inReplyTo = UUID.randomUUID();
final DateTime replyByDateTime = null;
final Map<String, Object> parameterDictionary = new HashMap<>();
String parameterName = "my-parm";
Serializable parameterValue = 10;
final String service = "MyService";
parameterDictionary.put(parameterName, parameterValue);
Message instance = new Message(
senderRoleId,
"SenderService", // senderService
recipientRoleId,
conversationId,
replyWith,
inReplyTo,
replyByDateTime,
service,
"ABC_Task", // operation
parameterDictionary,
"1.0.0");
assertEquals("10", instance.get(parameterName).toString());
}
/**
* Test of toString method, of class Message.
*/
@Test
public void testToString() {
LOGGER.info("toString");
final URI senderRoleId = randomURI();
final URI recipientRoleId = randomURI();
final UUID conversationId = UUID.randomUUID();
final UUID replyWith = UUID.randomUUID();
final UUID inReplyTo = UUID.randomUUID();
final DateTime replyByDateTime = null;
final String service = "MyService";
final Map<String, Object> parameterDictionary = new HashMap<>();
String parameterName = "my-parm";
Serializable parameterValue = 10;
parameterDictionary.put(parameterName, parameterValue);
Message instance = new Message(
senderRoleId,
"SenderService", // senderService
recipientRoleId,
conversationId,
replyWith,
inReplyTo,
replyByDateTime,
service,
"ABC_Task", // operation
parameterDictionary,
"1.0.0");
assertTrue(instance.toString().startsWith("[SenderService (ABC_Task) --> MyService{my-parm=10} sender: http://texai.org/texai/"));
}
/**
* Test of equals method, of class Message.
*/
@Test
public void testEquals() {
LOGGER.info("equals");
final URI senderRoleId = randomURI();
final URI recipientRoleId = randomURI();
final UUID conversationId = UUID.randomUUID();
final UUID replyWith = UUID.randomUUID();
final UUID inReplyTo = UUID.randomUUID();
final DateTime replyByDateTime = null;
final String service = "MyService";
final Map<String, Object> parameterDictionary1 = new HashMap<>();
String parameterName = "my-parm";
Serializable parameterValue = 10;
parameterDictionary1.put(parameterName, parameterValue);
Message instance1 = new Message(
senderRoleId,
"SenderService", // senderService
recipientRoleId,
conversationId,
replyWith,
inReplyTo,
replyByDateTime,
service,
"ABC_Task", // operation
parameterDictionary1,
"1.0.0");
final Map<String, Object> parameterDictionary2 = new HashMap<>();
parameterDictionary2.put(parameterName, parameterValue);
Message instance2 = new Message(
senderRoleId,
"SenderService", // senderService
recipientRoleId,
conversationId,
replyWith,
inReplyTo,
replyByDateTime,
service,
"ABC_Task", // operation
parameterDictionary2,
"1.0.0");
//assertTrue(instance1.equals(instance2)); only true if both instances are created at the same time
Message instance3 = new Message(
new URIImpl("http://texai.org/texai/be357af5-d270-4642-8d42-d9b17db87b0b"), // senderRoleId
"SenderService", // senderService
new URIImpl("http://texai.org/texai/8383dbb8-6158-4275-aff3-c94d5af9d733"), // recipientRoleId
conversationId,
replyWith,
inReplyTo,
replyByDateTime,
service,
"ABC_Task", // operation
parameterDictionary1,
"1.0.0");
assertFalse(instance1.equals(instance3));
}
/**
* Test of hashCode method, of class Message.
*/
@Test
public void testHashCode() {
LOGGER.info("hashCode");
final URI senderRoleId = new URIImpl("http://texai.org/texai/be357af5-d270-4642-8d42-d9b17db87b0b");
final URI recipientRoleId = new URIImpl("http://texai.org/texai/8383dbb8-6158-4275-aff3-c94d5af9d733");
LOGGER.info("recipientRoleId " + recipientRoleId);
final UUID conversationId = UUID.randomUUID();
final UUID replyWith = UUID.randomUUID();
final UUID inReplyTo = UUID.randomUUID();
final DateTime replyByDateTime = null;
final String service = "MyService";
final Map<String, Object> parameterDictionary = new HashMap<>();
String parameterName = "my-parm";
Serializable parameterValue = 10;
parameterDictionary.put(parameterName, parameterValue);
Message instance = new Message(
senderRoleId,
"SenderService", // senderService
recipientRoleId,
conversationId,
replyWith,
inReplyTo,
replyByDateTime,
service,
"ABC_Task", // operation
parameterDictionary,
"1.0.0");
int result = instance.hashCode();
assertEquals(281141015, result);
}
/**
* Test of getter methods, of class Message.
*/
@Test
public void testGetters() {
LOGGER.info("getters");
final URI senderRoleId = randomURI();
final String senderService = "MySenderService";
final URI recipientRoleId = randomURI();
final UUID conversationId = UUID.randomUUID();
final UUID replyWith = UUID.randomUUID();
final UUID inReplyTo = UUID.randomUUID();
final DateTime replyByDateTime = null;
final Map<String, Object> parameterDictionary = new HashMap<>();
final String service = "MyService";
String parameterName = "my-parm";
Serializable parameterValue = 10;
parameterDictionary.put(parameterName, parameterValue);
Message instance = new Message(
senderRoleId,
senderService,
recipientRoleId,
conversationId,
replyWith,
inReplyTo,
replyByDateTime,
service,
"ABC_Task", // operation
parameterDictionary,
"1.0.0");
assertEquals(senderRoleId, instance.getSenderRoleId());
assertEquals(senderService, instance.getSenderService());
assertEquals(recipientRoleId, instance.getRecipientRoleId());
assertEquals(conversationId, instance.getConversationId());
assertEquals(replyWith, instance.getReplyWith());
assertEquals(inReplyTo, instance.getInReplyTo());
assertEquals(replyByDateTime, instance.getReplyByDateTime());
assertNotNull(instance.getDate());
assertEquals("1.0.0", instance.getVersion());
}
/**
* Test of digital signature, of class Message.
*/
@Test
public void testDigitalSignature() {
LOGGER.info("digital signature");
final URI senderRoleId = randomURI();
final URI recipientRoleId = randomURI();
final UUID conversationId = UUID.randomUUID();
final UUID replyWith = UUID.randomUUID();
final UUID inReplyTo = UUID.randomUUID();
final DateTime replyByDateTime = null;
final String service = "MyService";
final Map<String, Object> parameterDictionary = new HashMap<>();
String parameterName = "my-parm";
Serializable parameterValue = 10;
parameterDictionary.put(parameterName, parameterValue);
Message instance = new Message(
senderRoleId,
"SenderService", // senderService
recipientRoleId,
conversationId,
replyWith,
inReplyTo,
replyByDateTime,
service,
"ABC_Task", // operation
parameterDictionary,
"1.0.0");
assertTrue(instance.toString().startsWith("[SenderService (ABC_Task) --> MyService{my-parm=10} sender: http://texai.org/texai/"));
try {
final X509SecurityInfo x509SecurityInfo = KeyStoreTestUtils.getClientX509SecurityInfo();
final X509KeyManager x509KeyManager = (X509KeyManager) x509SecurityInfo.getKeyManagers()[0];
final X509Certificate[] certificateChain = x509KeyManager.getCertificateChain(X509Utils.ENTRY_ALIAS);
assertNotNull(certificateChain);
LOGGER.info("certificate chain length:\n" + certificateChain.length);
assertEquals(2, certificateChain.length);
final X509Certificate x509Certificate = certificateChain[0];
LOGGER.info("certificate: " + x509Certificate);
final PrivateKey privateKey = x509KeyManager.getPrivateKey(X509Utils.ENTRY_ALIAS);
assertNotNull(privateKey);
LOGGER.info("private key: " + privateKey);
x509Certificate.checkValidity();
// validate the certificate with the issuer's public key
x509Certificate.verify(certificateChain[1].getPublicKey());
LOGGER.info("signing message");
instance.sign(privateKey);
LOGGER.info("Signature(in hex):: " + ByteUtils.toHex(instance.getSignatureBytes()));
LOGGER.info("verifying message");
boolean result = instance.verify(x509Certificate);
LOGGER.info("Signature Verification Result = " + x509Certificate);
assertTrue(result);
} catch (InvalidKeyException | NoSuchAlgorithmException | NoSuchProviderException | SignatureException | CertificateException ex) {
ex.printStackTrace();
fail(ex.getMessage());
}
}
}