public void Multiple_entities_in_exception_from_update_pipeline_can_be_handled()
        {
            ExtendedSqlAzureExecutionStrategy.ExecuteNew(
                () =>
            {
                using (new TransactionScope())
                {
                    using (var context = new AdvancedPatternsMasterContext())
                    {
                        // Create two entities which both have dependencies on each other
                        // to force a dependency ordering exception from the update pipeline.

                        var building = new Building
                        {
                            BuildingId          = new Guid("14C62AB6-A49C-40BD-BD5C-D374E070D3D7"),
                            Name                = "Building 18",
                            Value               = 1m,
                            PrincipalMailRoomId = -1,
                            Address             =
                                new Address
                            {
                                Street   = "100 Work St",
                                City     = "Redmond",
                                State    = "WA",
                                ZipCode  = "98052",
                                SiteInfo = new SiteInfo
                                {
                                    Zone        = 1,
                                    Environment = "Clean"
                                }
                            },
                        };

                        var mailRoom = new MailRoom
                        {
                            id         = (int)building.PrincipalMailRoomId,
                            BuildingId = building.BuildingId
                        };

                        context.Buildings.Add(building);
                        context.Set <MailRoom>().Add(mailRoom);

                        try
                        {
                            context.SaveChanges();
                            Assert.True(false);
                        }
                        catch (DbUpdateException ex)
                        {
                            Assert.IsType <UpdateException>(ex.InnerException);

                            var entries = ex.Entries.ToList();
                            Assert.Equal(2, entries.Count());
                            Assert.True(entries.Any(e => ReferenceEquals(e.Entity, building)));
                            Assert.True(entries.Any(e => ReferenceEquals(e.Entity, mailRoom)));
                        }
                    }
                }
            });
        }
Exemple #2
0
 public void announce_should_return_after_all_recipients_have_been_notified_but_before_they_finish()
 {
     var test_subject = new MailRoom();
     test_subject.subscribe<SillyMessage>(message_handler_that_never_finishes);
     test_subject.announce(new SillyMessage("hi"));
     _log.Should()
         .ContainInOrder(new object[] {"Notified: hi"});
 }
Exemple #3
0
 public void mail_sent_to_a_mail_room_should_also_be_announced_to_all_more_central_mail_rooms()
 {
     var home_office = new MailRoom();
     var log = store_silly_values();
     var mail_target = home_office.create_satellite_office();
     home_office.subscribe<SillyMessage>(log.accept);
     mail_target.announce_and_wait(new SillyMessage("hi"), TimeSpan.FromMilliseconds(50));
     log.received.Should()
         .ContainInOrder(new object[] {"hi"});
 }
Exemple #4
0
 public void announce_and_wait_should_time_out_but_not_cancel_tasks_if_tasks_never_finish()
 {
     var test_subject = new MailRoom();
     test_subject.subscribe<SillyMessage>(message_handler_that_never_finishes);
     test_subject.announce_and_wait(new SillyMessage("hi"), TimeSpan.FromMilliseconds(10))
         .Should()
         .BeFalse();
     _log.Should()
         .ContainInOrder(new object[] {"Notified: hi"});
 }
Exemple #5
0
 public void announce_and_wait_should_only_return_after_all_recipients_have_completed()
 {
     var test_subject = new MailRoom();
     test_subject.subscribe<SillyMessage>(message_handler_that_finishes);
     test_subject.announce_and_wait(new SillyMessage("hi"), TimeSpan.FromMilliseconds(50))
         .Should()
         .BeTrue();
     _log.Should()
         .ContainInOrder(new object[] {"Notified: hi", "Finished: hi"});
 }
Exemple #6
0
 public void announced_messages_should_be_delivered_to_all_who_have_expressed_interest_in_that_message_type()
 {
     var test_subject = new MailRoom();
     var log = store_silly_values();
     test_subject.subscribe<SillyMessage>(log.accept);
     test_subject.announce_and_wait(new SillyMessage("1"), TimeSpan.FromMilliseconds(50));
     test_subject.announce_and_wait(new SillyMessage("2"), TimeSpan.FromMilliseconds(50));
     log.received.Should()
         .ContainInOrder(new object[] {"1", "2"});
 }
Exemple #7
0
            public RecursiveSubscriber(int counter,
				[NotNull] MailRoom mail_room_for_recursive_subscriptions,
				[NotNull] List<string> log)
            {
                _counter = counter;
                _mail_room_for_recursive_subscriptions = mail_room_for_recursive_subscriptions;
                _log = log;
            }
Exemple #8
0
 public void universal_subscribers_should_receive_all_messages()
 {
     var test_subject = new MailRoom();
     var log = store_all_values();
     test_subject.subscribe_to_all(log.accept);
     test_subject.announce(new SillyMessage("silly"));
     test_subject.announce_and_wait(new SeriousMessage("serious"), TimeSpan.Zero);
     log.received.Should()
         .ContainInOrder(new object[] {"silly", "serious"});
 }
Exemple #9
0
 public void subscribing_for_a_message_while_processing_that_message_should_result_in_new_subscriber_not_receiving_message()
 {
     var test_subject = new MailRoom();
     test_subject.subscribe<SillyMessage>(new RecursiveSubscriber(3, test_subject, _log).subscribe_recursively_until_counter_expires);
     test_subject.subscribe<SillyMessage>(new RecursiveSubscriber(3, test_subject, _log).subscribe_recursively_until_counter_expires);
     test_subject.announce_and_wait(new SillyMessage("hi"), TimeSpan.FromMilliseconds(100))
         .Should()
         .BeTrue();
     _log.Should()
         .ContainInOrder(new object[] {"Counted 3: hi", "Counted 3: hi"});
 }
Exemple #10
0
 public void subscribers_should_only_get_messages_they_asked_for()
 {
     var test_subject = new MailRoom();
     var log = store_silly_values();
     test_subject.subscribe<SillyMessage>(log.accept);
     test_subject.announce_and_wait(new SillyMessage("silly"), TimeSpan.FromMilliseconds(50));
     test_subject.announce_and_wait(new SeriousMessage("serious"), TimeSpan.FromMilliseconds(50));
     log.received.Should()
         .ContainInOrder(new object[] {"silly"});
 }