public void TestBroadcastOperatorWithDefaultCodec()
        {
            INameServer nameServer = NameServerTests.BuildNameServer();

            string groupName    = "group1";
            string operatorName = "broadcast";
            string masterTaskId = "task0";
            string driverId     = "Driver Id";
            int    numTasks     = 10;
            int    value        = 1337;
            int    fanOut       = 3;

            IGroupCommDriver groupCommDriver = GetInstanceOfGroupCommDriver(driverId, masterTaskId, groupName, fanOut, numTasks);

            var commGroup = groupCommDriver.DefaultGroup
                            .AddBroadcast(operatorName, masterTaskId)
                            .Build();

            List <ICommunicationGroupClient> commGroups = CommGroupClients(groupName, numTasks, groupCommDriver, commGroup, GetDefaultCodecConfig());

            IBroadcastSender <int>   sender    = commGroups[0].GetBroadcastSender <int>(operatorName);
            IBroadcastReceiver <int> receiver1 = commGroups[1].GetBroadcastReceiver <int>(operatorName);
            IBroadcastReceiver <int> receiver2 = commGroups[2].GetBroadcastReceiver <int>(operatorName);

            Assert.NotNull(sender);
            Assert.NotNull(receiver1);
            Assert.NotNull(receiver2);

            sender.Send(value);
            Assert.Equal(value, receiver1.Receive());
            Assert.Equal(value, receiver2.Receive());
        }
        private ChannelFactory <IBroadcastReceiver <T> > GetChannelFactory()
        {
            ChannelFactory <IBroadcastReceiver <T> > channelFactory = null;

            if (Channel?.Mode == ChannelMode.Local)
            {
                var localBinding = new NetNamedPipeBinding();
                localBinding.Security.Mode = NetNamedPipeSecurityMode.Transport;

                var localEndpointUri = new Uri($"net.pipe://localhost/{Channel.Name}");
                var localEndpoint    = new EndpointAddress(localEndpointUri);

                channelFactory = new ChannelFactory <IBroadcastReceiver <T> >(localBinding);
                client         = channelFactory.CreateChannel(localEndpoint);
            }

            if (Channel?.Mode == ChannelMode.Mesh)
            {
                var meshBinding = new NetPeerTcpBinding();
                meshBinding.Security.Mode = SecurityMode.None;

                var meshEndpointUri = new Uri($"net.p2p://{Channel.Name}");
                var meshEndpoint    = new EndpointAddress(meshEndpointUri);

                channelFactory = new ChannelFactory <IBroadcastReceiver <T> >(meshBinding);
                client         = channelFactory.CreateChannel(meshEndpoint);
            }

            return(channelFactory);
        }
        public void TestBroadcastReduceOperators()
        {
            string groupName             = "group1";
            string broadcastOperatorName = "broadcast";
            string reduceOperatorName    = "reduce";
            string masterTaskId          = "task0";
            string driverId = "Driver Id";
            int    numTasks = 3;
            int    fanOut   = 2;

            var groupCommunicationDriver        = GetInstanceOfGroupCommDriver(driverId, masterTaskId, groupName, fanOut, numTasks);
            ICommunicationGroupDriver commGroup = groupCommunicationDriver.DefaultGroup
                                                  .AddBroadcast <int>(
                broadcastOperatorName,
                masterTaskId,
                TopologyTypes.Flat,
                GetDefaultDataConverterConfig())
                                                  .AddReduce <int>(
                reduceOperatorName,
                masterTaskId,
                TopologyTypes.Flat,
                GetDefaultDataConverterConfig(),
                GetDefaultReduceFuncConfig())
                                                  .Build();

            var commGroups = CommGroupClients(groupName, numTasks, groupCommunicationDriver, commGroup, GetDefaultCodecConfig());

            // for master task
            IBroadcastSender <int> broadcastSender = commGroups[0].GetBroadcastSender <int>(broadcastOperatorName);
            IReduceReceiver <int>  sumReducer      = commGroups[0].GetReduceReceiver <int>(reduceOperatorName);

            IBroadcastReceiver <int> broadcastReceiver1    = commGroups[1].GetBroadcastReceiver <int>(broadcastOperatorName);
            IReduceSender <int>      triangleNumberSender1 = commGroups[1].GetReduceSender <int>(reduceOperatorName);

            IBroadcastReceiver <int> broadcastReceiver2    = commGroups[2].GetBroadcastReceiver <int>(broadcastOperatorName);
            IReduceSender <int>      triangleNumberSender2 = commGroups[2].GetReduceSender <int>(reduceOperatorName);

            for (int j = 1; j <= 10; j++)
            {
                broadcastSender.Send(j);

                int n1 = broadcastReceiver1.Receive();
                int n2 = broadcastReceiver2.Receive();
                Assert.Equal(j, n1);
                Assert.Equal(j, n2);

                int triangleNum1 = TriangleNumber(n1);
                triangleNumberSender1.Send(triangleNum1);
                int triangleNum2 = TriangleNumber(n2);
                triangleNumberSender2.Send(triangleNum2);

                int sum      = sumReducer.Reduce();
                int expected = TriangleNumber(j) * (numTasks - 1);
                Assert.Equal(sum, expected);
            }
        }
