Skip to content

Commit

Permalink
Improved sync tests
Browse files Browse the repository at this point in the history
  • Loading branch information
semancik committed May 26, 2015
1 parent 8940a0a commit 276a4b3
Show file tree
Hide file tree
Showing 11 changed files with 161 additions and 28 deletions.
Expand Up @@ -527,6 +527,17 @@ public static void assertBetween(String message, XMLGregorianCalendar start, XML
actual.compare(end) == DatatypeConstants.LESSER || actual.compare(end) == DatatypeConstants.EQUAL);
}
}

public static void assertBetween(String message, Long start, Long end,
Long actual) {
assertNotNull(message + " is null", actual);
if (start != null) {
assertTrue(message+": expected time to be after "+start+" but it was "+actual, actual >= start);
}
if (end != null) {
assertTrue(message+": expected time to be before "+end+" but it was "+actual, actual <= end);
}
}

public static void assertEqualsTimestamp(String message, XMLGregorianCalendar expected, XMLGregorianCalendar actual) {
assertNotNull(message+"; expected "+expected, actual);
Expand Down
Expand Up @@ -1351,6 +1351,21 @@ private void dumpOrg(StringBuilder sb, PrismObject<OrgType> org, int indent) {
List<ObjectReferenceType> linkRefs = org.asObjectable().getLinkRef();
sb.append(": ").append(linkRefs.size()).append(" links");
}

protected void displayUsers() throws SchemaException, ObjectNotFoundException, SecurityViolationException, CommunicationException, ConfigurationException {
Task task = taskManager.createTaskInstance(AbstractModelIntegrationTest.class+".displayUsers");
OperationResult result = task.getResult();
ResultHandler<UserType> handler = new ResultHandler<UserType>() {
@Override
public boolean handle(PrismObject<UserType> user, OperationResult parentResult) {
display("User", user);
return true;
}
};
modelService.searchObjectsIterative(UserType.class, null, handler, null, task, result);
result.computeStatus();
TestUtil.assertSuccess(result);
}

protected <F extends FocusType> void assertAssignments(PrismObject<F> user, int expectedNumber) {
MidPointAsserts.assertAssignments(user, expectedNumber);
Expand Down
Expand Up @@ -81,6 +81,7 @@
import com.evolveum.midpoint.prism.query.ObjectFilter;
import com.evolveum.midpoint.prism.query.ObjectPaging;
import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.prism.util.PrismAsserts;
import com.evolveum.midpoint.prism.util.PrismTestUtil;
import com.evolveum.midpoint.schema.GetOperationOptions;
import com.evolveum.midpoint.schema.ResultHandler;
Expand Down Expand Up @@ -206,11 +207,12 @@ protected void startResources() throws Exception {

public abstract String getStopSystemCommand();

protected abstract void assertStepSyncToken(String syncTaskOid, int step, long tsStart, long tsEnd) throws ObjectNotFoundException, SchemaException;

protected boolean isIdmAdminInteOrgPerson() {
return false;
}


@AfterClass
public static void stopResources() throws Exception {
//end profiling
Expand Down Expand Up @@ -346,6 +348,19 @@ public void test020Schema() throws Exception {
accountObjectClassDefinition = refinedSchema.findObjectClassDefinition(getAccountObjectClass());
assertNotNull("No definition for object class "+getAccountObjectClass(), accountObjectClassDefinition);

ResourceAttributeDefinition<String> cnDef = accountObjectClassDefinition.findAttributeDefinition("cn");
PrismAsserts.assertDefinition(cnDef, new QName(MidPointConstants.NS_RI, "cn"), DOMUtil.XSD_STRING, 1, -1);
assertTrue("createTimestampDef read", cnDef.canRead());
assertTrue("createTimestampDef read", cnDef.canModify());
assertTrue("createTimestampDef read", cnDef.canAdd());

ResourceAttributeDefinition<Long> createTimestampDef = accountObjectClassDefinition.findAttributeDefinition("createTimestamp");
PrismAsserts.assertDefinition(createTimestampDef, new QName(MidPointConstants.NS_RI, "createTimestamp"),
DOMUtil.XSD_LONG, 0, 1);
assertTrue("createTimestampDef read", createTimestampDef.canRead());
assertFalse("createTimestampDef read", createTimestampDef.canModify());
assertFalse("createTimestampDef read", createTimestampDef.canAdd());

}

@Test
Expand Down Expand Up @@ -712,6 +727,7 @@ public void test200AssignAccountToBarbossa() throws Exception {
// GIVEN
Task task = taskManager.createTaskInstance(this.getClass().getName() + "." + TEST_NAME);
OperationResult result = task.getResult();
long tsStart = System.currentTimeMillis();

// WHEN
TestUtil.displayWhen(TEST_NAME);
Expand All @@ -721,19 +737,27 @@ public void test200AssignAccountToBarbossa() throws Exception {
TestUtil.displayThen(TEST_NAME);
result.computeStatus();
TestUtil.assertSuccess(result);

long tsEnd = System.currentTimeMillis();

Entry entry = assertLdapAccount(USER_BARBOSSA_USERNAME, USER_BARBOSSA_FULL_NAME);
assertAttribute(entry, "title", null);

PrismObject<UserType> user = getUser(USER_BARBOSSA_OID);
String shadowOid = getSingleLinkOid(user);
PrismObject<ShadowType> shadow = getShadowModel(shadowOid);
display("Shadow (model)", shadow);
accountBarbossaOid = shadow.getOid();
Collection<ResourceAttribute<?>> identifiers = ShadowUtil.getIdentifiers(shadow);
String accountBarbossaIcfUid = (String) identifiers.iterator().next().getRealValue();
assertNotNull("No identifier in "+shadow, accountBarbossaIcfUid);

assertEquals("Wrong ICFS UID", entry.get(ATTRIBUTE_ENTRY_UUID).getString(), accountBarbossaIcfUid);

ResourceAttribute<Long> createTimestampAttribute = ShadowUtil.getAttribute(shadow, new QName(MidPointConstants.NS_RI, "createTimestamp"));
assertNotNull("No createTimestamp in "+shadow, createTimestampAttribute);
Long createTimestamp = createTimestampAttribute.getRealValue();
TestUtil.assertBetween("Wrong createTimestamp in "+shadow, tsStart, tsEnd, createTimestamp);
}

@Test
Expand Down Expand Up @@ -831,6 +855,8 @@ public void test800ImportSyncTask() throws Exception {
Task task = taskManager.createTaskInstance(this.getClass().getName() + "." + TEST_NAME);
OperationResult result = task.getResult();

long tsStart = System.currentTimeMillis();

// WHEN
TestUtil.displayWhen(TEST_NAME);
addObject(getSyncTaskFile(), task, result);
Expand All @@ -841,7 +867,10 @@ public void test800ImportSyncTask() throws Exception {
TestUtil.assertSuccess(result);

waitForTaskStart(getSyncTaskOid(), true);
assertSyncToken(getSyncTaskOid(), (Integer)3);

long tsEnd = System.currentTimeMillis();

assertStepSyncToken(getSyncTaskOid(), 0, tsStart, tsEnd);
}

@Test
Expand All @@ -853,6 +882,8 @@ public void test810SyncAddAccountHt() throws Exception {
Task task = taskManager.createTaskInstance(this.getClass().getName() + "." + TEST_NAME);
OperationResult result = task.getResult();

long tsStart = System.currentTimeMillis();

// WHEN
TestUtil.displayWhen(TEST_NAME);
addLdapAccount(ACCOUNT_HT_UID, ACCOUNT_HT_CN, ACCOUNT_HT_GIVENNAME, ACCOUNT_HT_SN);
Expand All @@ -863,11 +894,15 @@ public void test810SyncAddAccountHt() throws Exception {
result.computeStatus();
TestUtil.assertSuccess(result);

long tsEnd = System.currentTimeMillis();

displayUsers();

PrismObject<UserType> user = findUserByUsername(ACCOUNT_HT_UID);
assertNotNull("No user "+ACCOUNT_HT_UID+" created", user);
assertUser(user, user.getOid(), ACCOUNT_HT_UID, ACCOUNT_HT_CN, ACCOUNT_HT_GIVENNAME, ACCOUNT_HT_SN);

assertSyncToken(getSyncTaskOid(), (Integer)4);
assertStepSyncToken(getSyncTaskOid(), 1, tsStart, tsEnd);
}

@Test
Expand All @@ -879,6 +914,8 @@ public void test812ModifyAccountHt() throws Exception {
Task task = taskManager.createTaskInstance(this.getClass().getName() + "." + TEST_NAME);
OperationResult result = task.getResult();

long tsStart = System.currentTimeMillis();

// WHEN
TestUtil.displayWhen(TEST_NAME);
LdapNetworkConnection connection = ldapConnect();
Expand All @@ -893,11 +930,13 @@ public void test812ModifyAccountHt() throws Exception {
result.computeStatus();
TestUtil.assertSuccess(result);

long tsEnd = System.currentTimeMillis();

PrismObject<UserType> user = findUserByUsername(ACCOUNT_HT_UID);
assertNotNull("No user "+ACCOUNT_HT_UID+" created", user);
assertUser(user, user.getOid(), ACCOUNT_HT_UID, "Horatio Torquemeda Marley", ACCOUNT_HT_GIVENNAME, ACCOUNT_HT_SN);

assertSyncToken(getSyncTaskOid(), (Integer)5);
assertStepSyncToken(getSyncTaskOid(), 2, tsStart, tsEnd);

}

Expand All @@ -910,6 +949,8 @@ public void test815RenameAccount() throws Exception {
Task task = taskManager.createTaskInstance(this.getClass().getName() + "." + TEST_NAME);
OperationResult result = task.getResult();

long tsStart = System.currentTimeMillis();

// WHEN
TestUtil.displayWhen(TEST_NAME);
LdapNetworkConnection connection = ldapConnect();
Expand All @@ -931,12 +972,14 @@ public void test815RenameAccount() throws Exception {
result.computeStatus();
TestUtil.assertSuccess(result);

long tsEnd = System.currentTimeMillis();

PrismObject<UserType> user = findUserByUsername("htm");
assertNotNull("No user "+"htm"+" created", user);
assertUser(user, user.getOid(), "htm", "Horatio Torquemeda Marley", ACCOUNT_HT_GIVENNAME, ACCOUNT_HT_SN);
assertNull("User "+ACCOUNT_HT_UID+" still exist", findUserByUsername(ACCOUNT_HT_UID));

assertSyncToken(getSyncTaskOid(), (Integer)6);
assertStepSyncToken(getSyncTaskOid(), 3, tsStart, tsEnd);

}

Expand All @@ -949,6 +992,8 @@ public void test819DeleteAccountHtm() throws Exception {
Task task = taskManager.createTaskInstance(this.getClass().getName() + "." + TEST_NAME);
OperationResult result = task.getResult();

long tsStart = System.currentTimeMillis();

// WHEN
TestUtil.displayWhen(TEST_NAME);
deleteLdapEntry(toDn("htm"));
Expand All @@ -960,24 +1005,18 @@ public void test819DeleteAccountHtm() throws Exception {
result.computeStatus();
TestUtil.assertSuccess(result);

long tsEnd = System.currentTimeMillis();

assertNull("User "+"htm"+" still exist", findUserByUsername("htm"));
assertNull("User "+ACCOUNT_HT_UID+" still exist", findUserByUsername(ACCOUNT_HT_UID));

assertSyncToken(getSyncTaskOid(), (Integer)7);
assertStepSyncToken(getSyncTaskOid(), 4, tsStart, tsEnd);

}

// TODO: create object of a different object class. See that it is ignored by sync.

// private Entry createEntry(String uid, String name) throws IOException {
// StringBuilder sb = new StringBuilder();
// String dn = "uid="+uid+","+getPeopleLdapSuffix();
// sb.append("dn: ").append(dn).append("\n");
// sb.append("objectClass: inetOrgPerson\n");
// sb.append("uid: ").append(uid).append("\n");
// sb.append("cn: ").append(name).append("\n");
// sb.append("sn: ").append(name).append("\n");
// }
// TODO: sync with "ALL" object class

protected Entry getLdapAccountByUid(String uid) throws LdapException, IOException, CursorException {
LdapNetworkConnection connection = ldapConnect();
Expand Down
Expand Up @@ -20,6 +20,8 @@
import org.testng.annotations.AfterClass;

import com.evolveum.midpoint.test.util.MidPointTestConstants;
import com.evolveum.midpoint.util.exception.ObjectNotFoundException;
import com.evolveum.midpoint.util.exception.SchemaException;

/**
* @author semancik
Expand Down Expand Up @@ -86,4 +88,12 @@ protected int getSearchSizeLimit() {
protected String getSyncTaskOid() {
return "cd1e0ff2-0099-11e5-9e22-001e8c717e5b";
}

@Override
protected void assertStepSyncToken(String syncTaskOid, int step, long tsStart, long tsEnd)
throws ObjectNotFoundException, SchemaException {
// TODO Auto-generated method stub

}

}
Expand Up @@ -20,6 +20,8 @@
import org.testng.annotations.AfterClass;

import com.evolveum.midpoint.test.util.MidPointTestConstants;
import com.evolveum.midpoint.util.exception.ObjectNotFoundException;
import com.evolveum.midpoint.util.exception.SchemaException;

/**
* @author semancik
Expand Down Expand Up @@ -100,12 +102,11 @@ protected int getSearchSizeLimit() {
protected String getSyncTaskOid() {
return "cd1e0ff2-0099-11e5-9e22-001e8c717e5b";
}

@Override
public void test290ModifyUserBarbossaRename() throws Exception {
// Do nothing. This fails because the OpenDJ permissions seems to be wrong
// TODO: fix this
protected void assertStepSyncToken(String syncTaskOid, int step, long tsStart, long tsEnd)
throws ObjectNotFoundException, SchemaException {
assertSyncToken(syncTaskOid, (Integer)(step+4));
}


}
Expand Up @@ -15,11 +15,26 @@
*/
package com.evolveum.midpoint.testing.conntest;

import static org.testng.AssertJUnit.assertNotNull;

import java.io.File;
import java.text.ParseException;

import org.apache.directory.api.util.GeneralizedTime;
import org.testng.AssertJUnit;
import org.testng.annotations.Test;

import com.evolveum.midpoint.prism.PrismProperty;
import com.evolveum.midpoint.schema.constants.SchemaConstants;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.test.AbstractIntegrationTest;
import com.evolveum.midpoint.test.IntegrationTestTools;
import com.evolveum.midpoint.test.util.MidPointTestConstants;
import com.evolveum.midpoint.test.util.TestUtil;
import com.evolveum.midpoint.util.MiscUtil;
import com.evolveum.midpoint.util.exception.ObjectNotFoundException;
import com.evolveum.midpoint.util.exception.SchemaException;

/**
* @author semancik
Expand Down Expand Up @@ -81,4 +96,33 @@ protected int getSearchSizeLimit() {
protected String getSyncTaskOid() {
return "cd1e0ff2-0099-11e5-9e22-001e8c717e5b";
}

@Override
protected void assertStepSyncToken(String syncTaskOid, int step, long tsStart, long tsEnd)
throws ObjectNotFoundException, SchemaException {
OperationResult result = new OperationResult(AbstractIntegrationTest.class.getName()+".assertSyncToken");
Task task = taskManager.getTask(syncTaskOid, result);
result.computeStatus();
TestUtil.assertSuccess(result);

PrismProperty<String> syncTokenProperty = task.getExtensionProperty(SchemaConstants.SYNC_TOKEN);
assertNotNull("No sync token in "+task, syncTokenProperty);
String syncToken = syncTokenProperty.getRealValue();
assertNotNull("No sync token in "+task, syncToken);
IntegrationTestTools.display("Sync token", syncToken);

GeneralizedTime syncTokenGt;
try {
syncTokenGt = new GeneralizedTime(syncToken);
} catch (ParseException e) {
throw new RuntimeException(e.getMessage(),e);
}
TestUtil.assertBetween("Wrong time in sync token: "+syncToken, roundTs(tsStart), roundTs(tsEnd), syncTokenGt.getCalendar().getTimeInMillis());

}

private Long roundTs(long ts) {
return (((long)(ts/1000))*1000);
}

}
Expand Up @@ -52,9 +52,12 @@
<icfcldap:pagingStrategy>auto</icfcldap:pagingStrategy>
<icfcldap:vlvSortAttribute>uid</icfcldap:vlvSortAttribute>
<icfcldap:operationalAttributes>memberOf</icfcldap:operationalAttributes>
<icfcldap:operationalAttributes>createTimestamp</icfcldap:operationalAttributes>
</icfc:configurationProperties>
<icfc:resultsHandlerConfiguration>
<icfc:enableNormalizingResultsHandler>false</icfc:enableNormalizingResultsHandler>
<icfc:enableFilteredResultsHandler>false</icfc:enableFilteredResultsHandler>
<icfc:enableAttributesToGetSearchResultsHandler>false</icfc:enableAttributesToGetSearchResultsHandler>
</icfc:resultsHandlerConfiguration>
</connectorConfiguration>

Expand Down
Expand Up @@ -63,6 +63,10 @@
<level>DEBUG</level>
<package>com.evolveum.polygon.connector.ldap.SchemaTranslator</package>
</classLogger>
<classLogger>
<level>DEBUG</level>
<package>com.evolveum.midpoint.model.impl.lens.Clockwork</package>
</classLogger>
<classLogger>
<c:level>TRACE</c:level>
<c:package>com.evolveum.midpoint.test</c:package>
Expand Down

0 comments on commit 276a4b3

Please sign in to comment.