protected override void Test(IOrganizationService service) { // // Arrange // // The CRM server will create one instance of your plugin, and then run it, multi-threaded, // so here we setup all the contexts, and call them potentially multi-threaded, on a single plugin var plugin = new RaceConditionPlugin(); var builder = new PluginExecutionContextBuilder() .WithFirstRegisteredEvent(plugin) .WithPrimaryEntityName(Contact.EntityLogicalName) .WithPreImage(new Contact()); var providers = new List <IServiceProvider>(); foreach (var contact in EntityIdsByLogicalName[Contact.EntityLogicalName].Cast <Id <Contact> >()) { var context = builder.WithTarget(new Contact { EMailAddress1 = contact.EntityId + "@test.com", [Contact.Fields.AccountId] = contact.Entity.ParentCustomerId }) .WithPrimaryEntityId(contact) .Build(); providers.Add(new ServiceProviderBuilder(service, context, Logger).Build()); } // // Act // var inParallel = false; Execute(providers, plugin, inParallel); // // Assert // var raceConditionFailures = new List <string>(); foreach (var account in service.GetEntitiesById <Account>(EntityIdsByLogicalName[Account.EntityLogicalName].Select(a => a.EntityId))) { if (account.EMailAddress1 == null) { raceConditionFailures.Add($"Account {account.Id} should have had it's email set to it's contact's email but didn't."); } if (account.PrimaryContactId == null) { raceConditionFailures.Add($"Account {account.Id} should have had it's PrimaryContactId set to it's contact's id but didn't."); } } var failures = string.Join(Environment.NewLine, raceConditionFailures); Assert.IsTrue(string.IsNullOrEmpty(failures), "No failures should have occured, but the following were found:" + Environment.NewLine + failures); }
private static void Execute(List <IServiceProvider> providers, RaceConditionPlugin plugin, bool inParallel) { if (inParallel) { Parallel.ForEach(providers, p => { plugin.Execute(p); }); } else { foreach (var provider in providers) { plugin.Execute(provider); } } }