Example #4
0
        public SlaveTask(
            [Parameter(typeof(GroupTestConfig.NumIterations))] int numIters,
            IGroupCommClient groupCommClient)
        {
            Logger.Log(Level.Info, "Hello from slave task");

            _numIterations        = numIters;
            _groupCommClient      = groupCommClient;
            _commGroup            = _groupCommClient.GetCommunicationGroup(GroupTestConstants.GroupName);
            _broadcastReceiver    = _commGroup.GetBroadcastReceiver <int>(GroupTestConstants.BroadcastOperatorName);
            _triangleNumberSender = _commGroup.GetReduceSender <int>(GroupTestConstants.ReduceOperatorName);
        }
Example #5
0
        public SlaveTask(
            [Parameter(typeof(GroupTestConfig.NumIterations))] int numIters,
            IGroupCommClient groupCommClient)
        {
            _logger.Log(Level.Info, "Hello from slave task");

            _numIterations = numIters;
            _groupCommClient = groupCommClient;
            _commGroup = _groupCommClient.GetCommunicationGroup(GroupTestConstants.GroupName);
            _broadcastReceiver = _commGroup.GetBroadcastReceiver<int>(GroupTestConstants.BroadcastOperatorName);
            _triangleNumberSender = _commGroup.GetReduceSender<int>(GroupTestConstants.ReduceOperatorName);
        }
Example #6
0
        private MapTaskHost(
            IMapFunction <TMapInput, TMapOutput> mapTask,
            IGroupCommClient groupCommunicationsClient,
            [Parameter(typeof(InvokeGC))] bool invokeGC)
        {
            _mapTask = mapTask;
            var cg = groupCommunicationsClient.GetCommunicationGroup(IMRUConstants.CommunicationGroupName);

            _dataAndMessageReceiver =
                cg.GetBroadcastReceiver <MapInputWithControlMessage <TMapInput> >(IMRUConstants.BroadcastOperatorName);
            _dataReducer = cg.GetReduceSender <TMapOutput>(IMRUConstants.ReduceOperatorName);
            _invokeGC    = invokeGC;
        }
Example #7
0
 private MapTaskHost(
     IMapFunction <TMapInput, TMapOutput> mapTask,
     IGroupCommClient groupCommunicationsClient,
     TaskCloseCoordinator taskCloseCoordinator,
     [Parameter(typeof(InvokeGC))] bool invokeGc,
     [Parameter(typeof(TaskConfigurationOptions.Identifier))] string taskId) :
     base(groupCommunicationsClient, taskCloseCoordinator, invokeGc)
 {
     Logger.Log(Level.Info, "Entering constructor of MapTaskHost for task id {0}", taskId);
     _mapTask = mapTask;
     _dataAndMessageReceiver =
         _communicationGroupClient.GetBroadcastReceiver <MapInputWithControlMessage <TMapInput> >(IMRUConstants.BroadcastOperatorName);
     _dataReducer = _communicationGroupClient.GetReduceSender <TMapOutput>(IMRUConstants.ReduceOperatorName);
     Logger.Log(Level.Info, "MapTaskHost initialized.");
 }
Example #8
0
 public KMeansSlaveTask(
     DataPartitionCache dataPartition,
     [Parameter(typeof(KMeansConfiguratioinOptions.TotalNumEvaluators))] int clustersNumber,
     IGroupCommClient groupCommClient)
 {
     using (Logger.LogFunction("KMeansSlaveTask::KMeansSlaveTask"))
     {
         _dataPartition            = dataPartition;
         _groupCommClient          = groupCommClient;
         _clustersNum              = clustersNumber;
         _commGroup                = _groupCommClient.GetCommunicationGroup(Constants.KMeansCommunicationGroupName);
         _dataBroadcastReceiver    = _commGroup.GetBroadcastReceiver <Centroids>(Constants.CentroidsBroadcastOperatorName);
         _partialMeansSender       = _commGroup.GetReduceSender <ProcessedResults>(Constants.MeansReduceOperatorName);
         _controlBroadcastReceiver = _commGroup.GetBroadcastReceiver <ControlMessage>(Constants.ControlMessageBroadcastOperatorName);
     }
 }
