internal static async Task MembershipTable_UpdateRow(IMembershipTable membership)
        {
            MembershipEntry data = CreateMembershipEntryForTest();

            MembershipTableData tableData = await membership.ReadAll();
            //TableVersion tableVer = tableData.Version;
            Assert.IsNotNull(tableData.Version, "TableVersion should not be null");
            Assert.AreEqual(0, tableData.Version.Version, "TableVersion should be zero");
            Assert.AreEqual(0, tableData.Members.Count, "Should be no data initially: {0}", tableData);

            TableVersion newTableVer = tableData.Version.Next();
            logger.Info("Calling InsertRow with Entry = {0} TableVersion = {1}", data, newTableVer);
            bool ok = await membership.InsertRow(data, newTableVer);

            Assert.IsTrue(ok, "InsertRow OK");

            tableData = await membership.ReadAll();
            Assert.IsNotNull(tableData.Version, "TableVersion should not be null");
            Assert.AreEqual(1, tableData.Version.Version, "TableVersion should be 1");
            Assert.AreEqual(1, tableData.Members.Count, "Should be one row after insert: {0}", tableData);

            Tuple<MembershipEntry, string> insertedData = tableData.Get(data.SiloAddress);
            Assert.IsNotNull(insertedData.Item2, "ETag should not be null");
            insertedData.Item1.Status = SiloStatus.Active;

            newTableVer = tableData.Version.Next();

            logger.Info("Calling UpdateRow with Entry = {0} eTag = {1} New TableVersion={2}", insertedData.Item1, insertedData.Item2, newTableVer);
            ok = await membership.UpdateRow(insertedData.Item1, insertedData.Item2, newTableVer);

            tableData = await membership.ReadAll();
            Assert.IsNotNull(tableData.Version, "TableVersion should not be null");
            Assert.AreEqual(2, tableData.Version.Version, "TableVersion should be 2");
            Assert.AreEqual(1, tableData.Members.Count, "Should be one row after insert: {0}", tableData);

            Assert.IsTrue(ok, "UpdateRow OK - Table Data = {0}", tableData);
        }
        private async Task MembershipTable_UpdateRow(IMembershipTable membership)
        {
            MembershipEntry MembershipEntry = CreateMembershipEntryForTest();

            MembershipTableData MembershipData = await membership.ReadAll();
            TableVersion tableVer = MembershipData.Version;
            Assert.AreEqual(0, MembershipData.Members.Count, "Should be no data initially: {0}", MembershipData);

            logger.Info("Calling InsertRow with Entry = {0} TableVersion = {1}", MembershipEntry, tableVer);
            bool ok = await membership.InsertRow(MembershipEntry, tableVer);

            Assert.IsTrue(ok, "InsertRow OK");

            MembershipData = await membership.ReadAll();
            Assert.AreEqual(1, MembershipData.Members.Count, "Should be one row after insert: {0}", MembershipData);

            Tuple<MembershipEntry, string> newEntryData = MembershipData.Get(MembershipEntry.SiloAddress);
            string eTag = newEntryData.Item2;
            Assert.IsNotNull(eTag, "ETag should not be null");

            tableVer = MembershipData.Version;
            Assert.IsNotNull(tableVer, "TableVersion should not be null");
            tableVer = tableVer.Next();

            MembershipEntry = CreateMembershipEntryForTest();
            MembershipEntry.Status = SiloStatus.Active;

            logger.Info("Calling UpdateRow with Entry = {0} eTag = {1} New TableVersion={2}", MembershipEntry, eTag, tableVer);
            ok = await membership.UpdateRow(MembershipEntry, eTag, tableVer);

            MembershipData = await membership.ReadAll();
            Assert.AreEqual(1, MembershipData.Members.Count, "Should be one row after update: {0}", MembershipData);

            Assert.IsTrue(ok, "UpdateRow OK - Table Data = {0}", MembershipData);
        }
        protected async Task MembershipTable_UpdateRow(bool extendedProtocol = true)
        {
            var tableData = await membershipTable.ReadAll();

            Assert.NotNull(tableData.Version);

            Assert.Equal(0, tableData.Version.Version);
            Assert.Equal(0, tableData.Members.Count);

            for (int i = 1; i < 10; i++)
            {
                var siloEntry = CreateMembershipEntryForTest();

                siloEntry.SuspectTimes =
                    new List <Tuple <SiloAddress, DateTime> >
                {
                    new Tuple <SiloAddress, DateTime>(CreateSiloAddressForTest(), GetUtcNowWithSecondsResolution().AddSeconds(1)),
                    new Tuple <SiloAddress, DateTime>(CreateSiloAddressForTest(), GetUtcNowWithSecondsResolution().AddSeconds(2))
                };

                TableVersion tableVersion = tableData.Version.Next();

                logger.Info("Calling InsertRow with Entry = {0} TableVersion = {1}", siloEntry, tableVersion);
                bool ok = await membershipTable.InsertRow(siloEntry, tableVersion);

                Assert.True(ok, "InsertRow failed");

                tableData = await membershipTable.ReadAll();

                var etagBefore = tableData.Get(siloEntry.SiloAddress).Item2;

                Assert.NotNull(etagBefore);

                if (extendedProtocol)
                {
                    logger.Info("Calling UpdateRow with Entry = {0} correct eTag = {1} old version={2}", siloEntry,
                                etagBefore, tableVersion != null ? tableVersion.ToString() : "null");
                    ok = await membershipTable.UpdateRow(siloEntry, etagBefore, tableVersion);

                    Assert.False(ok, $"row update should have failed - Table Data = {tableData}");
                    tableData = await membershipTable.ReadAll();
                }

                tableVersion = tableData.Version.Next();

                logger.Info("Calling UpdateRow with Entry = {0} correct eTag = {1} correct version={2}", siloEntry,
                            etagBefore, tableVersion != null ? tableVersion.ToString() : "null");

                ok = await membershipTable.UpdateRow(siloEntry, etagBefore, tableVersion);

                Assert.True(ok, $"UpdateRow failed - Table Data = {tableData}");

                logger.Info("Calling UpdateRow with Entry = {0} old eTag = {1} old version={2}", siloEntry,
                            etagBefore, tableVersion != null ? tableVersion.ToString() : "null");
                ok = await membershipTable.UpdateRow(siloEntry, etagBefore, tableVersion);

                Assert.False(ok, $"row update should have failed - Table Data = {tableData}");

                tableData = await membershipTable.ReadAll();

                var tuple = tableData.Get(siloEntry.SiloAddress);

                Assert.Equal(tuple.Item1.ToFullString(true), siloEntry.ToFullString(true));

                var etagAfter = tuple.Item2;

                if (extendedProtocol)
                {
                    logger.Info("Calling UpdateRow with Entry = {0} correct eTag = {1} old version={2}", siloEntry,
                                etagAfter, tableVersion != null ? tableVersion.ToString() : "null");

                    ok = await membershipTable.UpdateRow(siloEntry, etagAfter, tableVersion);

                    Assert.False(ok, $"row update should have failed - Table Data = {tableData}");
                }

                tableData = await membershipTable.ReadAll();

                etagBefore = etagAfter;

                etagAfter = tableData.Get(siloEntry.SiloAddress).Item2;

                Assert.Equal(etagBefore, etagAfter);
                Assert.NotNull(tableData.Version);
                if (extendedProtocol)
                {
                    Assert.Equal(tableVersion.Version, tableData.Version.Version);
                }

                Assert.Equal(i, tableData.Members.Count);
            }
        }