Skip to content

Commit

Permalink
Fix TestInboundLiveSyncTask
Browse files Browse the repository at this point in the history
The AbstractInboundSyncTest was converted from asynchronous to
synchronous (driven by test methods) sync task execution. This fixed
some race conditions that emerged due to applySchemasAndSecurity
being suddenly too fast. :)
  • Loading branch information
mederly committed Apr 26, 2023
1 parent 604d874 commit 8eccdbd
Show file tree
Hide file tree
Showing 5 changed files with 68 additions and 127 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,16 @@
import static org.testng.AssertJUnit.assertNotNull;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Collections;
import java.util.Date;
import javax.xml.datatype.XMLGregorianCalendar;

import com.evolveum.midpoint.prism.polystring.PolyString;

import com.evolveum.midpoint.test.TestTask;

import com.evolveum.midpoint.util.exception.CommonException;

import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.annotation.DirtiesContext.ClassMode;
import org.springframework.test.context.ContextConfiguration;
Expand All @@ -25,7 +30,6 @@
import com.evolveum.midpoint.model.test.CommonInitialObjects;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.util.PrismAsserts;
import com.evolveum.midpoint.prism.util.PrismTestUtil;
import com.evolveum.midpoint.prism.xml.XmlTypeConverter;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.task.api.Task;
Expand All @@ -42,19 +46,18 @@ public abstract class AbstractInboundSyncTest extends AbstractInitializedModelIn

public static final File TEST_DIR = new File("src/test/resources/sync");

protected static final File TASK_LIVE_SYNC_DUMMY_EMERALD_FILE = new File(TEST_DIR, "task-dummy-emerald-livesync.xml");
protected static final String TASK_LIVE_SYNC_DUMMY_EMERALD_OID = "10000000-0000-0000-5555-55550000e404";
static final TestTask TASK_LIVE_SYNC_DUMMY_EMERALD = TestTask.file(
TEST_DIR, "task-dummy-emerald-livesync.xml", "10000000-0000-0000-5555-55550000e404");
static final TestTask TASK_RECON_DUMMY_EMERALD = TestTask.file(
TEST_DIR, "task-dummy-emerald-recon.xml", "10000000-0000-0000-5656-56560000e404");

protected static final File TASK_RECON_DUMMY_EMERALD_FILE = new File(TEST_DIR, "task-dummy-emerald-recon.xml");
protected static final String TASK_RECON_DUMMY_EMERALD_OID = "10000000-0000-0000-5656-56560000e404";
static final String ACCOUNT_MANCOMB_DUMMY_USERNAME = "mancomb";
static final Date ACCOUNT_MANCOMB_VALID_FROM_DATE = MiscUtil.asDate(2011, 2, 3, 4, 5, 6);
static final Date ACCOUNT_MANCOMB_VALID_TO_DATE = MiscUtil.asDate(2066, 5, 4, 3, 2, 1);

protected static final String ACCOUNT_MANCOMB_DUMMY_USERNAME = "mancomb";
protected static final Date ACCOUNT_MANCOMB_VALID_FROM_DATE = MiscUtil.asDate(2011, 2, 3, 4, 5, 6);
protected static final Date ACCOUNT_MANCOMB_VALID_TO_DATE = MiscUtil.asDate(2066, 5, 4, 3, 2, 1);
private static final String ACCOUNT_POSIXUSER_DUMMY_USERNAME = "posixuser";

protected static final String ACCOUNT_POSIXUSER_DUMMY_USERNAME = "posixuser";

protected long timeBeforeSync;
private long timeBeforeSync;

@Override
public void initSystem(Task initTask, OperationResult initResult) throws Exception {
Expand All @@ -66,28 +69,14 @@ public void initSystem(Task initTask, OperationResult initResult) throws Excepti
}
assumeAssignmentPolicy(AssignmentPolicyEnforcementType.NONE);

getSyncTask().init(this, initTask, initResult);
runSyncTask(initResult); // necessary e.g. for live sync to obtain initial token (for recon should be idempotent)
}

@Override
protected File getResourceDummyEmeraldFile() {
return RESOURCE_DUMMY_EMERALD_FILE;
}

