public void SimpleTwoTwoEach()
        {
            Func <SDChaindcode, SDEndorserState> es = ServiceDiscovery.ENDORSEMENT_SELECTION_LEAST_REQUIRED_BLOCKHEIGHT;

            List <SDLayout>   lol      = new List <SDLayout>();
            SDLayout          sdLayout = new SDLayout();
            List <SDEndorser> sdl      = new List <SDEndorser>();

            sdl.Add(new MockSDEndorser("org1", "localhost:80", 20));
            sdl.Add(new MockSDEndorser("org1", "localhost:81", 20));
            sdLayout.AddGroup("G1", 2, sdl);
            sdl = new List <SDEndorser>();
            sdl.Add(new MockSDEndorser("org2", "otherhost:90", 20));
            sdl.Add(new MockSDEndorser("org2", "otherhost:91", 20));
            sdLayout.AddGroup("G2", 2, sdl);
            lol.Add(sdLayout);
            SDChaindcode      cc = new SDChaindcode("fakecc", lol);
            SDEndorserState   sdEndorserState = es(cc);
            List <SDEndorser> sdEndorsers     = sdEndorserState.SDEndorsers;

            Assert.AreEqual(4, sdEndorsers.Count);
            Assert.IsTrue(sdLayout == sdEndorserState.PickedLayout);

            Assert.AreEqual(FilterByEndpoint(sdEndorsers, "localhost").Count, 2);
            Assert.AreEqual(FilterByEndpoint(sdEndorsers, "otherhost").Count, 2);
        }
        public void simpleOneTwoEachRandom()
        {
            Func <SDChaindcode, SDEndorserState> es = ServiceDiscovery.ENDORSEMENT_SELECTION_RANDOM;

            List <SDLayout>   lol      = new List <SDLayout>();
            SDLayout          sdLayout = new SDLayout();
            List <SDEndorser> sdl      = new List <SDEndorser>();

            sdl.Add(new MockSDEndorser("org1", "localhost:80", 20));
            sdl.Add(new MockSDEndorser("org1", "localhost:81", 20));
            sdLayout.AddGroup("G1", 1, sdl);
            sdl = new List <SDEndorser>();
            sdl.Add(new MockSDEndorser("org2", "otherhost:90", 20));
            sdl.Add(new MockSDEndorser("org2", "otherhost:91", 20));
            sdLayout.AddGroup("G2", 2, sdl);
            lol.Add(sdLayout);
            SDChaindcode cc = new SDChaindcode("fakecc", lol);

            for (int i = 64; i > 0; --i)
            {
                SDEndorserState   sdEndorserState = es(cc);
                List <SDEndorser> sdEndorsers     = sdEndorserState.SDEndorsers;
                Assert.AreEqual(3, sdEndorsers.Count);
                Assert.IsTrue(sdLayout == sdEndorserState.PickedLayout);

                Assert.AreEqual(FilterByEndpoint(sdEndorsers, "localhost").Count, 1);
                Assert.AreEqual(FilterByEndpoint(sdEndorsers, "otherhost").Count, 2);
            }
        }
        public void twoLayoutTwoTwoEachExtrasCommon()
        {
            Func <SDChaindcode, SDEndorserState> es = ServiceDiscovery.ENDORSEMENT_SELECTION_LEAST_REQUIRED_BLOCKHEIGHT;

            List <SDLayout>   lol      = new List <SDLayout>();
            SDLayout          sdLayout = new SDLayout();
            List <SDEndorser> sdl      = new List <SDEndorser>();

            sdl.Add(new MockSDEndorser("org1", "localhost:80", 20));
            sdl.Add(new MockSDEndorser("org1", "localhost:81", 20));
            sdl.Add(new MockSDEndorser("org1", "localhost:83", 20));
            sdLayout.AddGroup("G1", 3, sdl); // << 3 needed
            sdl = new List <SDEndorser>();
            sdl.Add(new MockSDEndorser("org2", "otherhost:93", 20));
            sdl.Add(new MockSDEndorser("org2", "otherhost:90", 20));
            sdl.Add(new MockSDEndorser("org1", "commonHost:82", 20));

            sdLayout.AddGroup("G2", 2, sdl);
            lol.Add(sdLayout);

            sdLayout = new SDLayout(); // another layout the above needs 3
            sdl      = new List <SDEndorser>();
            sdl.Add(new MockSDEndorser("org1", "l2localhost:80", 20));
            sdl.Add(new MockSDEndorser("org1", "l2localhost:81", 20));
            sdl.Add(new MockSDEndorser("org1", "l2commonHost:82", 20));
            sdLayout.AddGroup("G1", 2, sdl);
            sdl = new List <SDEndorser>();
            sdl.Add(new MockSDEndorser("org2", "l2otherhost:93", 20));
            sdl.Add(new MockSDEndorser("org2", "l2otherhost:90", 20));
            sdl.Add(new MockSDEndorser("org1", "l2commonHost:82", 20));

            sdLayout.AddGroup("G2", 2, sdl);
            lol.Add(sdLayout);

            SDChaindcode      cc = new SDChaindcode("fakecc", lol);
            SDEndorserState   sdEndorserState = es(cc);
            List <SDEndorser> sdEndorsers     = sdEndorserState.SDEndorsers;

            Assert.AreEqual(3, sdEndorsers.Count);
            Assert.IsTrue(sdLayout == sdEndorserState.PickedLayout);

            Assert.AreEqual(FilterByEndpoint(sdEndorsers, "l2localhost").Count, 1);
            Assert.AreEqual(FilterByEndpoint(sdEndorsers, "l2otherhost").Count, 1);
            Assert.AreEqual(FilterByEndpoint(sdEndorsers, "l2commonHost").Count, 1);
        }
        public void twoLayoutTwoTwoEachExtrasCommonRandom()
        {
            Func <SDChaindcode, SDEndorserState> es = ServiceDiscovery.ENDORSEMENT_SELECTION_RANDOM;

            List <SDLayout>   lol      = new List <SDLayout>();
            SDLayout          sdLayout = new SDLayout();
            List <SDEndorser> sdl      = new List <SDEndorser>();

            sdl.Add(new MockSDEndorser("org1", "localhost:80", 20));
            sdl.Add(new MockSDEndorser("org1", "localhost:81", 20));
            sdl.Add(new MockSDEndorser("org1", "localhost:83", 20));
            sdLayout.AddGroup("G1", 3, sdl); // << 3 needed
            sdl = new List <SDEndorser>();
            sdl.Add(new MockSDEndorser("org2", "otherhost:93", 20));
            sdl.Add(new MockSDEndorser("org2", "otherhost:90", 20));
            sdl.Add(new MockSDEndorser("org2", "otherhost:82", 20));

            sdLayout.AddGroup("G2", 2, sdl);
            lol.Add(sdLayout);

            sdLayout = new SDLayout(); // another layout the above needs 3
            sdl      = new List <SDEndorser>();
            sdl.Add(new MockSDEndorser("org1", "l2localhost:80", 20));
            sdl.Add(new MockSDEndorser("org1", "l2localhost:81", 20));
            sdl.Add(new MockSDEndorser("org1", "l2localhost:82", 20));
            sdLayout.AddGroup("G1", 1, sdl);
            sdl = new List <SDEndorser>();
            sdl.Add(new MockSDEndorser("org2", "l2otherhost:93", 20));
            sdl.Add(new MockSDEndorser("org2", "l2otherhost:90", 20));
            sdl.Add(new MockSDEndorser("org1", "l2otherhost:82", 20));

            sdLayout.AddGroup("G2", 2, sdl);
            lol.Add(sdLayout);

            SDChaindcode cc = new SDChaindcode("fakecc", lol);

            for (int i = 64; i > 0; --i)
            {
                SDEndorserState   sdEndorserState = es(cc);
                List <SDEndorser> sdEndorsers     = sdEndorserState.SDEndorsers;

                Assert.IsTrue(FilterByEndpoint(sdEndorsers, "localhost").Count == 3 && FilterByEndpoint(sdEndorsers, "otherhost").Count == 2 || FilterByEndpoint(sdEndorsers, "l2localhost").Count == 1 && FilterByEndpoint(sdEndorsers, "l2otherhost").Count == 2);
            }
        }