Example #9
0
 public KMeansSlaveTask(
     DataPartitionCache dataPartition,
     [Parameter(typeof(KMeansConfiguratioinOptions.TotalNumEvaluators))] int clustersNumber,
     IGroupCommClient groupCommClient)
 {
     using (Logger.LogFunction("KMeansSlaveTask::KMeansSlaveTask"))
     {
         _dataPartition = dataPartition;
         _groupCommClient = groupCommClient;
         _clustersNum = clustersNumber;
         _commGroup = _groupCommClient.GetCommunicationGroup(Constants.KMeansCommunicationGroupName);
         _dataBroadcastReceiver = _commGroup.GetBroadcastReceiver<Centroids>(Constants.CentroidsBroadcastOperatorName);
         _partialMeansSender = _commGroup.GetReduceSender<ProcessedResults>(Constants.MeansReduceOperatorName);
         _controlBroadcastReceiver = _commGroup.GetBroadcastReceiver<ControlMessage>(Constants.ControlMessageBroadcastOperatorName);
     }      
 }
Example #10
0
        private MapTaskHost(
            IMapFunction <TMapInput, TMapOutput> mapTask,
            IGroupCommClient groupCommunicationsClient,
            TaskCloseCoordinator taskCloseCoordinator,
            [Parameter(typeof(InvokeGC))] bool invokeGC)
        {
            _mapTask = mapTask;
            _groupCommunicationsClient = groupCommunicationsClient;
            var cg = groupCommunicationsClient.GetCommunicationGroup(IMRUConstants.CommunicationGroupName);

            _dataAndMessageReceiver =
                cg.GetBroadcastReceiver <MapInputWithControlMessage <TMapInput> >(IMRUConstants.BroadcastOperatorName);
            _dataReducer          = cg.GetReduceSender <TMapOutput>(IMRUConstants.ReduceOperatorName);
            _invokeGC             = invokeGC;
            _taskCloseCoordinator = taskCloseCoordinator;
            _cancellationSource   = new CancellationTokenSource();
        }
Example #11
0
        public void TestBroadcastOperator2()
        {
            string groupName    = "group1";
            string operatorName = "broadcast";
            string driverId     = "driverId";
            string masterTaskId = "task0";
            int    numTasks     = 3;
            int    value1       = 1337;
            int    value2       = 42;
            int    value3       = 99;
            int    fanOut       = 2;

            IGroupCommDriver groupCommDriver = GetInstanceOfGroupCommDriver(driverId, masterTaskId, groupName, fanOut, numTasks);

            var commGroup = groupCommDriver.DefaultGroup
                            .AddBroadcast(operatorName, masterTaskId)
                            .Build();

            List <ICommunicationGroupClient> commGroups = CommGroupClients(groupName, numTasks, groupCommDriver, commGroup, GetDefaultCodecConfig());

            IBroadcastSender <int>   sender    = commGroups[0].GetBroadcastSender <int>(operatorName);
            IBroadcastReceiver <int> receiver1 = commGroups[1].GetBroadcastReceiver <int>(operatorName);
            IBroadcastReceiver <int> receiver2 = commGroups[2].GetBroadcastReceiver <int>(operatorName);

            Assert.IsNotNull(sender);
            Assert.IsNotNull(receiver1);
            Assert.IsNotNull(receiver2);

            sender.Send(value1);
            Assert.AreEqual(value1, receiver1.Receive());
            Assert.AreEqual(value1, receiver2.Receive());

            sender.Send(value2);
            Assert.AreEqual(value2, receiver1.Receive());
            Assert.AreEqual(value2, receiver2.Receive());

            sender.Send(value3);
            Assert.AreEqual(value3, receiver1.Receive());
            Assert.AreEqual(value3, receiver2.Receive());
        }
