package org.cagrid.gts.service.impl;
import java.sql.Connection;
import java.sql.PreparedStatement;
import junit.framework.TestCase;
import org.cagrid.gts.model.AuthorityGTS;
import org.cagrid.gts.model.AuthorityPrioritySpecification;
import org.cagrid.gts.model.AuthorityPriorityUpdate;
import org.cagrid.gts.model.TimeToLive;
import org.cagrid.gts.service.exception.IllegalAuthorityException;
import org.cagrid.gts.service.impl.db.AuthorityTable;
import org.cagrid.gts.service.impl.db.DBManager;
import org.cagrid.gts.service.impl.test.Utils;
/**
* @author <A href="mailto:langella@bmi.osu.edu">Stephen Langella </A>
* @author <A href="mailto:oster@bmi.osu.edu">Scott Oster </A>
* @author <A href="mailto:hastings@bmi.osu.edu">Shannon Hastings </A>
* @version $Id: ArgumentManagerTable.java,v 1.2 2004/10/15 16:35:16 langella Exp $
*/
public class TestGTSAuthorityManager extends TestCase {
private DBManager db;
private final String GTS_URI = "localhost";
public TestGTSAuthorityManager() {
}
public void testCreateAndDestroy() {
GTSAuthorityManager am = new GTSAuthorityManager(GTS_URI, getAuthoritySyncTime(), db);
try {
am.clearDatabase();
assertTrue(db.getDatabase().tableExists(AuthorityTable.TABLE_NAME));
am.clearDatabase();
} catch (Exception e) {
e.printStackTrace();
assertTrue(false);
} finally {
try {
am.clearDatabase();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public void testAddInvalidAuthority() {
GTSAuthorityManager am = new GTSAuthorityManager(GTS_URI, getAuthoritySyncTime(), db);
try {
am.clearDatabase();
TimeToLive ttl = new TimeToLive();
ttl.setHours(1);
ttl.setMinutes(1);
ttl.setSeconds(1);
// Add Authority no serviceURI
AuthorityGTS a1 = new AuthorityGTS();
a1.setPriority(1);
a1.setPerformAuthorization(true);
a1.setServiceIdentity("Service");
a1.setSyncTrustLevels(true);
a1.setTimeToLive(ttl);
try {
am.addAuthority(a1);
fail("Should not be able to add authority!!!");
} catch (IllegalAuthorityException f) {
}
// Add Authority no ttl
AuthorityGTS a2 = new AuthorityGTS();
a2.setServiceURI("Service");
a2.setPriority(1);
a2.setPerformAuthorization(true);
a2.setServiceIdentity("Service");
a2.setSyncTrustLevels(true);
try {
am.addAuthority(a2);
fail("Should not be able to add authority!!!");
} catch (IllegalAuthorityException f) {
}
// Add Authority no service identity
AuthorityGTS a3 = new AuthorityGTS();
a3.setServiceURI("Service");
a3.setPriority(1);
a3.setPerformAuthorization(true);
a3.setSyncTrustLevels(true);
a3.setTimeToLive(ttl);
try {
am.addAuthority(a3);
fail("Should not be able to add authority!!!");
} catch (IllegalAuthorityException f) {
}
a3.setServiceIdentity("");
try {
am.addAuthority(a3);
fail("Should not be able to add authority!!!");
} catch (IllegalAuthorityException f) {
}
a3.setServiceIdentity(" ");
try {
am.addAuthority(a3);
fail("Should not be able to add authority!!!");
} catch (IllegalAuthorityException f) {
}
// Invalid Priority
AuthorityGTS a4 = new AuthorityGTS();
a4.setServiceURI("Service");
a4.setPriority(0);
a4.setPerformAuthorization(true);
a4.setSyncTrustLevels(true);
a4.setServiceIdentity("Service");
a4.setTimeToLive(ttl);
try {
am.addAuthority(a4);
fail("Should not be able to add authority!!!");
} catch (IllegalAuthorityException f) {
}
// Invalid Time To Sync
AuthorityGTS a5 = new AuthorityGTS();
a5.setServiceURI("Service");
a5.setPriority(1);
a5.setPerformAuthorization(true);
a5.setSyncTrustLevels(true);
a5.setServiceIdentity("Service");
TimeToLive ttl2 = new TimeToLive();
ttl2.setHours(0);
ttl2.setMinutes(0);
ttl2.setSeconds(1);
a5.setTimeToLive(ttl2);
try {
am.addAuthority(a5);
fail("Should not be able to add authority!!!");
} catch (IllegalAuthorityException f) {
}
AuthorityGTS a6 = getAuthority("GTS 6", 1);
am.addAuthority(a6);
assertTrue(am.doesAuthorityExist(a6.getServiceURI()));
assertEquals(1, am.getAuthorityCount());
assertEquals(a6, am.getAuthority(a6.getServiceURI()));
try {
am.addAuthority(a6);
fail("Should not be able to add authority!!!");
} catch (IllegalAuthorityException f) {
}
} catch (Exception e) {
e.printStackTrace();
assertTrue(false);
} finally {
try {
am.clearDatabase();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public void testUpdateInvalidAuthority() {
GTSAuthorityManager am = new GTSAuthorityManager(GTS_URI, getAuthoritySyncTime(), db);
try {
am.clearDatabase();
TimeToLive ttl = new TimeToLive();
ttl.setHours(10);
ttl.setMinutes(10);
ttl.setSeconds(10);
AuthorityGTS a = getAuthority("GTS", 1);
am.addAuthority(a);
assertTrue(am.doesAuthorityExist(a.getServiceURI()));
assertEquals(1, am.getAuthorityCount());
assertEquals(a, am.getAuthority(a.getServiceURI()));
// First make sure update works
a.setTimeToLive(ttl);
am.updateAuthority(a);
assertTrue(am.doesAuthorityExist(a.getServiceURI()));
assertEquals(1, am.getAuthorityCount());
assertEquals(a, am.getAuthority(a.getServiceURI()));
// Add Authority no serviceURI
AuthorityGTS a1 = getAuthority("GTS", 1);
a1.setServiceURI(null);
try {
am.updateAuthority(a1);
fail("Should not be able to update authority!!!");
} catch (IllegalAuthorityException f) {
}
// Add Authority no ttl
AuthorityGTS a2 = getAuthority("GTS", 1);
a2.setTimeToLive(null);
try {
am.addAuthority(a2);
fail("Should not be able to update authority!!!");
} catch (IllegalAuthorityException f) {
}
// Add Authority no service identity
AuthorityGTS a3 = getAuthority("GTS", 1);
a3.setServiceIdentity(null);
try {
am.addAuthority(a3);
fail("Should not be able to update authority!!!");
} catch (IllegalAuthorityException f) {
}
a3.setServiceIdentity("");
try {
am.addAuthority(a3);
fail("Should not be able to update authority!!!");
} catch (IllegalAuthorityException f) {
}
a3.setServiceIdentity(" ");
try {
am.addAuthority(a3);
fail("Should not be able to update authority!!!");
} catch (IllegalAuthorityException f) {
}
// Invalid Priority
AuthorityGTS a4 = getAuthority("GTS", 1);
a4.setPriority(2);
try {
am.addAuthority(a4);
fail("Should not be able to update authority!!!");
} catch (IllegalAuthorityException f) {
}
// Adding Self
AuthorityGTS a5 = getAuthority(GTS_URI, 1);
a5.setPriority(2);
try {
am.addAuthority(a5);
fail("Should not be able to update authority!!!");
} catch (IllegalAuthorityException f) {
}
} catch (Exception e) {
e.printStackTrace();
assertTrue(false);
} finally {
try {
am.clearDatabase();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public void testAddAuthority() {
GTSAuthorityManager am = new GTSAuthorityManager(GTS_URI, getAuthoritySyncTime(), db);
try {
am.clearDatabase();
AuthorityGTS a1 = getAuthority("GTS 1", 1);
assertFalse(am.doesAuthorityExist(a1.getServiceURI()));
assertEquals(0, am.getAuthorityCount());
am.addAuthority(a1);
assertTrue(am.doesAuthorityExist(a1.getServiceURI()));
assertEquals(1, am.getAuthorityCount());
assertEquals(a1, am.getAuthority(a1.getServiceURI()));
} catch (Exception e) {
e.printStackTrace();
assertTrue(false);
} finally {
try {
am.clearDatabase();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public void testAddUpdateRemoveAuthorities() {
GTSAuthorityManager am = new GTSAuthorityManager(GTS_URI, getAuthoritySyncTime(), db);
int count = 5;
AuthorityGTS[] a = new AuthorityGTS[count];
try {
am.clearDatabase();
for (int i = 0; i < count; i++) {
a[i] = getAuthority("GTS " + i, 1);
assertFalse(am.doesAuthorityExist(a[i].getServiceURI()));
assertEquals(i, am.getAuthorityCount());
am.addAuthority(a[i]);
assertTrue(am.doesAuthorityExist(a[i].getServiceURI()));
assertEquals((i + 1), am.getAuthorityCount());
assertEquals(a[i], am.getAuthority(a[i].getServiceURI()));
for (int j = 0; j < i; j++) {
a[j].setPriority(a[j].getPriority() + 1);
assertEquals(a[j], am.getAuthority(a[j].getServiceURI()));
}
}
for (int i = 0; i < count; i++) {
updateAuthority(a[i]);
am.updateAuthority(a[i]);
assertTrue(am.doesAuthorityExist(a[i].getServiceURI()));
assertEquals(count, am.getAuthorityCount());
assertEquals(a[i], am.getAuthority(a[i].getServiceURI()));
}
int priority = 1;
AuthorityPriorityUpdate update = new AuthorityPriorityUpdate();
AuthorityPrioritySpecification[] specs = new AuthorityPrioritySpecification[count];
for (int i = 0; i < count; i++) {
a[i].setPriority(priority);
specs[i] = new AuthorityPrioritySpecification();
specs[i].setServiceURI(a[i].getServiceURI());
specs[i].setPriority(a[i].getPriority());
priority = priority + 1;
update.getAuthorityPrioritySpecification().add(specs[i]);
}
am.updateAuthorityPriorities(update);
for (int i = 0; i < count; i++) {
assertTrue(am.doesAuthorityExist(a[i].getServiceURI()));
assertEquals(count, am.getAuthorityCount());
assertEquals(a[i], am.getAuthority(a[i].getServiceURI()));
}
AuthorityGTS[] auths = am.getAuthorities();
for (int i = 0; i < count; i++) {
assertEquals(a[i], auths[i]);
}
int num = count;
for (int i = 0; i < count; i++) {
am.removeAuthority(a[i].getServiceURI());
num = num - 1;
assertFalse(am.doesAuthorityExist(a[i].getServiceURI()));
assertEquals(num, am.getAuthorityCount());
for (int j = (i + 1); j <= i; j++) {
a[j].setPriority(a[j].getPriority() - 1);
assertEquals(a[j], am.getAuthority(a[j].getServiceURI()));
}
}
} catch (Exception e) {
e.printStackTrace();
assertTrue(false);
} finally {
try {
am.clearDatabase();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public void testInvalidUpdatePrioritiesAuthorities() {
GTSAuthorityManager am = new GTSAuthorityManager(GTS_URI, getAuthoritySyncTime(), db);
int count = 5;
AuthorityGTS[] a = new AuthorityGTS[count];
try {
am.clearDatabase();
for (int i = 0; i < count; i++) {
a[i] = getAuthority("GTS " + i, 1);
assertFalse(am.doesAuthorityExist(a[i].getServiceURI()));
assertEquals(i, am.getAuthorityCount());
am.addAuthority(a[i]);
assertTrue(am.doesAuthorityExist(a[i].getServiceURI()));
assertEquals((i + 1), am.getAuthorityCount());
assertEquals(a[i], am.getAuthority(a[i].getServiceURI()));
for (int j = 0; j < i; j++) {
a[j].setPriority(a[j].getPriority() + 1);
assertEquals(a[j], am.getAuthority(a[j].getServiceURI()));
}
}
// First insert invalid amount
int priority = 1;
AuthorityPriorityUpdate update = new AuthorityPriorityUpdate();
AuthorityPrioritySpecification[] specs = new AuthorityPrioritySpecification[(count - 1)];
for (int i = 0; i < (count - 1); i++) {
a[i].setPriority(priority);
specs[i] = new AuthorityPrioritySpecification();
specs[i].setServiceURI(a[i].getServiceURI());
specs[i].setPriority(a[i].getPriority());
priority = priority + 1;
update.getAuthorityPrioritySpecification().add(specs[i]);
}
try {
am.updateAuthorityPriorities(update);
fail("Should not be able to update priorities");
} catch (IllegalAuthorityException g) {
}
// Invalid priority
int priority2 = 2;
AuthorityPriorityUpdate update2 = new AuthorityPriorityUpdate();
AuthorityPrioritySpecification[] specs2 = new AuthorityPrioritySpecification[count];
for (int i = 0; i < count; i++) {
a[i].setPriority(priority2);
specs2[i] = new AuthorityPrioritySpecification();
specs2[i].setServiceURI(a[i].getServiceURI());
specs2[i].setPriority(a[i].getPriority());
priority2 = priority2 + 1;
update2.getAuthorityPrioritySpecification().add(specs2[i]);
}
try {
am.updateAuthorityPriorities(update2);
fail("Should not be able to update priorities");
} catch (IllegalAuthorityException g) {
}
// Invalid priority
AuthorityPriorityUpdate update3 = new AuthorityPriorityUpdate();
AuthorityPrioritySpecification[] specs3 = new AuthorityPrioritySpecification[count];
for (int i = 0; i < count; i++) {
a[i].setPriority(1);
specs3[i] = new AuthorityPrioritySpecification();
specs3[i].setServiceURI(a[i].getServiceURI());
specs3[i].setPriority(a[i].getPriority());
update3.getAuthorityPrioritySpecification().add(specs3[i]);
}
try {
am.updateAuthorityPriorities(update3);
fail("Should not be able to update priorities");
} catch (IllegalAuthorityException g) {
}
} catch (Exception e) {
e.printStackTrace();
assertTrue(false);
} finally {
try {
am.clearDatabase();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public void testUpdateRollback() {
GTSAuthorityManager am = new GTSAuthorityManager(GTS_URI, getAuthoritySyncTime(), db);
int count = 5;
AuthorityGTS[] a = new AuthorityGTS[count];
Connection c = null;
try {
am.clearDatabase();
for (int i = 0; i < count; i++) {
a[i] = getAuthority("GTS " + i, 1);
assertFalse(am.doesAuthorityExist(a[i].getServiceURI()));
assertEquals(i, am.getAuthorityCount());
am.addAuthority(a[i]);
assertTrue(am.doesAuthorityExist(a[i].getServiceURI()));
assertEquals((i + 1), am.getAuthorityCount());
assertEquals(a[i], am.getAuthority(a[i].getServiceURI()));
for (int j = 0; j < i; j++) {
a[j].setPriority(a[j].getPriority() + 1);
assertEquals(a[j], am.getAuthority(a[j].getServiceURI()));
}
}
c = db.getDatabase().getConnection();
c.setAutoCommit(false);
for (int i = 0; i < count; i++) {
a[i].setPriority(a[i].getPriority() + 1);
am.updateAuthorityPriority(c, a[i].getServiceURI(), a[i].getPriority());
}
for (int i = 0; i < count; i++) {
assertEquals((a[i].getPriority() - 1), am.getAuthority(a[i].getServiceURI()).getPriority());
}
c.commit();
for (int i = 0; i < count; i++) {
assertEquals(a[i], am.getAuthority(a[i].getServiceURI()));
}
for (int i = 0; i < count; i++) {
a[i].setPriority(a[i].getPriority() + 1);
am.updateAuthorityPriority(c, a[i].getServiceURI(), a[i].getPriority());
}
try {
PreparedStatement bad = c.prepareStatement("INSERT INTO NOTHING SET VALUES(1,2)");
bad.executeUpdate();
try {
c.commit();
} catch (Exception com) {
c.rollback();
}
} catch (Exception ex) {
c.rollback();
}
for (int i = 0; i < count; i++) {
a[i].setPriority(a[i].getPriority() - 1);
assertEquals(a[i], am.getAuthority(a[i].getServiceURI()));
}
c.setAutoCommit(true);
} catch (Exception e) {
e.printStackTrace();
assertTrue(false);
} finally {
if (c != null) {
try {
c.setAutoCommit(true);
} catch (Exception e) {
e.printStackTrace();
}
db.getDatabase().releaseConnection(c);
}
try {
am.clearDatabase();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public void testAddAuthorityOverwritePriority() {
GTSAuthorityManager am = new GTSAuthorityManager(GTS_URI, getAuthoritySyncTime(), db);
try {
am.clearDatabase();
AuthorityGTS a1 = getAuthority("GTS 1", 1);
assertFalse(am.doesAuthorityExist(a1.getServiceURI()));
assertEquals(0, am.getAuthorityCount());
am.addAuthority(a1);
assertTrue(am.doesAuthorityExist(a1.getServiceURI()));
assertEquals(1, am.getAuthorityCount());
assertEquals(a1, am.getAuthority(a1.getServiceURI()));
AuthorityGTS a2 = getAuthority("GTS 2", 1);
am.addAuthority(a2);
assertTrue(am.doesAuthorityExist(a2.getServiceURI()));
assertEquals(2, am.getAuthorityCount());
assertEquals(a2, am.getAuthority(a2.getServiceURI()));
a1.setPriority(2);
assertEquals(a1, am.getAuthority(a1.getServiceURI()));
} catch (Exception e) {
e.printStackTrace();
assertTrue(false);
} finally {
try {
am.clearDatabase();
} catch (Exception e) {
e.printStackTrace();
}
}
}
private AuthorityGTS getAuthority(String uri, int priority) {
TimeToLive ttl = new TimeToLive();
ttl.setHours(1);
ttl.setMinutes(1);
ttl.setSeconds(1);
AuthorityGTS a1 = new AuthorityGTS();
a1.setServiceURI(uri);
a1.setPriority(1);
a1.setPerformAuthorization(true);
a1.setServiceIdentity(uri);
a1.setSyncTrustLevels(true);
a1.setTimeToLive(ttl);
return a1;
}
private AuthoritySyncTime getAuthoritySyncTime() {
AuthoritySyncTime time = new AuthoritySyncTime(0, 0, 2);
return time;
}
private void updateAuthority(AuthorityGTS gts) {
TimeToLive ttl = new TimeToLive();
ttl.setHours(10);
ttl.setMinutes(10);
ttl.setSeconds(10);
gts.setPerformAuthorization(false);
gts.setServiceIdentity(null);
gts.setSyncTrustLevels(false);
gts.setTimeToLive(ttl);
}
protected void setUp() throws Exception {
super.setUp();
try {
db = Utils.getDBManager();
assertEquals(0, db.getDatabase().getUsedConnectionCount());
} catch (Exception e) {
e.printStackTrace();
assertTrue(false);
}
}
protected void tearDown() throws Exception {
super.tearDown();
try {
assertEquals(0, db.getDatabase().getUsedConnectionCount());
// db.getDatabase().destroyDatabase();
} catch (Exception e) {
e.printStackTrace();
assertTrue(false);
}
}
}