public static void TestCase_OutcomeRegistration(bool promote)
{
string testCaseDescription = string.Format(
"TestCase_OutcomeRegistration promote={0}",
promote
);
Trace("**** " + testCaseDescription + " ****");
AutoResetEvent pspeCompleted = new AutoResetEvent(false);
NonMSDTCPromoterEnlistment pspe = null;
int numberOfCompletions = 0;
CommittableTransaction tx = null;
try
{
tx = new CommittableTransaction(TimeSpan.FromSeconds(5));
tx.TransactionCompleted += delegate (object sender, TransactionEventArgs completedArgs)
{
Trace("Completed event registered before PSPE");
numberOfCompletions++;
Assert.Equal(TransactionStatus.Committed, completedArgs.Transaction.TransactionInformation.Status);
};
pspe = (NonMSDTCPromoterEnlistment)CreatePSPEEnlistment(NonMsdtcPromoterTests.PromoterType1,
NonMsdtcPromoterTests.PromotedToken1,
pspeCompleted,
/*nonMSDTC = */ true,
tx,
/*spcResponse=*/ TransactionStatus.Committed,
/*expectRejection=*/ false
);
tx.TransactionCompleted += delegate (object sender, TransactionEventArgs completedArgs)
{
Trace("Completed event registered after PSPE");
numberOfCompletions++;
Assert.Equal(TransactionStatus.Committed, completedArgs.Transaction.TransactionInformation.Status);
};
if (promote)
{
Promote(testCaseDescription, NonMsdtcPromoterTests.PromotedToken1, tx);
tx.TransactionCompleted += delegate (object sender, TransactionEventArgs completedArgs)
{
Trace("Completed event registered after promote");
numberOfCompletions++;
Assert.Equal(TransactionStatus.Committed, completedArgs.Transaction.TransactionInformation.Status);
};
}
tx.Commit();
}
catch (Exception ex)
{
Assert.Null(ex);
}
tx.TransactionCompleted += delegate (object sender, TransactionEventArgs completedArgs)
{
Trace("Completed event registered after commit");
numberOfCompletions++;
Assert.Equal(TransactionStatus.Committed, completedArgs.Transaction.TransactionInformation.Status);
};
Assert.True(pspeCompleted.WaitOne(TimeSpan.FromSeconds(5)));
if (promote)
{
Assert.True(pspe.Promoted);
}
else
{
Assert.False(pspe.Promoted);
}
Assert.Equal((promote ? 4 : 3), numberOfCompletions);
TestPassed();
}