Example #12
0
        public void TestGetBroadcastReduceOperatorsForIntArrayMessageType()
        {
            const string groupName             = "group1";
            const string broadcastOperatorName = "broadcast";
            const string reduceOperatorName    = "reduce";
            const string masterTaskId          = "task0";
            const string driverId = "Driver Id";
            const int    numTasks = 3;
            const int    fanOut   = 2;

            IConfiguration codecConfig = StreamingCodecConfiguration <int[]> .Conf
                                         .Set(StreamingCodecConfiguration <int[]> .Codec, GenericType <IntArrayStreamingCodec> .Class)
                                         .Build();

            IConfiguration reduceFunctionConfig = ReduceFunctionConfiguration <int[]> .Conf
                                                  .Set(ReduceFunctionConfiguration <int[]> .ReduceFunction, GenericType <ArraySumFunction> .Class)
                                                  .Build();

            IConfiguration dataConverterConfig = TangFactory.GetTang().NewConfigurationBuilder(
                PipelineDataConverterConfiguration <int[]> .Conf
                .Set(PipelineDataConverterConfiguration <int[]> .DataConverter,
                     GenericType <PipelineIntDataConverter> .Class)
                .Build())
                                                 .BindNamedParameter <GroupTestConfig.ChunkSize, int>(
                GenericType <GroupTestConfig.ChunkSize> .Class,
                GroupTestConstants.ChunkSize.ToString(CultureInfo.InvariantCulture))
                                                 .Build();

            var groupCommunicationDriver        = GetInstanceOfGroupCommDriver(driverId, masterTaskId, groupName, fanOut, numTasks);
            ICommunicationGroupDriver commGroup = groupCommunicationDriver.DefaultGroup
                                                  .AddBroadcast <int[]>(
                broadcastOperatorName,
                masterTaskId,
                TopologyTypes.Flat,
                dataConverterConfig)
                                                  .AddReduce <int[]>(
                reduceOperatorName,
                masterTaskId,
                TopologyTypes.Flat,
                dataConverterConfig,
                reduceFunctionConfig)
                                                  .Build();

            var commGroups = CommGroupClients(groupName, numTasks, groupCommunicationDriver, commGroup, codecConfig);

            // for master task
            IBroadcastSender <int[]> broadcastSender = commGroups[0].GetBroadcastSender <int[]>(broadcastOperatorName);
            IReduceReceiver <int[]>  sumReducer      = commGroups[0].GetReduceReceiver <int[]>(reduceOperatorName);

            IBroadcastReceiver <int[]> broadcastReceiver1    = commGroups[1].GetBroadcastReceiver <int[]>(broadcastOperatorName);
            IReduceSender <int[]>      triangleNumberSender1 = commGroups[1].GetReduceSender <int[]>(reduceOperatorName);

            IBroadcastReceiver <int[]> broadcastReceiver2    = commGroups[2].GetBroadcastReceiver <int[]>(broadcastOperatorName);
            IReduceSender <int[]>      triangleNumberSender2 = commGroups[2].GetReduceSender <int[]>(reduceOperatorName);

            Assert.NotNull(broadcastSender);
            Assert.NotNull(sumReducer);
            Assert.NotNull(broadcastReceiver1);
            Assert.NotNull(triangleNumberSender1);
            Assert.NotNull(broadcastReceiver2);
            Assert.NotNull(triangleNumberSender2);
        }
        public void TestBroadcastReduceOperators()
        {
            string groupName             = "group1";
            string broadcastOperatorName = "broadcast";
            string reduceOperatorName    = "reduce";
            string masterTaskId          = "task0";
            string driverId = "Driver Id";
            int    numTasks = 10;
            int    fanOut   = 3;

            var groupCommDriver = GroupCommunicationTests.GetInstanceOfGroupCommDriver(driverId, masterTaskId, groupName, fanOut, numTasks);

            ICommunicationGroupDriver commGroup = groupCommDriver.DefaultGroup
                                                  .AddBroadcast <int>(
                broadcastOperatorName,
                masterTaskId,
                TopologyTypes.Tree,
                GetDefaultDataConverterConfig())
                                                  .AddReduce <int>(
                reduceOperatorName,
                masterTaskId,
                TopologyTypes.Tree,
                GetDefaultDataConverterConfig(),
                GetDefaultReduceFuncConfig())
                                                  .Build();

            var commGroups = GroupCommunicationTests.CommGroupClients(groupName, numTasks, groupCommDriver, commGroup, GetDefaultCodecConfig());

            // for master task
            IBroadcastSender <int> broadcastSender = commGroups[0].GetBroadcastSender <int>(broadcastOperatorName);
            IReduceReceiver <int>  sumReducer      = commGroups[0].GetReduceReceiver <int>(reduceOperatorName);

            IBroadcastReceiver <int> broadcastReceiver1    = commGroups[1].GetBroadcastReceiver <int>(broadcastOperatorName);
            IReduceSender <int>      triangleNumberSender1 = commGroups[1].GetReduceSender <int>(reduceOperatorName);

            IBroadcastReceiver <int> broadcastReceiver2    = commGroups[2].GetBroadcastReceiver <int>(broadcastOperatorName);
            IReduceSender <int>      triangleNumberSender2 = commGroups[2].GetReduceSender <int>(reduceOperatorName);

            IBroadcastReceiver <int> broadcastReceiver3    = commGroups[3].GetBroadcastReceiver <int>(broadcastOperatorName);
            IReduceSender <int>      triangleNumberSender3 = commGroups[3].GetReduceSender <int>(reduceOperatorName);

            IBroadcastReceiver <int> broadcastReceiver4    = commGroups[4].GetBroadcastReceiver <int>(broadcastOperatorName);
            IReduceSender <int>      triangleNumberSender4 = commGroups[4].GetReduceSender <int>(reduceOperatorName);

            IBroadcastReceiver <int> broadcastReceiver5    = commGroups[5].GetBroadcastReceiver <int>(broadcastOperatorName);
            IReduceSender <int>      triangleNumberSender5 = commGroups[5].GetReduceSender <int>(reduceOperatorName);

            IBroadcastReceiver <int> broadcastReceiver6    = commGroups[6].GetBroadcastReceiver <int>(broadcastOperatorName);
            IReduceSender <int>      triangleNumberSender6 = commGroups[6].GetReduceSender <int>(reduceOperatorName);

            IBroadcastReceiver <int> broadcastReceiver7    = commGroups[7].GetBroadcastReceiver <int>(broadcastOperatorName);
            IReduceSender <int>      triangleNumberSender7 = commGroups[7].GetReduceSender <int>(reduceOperatorName);

            IBroadcastReceiver <int> broadcastReceiver8    = commGroups[8].GetBroadcastReceiver <int>(broadcastOperatorName);
            IReduceSender <int>      triangleNumberSender8 = commGroups[8].GetReduceSender <int>(reduceOperatorName);

            IBroadcastReceiver <int> broadcastReceiver9    = commGroups[9].GetBroadcastReceiver <int>(broadcastOperatorName);
            IReduceSender <int>      triangleNumberSender9 = commGroups[9].GetReduceSender <int>(reduceOperatorName);

            for (int i = 1; i <= 10; i++)
            {
                broadcastSender.Send(i);

                int n1 = broadcastReceiver1.Receive();
                int n2 = broadcastReceiver2.Receive();
                int n3 = broadcastReceiver3.Receive();
                int n4 = broadcastReceiver4.Receive();
                int n5 = broadcastReceiver5.Receive();
                int n6 = broadcastReceiver6.Receive();
                int n7 = broadcastReceiver7.Receive();
                int n8 = broadcastReceiver8.Receive();
                int n9 = broadcastReceiver9.Receive();
                Assert.Equal(i, n1);
                Assert.Equal(i, n2);
                Assert.Equal(i, n3);
                Assert.Equal(i, n4);
                Assert.Equal(i, n5);
                Assert.Equal(i, n6);
                Assert.Equal(i, n7);
                Assert.Equal(i, n8);
                Assert.Equal(i, n9);

                int triangleNum9 = GroupCommunicationTests.TriangleNumber(n9);
                triangleNumberSender9.Send(triangleNum9);

                int triangleNum8 = GroupCommunicationTests.TriangleNumber(n8);
                triangleNumberSender8.Send(triangleNum8);

                int triangleNum7 = GroupCommunicationTests.TriangleNumber(n7);
                triangleNumberSender7.Send(triangleNum7);

                int triangleNum6 = GroupCommunicationTests.TriangleNumber(n6);
                triangleNumberSender6.Send(triangleNum6);

                int triangleNum5 = GroupCommunicationTests.TriangleNumber(n5);
                triangleNumberSender5.Send(triangleNum5);

                int triangleNum4 = GroupCommunicationTests.TriangleNumber(n4);
                triangleNumberSender4.Send(triangleNum4);

                int triangleNum3 = GroupCommunicationTests.TriangleNumber(n3);
                triangleNumberSender3.Send(triangleNum3);

                int triangleNum2 = GroupCommunicationTests.TriangleNumber(n2);
                triangleNumberSender2.Send(triangleNum2);

                int triangleNum1 = GroupCommunicationTests.TriangleNumber(n1);
                triangleNumberSender1.Send(triangleNum1);

                int sum      = sumReducer.Reduce();
                int expected = GroupCommunicationTests.TriangleNumber(i) * (numTasks - 1);
                Assert.Equal(sum, expected);
            }
        }
        public void TestBroadcastOperator()
        {
            string groupName    = "group1";
            string operatorName = "broadcast";
            string driverId     = "driverId";
            string masterTaskId = "task0";
            int    numTasks     = 10;
            int    value1       = 1337;
            int    value2       = 42;
            int    value3       = 99;
            int    fanOut       = 3;

            var groupCommDriver = GroupCommunicationTests.GetInstanceOfGroupCommDriver(driverId, masterTaskId, groupName, fanOut, numTasks);

            ICommunicationGroupDriver commGroup = groupCommDriver.DefaultGroup
                                                  .AddBroadcast <int>(operatorName, masterTaskId, TopologyTypes.Tree, GetDefaultDataConverterConfig(), GetDefaultReduceFuncConfig())
                                                  .Build();

            var commGroups = GroupCommunicationTests.CommGroupClients(groupName, numTasks, groupCommDriver, commGroup, GetDefaultCodecConfig());

            IBroadcastSender <int>   sender    = commGroups[0].GetBroadcastSender <int>(operatorName);
            IBroadcastReceiver <int> receiver1 = commGroups[1].GetBroadcastReceiver <int>(operatorName);
            IBroadcastReceiver <int> receiver2 = commGroups[2].GetBroadcastReceiver <int>(operatorName);
            IBroadcastReceiver <int> receiver3 = commGroups[3].GetBroadcastReceiver <int>(operatorName);
            IBroadcastReceiver <int> receiver4 = commGroups[4].GetBroadcastReceiver <int>(operatorName);
            IBroadcastReceiver <int> receiver5 = commGroups[5].GetBroadcastReceiver <int>(operatorName);
            IBroadcastReceiver <int> receiver6 = commGroups[6].GetBroadcastReceiver <int>(operatorName);
            IBroadcastReceiver <int> receiver7 = commGroups[7].GetBroadcastReceiver <int>(operatorName);
            IBroadcastReceiver <int> receiver8 = commGroups[8].GetBroadcastReceiver <int>(operatorName);
            IBroadcastReceiver <int> receiver9 = commGroups[9].GetBroadcastReceiver <int>(operatorName);

            Assert.NotNull(sender);
            Assert.NotNull(receiver1);
            Assert.NotNull(receiver2);
            Assert.NotNull(receiver3);
            Assert.NotNull(receiver4);
            Assert.NotNull(receiver5);
            Assert.NotNull(receiver6);
            Assert.NotNull(receiver7);
            Assert.NotNull(receiver8);
            Assert.NotNull(receiver9);

            sender.Send(value1);
            Assert.Equal(value1, receiver1.Receive());
            Assert.Equal(value1, receiver2.Receive());
            Assert.Equal(value1, receiver3.Receive());
            Assert.Equal(value1, receiver4.Receive());
            Assert.Equal(value1, receiver5.Receive());
            Assert.Equal(value1, receiver6.Receive());
            Assert.Equal(value1, receiver7.Receive());
            Assert.Equal(value1, receiver8.Receive());
            Assert.Equal(value1, receiver9.Receive());

            sender.Send(value2);
            Assert.Equal(value2, receiver1.Receive());
            Assert.Equal(value2, receiver2.Receive());
            Assert.Equal(value2, receiver3.Receive());
            Assert.Equal(value2, receiver4.Receive());
            Assert.Equal(value2, receiver5.Receive());
            Assert.Equal(value2, receiver6.Receive());
            Assert.Equal(value2, receiver7.Receive());
            Assert.Equal(value2, receiver8.Receive());
            Assert.Equal(value2, receiver9.Receive());

            sender.Send(value3);
            Assert.Equal(value3, receiver1.Receive());
            Assert.Equal(value3, receiver2.Receive());
            Assert.Equal(value3, receiver3.Receive());
            Assert.Equal(value3, receiver4.Receive());
            Assert.Equal(value3, receiver5.Receive());
            Assert.Equal(value3, receiver6.Receive());
            Assert.Equal(value3, receiver7.Receive());
            Assert.Equal(value3, receiver8.Receive());
            Assert.Equal(value3, receiver9.Receive());
        }