protected abstract void importSyncTask(PrismObject<ResourceType> resource) throws FileNotFoundException;

protected abstract String getSyncTaskOid(PrismObject<ResourceType> resource);

protected int getWaitTimeout() {
return DEFAULT_TASK_WAIT_TIMEOUT;
}

@Test
public void test100ImportLiveSyncTaskDummyEmerald() throws Exception {
when();
importSyncTask(resourceDummyEmerald);
abstract TestTask getSyncTask();

then();
waitForSyncTaskStart(resourceDummyEmerald);
void runSyncTask(OperationResult result) throws CommonException {
getSyncTask().rerun(result);
}

@Test
Expand Down Expand Up @@ -115,7 +104,7 @@ public void test110AddDummyEmeraldAccountMancomb() throws Exception {

dummyResourceEmerald.addAccount(account);

waitForSyncTaskNextRun(resourceDummyEmerald);
runSyncTask(getTestOperationResult());

// THEN
then();
Expand Down Expand Up @@ -161,7 +150,7 @@ public void test120ModifyDummyEmeraldAccountMancombSeepbad() throws Exception {

displayValue("Modified dummy account", account.debugDump());

waitForSyncTaskNextRun(resourceDummyEmerald);
runSyncTask(getTestOperationResult());

// THEN
then();
Expand All @@ -185,7 +174,7 @@ public void test120ModifyDummyEmeraldAccountMancombSeepbad() throws Exception {

assertLinked(userAfter, accountAfter);

PrismAsserts.assertPropertyValue(userAfter, UserType.F_FULL_NAME, PrismTestUtil.createPolyString("Mancomb Seepbad"));
PrismAsserts.assertPropertyValue(userAfter, UserType.F_FULL_NAME, PolyString.fromOrig("Mancomb Seepbad"));

assertUsers(7);

Expand All @@ -211,7 +200,7 @@ public void test122ModifyDummyEmeraldAccountMancombSeepNULL() throws Exception {

displayValue("Modified dummy account", account.debugDump());

waitForSyncTaskNextRun(resourceDummyEmerald);
runSyncTask(getTestOperationResult());

// THEN
then();
Expand Down Expand Up @@ -261,7 +250,7 @@ public void test124ModifyDummyEmeraldAccountMancombSeepevil() throws Exception {

displayValue("Modified dummy account", account.debugDump());

waitForSyncTaskNextRun(resourceDummyEmerald);
runSyncTask(getTestOperationResult());

// THEN
then();
Expand All @@ -285,7 +274,7 @@ public void test124ModifyDummyEmeraldAccountMancombSeepevil() throws Exception {

assertLinked(userAfter, accountAfter);

PrismAsserts.assertPropertyValue(userAfter, UserType.F_FULL_NAME, PrismTestUtil.createPolyString("Mancomb Seepevil"));
PrismAsserts.assertPropertyValue(userAfter, UserType.F_FULL_NAME, PolyString.fromOrig("Mancomb Seepevil"));

assertUsers(7);

Expand All @@ -311,7 +300,7 @@ public void test126ModifyDummyEmeraldAccountMancombTitlePirate() throws Exceptio

displayValue("Modified dummy account", account.debugDump());

waitForSyncTaskNextRun(resourceDummyEmerald);
runSyncTask(getTestOperationResult());

// THEN
then();
Expand All @@ -335,8 +324,8 @@ public void test126ModifyDummyEmeraldAccountMancombTitlePirate() throws Exceptio

assertLinked(userAfter, accountAfter);

PrismAsserts.assertPropertyValue(userAfter, UserType.F_FULL_NAME, PrismTestUtil.createPolyString("Mancomb Seepevil"));
PrismAsserts.assertPropertyValue(userAfter, UserType.F_TITLE, PrismTestUtil.createPolyString("Pirate"));
PrismAsserts.assertPropertyValue(userAfter, UserType.F_FULL_NAME, PolyString.fromOrig("Mancomb Seepevil"));
PrismAsserts.assertPropertyValue(userAfter, UserType.F_TITLE, PolyString.fromOrig("Pirate"));

assertUsers(7);

Expand All @@ -362,7 +351,7 @@ public void test127ModifyDummyEmeraldAccountMancombTitlePirateNull() throws Exce

displayValue("Modified dummy account", account.debugDump());

waitForSyncTaskNextRun(resourceDummyEmerald);
runSyncTask(getTestOperationResult());

// THEN
then();
Expand All @@ -386,7 +375,7 @@ public void test127ModifyDummyEmeraldAccountMancombTitlePirateNull() throws Exce

assertLinked(userAfter, accountAfter);

PrismAsserts.assertPropertyValue(userAfter, UserType.F_FULL_NAME, PrismTestUtil.createPolyString("Mancomb Seepevil"));
PrismAsserts.assertPropertyValue(userAfter, UserType.F_FULL_NAME, PolyString.fromOrig("Mancomb Seepevil"));
PrismAsserts.assertNoItem(userAfter, UserType.F_TITLE);

assertUsers(7);
Expand All @@ -413,7 +402,7 @@ public void test129ModifyDummyEmeraldAccountMancombSeepgood() throws Exception {

displayValue("Modified dummy account", account.debugDump());

waitForSyncTaskNextRun(resourceDummyEmerald);
runSyncTask(getTestOperationResult());

// THEN
then();
Expand All @@ -437,7 +426,7 @@ public void test129ModifyDummyEmeraldAccountMancombSeepgood() throws Exception {

assertLinked(userAfter, accountAfter);

PrismAsserts.assertPropertyValue(userAfter, UserType.F_FULL_NAME, PrismTestUtil.createPolyString("Mancomb Seepgood"));
PrismAsserts.assertPropertyValue(userAfter, UserType.F_FULL_NAME, PolyString.fromOrig("Mancomb Seepgood"));

assertUsers(7);

Expand Down Expand Up @@ -478,7 +467,7 @@ public void test300AddDummyEmeraldAccountPosixUser() throws Exception {

dummyResourceEmerald.addAccount(account);

waitForSyncTaskNextRun(resourceDummyEmerald);
runSyncTask(getTestOperationResult());

// THEN
then();
Expand Down Expand Up @@ -525,7 +514,7 @@ public void test310ModifyDummyEmeraldAccountPosixUserUidNumber() throws Exceptio

displayValue("Modified dummy account", account.debugDump());

waitForSyncTaskNextRun(resourceDummyEmerald);
runSyncTask(getTestOperationResult());

// THEN
then();
Expand Down Expand Up @@ -553,19 +542,12 @@ public void test310ModifyDummyEmeraldAccountPosixUserUidNumber() throws Exceptio
// TODO create and test inbounds for uid and gid numbers; also other attributes
}

protected void waitForSyncTaskStart(PrismObject<ResourceType> resource) throws Exception {
waitForTaskStart(getSyncTaskOid(resource), false, getWaitTimeout());
}

protected void waitForSyncTaskNextRun(PrismObject<ResourceType> resource) throws Exception {
waitForTaskNextRunAssertSuccess(getSyncTaskOid(resource), false, getWaitTimeout());
}

protected void rememberTimeBeforeSync() {
void rememberTimeBeforeSync() {
timeBeforeSync = System.currentTimeMillis();
}

protected void assertShadowOperationalData(PrismObject<ShadowType> shadow, SynchronizationSituationType expectedSituation) {
@SuppressWarnings("SameParameterValue")
private void assertShadowOperationalData(PrismObject<ShadowType> shadow, SynchronizationSituationType expectedSituation) {
ShadowType shadowType = shadow.asObjectable();
SynchronizationSituationType actualSituation = shadowType.getSynchronizationSituation();
assertEquals("Wrong situation in shadow " + shadow, expectedSituation, actualSituation);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

import static org.testng.AssertJUnit.assertNull;

import java.io.FileNotFoundException;
import com.evolveum.midpoint.test.TestTask;

import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.annotation.DirtiesContext.ClassMode;
Expand All @@ -19,7 +19,6 @@
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ActivationStatusType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.SynchronizationSituationType;

Expand All @@ -39,21 +38,8 @@ public void initSystem(Task initTask, OperationResult initResult) throws Excepti
}

@Override
protected void importSyncTask(PrismObject<ResourceType> resource) throws FileNotFoundException {
if (resource == resourceDummyEmerald) {
importObjectFromFile(TASK_LIVE_SYNC_DUMMY_EMERALD_FILE);
} else {
throw new IllegalArgumentException("Unknown resource "+resource);
}
}

@Override
protected String getSyncTaskOid(PrismObject<ResourceType> resource) {
if (resource == resourceDummyEmerald) {
return TASK_LIVE_SYNC_DUMMY_EMERALD_OID;
} else {
throw new IllegalArgumentException("Unknown resource "+resource);
}
protected TestTask getSyncTask() {
return TASK_LIVE_SYNC_DUMMY_EMERALD;
}

@Override
Expand All @@ -70,7 +56,7 @@ public void test199DeleteDummyEmeraldAccountMancomb() throws Exception {

dummyResourceEmerald.deleteAccountByName(ACCOUNT_MANCOMB_DUMMY_USERNAME);

waitForSyncTaskNextRun(resourceDummyEmerald);
runSyncTask(getTestOperationResult());

// THEN
then();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,10 @@
import static org.testng.AssertJUnit.assertNotNull;
import static org.testng.AssertJUnit.assertNull;

import java.io.FileNotFoundException;
import java.util.Date;

import com.evolveum.midpoint.test.TestTask;

import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.annotation.DirtiesContext.ClassMode;
import org.springframework.test.context.ContextConfiguration;
Expand All @@ -22,7 +23,6 @@
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.util.MiscUtil;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ActivationStatusType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType;

Expand All @@ -34,28 +34,15 @@ public class TestInboundReconTask extends AbstractInboundSyncTest {
private static final Date ACCOUNT_MANCOMB_VALID_TO_DATE = MiscUtil.asDate(2066, 5, 4, 3, 2, 1);

@Override
public void initSystem(Task initTask, OperationResult initResult) throws Exception {
super.initSystem(initTask, initResult);

dummyResourceEmerald.setSyncStyle(DummySyncStyle.DUMB);
protected TestTask getSyncTask() {
return TASK_RECON_DUMMY_EMERALD;
}

@Override
protected void importSyncTask(PrismObject<ResourceType> resource) throws FileNotFoundException {
if (resource == resourceDummyEmerald) {
importObjectFromFile(TASK_RECON_DUMMY_EMERALD_FILE);
} else {
throw new IllegalArgumentException("Unknown resource "+resource);
}
}
public void initSystem(Task initTask, OperationResult initResult) throws Exception {
super.initSystem(initTask, initResult);

@Override
protected String getSyncTaskOid(PrismObject<ResourceType> resource) {
if (resource == resourceDummyEmerald) {
return TASK_RECON_DUMMY_EMERALD_OID;
} else {
throw new IllegalArgumentException("Unknown resource "+resource);
}
dummyResourceEmerald.setSyncStyle(DummySyncStyle.DUMB);
}

@Override
Expand All @@ -71,7 +58,7 @@ public void test180NoChange() throws Exception {
/// WHEN
when();

waitForSyncTaskNextRun(resourceDummyEmerald);
runSyncTask(getTestOperationResult());

// THEN
then();
Expand Down Expand Up @@ -111,7 +98,7 @@ public void test199DeleteDummyEmeraldAccountMancomb() throws Exception {

dummyResourceEmerald.deleteAccountByName(ACCOUNT_MANCOMB_DUMMY_USERNAME);

waitForSyncTaskNextRun(resourceDummyEmerald);
runSyncTask(getTestOperationResult());

// THEN
then();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,8 @@

<taskIdentifier>10000000-0000-0000-5555-555500000404</taskIdentifier>
<ownerRef oid="00000000-0000-0000-0000-000000000002"/>
<executionState>runnable</executionState>
<executionState>closed</executionState> <!-- run on demand -->

<binding>tight</binding>
<schedule>
<interval>1</interval>
</schedule>
<activity>
<work>
<liveSynchronization>
Expand Down

0 comments on commit 8eccdbd

Please sign in to comment.