Пример #1
0
        public void RTableDeleteSync()
        {
            string firstName = "FirstName04";
            string lastName = "LastName04";
            string email = "*****@*****.**";
            string phone = "1-800-123-0004";

            // Insert entity
            CustomerEntity newCustomer = new CustomerEntity(firstName, lastName);
            newCustomer.Email = email;
            newCustomer.PhoneNumber = phone;

            TableOperation operation = TableOperation.InsertOrReplace(newCustomer);
            TableResult result = repTable.Execute(operation);
            Assert.AreNotEqual(null, result, "result = null");

            ReplicatedTableEntity row = (ReplicatedTableEntity)result.Result;

            Assert.AreNotEqual(result, null);
            Assert.AreNotEqual(result.HttpStatusCode, 503);
            Assert.AreNotEqual(result.Result, null);
            Assert.AreEqual(result.Etag, "1");
            Assert.AreEqual(row._rtable_RowLock, false);
            Assert.AreEqual(row._rtable_Version, 1);
            Assert.AreEqual(row._rtable_Tombstone, false);
            Assert.AreEqual(row._rtable_ViewId, this.rtableTestConfiguration.RTableInformation.ViewId);

            Assert.AreEqual((int)HttpStatusCode.NoContent, result.HttpStatusCode, "result.HttpStatusCode mismatch");
            Assert.AreNotEqual(null, result.Result, "result.Result = null");
            Assert.AreEqual("1", result.Etag, "result.Etag mismatch");
            Assert.AreEqual(false, row._rtable_RowLock, "row._rtable_RowLock mismatch");
            Assert.AreEqual(1, row._rtable_Version, "row._rtable_Version mismatch");
            Assert.AreEqual(false, row._rtable_Tombstone, "row._rtable_Tombstone mismatch");
            Assert.AreEqual(this.rtableTestConfiguration.RTableInformation.ViewId, row._rtable_ViewId, "row._rtable_ViewId mismatch");

            // Delete operation
            Console.WriteLine("Calling TableOperation.Delete(newCustomer)...");
            newCustomer = new CustomerEntity(firstName, lastName);
            newCustomer.ETag = result.Etag;
            operation = TableOperation.Delete(newCustomer);
            TableResult deleteResult = repTable.Execute(operation);

            Assert.AreNotEqual(null, deleteResult, "deleteResult = null");
            Assert.AreEqual((int)HttpStatusCode.NoContent, deleteResult.HttpStatusCode, "deleteResult.HttpStatusCode mismatch");
            Assert.IsNotNull(deleteResult.Result, "deleteResult.Result = null");

            // Retrieve
            Console.WriteLine("Calling TableOperation.Retrieve() after Delete() was called...");
            operation = TableOperation.Retrieve<CustomerEntity>(firstName, lastName);
            TableResult retrievedResult2 = repTable.Execute(operation);
            Assert.AreEqual((int)HttpStatusCode.NotFound, retrievedResult2.HttpStatusCode, "retrievedResult2.HttpStatusCode mismatch");
            Assert.IsNull(retrievedResult2.Result, "retrievedResult2.Result != null");
        }
Пример #2
0
        public void ReplaceUsingLargerViewId()
        {
            long currentViewId = 100;
            long futureViewId = currentViewId + 1;

            this.UpdateConfiguration(replicas, 0, false, currentViewId);

            string firstName = "FirstName02";
            string lastName = "LastName02";
            string email = "*****@*****.**";
            string phone = "1-800-123-0001";

            // Insert entity
            CustomerEntity newCustomer = new CustomerEntity(firstName, lastName);
            newCustomer.Email = email;
            newCustomer.PhoneNumber = phone;

            TableOperation operation = TableOperation.Insert(newCustomer);
            TableResult result = this.repTable.Execute(operation);
            Assert.AreNotEqual(null, result, "result = null");
            ReplicatedTableEntity row = (ReplicatedTableEntity)result.Result;
            Assert.AreEqual((int)HttpStatusCode.NoContent, result.HttpStatusCode, "result.HttpStatusCode mismatch");
            Assert.AreNotEqual(null, result.Result, "result.Result = null");
            Assert.AreEqual("1", result.Etag, "result.Etag mismatch");
            Assert.AreEqual(false, row._rtable_RowLock, "row._rtable_RowLock mismatch");
            Assert.AreEqual(1, row._rtable_Version, "row._rtable_Version mismatch");
            Assert.AreEqual(false, row._rtable_Tombstone, "row._rtable_Tombstone mismatch");
            Assert.AreEqual(currentViewId, row._rtable_ViewId, "row._rtable_ViewId mismatch");
            Console.WriteLine("Successfully created an entity");

            // Retrieve entity
            operation = TableOperation.Retrieve<CustomerEntity>(firstName, lastName);
            TableResult retrievedResult = this.repTable.Execute(operation);
            Assert.AreNotEqual(null, retrievedResult, "retrievedResult = null");
            CustomerEntity customer = (CustomerEntity)retrievedResult.Result;

            Assert.AreEqual((int)HttpStatusCode.OK, retrievedResult.HttpStatusCode, "retrievedResult.HttpStatusCode mismatch");
            Assert.AreNotEqual(null, retrievedResult.Result, "retrievedResult.Result = null");
            Assert.AreEqual("1", retrievedResult.Etag, "retrievedResult.Etag mismatch");
            Assert.AreEqual(false, customer._rtable_RowLock, "customer._rtable_RowLock mismatch");
            Assert.AreEqual(1, customer._rtable_Version, "customer._rtable_Version mismatch");
            Assert.AreEqual(false, customer._rtable_Tombstone, "customer._rtable_Tombstone mismatch");
            Assert.AreEqual(currentViewId, customer._rtable_ViewId, "customer._rtable_ViewId mismatch");
            Assert.AreEqual(newCustomer.PhoneNumber, customer.PhoneNumber, "customer.PhoneNumber mismatch");
            Assert.AreEqual(newCustomer.Email, customer.Email, "customer.Email mismatch");
            Console.WriteLine("Successfully retrieved the entity");

            //
            // Call ModifyConfigurationBlob to change the viewId of the wrapper to a larger value
            //
            Console.WriteLine("Changing the viewId to futureViewId {0}", futureViewId);
            this.UpdateConfiguration(replicas, 0, false, futureViewId);

            //
            // Replace entity
            //
            Console.WriteLine("\nCalling Replace with larger viewId...");
            email = "*****@*****.**";
            phone = "1-800-123-0002";
            customer.Email = email;
            customer.PhoneNumber = phone;
            operation = TableOperation.Replace(customer);
            result = repTable.Execute(operation);
            Assert.AreNotEqual(null, result, "result = null");

            Assert.AreEqual((int)HttpStatusCode.NoContent, result.HttpStatusCode, "result.HttpStatusCode mismatch");
            Assert.AreNotEqual(null, result.Result, "result.Result = null");

            // Retrieve Entity
            Console.WriteLine("\nCalling Retrieve() with larger viewId...");
            operation = TableOperation.Retrieve<CustomerEntity>(firstName, lastName);
            retrievedResult = repTable.Execute(operation);
            Assert.AreNotEqual(null, retrievedResult, "retrievedResult = null");
            CustomerEntity customer2 = (CustomerEntity)retrievedResult.Result;

            Assert.AreEqual((int)HttpStatusCode.OK, retrievedResult.HttpStatusCode, "retrievedResult.HttpStatusCode mismatch");
            Assert.AreNotEqual(null, retrievedResult.Result, "retrievedResult.Result = null");
            Assert.AreEqual("2", retrievedResult.Etag, "retrievedResult.Etag mismatch");
            Assert.AreEqual(false, customer2._rtable_RowLock, "customer2._rtable_RowLock mismatch");
            Assert.AreEqual(2, customer2._rtable_Version, "customer2._rtable_Version mismatch");
            Assert.AreEqual(false, customer2._rtable_Tombstone, "customer2._rtable_Tombstone mismatch");
            Assert.AreEqual(futureViewId, customer2._rtable_ViewId, "customer2._rtable_ViewId mismatch");
            Assert.AreEqual(phone, customer2.PhoneNumber, "customer2.PhoneNumber mismatch");
            Assert.AreEqual(email, customer2.Email, "customer2.Email mismatch");
            Console.WriteLine("Successfully retrieved the entity");

            //
            // Delete entity
            //
            Console.WriteLine("\nCalling Delete with larger viewId...");
            operation = TableOperation.Delete(customer);
            TableResult deleteResult = repTable.Execute(operation);
            Assert.AreNotEqual(null, deleteResult, "deleteResult = null");
            Assert.AreEqual((int)HttpStatusCode.NoContent, deleteResult.HttpStatusCode, "deleteResult.HttpStatusCode mismatch");
            Assert.IsNotNull(deleteResult.Result, "deleteResult.Result = null");

            // Retrieve
            Console.WriteLine("Calling TableOperation.Retrieve() after Delete() was called...");
            operation = TableOperation.Retrieve<CustomerEntity>(firstName, lastName);
            TableResult retrievedResult2 = repTable.Execute(operation);
            Assert.AreEqual((int)HttpStatusCode.NotFound, retrievedResult2.HttpStatusCode, "retrievedResult2.HttpStatusCode mismatch");
            Assert.IsNull(retrievedResult2.Result, "retrievedResult2.Result != null");
        }
Пример #3
0
        public void ExceptionWhenUsingSmallerViewId()
        {
            long currentViewId = 100;
            long badViewId = currentViewId - 1;

            this.UpdateConfiguration(replicas, 0, false, currentViewId);

            string firstName = "FirstName01";
            string lastName = "LastName01";
            string email = "*****@*****.**";
            string phone = "1-800-123-0001";

            // Insert entity
            CustomerEntity newCustomer = new CustomerEntity(firstName, lastName);
            newCustomer.Email = email;
            newCustomer.PhoneNumber = phone;

            TableOperation operation = TableOperation.Insert(newCustomer);
            TableResult result = this.repTable.Execute(operation);
            Assert.AreNotEqual(null, result, "result = null");
            ReplicatedTableEntity row = (ReplicatedTableEntity)result.Result;
            Assert.AreEqual((int)HttpStatusCode.NoContent, result.HttpStatusCode, "result.HttpStatusCode mismatch");
            Assert.AreNotEqual(null, result.Result, "result.Result = null");
            Assert.AreEqual("1", result.Etag, "result.Etag mismatch");
            Assert.AreEqual(false, row._rtable_RowLock, "row._rtable_RowLock mismatch");
            Assert.AreEqual(1, row._rtable_Version, "row._rtable_Version mismatch");
            Assert.AreEqual(false, row._rtable_Tombstone, "row._rtable_Tombstone mismatch");
            Assert.AreEqual(currentViewId, row._rtable_ViewId, "row._rtable_ViewId mismatch");
            Console.WriteLine("Successfully created an entity");

            // Retrieve entity
            operation = TableOperation.Retrieve<CustomerEntity>(firstName, lastName);
            TableResult retrievedResult = this.repTable.Execute(operation);
            Assert.AreNotEqual(null, retrievedResult, "retrievedResult = null");
            CustomerEntity customer = (CustomerEntity)retrievedResult.Result;

            Assert.AreEqual((int)HttpStatusCode.OK, retrievedResult.HttpStatusCode, "retrievedResult.HttpStatusCode mismatch");
            Assert.AreNotEqual(null, retrievedResult.Result, "retrievedResult.Result = null");
            Assert.AreEqual("1", retrievedResult.Etag, "retrievedResult.Etag mismatch");
            Assert.AreEqual(false, customer._rtable_RowLock, "customer._rtable_RowLock mismatch");
            Assert.AreEqual(1, customer._rtable_Version, "customer._rtable_Version mismatch");
            Assert.AreEqual(false, customer._rtable_Tombstone, "customer._rtable_Tombstone mismatch");
            Assert.AreEqual(currentViewId, customer._rtable_ViewId, "customer._rtable_ViewId mismatch");
            Assert.AreEqual(newCustomer.PhoneNumber, customer.PhoneNumber, "customer.PhoneNumber mismatch");
            Assert.AreEqual(newCustomer.Email, customer.Email, "customer.Email mismatch");
            Console.WriteLine("Successfully retrieved the entity");

            //
            // Call RefreshRTableEnvJsonConfigBlob to change the viewId of the wrapper to an older value
            //
            Console.WriteLine("Changing the viewId to badViewId {0}", badViewId);
            this.UpdateConfiguration(replicas, 0, false, badViewId);

            //
            // Retrieve with bad viewId
            //
            Console.WriteLine("\nCalling Retrieve with badViewId...");
            operation = TableOperation.Retrieve<CustomerEntity>(firstName, lastName);
            try
            {
                retrievedResult = this.repTable.Execute(operation);
                Assert.Fail("Retrieve() is expected to get an RTableStaleViewException but did not get it.");
            }
            catch (ReplicatedTableStaleViewException ex)
            {
                Console.WriteLine("Get this RTableStaleViewException: {0}", ex.Message);
                Assert.IsTrue(ex.Message.Contains(string.Format("current _rtable_ViewId {0} is smaller than", badViewId)), "Got unexpected exception message");
            }

            //
            // Replace with bad viewId
            //
            Console.WriteLine("\nCalling Replace with badViewId...");
            operation = TableOperation.Replace(customer);
            try
            {
                retrievedResult = this.repTable.Execute(operation);
                Assert.Fail("Replace() is expected to get an RTableStaleViewException but did not get it.");
            }
            catch (ReplicatedTableStaleViewException ex)
            {
                Console.WriteLine("Get this RTableStaleViewException: {0}", ex.Message);
                Assert.IsTrue(ex.Message.Contains(string.Format("current _rtable_ViewId {0} is smaller than", badViewId)), "Got unexpected exception message");
            }

            //
            // InsertOrMerge with bad viewId
            //
            Console.WriteLine("\nCalling InsertOrMerge with badViewId...");
            operation = TableOperation.InsertOrMerge(customer);
            try
            {
                retrievedResult = this.repTable.Execute(operation);
                Assert.Fail("InsertOrMerge() is expected to get an RTableStaleViewException but did not get it.");
            }
            catch (ReplicatedTableStaleViewException ex)
            {
                Console.WriteLine("Get this RTableStaleViewException: {0}", ex.Message);
                Assert.IsTrue(ex.Message.Contains(string.Format("current _rtable_ViewId {0} is smaller than", badViewId)), "Got unexpected exception message");
            }

            //
            // InsertOrReplace with bad viewId
            //
            Console.WriteLine("\nCalling InsertOrReplace with badViewId...");
            operation = TableOperation.InsertOrReplace(customer);
            try
            {
                retrievedResult = this.repTable.Execute(operation);
                Assert.Fail("InsertOrReplace() is expected to get an RTableStaleViewException but did not get it.");
            }
            catch (ReplicatedTableStaleViewException ex)
            {
                Console.WriteLine("Get this RTableStaleViewException: {0}", ex.Message);
                Assert.IsTrue(ex.Message.Contains(string.Format("current _rtable_ViewId {0} is smaller than", badViewId)), "Got unexpected exception message");
            }

            //
            // Merge with bad viewId
            //
            Console.WriteLine("\nCalling Merge with badViewId...");
            operation = TableOperation.Merge(customer);
            try
            {
                retrievedResult = this.repTable.Execute(operation);
                Assert.Fail("Merge() is expected to get an RTableStaleViewException but did not get it.");
            }
            catch (ReplicatedTableStaleViewException ex)
            {
                Console.WriteLine("Get this RTableStaleViewException: {0}", ex.Message);
                Assert.IsTrue(ex.Message.Contains(string.Format("current _rtable_ViewId {0} is smaller than", badViewId)), "Got unexpected exception message");
            }

            //
            // Delete with bad viewId
            //
            Console.WriteLine("\nCalling Delete with badViewId...");
            operation = TableOperation.Delete(customer);
            try
            {
                retrievedResult = this.repTable.Execute(operation);
                Assert.Fail("Delete() is expected to get an RTableStaleViewException but did not get it.");
            }
            catch (ReplicatedTableStaleViewException ex)
            {
                Console.WriteLine("Get this RTableStaleViewException: {0}", ex.Message);
                Assert.IsTrue(ex.Message.Contains(string.Format("current _rtable_ViewId {0} is smaller than", badViewId)), "Got unexpected exception message");
            }
        }
Пример #4
0
        public void XStoreCRUDTest()
        {
            CloudTableClient tableClient = this.cloudTableClients[0];
            CloudTable table = tableClient.GetTableReference(this.repTable.TableName);

            string firstName = "FirstNameXStore";
            string lastName = "LastNameXStore";
            string email = "*****@*****.**";
            string phone = "1-800-123-0001";
            CustomerEntity newCustomer = new CustomerEntity(firstName, lastName);
            newCustomer.Email = email;
            newCustomer.PhoneNumber = phone;

            // XStore Insert
            Console.WriteLine("Calling XStore Insert...");
            TableOperation insertOperation = TableOperation.Insert(newCustomer);
            TableResult insertResult = table.Execute(insertOperation);

            Assert.IsNotNull(insertResult, "insertResult = null");
            Console.WriteLine("insertResult.HttpStatusCode = {0}", insertResult.HttpStatusCode);
            Console.WriteLine("insertResult.ETag = {0}", insertResult.Etag);
            Assert.AreEqual((int)HttpStatusCode.NoContent, insertResult.HttpStatusCode, "insertResult.HttpStatusCode mismatch");
            Assert.IsFalse(string.IsNullOrEmpty(insertResult.Etag), "insertResult.ETag = null or empty");

            ITableEntity row = (ITableEntity)insertResult.Result;
            Assert.IsNotNull(row, "insertResult.Result = null");
            Console.WriteLine("row.PartitionKey = {0}", row.PartitionKey);
            Console.WriteLine("row.RowKey = {0}", row.RowKey);

            CustomerEntity customer = (CustomerEntity)insertResult.Result;
            Assert.IsNotNull(customer, "Insert: customer = null");
            Console.WriteLine("Insert: customer.Email = {0}", customer.Email);
            Console.WriteLine("Insert: customer.PhoneNumber = {0}", customer.PhoneNumber);
            Assert.AreEqual(newCustomer.Email, customer.Email, "Insert: customer.Email mismatch");
            Assert.AreEqual(newCustomer.PhoneNumber, customer.PhoneNumber, "Insert: customer.PhoneNumber mismatch");

            // Retrieve
            Console.WriteLine("Calling XStore Retrieve...");
            TableOperation retrieveOperation = TableOperation.Retrieve<CustomerEntity>(row.PartitionKey, row.RowKey);
            TableResult retrieveResult = table.Execute(retrieveOperation);
            Assert.IsNotNull(retrieveResult, "retrieveResult = null");
            Console.WriteLine("retrieveResult.HttpStatusCode = {0}", retrieveResult.HttpStatusCode);
            Assert.AreEqual((int)HttpStatusCode.OK, retrieveResult.HttpStatusCode, "retrieveResult.HttpStatusCode mismatch");
            customer = (CustomerEntity)retrieveResult.Result;
            Assert.IsNotNull(customer, "Retrieve: customer = null");
            Console.WriteLine("Retrieve: customer.Email = {0}", customer.Email);
            Console.WriteLine("Retrieve: customer.PhoneNumber = {0}", customer.PhoneNumber);
            Assert.AreEqual(newCustomer.Email, customer.Email, "Retrieve: customer.Email mismatch");
            Assert.AreEqual(newCustomer.PhoneNumber, customer.PhoneNumber, "Retrieve: customer.PhoneNumber mismatch");

            // Replace entity
            Console.WriteLine("Calling XStore Replace...");
            string email2 = "*****@*****.**";
            string phone2 = "1-800-123-0002";
            customer.PhoneNumber = phone2;
            customer.Email = email2;
            TableOperation updateOperation = TableOperation.Replace(customer);
            TableResult updateResult = table.Execute(updateOperation);
            Assert.IsNotNull(updateResult, "updateResult = null");
            Console.WriteLine("updateResult.HttpStatusCode = {0}", updateResult.HttpStatusCode);
            Assert.AreEqual((int)HttpStatusCode.NoContent, updateResult.HttpStatusCode, "updateResult.HttpStatusCode mismatch");

            // Retrieve after Replace
            Console.WriteLine("Calling XStore Retrieve after Replace was called...");
            retrieveOperation = TableOperation.Retrieve<CustomerEntity>(row.PartitionKey, row.RowKey);
            retrieveResult = table.Execute(retrieveOperation);
            Assert.IsNotNull(retrieveResult, "RetrieveAfterReplace: retrieveResult = null");
            Console.WriteLine("RetrieveAfterReplace: retrieveResult.HttpStatusCode = {0}", retrieveResult.HttpStatusCode);
            Assert.AreEqual((int)HttpStatusCode.OK, retrieveResult.HttpStatusCode, "RetrieveAfterReplace: retrieveResult.HttpStatusCode mismatch");
            CustomerEntity customer2 = (CustomerEntity)retrieveResult.Result;
            Assert.IsNotNull(customer2, "RetrieveAfterReplace: customer2 = null");
            Console.WriteLine("RetrieveAfterReplace: customer2.Email = {0}", customer2.Email);
            Console.WriteLine("RetrieveAfterReplace: customer2.PhoneNumber = {0}", customer2.PhoneNumber);
            Assert.AreEqual(email2, customer2.Email, "RetrieveAfterReplace: customer2.Email mismatch");
            Assert.AreEqual(phone2, customer2.PhoneNumber, "RetrieveAfterReplace: customer2.PhoneNumber mismatch");

            // Delete
            Console.WriteLine("Calling XStore Delete...");
            TableOperation deleteOperation = TableOperation.Delete(customer2);
            TableResult deleteResult = table.Execute(deleteOperation);
            Assert.IsNotNull(deleteResult, "deleteResult = null");
            Console.WriteLine("deleteResult.HttpStatusCode = {0}", deleteResult.HttpStatusCode);
            Assert.AreEqual((int)HttpStatusCode.NoContent, deleteResult.HttpStatusCode, "deleteResult.HttpStatusCode mismatch");

            // Retrieve after Delete
            Console.WriteLine("Calling XStore Retrieve after Delete was called...");
            retrieveOperation = TableOperation.Retrieve<CustomerEntity>(row.PartitionKey, row.RowKey);
            retrieveResult = table.Execute(retrieveOperation);
            Assert.IsNotNull(retrieveResult, "RetrieveAfterDelete: retrieveResult = null");
            Console.WriteLine("RetrieveAfterDelete: retrieveResult.HttpStatusCode = {0}", retrieveResult.HttpStatusCode);
            Assert.AreEqual((int)HttpStatusCode.NotFound, retrieveResult.HttpStatusCode, "RetrieveAfterDelete: retrieveResult.HttpStatusCode mismatch");
            CustomerEntity customer3 = (CustomerEntity)retrieveResult.Result;
            Assert.IsNull(customer3, "RetrieveAfterDelete: customer3 != null");

            // Replace after Delete
            Console.WriteLine("Calling XStore Replace after Delete...");
            updateOperation = TableOperation.Replace(customer2);
            try
            {
                updateResult = table.Execute(updateOperation);
                Assert.Fail("RetrieveAfterDelete: table.Execute() should throw.");
            }
            catch (Exception ex)
            {
                WebException webEx = ex.InnerException as WebException;
                if (webEx != null)
                {
                    Console.WriteLine("webEx.Message = {0}", webEx.Message);
                    HttpWebResponse webResponse = webEx.Response as HttpWebResponse;
                    if (webResponse != null)
                    {
                        Console.WriteLine("webResponse.StatusCode = {0}", webResponse.StatusCode);
                        Assert.AreEqual(HttpStatusCode.NotFound.ToString(), webResponse.StatusCode.ToString(), "RetrieveAfterDelete: webResponse.StatusCode mismatch");
                    }
                    Assert.NotNull(webResponse, "RetrieveAfterDelete: WebResponse is null");
                }
                Assert.NotNull(webEx, "RetrieveAfterDelete: StorageException was not a WebException");
            }
        }
Пример #5
0
        public void RTableReplaceWithStarEtagSync()
        {
            // Insert entity
            string firstName = "FirstName03_star";
            string lastName = "LastName03_star";
            string email = "*****@*****.**";
            string phone = "1-800-123-0003";

            CustomerEntity newCustomer = new CustomerEntity(firstName, lastName);
            newCustomer.Email = email;
            newCustomer.PhoneNumber = phone;

            TableOperation operation = TableOperation.Insert(newCustomer);
            TableResult result = repTable.Execute(operation);
            Assert.AreNotEqual(null, result, "result = null");
            ReplicatedTableEntity row = (ReplicatedTableEntity)result.Result;

            Assert.AreEqual((int)HttpStatusCode.NoContent, result.HttpStatusCode, "result.HttpStatusCode mismatch");
            Assert.AreNotEqual(null, result.Result, "result.Result = null");
            Assert.AreEqual("1", result.Etag, "result.Etag mismatch");
            Assert.AreEqual(false, row._rtable_RowLock, "row._rtable_RowLock mismatch");
            Assert.AreEqual(1, row._rtable_Version, "row._rtable_Version mismatch");
            Assert.AreEqual(false, row._rtable_Tombstone, "row._rtable_Tombstone mismatch");
            Assert.AreEqual(this.rtableTestConfiguration.RTableInformation.ViewId, row._rtable_ViewId, "row._rtable_ViewId mismatch");

            // Replace entity
            Console.WriteLine("Calling TableOperation.Replace(newCustomer)...");
            email = "*****@*****.**";
            phone = "1-800-456-0003";
            newCustomer = new CustomerEntity(firstName, lastName);
            newCustomer.Email = email;
            newCustomer.PhoneNumber = phone;
            newCustomer.ETag = "*";
            operation = TableOperation.Replace(newCustomer);
            result = repTable.Execute(operation);
            Assert.AreNotEqual(null, result, "result = null");

            Assert.AreEqual((int)HttpStatusCode.NoContent, result.HttpStatusCode, "result.HttpStatusCode mismatch");
            Assert.AreNotEqual(null, result.Result, "result.Result = null");

            // Retrieve Entity
            Console.WriteLine("Calling TableOperation.Retrieve<CustomerEntity>(firstName, lastName)...");
            operation = TableOperation.Retrieve<CustomerEntity>(firstName, lastName);
            TableResult retrievedResult = repTable.Execute(operation);
            Assert.AreNotEqual(null, retrievedResult, "retrievedResult = null");

            CustomerEntity customer = (CustomerEntity)retrievedResult.Result;

            Assert.AreEqual((int)HttpStatusCode.OK, retrievedResult.HttpStatusCode, "retrievedResult.HttpStatusCode mismatch");
            Assert.AreNotEqual(null, retrievedResult.Result, "retrievedResult.Result = null");
            Assert.AreEqual("2", retrievedResult.Etag, "retrievedResult.Etag mismatch");
            Assert.AreEqual(false, customer._rtable_RowLock, "customer._rtable_RowLock mismatch");
            Assert.AreEqual(2, customer._rtable_Version, "customer._rtable_Version mismatch");
            Assert.AreEqual(false, customer._rtable_Tombstone, "customer._rtable_Tombstone mismatch");
            Assert.AreEqual(this.rtableTestConfiguration.RTableInformation.ViewId, customer._rtable_ViewId, "customer._rtable_ViewId mismatch");
            Assert.AreEqual(newCustomer.PhoneNumber, customer.PhoneNumber, "customer.PhoneNumber mismatch");
            Assert.AreEqual(newCustomer.Email, customer.Email, "customer.Email mismatch");

            customer.Email = "*****@*****.**";
            // Replace again
            Console.WriteLine("Calling TableOperation.Replace after Retrieve...");
            operation = TableOperation.Replace(customer);
            result = repTable.Execute(operation);
            Assert.AreNotEqual(null, result, "result = null");
            Assert.IsTrue(result.HttpStatusCode == (int)HttpStatusCode.NoContent || result.HttpStatusCode == (int)HttpStatusCode.OK,
                "result.HttpStatusCode mismatch");

            //Non-gen Retrieve and Replace with star
            Console.WriteLine("Calling TableOperation.Retrieve(firstName, lastName)...");
            operation = TableOperation.Retrieve(firstName, lastName);
            retrievedResult = repTable.Execute(operation);
            Assert.AreNotEqual(null, retrievedResult, "retrievedResult = null");
            DynamicReplicatedTableEntity dynCustomer = (DynamicReplicatedTableEntity)retrievedResult.Result;
            Assert.AreEqual((int)HttpStatusCode.OK, retrievedResult.HttpStatusCode, "retrievedResult.HttpStatusCode mismatch");
            Assert.AreNotEqual(null, retrievedResult.Result, "retrievedResult.Result = null");
            Assert.AreEqual("3", retrievedResult.Etag, "retrievedResult.Etag mismatch");
            Assert.AreEqual(false, dynCustomer._rtable_RowLock, "dynCustomer._rtable_RowLock mismatch");
            Assert.AreEqual(3, dynCustomer._rtable_Version, "dynCustomer._rtable_Version mismatch");
            Assert.AreEqual(false, dynCustomer._rtable_Tombstone, "dynCustomer._rtable_Tombstone mismatch");
            Assert.AreEqual(this.rtableTestConfiguration.RTableInformation.ViewId, dynCustomer._rtable_ViewId, "customer._rtable_ViewId mismatch");
            Assert.AreEqual(customer.PhoneNumber, dynCustomer.Properties["PhoneNumber"].StringValue, "dynCustomer.PhoneNumber mismatch");
            Assert.AreEqual(customer.Email, dynCustomer.Properties["Email"].StringValue, "dynCustomer.Email mismatch");

            dynCustomer.Properties["Email"] = EntityProperty.CreateEntityPropertyFromObject("*****@*****.**");
            dynCustomer.ETag = "*";

            // Replace again
            Console.WriteLine("Calling TableOperation.Replace after Retrieve...");

            operation = TableOperation.Replace(dynCustomer);
            result = repTable.Execute(operation);
            Assert.AreNotEqual(null, result, "result = null");
            Console.WriteLine("Foo - returned status: {0}", result.HttpStatusCode);
            Assert.IsTrue(result.HttpStatusCode == (int)HttpStatusCode.NoContent || result.HttpStatusCode == (int)HttpStatusCode.OK,
                "result.HttpStatusCode mismatch");
        }
Пример #6
0
        public void RTableInsertOrReplaceSync()
        {
            string firstName = "FirstName01";
            string lastName = "LastName01";
            string email = "*****@*****.**";
            string phone = "1-800-123-0001";

            string dynamicFirstName = "DynFirstName01";
            string dynamicLastName = "DynLastName01";
            string dynamicEmail = "*****@*****.**";
            string dynamicPhone = "1-800-123-0002";

            // Insert entity
            CustomerEntity newCustomer = new CustomerEntity(firstName, lastName);
            newCustomer.Email = email;
            newCustomer.PhoneNumber = phone;

            TableOperation operation = TableOperation.Insert(newCustomer);
            TableResult result = repTable.Execute(operation);
            Assert.AreNotEqual(null, result, "result = null");
            ReplicatedTableEntity row = (ReplicatedTableEntity)result.Result;
            Assert.AreEqual((int)HttpStatusCode.NoContent, result.HttpStatusCode, "result.HttpStatusCode mismatch");
            Assert.AreNotEqual(null, result.Result, "result.Result = null");
            Assert.AreEqual("1", result.Etag, "result.Etag mismatch");
            Assert.AreEqual(false, row._rtable_RowLock, "row._rtable_RowLock mismatch");
            Assert.AreEqual(1, row._rtable_Version, "row._rtable_Version mismatch");
            Assert.AreEqual(false, row._rtable_Tombstone, "row._rtable_Tombstone mismatch");
            Assert.AreEqual(this.rtableTestConfiguration.RTableInformation.ViewId, row._rtable_ViewId, "row._rtable_ViewId mismatch");

            //Non-generic retrieve
            operation = TableOperation.Retrieve(firstName, lastName);
            TableResult retrievedResult = this.repTable.Execute(operation);
            Assert.AreNotEqual(null, retrievedResult, "retrievedResult = null");
            Assert.IsTrue(retrievedResult.Result is IReplicatedTableEntity, "Expected entity to be of type IReplicatedTableEntity");
            DynamicReplicatedTableEntity readRow = retrievedResult.Result as DynamicReplicatedTableEntity;
            Assert.IsTrue(readRow.ETag == "1", "Returned etag is not zero");
            Assert.IsTrue(readRow.Properties.ContainsKey("Email"), "DynamicRTableEntity returned didnt contain Email");
            Assert.IsTrue(readRow.Properties.ContainsKey("PhoneNumber"), "DynamicRTableEntity returned didnt contain PhoneNumber");
            Assert.IsTrue(readRow.Properties.Count == 2, "DynamicRTableEntity returned contained diff number of properties");

            ////Dynamic insert entity
            DynamicReplicatedTableEntity newDynamicCustomer = new DynamicReplicatedTableEntity(dynamicFirstName, dynamicLastName);
            newDynamicCustomer.Properties["Email"] = EntityProperty.CreateEntityPropertyFromObject(dynamicEmail);
            newDynamicCustomer.Properties["PhoneNumber"] = EntityProperty.CreateEntityPropertyFromObject(dynamicPhone);

            operation = TableOperation.Insert(newDynamicCustomer);
            result = repTable.Execute(operation);
            Assert.AreNotEqual(null, result, "result = null");
            row = (DynamicReplicatedTableEntity)result.Result;
            Assert.AreEqual((int)HttpStatusCode.NoContent, result.HttpStatusCode, "result.HttpStatusCode mismatch");
            Assert.AreNotEqual(null, result.Result, "result.Result = null");
            Assert.AreEqual("1", result.Etag, "result.Etag mismatch");
            Assert.AreEqual(false, row._rtable_RowLock, "row._rtable_RowLock mismatch");
            Assert.AreEqual(1, row._rtable_Version, "row._rtable_Version mismatch");
            Assert.AreEqual(false, row._rtable_Tombstone, "row._rtable_Tombstone mismatch");
            Assert.AreEqual(this.rtableTestConfiguration.RTableInformation.ViewId, row._rtable_ViewId, "row._rtable_ViewId mismatch");

            //Non-generic retrieve for dynamic entity
            operation = TableOperation.Retrieve(dynamicFirstName, dynamicLastName);
            retrievedResult = this.repTable.Execute(operation);
            Assert.AreNotEqual(null, retrievedResult, "retrievedResult = null");
            Assert.IsTrue(retrievedResult.Result is IReplicatedTableEntity, "Expected entity to be of type IReplicatedTableEntity");
            readRow = retrievedResult.Result as DynamicReplicatedTableEntity;
            Assert.IsTrue(readRow.ETag == "1", "Returned etag is not zero");
            Assert.IsTrue(readRow.Properties.ContainsKey("Email"), "DynamicRTableEntity returned didnt contain Email");
            Assert.IsTrue(readRow.Properties.ContainsKey("PhoneNumber"), "DynamicRTableEntity returned didnt contain PhoneNumber");
            Assert.IsTrue(readRow.Properties.Count == 2, "DynamicRTableEntity returned contained diff number of properties");

            // Retrieve entity
            operation = TableOperation.Retrieve<CustomerEntity>(firstName, lastName);
            retrievedResult = this.repTable.Execute(operation);
            Assert.AreNotEqual(null, retrievedResult, "retrievedResult = null");
            CustomerEntity customer = (CustomerEntity)retrievedResult.Result;

            Assert.AreEqual((int)HttpStatusCode.OK, retrievedResult.HttpStatusCode, "retrievedResult.HttpStatusCode mismatch");
            Assert.AreNotEqual(null, retrievedResult.Result, "retrievedResult.Result = null");
            Assert.AreEqual("1", retrievedResult.Etag, "retrievedResult.Etag mismatch");
            Assert.AreEqual(false, customer._rtable_RowLock, "customer._rtable_RowLock mismatch");
            Assert.AreEqual(1, customer._rtable_Version, "customer._rtable_Version mismatch");
            Assert.AreEqual(false, customer._rtable_Tombstone, "customer._rtable_Tombstone mismatch");
            Assert.AreEqual(this.rtableTestConfiguration.RTableInformation.ViewId, customer._rtable_ViewId, "customer._rtable_ViewId mismatch");
            Assert.AreEqual(newCustomer.PhoneNumber, customer.PhoneNumber, "customer.PhoneNumber mismatch");
            Assert.AreEqual(newCustomer.Email, customer.Email, "customer.Email mismatch");

            // Update the entity
            email = "*****@*****.**";
            phone = "1-800-456-0001";
            newCustomer = new CustomerEntity(firstName, lastName);
            newCustomer.Email = email;
            newCustomer.PhoneNumber = phone;

            // InsertOrReplace
            Console.WriteLine("Calling TableOperation.InsertOrReplace(newCustomer)...");
            operation = TableOperation.InsertOrReplace(newCustomer);
            result = this.repTable.Execute(operation);
            Assert.AreNotEqual(result, null);
            row = (ReplicatedTableEntity)result.Result;

            Assert.AreEqual((int)HttpStatusCode.NoContent, result.HttpStatusCode, "result.HttpStatusCode mismatch");
            Assert.AreNotEqual(null, result.Result, "result.Result = null");
            Assert.AreEqual("2", result.Etag, "result.Etag mismatch");
            Assert.AreEqual(false, row._rtable_RowLock, "row._rtable_RowLock mismatch");
            Assert.AreEqual(2, row._rtable_Version, "row._rtable_Version mismatch");
            Assert.AreEqual(false, row._rtable_Tombstone, "row._rtable_Tombstone mismatch");
            Assert.AreEqual(this.rtableTestConfiguration.RTableInformation.ViewId, row._rtable_ViewId, "row._rtable_ViewId mismatch");

            // Retrieve entity
            Console.WriteLine("Calling Retrieve...");
            operation = TableOperation.Retrieve<CustomerEntity>(firstName, lastName);
            retrievedResult = this.repTable.Execute(operation);
            Assert.AreNotEqual(null, retrievedResult, "retrievedResult = null");

            customer = (CustomerEntity)retrievedResult.Result;
            Assert.AreEqual((int)HttpStatusCode.OK, retrievedResult.HttpStatusCode, "retrievedResult.HttpStatusCode mismatch");
            Assert.AreNotEqual(null, retrievedResult.Result, "retrievedResult.Result = null");
            Assert.AreEqual("2", retrievedResult.Etag, "retrievedResult.Etag mismatch");
            Assert.AreEqual(false, customer._rtable_RowLock, "customer._rtable_RowLock mismatch");
            Assert.AreEqual(2, customer._rtable_Version, "customer._rtable_Version mismatch");
            Assert.AreEqual(false, customer._rtable_Tombstone, "customer._rtable_Tombstone mismatch");
            Assert.AreEqual(this.rtableTestConfiguration.RTableInformation.ViewId, customer._rtable_ViewId, "customer._rtable_ViewId mismatch");
            Assert.AreEqual(newCustomer.PhoneNumber, customer.PhoneNumber, "customer.PhoneNumber mismatch");
            Assert.AreEqual(newCustomer.Email, customer.Email, "customer.Email mismatch");
        }
Пример #7
0
        public void RTableInsertRetrieveSync()
        {
            string firstName = "FirstName02";
            string lastName = "LastName02";
            string email = "*****@*****.**";
            string phone = "1-800-123-0002";

            // Insert entity
            CustomerEntity newCustomer = new CustomerEntity(firstName, lastName);
            newCustomer.Email = email;
            newCustomer.PhoneNumber = phone;
            TableOperation operation = TableOperation.Insert(newCustomer);
            TableResult result = repTable.Execute(operation);
            Assert.AreNotEqual(null, result, "result = null");
            ReplicatedTableEntity row = (ReplicatedTableEntity)result.Result;
            Assert.AreEqual((int)HttpStatusCode.NoContent, result.HttpStatusCode, "result.HttpStatusCode mismatch");
            Assert.AreNotEqual(null, result.Result, "result.Result = null");
            Assert.AreEqual("1", result.Etag, "result.Etag mismatch");
            Assert.AreEqual(false, row._rtable_RowLock, "row._rtable_RowLock mismatch");
            Assert.AreEqual(1, row._rtable_Version, "row._rtable_Version mismatch");
            Assert.AreEqual(false, row._rtable_Tombstone, "row._rtable_Tombstone mismatch");
            Assert.AreEqual(this.rtableTestConfiguration.RTableInformation.ViewId, row._rtable_ViewId, "row._rtable_ViewId mismatch");

            // Retrieve entity
            operation = TableOperation.Retrieve<CustomerEntity>(firstName, lastName);
            TableResult retrievedResult = repTable.Execute(operation);
            Assert.AreNotEqual(retrievedResult, null, "retrievedResult = null");
            CustomerEntity customer = (CustomerEntity)retrievedResult.Result;
            Assert.AreEqual((int)HttpStatusCode.OK, retrievedResult.HttpStatusCode, "retrievedResult.HttpStatusCode mismatch");
            Assert.AreNotEqual(null, retrievedResult.Result, "retrievedResult.Result = null");
            Assert.AreEqual("1", retrievedResult.Etag, "retrievedResult.Etag mismatch");
            Assert.AreEqual(false, customer._rtable_RowLock, "customer._rtable_RowLock mismatch");
            Assert.AreEqual(1, customer._rtable_Version, "customer._rtable_Version mismatch");
            Assert.AreEqual(customer._rtable_Version.ToString(), customer.ETag, "customer.Etag mismatch");
            Assert.AreEqual(false, customer._rtable_Tombstone, "customer._rtable_Tombstone mismatch");
            Assert.AreEqual(this.rtableTestConfiguration.RTableInformation.ViewId, customer._rtable_ViewId, "customer._rtable_ViewId mismatch");
            Assert.AreEqual(newCustomer.PhoneNumber, customer.PhoneNumber, "customer.PhoneNumber mismatch");
            Assert.AreEqual(newCustomer.Email, customer.Email, "customer.Email mismatch");

            Console.WriteLine("Duplicate insert...");
            // try insert again and it should fail
            result = repTable.Execute(TableOperation.Insert(customer));
            Assert.AreNotEqual(result, null, "result null for dup insert");
            Assert.AreEqual(result.HttpStatusCode, (int) HttpStatusCode.Conflict, "Duplicate insert should result in a conflict error. Error = {0}", result.HttpStatusCode);

            Console.WriteLine("Insert Dynamic entity...");
            // Insert Dynamic entity
            // Add insert
            string pk = Guid.NewGuid().ToString();
            DynamicReplicatedTableEntity sendEnt = GenerateRandomEnitity(pk);

            // generate a set of properties for all supported Types
            sendEnt.Properties = new ComplexIEntity().WriteEntity(null);
            result = repTable.Execute(TableOperation.Insert(sendEnt));
            Assert.AreNotEqual(result, null);
            DynamicReplicatedTableEntity currentRow = (DynamicReplicatedTableEntity)result.Result;
            Assert.AreEqual((int)HttpStatusCode.NoContent, result.HttpStatusCode, "result.HttpStatusCode mismatch");
            Assert.AreNotEqual(null, currentRow, "currentRow = null");
            Assert.AreEqual("1", result.Etag, "result.Result mismatch");
            Assert.AreEqual(false, currentRow._rtable_RowLock, "currentRow._rtable_RowLock mismatch");
            Assert.AreEqual(1, currentRow._rtable_Version, "currentRow._rtable_Version mismatch");
            Assert.AreEqual(false, currentRow._rtable_Tombstone, "currentRow._rtable_Tombstone mismatch");
            Assert.AreEqual(this.rtableTestConfiguration.RTableInformation.ViewId, currentRow._rtable_ViewId, "currentRow._rtable_ViewId mismatch");

            // Retrieve Dynamic entity
            operation = TableOperation.Retrieve<DynamicReplicatedTableEntity>(sendEnt.PartitionKey, sendEnt.RowKey);
            retrievedResult = repTable.Execute(operation);
            Assert.AreNotEqual(null, retrievedResult, "retrievedResult = null");
            DynamicReplicatedTableEntity retrievedEntity = retrievedResult.Result as DynamicReplicatedTableEntity;
            Assert.AreNotEqual(null, retrievedEntity, "retrievedEntity = null");

            // Validate entity
            Assert.AreEqual(sendEnt["String"], retrievedEntity["String"], "[String] mismatch");
            Assert.AreEqual(sendEnt["Int64"], retrievedEntity["Int64"], "[Int64] mismatch");
            Assert.AreEqual(sendEnt["Int64N"], retrievedEntity["Int64N"], "[Int64N] mismatch");
            Assert.AreEqual(sendEnt["LongPrimitive"], retrievedEntity["LongPrimitive"], "[LongPrimitive] mismatch");
            Assert.AreEqual(sendEnt["LongPrimitiveN"], retrievedEntity["LongPrimitiveN"], "[LongPrimitiveN] mismatch");
            Assert.AreEqual(sendEnt["Int32"], retrievedEntity["Int32"], "[Int32] mismatch");
            Assert.AreEqual(sendEnt["Int32N"], retrievedEntity["Int32N"], "[Int32N] mismatch");
            Assert.AreEqual(sendEnt["IntegerPrimitive"], retrievedEntity["IntegerPrimitive"], "[IntegerPrimitive] mismatch");
            Assert.AreEqual(sendEnt["IntegerPrimitiveN"], retrievedEntity["IntegerPrimitiveN"], "[IntegerPrimitiveN] mismatch");
            Assert.AreEqual(sendEnt["Guid"], retrievedEntity["Guid"], "[Guid] mismatch");
            Assert.AreEqual(sendEnt["GuidN"], retrievedEntity["GuidN"], "[GuidN] mismatch");
            Assert.AreEqual(sendEnt["Double"], retrievedEntity["Double"], "[Double] mismatch");
            Assert.AreEqual(sendEnt["DoubleN"], retrievedEntity["DoubleN"], "[DoubleN] mismatch");
            Assert.AreEqual(sendEnt["DoublePrimitive"], retrievedEntity["DoublePrimitive"], "[DoublePrimitive] mismatch");
            Assert.AreEqual(sendEnt["DoublePrimitiveN"], retrievedEntity["DoublePrimitiveN"], "[DoublePrimitiveN] mismatch");
            Assert.AreEqual(sendEnt["BinaryPrimitive"], retrievedEntity["BinaryPrimitive"], "[BinaryPrimitive] mismatch");
            Assert.AreEqual(sendEnt["Binary"], retrievedEntity["Binary"], "[Binary] mismatch");
            Assert.AreEqual(sendEnt["BoolPrimitive"], retrievedEntity["BoolPrimitive"], "[BoolPrimitive] mismatch");
            Assert.AreEqual(sendEnt["BoolPrimitiveN"], retrievedEntity["BoolPrimitiveN"], "[BoolPrimitiveN] mismatch");
            Assert.AreEqual(sendEnt["Bool"], retrievedEntity["Bool"], "[Bool] mismatch");
            Assert.AreEqual(sendEnt["BoolN"], retrievedEntity["BoolN"], "[BoolN] mismatch");
            Assert.AreEqual(sendEnt["DateTimeOffsetN"], retrievedEntity["DateTimeOffsetN"], "[DateTimeOffsetN] mismatch");
            Assert.AreEqual(sendEnt["DateTimeOffset"], retrievedEntity["DateTimeOffset"], "[DateTimeOffset] mismatch");
            Assert.AreEqual(sendEnt["DateTime"], retrievedEntity["DateTime"], "[DateTime] mismatch");
            Assert.AreEqual(sendEnt["DateTimeN"], retrievedEntity["DateTimeN"], "[DateTimeN] mismatch");
        }
Пример #8
0
        public void RepairTableWontRepairRowsWithHigherViewIdWhenIgnoreHigherViewIdRowsFlagIsSet()
        {
            TableOperation operation;
            TableResult    result;
            CustomerEntity customer;


            // - View has 2 replicas ?
            View view = this.configurationWrapper.GetWriteView();

            Assert.IsTrue(view.Chain.Count == 2, "expects 2 replicas only!");


            // - Remove the Head, [None]->[RW]
            RemoveHeadFromView(view.Name, 600, this.configurationService);


            // 1 - Insert entries in old viewId
            var rtable = new ReplicatedTable(this.repTable.TableName, this.configurationService);

            string firstName = "FirstName";
            string lastName  = "LastName";

            for (int i = 0; i < 10; i++)
            {
                customer = new CustomerEntity(firstName + i, lastName + i);

                operation = TableOperation.Insert(customer);
                rtable.Execute(operation);
            }


            // 2 - Increase viewId => so we can create rows with higher viewId
            //   - Update entry #5 and #8 in new viewId
            ReplicatedTableConfiguration    config;
            ReplicatedTableQuorumReadResult readStatus = this.configurationService.RetrieveConfiguration(out config);

            Assert.IsTrue(readStatus.Code == ReplicatedTableQuorumReadCode.Success);
            ReplicatedTableConfigurationStore viewConfg = config.GetView(view.Name);

            viewConfg.ViewId += 100;
            this.configurationService.UpdateConfiguration(config);

            foreach (int entryId in new int[] { 5, 8 })
            {
                operation = TableOperation.Retrieve <CustomerEntity>(firstName + entryId, lastName + entryId);
                result    = rtable.Execute(operation);

                Assert.IsTrue(result != null && result.HttpStatusCode == (int)HttpStatusCode.OK && (CustomerEntity)result.Result != null, "Retrieve customer failed");

                customer       = (CustomerEntity)result.Result;
                customer.Email = "*****@*****.**";

                operation = TableOperation.Replace(customer);
                result    = rtable.Execute(operation);

                Assert.IsTrue(result != null && result.HttpStatusCode == (int)HttpStatusCode.NoContent, "Update customer failed");
            }


            // 3 - Restore previous viewId, and,
            //   - Set 'IgnoreHigherViewIdRows' flag so we ignore rows with higher viewIds
            readStatus = this.configurationService.RetrieveConfiguration(out config);
            Assert.IsTrue(readStatus.Code == ReplicatedTableQuorumReadCode.Success);
            viewConfg         = config.GetView(view.Name);
            viewConfg.ViewId -= 100;
            config.SetIgnoreHigherViewIdRowsFlag(true);
            this.configurationService.UpdateConfiguration(config);

            try
            {
                // Check Retrieve of row #5 and #8 returns NotFound
                foreach (int entryId in new int[] { 5, 8 })
                {
                    operation = TableOperation.Retrieve <CustomerEntity>(firstName + entryId, lastName + entryId);
                    var retrievedResult = rtable.Execute(operation);

                    Assert.AreNotEqual(null, retrievedResult, "retrievedResult = null");
                    Assert.AreEqual((int)HttpStatusCode.NotFound, retrievedResult.HttpStatusCode, "retrievedResult.HttpStatusCode mismatch");
                }
            }
            catch (ReplicatedTableStaleViewException)
            {
                Assert.Fail("Retrieve() is expected to NotFound the row, but got RTableStaleViewException !");
            }


            // 4 - Now insert a Head [WO]->[RW]
            //   - Then, call RepairTable ...
            InsertHeadInView(view.Name, 600, this.configurationService);
            ReconfigurationStatus status = rtable.RepairTable(0, null);

            Assert.AreEqual(status, ReconfigurationStatus.PARTIAL_FAILURE, "rows with higher viewId should not be repaired");


            // 5 - Check rows with higher viewId still NotFound, even after repair ...
            try
            {
                // Check Retrieve of row #5 and #8 returns NotFound
                foreach (int entryId in new int[] { 5, 8 })
                {
                    operation = TableOperation.Retrieve <CustomerEntity>(firstName + entryId, lastName + entryId);
                    var retrievedResult = rtable.Execute(operation);

                    Assert.AreNotEqual(null, retrievedResult, "retrievedResult = null");
                    Assert.AreEqual((int)HttpStatusCode.NotFound, retrievedResult.HttpStatusCode, "retrievedResult.HttpStatusCode mismatch");
                }
            }
            catch (ReplicatedTableStaleViewException)
            {
                Assert.Fail("Retrieve() is expected to NotFound the row, but got RTableStaleViewException !");
            }
        }
Пример #9
0
        public void CaseNoRepair_ReadRowFromNewViewCutOffTailUpdateRow()
        {
            string firstName = "FirstName";
            string lastName  = "LastName";

            TableOperation operation;
            TableResult    result;
            CustomerEntity customer;

            // - View has 2 replicas ?
            View view = this.configurationWrapper.GetWriteView();

            Assert.IsTrue(view.Chain.Count == 2, "expects 2 replicas only!");


            // 1 - [None]->[RW]
            ReplicatedTableConfiguration config;

            this.configurationService.RetrieveConfiguration(out config);
            ReplicatedTableConfigurationStore viewConfg = config.GetView(view.Name);

            viewConfg.ReplicaChain[0].Status = ReplicaStatus.None;
            viewConfg.ViewId++;
            this.configurationService.UpdateConfiguration(config);

            // *** - Insert entries in old viewId
            var rtable = new ReplicatedTable(this.repTable.TableName, this.configurationService);

            for (int i = 0; i < 3; i++)
            {
                customer = new CustomerEntity(firstName + i, lastName + i);

                operation = TableOperation.Insert(customer);
                rtable.Execute(operation);
            }


            // 2 - Insert Head => [WO]->[RW]
            this.configurationService.RetrieveConfiguration(out config);
            viewConfg = config.GetView(view.Name);
            viewConfg.ReplicaChain[0].Status = ReplicaStatus.WriteOnly;
            viewConfg.ViewId++;
            this.configurationService.UpdateConfiguration(config);

            // *** - Insert entries in new viewId
            rtable = new ReplicatedTable(this.repTable.TableName, this.configurationService);
            for (int i = 10; i < 13; i++)
            {
                customer = new CustomerEntity(firstName + i, lastName + i);

                operation = TableOperation.Insert(customer);
                rtable.Execute(operation);
            }


            // => Read old entry - from Tail -
            int entryId = 10;

            operation = TableOperation.Retrieve <CustomerEntity>(firstName + entryId, lastName + entryId);
            result    = rtable.Execute(operation);


            // 3 - Cut-off Tail without repairing replicas
            configurationService.RetrieveConfiguration(out config);
            viewConfg = config.GetView(view.Name);
            viewConfg.ReplicaChain[0].Status = ReplicaStatus.ReadWrite;
            viewConfg.ReplicaChain[1].Status = ReplicaStatus.None;
            viewConfg.ViewId++;
            this.configurationService.UpdateConfiguration(config);

            // => Update the row
            customer       = (CustomerEntity)result.Result;
            customer.Email = "*****@*****.**";
            operation      = TableOperation.Replace(customer);
            result         = rtable.Execute(operation);
            Assert.IsTrue(result != null && result.HttpStatusCode == (int)HttpStatusCode.NoContent, "Update customer failed");
        }
Пример #10
0
        public void InsertInStaleViewConflictingWithInsertInNewView()
        {
            ReplicatedTableConfigurationServiceV2 configServiceOne, configServiceTwo;

            // setup:        Acc0       Acc1
            //  stale view = [None] ->  [RW]
            //  new view   = [WO]   ->  [RW]
            SetupStaleViewAndNewView(out configServiceOne, out configServiceTwo);

            long staleViewId  = configServiceOne.GetTableView(this.repTable.TableName).ViewId;
            long latestViewId = configServiceTwo.GetTableView(this.repTable.TableName).ViewId;

            string firstName = "FirstName01";
            string lastName  = "LastName01";

            var workerOne = new ReplicatedTable(this.repTable.TableName, configServiceOne);
            var workerTwo = new ReplicatedTable(this.repTable.TableName, configServiceTwo);

            string accountNameToTamper = this.rtableTestConfiguration.StorageInformation.AccountNames[1];

            Console.WriteLine("RunHttpManglerBehaviorHelper(): accountNameToTamper={0}", accountNameToTamper);

            TableResult oldInsertResult          = null;
            TableResult newInsertResult          = null;
            bool        triggerInsertWithNewView = false;
            bool        oldInsertResume          = false;

            // Start new newInsertTask in wait
            var newInsertTask = Task.Run(() =>
            {
                while (!triggerInsertWithNewView)
                {
                    Thread.Sleep(100);
                }

                /*
                 * 2 - Executes after step 1 below:
                 *     WorkerTwo => Insert a new row using new view
                 */
                var customer   = new CustomerEntity(firstName, lastName);
                customer.Email = "workerTwo";

                TableOperation operation = TableOperation.Insert(customer);
                newInsertResult          = workerTwo.Execute(operation);

                // Signal old Insert to resume
                oldInsertResume = true;
            });


            // Delay behavior
            ProxyBehavior[] behaviors =
            {
                TamperBehaviors.TamperAllRequestsIf(
                    (session =>
                {
                    // => trigger new insert to start
                    triggerInsertWithNewView = true;

                    // Delaying commit to the Tail by stale view Update
                    while (!oldInsertResume)
                    {
                        Thread.Sleep(100);
                    }
                }),
                    (session =>
                {
                    var body = session.GetRequestBodyAsString();

                    // Commit to Tail by stale view
                    if (session.hostname.Contains(accountNameToTamper + ".") &&
                        session.HTTPMethodIs("PUT") &&
                        body.Contains("\"Email\":\"workerOne\"") &&
                        body.Contains(string.Format("\"_rtable_ViewId\":\"{0}\"", staleViewId)) &&
                        body.Contains("\"_rtable_RowLock\":false"))
                    {
                        return(true);
                    }

                    return(false);
                })),
            };

            /*
             * 1 - WorkerOne => update an entry using the stale View
             */
            using (new HttpMangler(false, behaviors))
            {
                var customer = new CustomerEntity(firstName, lastName);
                customer.Email = "workerOne";

                TableOperation operation = TableOperation.Insert(customer);
                oldInsertResult = workerOne.Execute(operation);
            }

            // Wait on new Insert to finish
            newInsertTask.Wait();


            // Expected behavior:

            // Thread_1 (stale ViewId)
            Assert.IsNotNull(oldInsertResult, "oldInsertResult = null");
            Assert.AreEqual((int)HttpStatusCode.NoContent, oldInsertResult.HttpStatusCode, "oldInsertResult.HttpStatusCode mismatch");
            Console.WriteLine("Insert in stale View Succeeded with HttpStatus={0}", oldInsertResult.HttpStatusCode);

            // Thread_2 (new ViewId)
            Assert.IsNotNull(newInsertResult, "newInsertResult = null");
            Assert.AreEqual((int)HttpStatusCode.Conflict, newInsertResult.HttpStatusCode, "newUpdateResult.HttpStatusCode mismatch");
            Console.WriteLine("Insert in new View failed with HttpStatus={0}", newInsertResult.HttpStatusCode);

            var currCustomer = RetrieveCustomer(firstName, lastName, workerTwo);

            Assert.AreEqual(staleViewId, currCustomer._rtable_ViewId, "customer._rtable_ViewId mismatch");
            Assert.AreEqual("workerOne", currCustomer.Email, "customer.Email mismatch");

            Console.WriteLine("workerOne write Succeeded");
            Console.WriteLine("workerTwo got Conflict because row was lock.");
        }
Пример #11
0
        public void ConfigurationChangeNotificationAfterDetectingStaleView()
        {
            ReplicatedTableConfigurationServiceV2 configServiceOne, configServiceTwo;

            // setup:
            //  stale view = [None] ->  [RW]
            //  new view   = [WO]   ->  [RW]
            SetupStaleViewAndNewView(out configServiceOne, out configServiceTwo);

            long staleViewId  = configServiceOne.GetTableView(this.repTable.TableName).ViewId;
            long latestViewId = configServiceTwo.GetTableView(this.repTable.TableName).ViewId;

            string firstName = "FirstName01";
            string lastName  = "LastName01";

            /*
             * 1 - WorkerOne => inserts an entry using the stale View
             */
            var workerOne = new ReplicatedTable(this.repTable.TableName, configServiceOne);

            var customer = new CustomerEntity(firstName, lastName);

            customer.Email = "*****@*****.**";
            InsertCustormer(customer, workerOne);

            customer = RetrieveCustomer(firstName, lastName, workerOne);

            Assert.AreEqual(staleViewId, customer._rtable_ViewId, "customer._rtable_ViewId mismatch");
            Assert.AreEqual("*****@*****.**", customer.Email, "customer.Email mismatch");
            Console.WriteLine("workerOne inserted a customer in ViewId={0}", staleViewId);


            /*
             * 2 - WorkerTwo => updates the entry using latest View
             */
            var workerTwo = new ReplicatedTable(this.repTable.TableName, configServiceTwo);

            customer       = RetrieveCustomer(firstName, lastName, workerTwo);
            customer.Email = "*****@*****.**";
            UpdateCustomer(customer, workerTwo);

            customer = RetrieveCustomer(firstName, lastName, workerTwo);

            Assert.AreEqual(latestViewId, customer._rtable_ViewId, "customer._rtable_ViewId mismatch");
            Assert.AreEqual("*****@*****.**", customer.Email, "customer.Email mismatch");
            Console.WriteLine("workerTwo updated the customer in ViewId={0}", latestViewId);


            /*
             * 3 - WorkerOne => access existing entry using "the stale View"
             */
            try
            {
                customer = RetrieveCustomer(firstName, lastName, workerOne);
                Assert.Fail("Retrieve() is expected to get an RTableStaleViewException but did not get it.");
            }
            catch (ReplicatedTableStaleViewException ex)
            {
                Console.WriteLine("workerOne got exception: {0}", ex.Message);
                Assert.IsTrue(ex.ErrorCode == ReplicatedTableViewErrorCodes.ViewIdSmallerThanEntryViewId);
                Assert.IsTrue(ex.Message.Contains(string.Format("current _rtable_ViewId {0} is smaller than _rtable_ViewId of existing row {1}", staleViewId, latestViewId)), "Got unexpected exception message");
            }

            // Note:
            //  No need to test all table APIs since already covered by UT:
            //  => "Microsoft.Azure.Toolkit.Replication.Test.RTableViewIdTests.ExceptionWhenUsingSmallerViewId()"


            /*
             * 4 - Notify "configServiceOne" instance of config change
             */
            Assert.AreEqual(configServiceOne.GetTableView(this.repTable.TableName).ViewId, staleViewId, "we should see old View!!!");
            {
                configServiceOne.ConfigurationChangeNotification();
            }
            Assert.AreEqual(configServiceOne.GetTableView(this.repTable.TableName).ViewId, latestViewId, "we should see latest View!!!");


            /*
             * 5 - WorkerOne => updates the entry using latest View
             */
            customer       = RetrieveCustomer(firstName, lastName, workerTwo);
            customer.Email = "*****@*****.**";
            UpdateCustomer(customer, workerTwo);

            customer = RetrieveCustomer(firstName, lastName, workerTwo);

            Assert.AreEqual(latestViewId, customer._rtable_ViewId, "customer._rtable_ViewId mismatch");
            Assert.AreEqual("*****@*****.**", customer.Email, "customer.Email mismatch");
            Console.WriteLine("workerOne updated the customer in ViewId={0}", latestViewId);
        }
Пример #12
0
        public void ExceptionWhenUsingSmallerViewId()
        {
            long currentViewId = 100;
            long badViewId     = currentViewId - 1;

            this.UpdateConfiguration(replicas, 0, false, currentViewId);

            string firstName = "FirstName01";
            string lastName  = "LastName01";
            string email     = "*****@*****.**";
            string phone     = "1-800-123-0001";

            // Insert entity
            CustomerEntity newCustomer = new CustomerEntity(firstName, lastName);

            newCustomer.Email       = email;
            newCustomer.PhoneNumber = phone;

            TableOperation operation = TableOperation.Insert(newCustomer);
            TableResult    result    = this.repTable.Execute(operation);

            Assert.AreNotEqual(null, result, "result = null");
            ReplicatedTableEntity row = (ReplicatedTableEntity)result.Result;

            Assert.AreEqual((int)HttpStatusCode.NoContent, result.HttpStatusCode, "result.HttpStatusCode mismatch");
            Assert.AreNotEqual(null, result.Result, "result.Result = null");
            Assert.AreEqual("1", result.Etag, "result.Etag mismatch");
            Assert.AreEqual(false, row._rtable_RowLock, "row._rtable_RowLock mismatch");
            Assert.AreEqual(1, row._rtable_Version, "row._rtable_Version mismatch");
            Assert.AreEqual(false, row._rtable_Tombstone, "row._rtable_Tombstone mismatch");
            Assert.AreEqual(currentViewId, row._rtable_ViewId, "row._rtable_ViewId mismatch");
            Console.WriteLine("Successfully created an entity");

            // Retrieve entity
            operation = TableOperation.Retrieve <CustomerEntity>(firstName, lastName);
            TableResult retrievedResult = this.repTable.Execute(operation);

            Assert.AreNotEqual(null, retrievedResult, "retrievedResult = null");
            CustomerEntity customer = (CustomerEntity)retrievedResult.Result;

            Assert.AreEqual((int)HttpStatusCode.OK, retrievedResult.HttpStatusCode, "retrievedResult.HttpStatusCode mismatch");
            Assert.AreNotEqual(null, retrievedResult.Result, "retrievedResult.Result = null");
            Assert.AreEqual("1", retrievedResult.Etag, "retrievedResult.Etag mismatch");
            Assert.AreEqual(false, customer._rtable_RowLock, "customer._rtable_RowLock mismatch");
            Assert.AreEqual(1, customer._rtable_Version, "customer._rtable_Version mismatch");
            Assert.AreEqual(false, customer._rtable_Tombstone, "customer._rtable_Tombstone mismatch");
            Assert.AreEqual(currentViewId, customer._rtable_ViewId, "customer._rtable_ViewId mismatch");
            Assert.AreEqual(newCustomer.PhoneNumber, customer.PhoneNumber, "customer.PhoneNumber mismatch");
            Assert.AreEqual(newCustomer.Email, customer.Email, "customer.Email mismatch");
            Console.WriteLine("Successfully retrieved the entity");

            //
            // Call RefreshRTableEnvJsonConfigBlob to change the viewId of the wrapper to an older value
            //
            Console.WriteLine("Changing the viewId to badViewId {0}", badViewId);
            this.UpdateConfiguration(replicas, 0, false, badViewId);

            //
            // Retrieve with bad viewId
            //
            Console.WriteLine("\nCalling Retrieve with badViewId...");
            operation = TableOperation.Retrieve <CustomerEntity>(firstName, lastName);
            try
            {
                retrievedResult = this.repTable.Execute(operation);
                Assert.Fail("Retrieve() is expected to get an RTableStaleViewException but did not get it.");
            }
            catch (ReplicatedTableStaleViewException ex)
            {
                Console.WriteLine("Get this RTableStaleViewException: {0}", ex.Message);
                Assert.IsTrue(ex.ErrorCode == ReplicatedTableViewErrorCodes.ViewIdSmallerThanEntryViewId);
                Assert.IsTrue(ex.Message.Contains(string.Format("current _rtable_ViewId {0} is smaller than", badViewId)), "Got unexpected exception message");
            }

            //
            // Replace with bad viewId
            //
            Console.WriteLine("\nCalling Replace with badViewId...");
            operation = TableOperation.Replace(customer);
            try
            {
                retrievedResult = this.repTable.Execute(operation);
                Assert.Fail("Replace() is expected to get an RTableStaleViewException but did not get it.");
            }
            catch (ReplicatedTableStaleViewException ex)
            {
                Console.WriteLine("Get this RTableStaleViewException: {0}", ex.Message);
                Assert.IsTrue(ex.ErrorCode == ReplicatedTableViewErrorCodes.ViewIdSmallerThanEntryViewId);
                Assert.IsTrue(ex.Message.Contains(string.Format("current _rtable_ViewId {0} is smaller than", badViewId)), "Got unexpected exception message");
            }

            //
            // InsertOrMerge with bad viewId
            //
            Console.WriteLine("\nCalling InsertOrMerge with badViewId...");
            operation = TableOperation.InsertOrMerge(customer);
            try
            {
                retrievedResult = this.repTable.Execute(operation);
                Assert.Fail("InsertOrMerge() is expected to get an RTableStaleViewException but did not get it.");
            }
            catch (ReplicatedTableStaleViewException ex)
            {
                Console.WriteLine("Get this RTableStaleViewException: {0}", ex.Message);
                Assert.IsTrue(ex.ErrorCode == ReplicatedTableViewErrorCodes.ViewIdSmallerThanEntryViewId);
                Assert.IsTrue(ex.Message.Contains(string.Format("current _rtable_ViewId {0} is smaller than", badViewId)), "Got unexpected exception message");
            }

            //
            // InsertOrReplace with bad viewId
            //
            Console.WriteLine("\nCalling InsertOrReplace with badViewId...");
            operation = TableOperation.InsertOrReplace(customer);
            try
            {
                retrievedResult = this.repTable.Execute(operation);
                Assert.Fail("InsertOrReplace() is expected to get an RTableStaleViewException but did not get it.");
            }
            catch (ReplicatedTableStaleViewException ex)
            {
                Console.WriteLine("Get this RTableStaleViewException: {0}", ex.Message);
                Assert.IsTrue(ex.ErrorCode == ReplicatedTableViewErrorCodes.ViewIdSmallerThanEntryViewId);
                Assert.IsTrue(ex.Message.Contains(string.Format("current _rtable_ViewId {0} is smaller than", badViewId)), "Got unexpected exception message");
            }

            //
            // Merge with bad viewId
            //
            Console.WriteLine("\nCalling Merge with badViewId...");
            operation = TableOperation.Merge(customer);
            try
            {
                retrievedResult = this.repTable.Execute(operation);
                Assert.Fail("Merge() is expected to get an RTableStaleViewException but did not get it.");
            }
            catch (ReplicatedTableStaleViewException ex)
            {
                Console.WriteLine("Get this RTableStaleViewException: {0}", ex.Message);
                Assert.IsTrue(ex.ErrorCode == ReplicatedTableViewErrorCodes.ViewIdSmallerThanEntryViewId);
                Assert.IsTrue(ex.Message.Contains(string.Format("current _rtable_ViewId {0} is smaller than", badViewId)), "Got unexpected exception message");
            }

            //
            // Delete with bad viewId
            //
            Console.WriteLine("\nCalling Delete with badViewId...");
            operation = TableOperation.Delete(customer);
            try
            {
                retrievedResult = this.repTable.Execute(operation);
                Assert.Fail("Delete() is expected to get an RTableStaleViewException but did not get it.");
            }
            catch (ReplicatedTableStaleViewException ex)
            {
                Console.WriteLine("Get this RTableStaleViewException: {0}", ex.Message);
                Assert.IsTrue(ex.ErrorCode == ReplicatedTableViewErrorCodes.ViewIdSmallerThanEntryViewId);
                Assert.IsTrue(ex.Message.Contains(string.Format("current _rtable_ViewId {0} is smaller than", badViewId)), "Got unexpected exception message");
            }
        }
Пример #13
0
        public void ReplaceUsingLargerViewId()
        {
            long currentViewId = 100;
            long futureViewId  = currentViewId + 1;

            this.UpdateConfiguration(replicas, 0, false, currentViewId);

            string firstName = "FirstName02";
            string lastName  = "LastName02";
            string email     = "*****@*****.**";
            string phone     = "1-800-123-0001";

            // Insert entity
            CustomerEntity newCustomer = new CustomerEntity(firstName, lastName);

            newCustomer.Email       = email;
            newCustomer.PhoneNumber = phone;

            TableOperation operation = TableOperation.Insert(newCustomer);
            TableResult    result    = this.repTable.Execute(operation);

            Assert.AreNotEqual(null, result, "result = null");
            ReplicatedTableEntity row = (ReplicatedTableEntity)result.Result;

            Assert.AreEqual((int)HttpStatusCode.NoContent, result.HttpStatusCode, "result.HttpStatusCode mismatch");
            Assert.AreNotEqual(null, result.Result, "result.Result = null");
            Assert.AreEqual("1", result.Etag, "result.Etag mismatch");
            Assert.AreEqual(false, row._rtable_RowLock, "row._rtable_RowLock mismatch");
            Assert.AreEqual(1, row._rtable_Version, "row._rtable_Version mismatch");
            Assert.AreEqual(false, row._rtable_Tombstone, "row._rtable_Tombstone mismatch");
            Assert.AreEqual(currentViewId, row._rtable_ViewId, "row._rtable_ViewId mismatch");
            Console.WriteLine("Successfully created an entity");

            // Retrieve entity
            operation = TableOperation.Retrieve <CustomerEntity>(firstName, lastName);
            TableResult retrievedResult = this.repTable.Execute(operation);

            Assert.AreNotEqual(null, retrievedResult, "retrievedResult = null");
            CustomerEntity customer = (CustomerEntity)retrievedResult.Result;

            Assert.AreEqual((int)HttpStatusCode.OK, retrievedResult.HttpStatusCode, "retrievedResult.HttpStatusCode mismatch");
            Assert.AreNotEqual(null, retrievedResult.Result, "retrievedResult.Result = null");
            Assert.AreEqual("1", retrievedResult.Etag, "retrievedResult.Etag mismatch");
            Assert.AreEqual(false, customer._rtable_RowLock, "customer._rtable_RowLock mismatch");
            Assert.AreEqual(1, customer._rtable_Version, "customer._rtable_Version mismatch");
            Assert.AreEqual(false, customer._rtable_Tombstone, "customer._rtable_Tombstone mismatch");
            Assert.AreEqual(currentViewId, customer._rtable_ViewId, "customer._rtable_ViewId mismatch");
            Assert.AreEqual(newCustomer.PhoneNumber, customer.PhoneNumber, "customer.PhoneNumber mismatch");
            Assert.AreEqual(newCustomer.Email, customer.Email, "customer.Email mismatch");
            Console.WriteLine("Successfully retrieved the entity");

            //
            // Call ModifyConfigurationBlob to change the viewId of the wrapper to a larger value
            //
            Console.WriteLine("Changing the viewId to futureViewId {0}", futureViewId);
            this.UpdateConfiguration(replicas, 0, false, futureViewId);

            //
            // Replace entity
            //
            Console.WriteLine("\nCalling Replace with larger viewId...");
            email                = "*****@*****.**";
            phone                = "1-800-123-0002";
            customer.Email       = email;
            customer.PhoneNumber = phone;
            operation            = TableOperation.Replace(customer);
            result               = repTable.Execute(operation);
            Assert.AreNotEqual(null, result, "result = null");

            Assert.AreEqual((int)HttpStatusCode.NoContent, result.HttpStatusCode, "result.HttpStatusCode mismatch");
            Assert.AreNotEqual(null, result.Result, "result.Result = null");

            // Retrieve Entity
            Console.WriteLine("\nCalling Retrieve() with larger viewId...");
            operation       = TableOperation.Retrieve <CustomerEntity>(firstName, lastName);
            retrievedResult = repTable.Execute(operation);
            Assert.AreNotEqual(null, retrievedResult, "retrievedResult = null");
            CustomerEntity customer2 = (CustomerEntity)retrievedResult.Result;

            Assert.AreEqual((int)HttpStatusCode.OK, retrievedResult.HttpStatusCode, "retrievedResult.HttpStatusCode mismatch");
            Assert.AreNotEqual(null, retrievedResult.Result, "retrievedResult.Result = null");
            Assert.AreEqual("2", retrievedResult.Etag, "retrievedResult.Etag mismatch");
            Assert.AreEqual(false, customer2._rtable_RowLock, "customer2._rtable_RowLock mismatch");
            Assert.AreEqual(2, customer2._rtable_Version, "customer2._rtable_Version mismatch");
            Assert.AreEqual(false, customer2._rtable_Tombstone, "customer2._rtable_Tombstone mismatch");
            Assert.AreEqual(futureViewId, customer2._rtable_ViewId, "customer2._rtable_ViewId mismatch");
            Assert.AreEqual(phone, customer2.PhoneNumber, "customer2.PhoneNumber mismatch");
            Assert.AreEqual(email, customer2.Email, "customer2.Email mismatch");
            Console.WriteLine("Successfully retrieved the entity");

            //
            // Delete entity
            //
            Console.WriteLine("\nCalling Delete with larger viewId...");
            operation = TableOperation.Delete(customer);
            TableResult deleteResult = repTable.Execute(operation);

            Assert.AreNotEqual(null, deleteResult, "deleteResult = null");
            Assert.AreEqual((int)HttpStatusCode.NoContent, deleteResult.HttpStatusCode, "deleteResult.HttpStatusCode mismatch");
            Assert.IsNotNull(deleteResult.Result, "deleteResult.Result = null");

            // Retrieve
            Console.WriteLine("Calling TableOperation.Retrieve() after Delete() was called...");
            operation = TableOperation.Retrieve <CustomerEntity>(firstName, lastName);
            TableResult retrievedResult2 = repTable.Execute(operation);

            Assert.AreEqual((int)HttpStatusCode.NotFound, retrievedResult2.HttpStatusCode, "retrievedResult2.HttpStatusCode mismatch");
            Assert.IsNull(retrievedResult2.Result, "retrievedResult2.Result != null");
        }
Пример #14
0
        public void RowsWithHigherViewIdNotFoundWhenIgnoreHigherViewIdRowsFlagIsSet()
        {
            long higherViewId = 200;

            // Configure RTable with a higher ViewId
            this.UpdateConfiguration(replicas, 0, false, higherViewId);

            string firstName = "FirstName02";
            string lastName  = "LastName02";
            string email     = "*****@*****.**";
            string phone     = "1-800-123-0001";

            // Insert entity
            CustomerEntity newCustomer = new CustomerEntity(firstName, lastName);

            newCustomer.Email       = email;
            newCustomer.PhoneNumber = phone;

            TableOperation operation = TableOperation.Insert(newCustomer);
            TableResult    result    = this.repTable.Execute(operation);

            Assert.AreNotEqual(null, result, "result = null");
            Assert.AreEqual((int)HttpStatusCode.NoContent, result.HttpStatusCode, "result.HttpStatusCode mismatch");

            // Retrieve entity
            operation = TableOperation.Retrieve <CustomerEntity>(firstName, lastName);
            TableResult retrievedResult = this.repTable.Execute(operation);

            Assert.AreNotEqual(null, retrievedResult, "retrievedResult = null");
            Assert.AreEqual((int)HttpStatusCode.OK, retrievedResult.HttpStatusCode, "retrievedResult.HttpStatusCode mismatch");
            Assert.AreNotEqual(null, retrievedResult.Result, "retrievedResult.Result = null");
            CustomerEntity customer = (CustomerEntity)retrievedResult.Result;

            Assert.AreEqual(higherViewId, customer._rtable_ViewId, "customer._rtable_ViewId mismatch");
            Assert.AreEqual(newCustomer.PhoneNumber, customer.PhoneNumber, "customer.PhoneNumber mismatch");
            Assert.AreEqual(newCustomer.Email, customer.Email, "customer.Email mismatch");
            Console.WriteLine("Successfully retrieved the entity");

            //
            // Change RTable config to a lower viewId, and force RTable to ignore rows with higher viewId
            //
            long currentViewId = 10;

            Assert.IsTrue(currentViewId < higherViewId, "expected currentViewId < higherViewId !");

            Console.WriteLine("Changing the viewId to currentViewId {0}", currentViewId);
            ReplicatedTableConfiguration    config;
            ReplicatedTableQuorumReadResult readStatus = this.configurationService.RetrieveConfiguration(out config);

            Assert.IsTrue(readStatus.Code == ReplicatedTableQuorumReadCode.Success);
            ReplicatedTableConfigurationStore viewConfg = config.GetView(this.configurationWrapper.GetWriteView().Name);

            viewConfg.ViewId = currentViewId;
            config.SetIgnoreHigherViewIdRowsFlag(true);
            this.configurationService.UpdateConfiguration(config);


            //
            // Retrieve with lower viewId
            //
            Console.WriteLine("\nCalling Retrieve with lower ViewId...");
            operation = TableOperation.Retrieve <CustomerEntity>(firstName, lastName);
            try
            {
                retrievedResult = this.repTable.Execute(operation);

                Assert.AreNotEqual(null, retrievedResult, "retrievedResult = null");
                Assert.AreEqual((int)HttpStatusCode.NotFound, retrievedResult.HttpStatusCode, "retrievedResult.HttpStatusCode mismatch");
            }
            catch (ReplicatedTableStaleViewException)
            {
                Assert.Fail("Retrieve() is expected to NotFound the row, but got RTableStaleViewException !");
            }

            //
            // Replace with lower viewId
            //
            Console.WriteLine("\nCalling Replace with lower ViewId...");
            operation = TableOperation.Replace(customer);
            try
            {
                retrievedResult = this.repTable.Execute(operation);

                Assert.AreNotEqual(null, retrievedResult, "retrievedResult = null");
                Assert.AreEqual((int)HttpStatusCode.NotFound, retrievedResult.HttpStatusCode, "retrievedResult.HttpStatusCode mismatch");
            }
            catch (ReplicatedTableStaleViewException)
            {
                Assert.Fail("Replace() is expected to NotFound the row, but got RTableStaleViewException !");
            }

            //
            // InsertOrMerge with lower viewId
            //
            Console.WriteLine("\nCalling InsertOrMerge with lower ViewId...");
            operation = TableOperation.InsertOrMerge(customer);
            try
            {
                retrievedResult = this.repTable.Execute(operation);

                Assert.AreNotEqual(null, retrievedResult, "retrievedResult = null");
                Assert.AreEqual((int)HttpStatusCode.Conflict, retrievedResult.HttpStatusCode, "retrievedResult.HttpStatusCode mismatch");
            }
            catch (ReplicatedTableStaleViewException)
            {
                Assert.Fail("InsertOrMerge() is expected to get Conflict, but got RTableStaleViewException !");
            }

            //
            // InsertOrReplace with lower viewId
            //
            Console.WriteLine("\nCalling InsertOrReplace with lower ViewId...");
            operation = TableOperation.InsertOrReplace(customer);
            try
            {
                retrievedResult = this.repTable.Execute(operation);

                Assert.AreNotEqual(null, retrievedResult, "retrievedResult = null");
                Assert.AreEqual((int)HttpStatusCode.Conflict, retrievedResult.HttpStatusCode, "retrievedResult.HttpStatusCode mismatch");
            }
            catch (ReplicatedTableStaleViewException)
            {
                Assert.Fail("InsertOrReplace() is expected to get Conflict, but got RTableStaleViewException !");
            }

            //
            // Merge with lower viewId
            //
            Console.WriteLine("\nCalling Merge with lower ViewId...");
            operation = TableOperation.Merge(customer);
            try
            {
                retrievedResult = this.repTable.Execute(operation);

                Assert.AreNotEqual(null, retrievedResult, "retrievedResult = null");
                Assert.AreEqual((int)HttpStatusCode.NotFound, retrievedResult.HttpStatusCode, "retrievedResult.HttpStatusCode mismatch");
            }
            catch (ReplicatedTableStaleViewException)
            {
                Assert.Fail("Merge() is expected to NotFound the row, but got RTableStaleViewException !");
            }

            //
            // Delete with lower viewId
            //
            Console.WriteLine("\nCalling Delete with lower ViewId...");
            operation = TableOperation.Delete(customer);
            try
            {
                retrievedResult = this.repTable.Execute(operation);

                Assert.AreNotEqual(null, retrievedResult, "retrievedResult = null");
                Assert.AreEqual((int)HttpStatusCode.NotFound, retrievedResult.HttpStatusCode, "retrievedResult.HttpStatusCode mismatch");
            }
            catch (ReplicatedTableStaleViewException)
            {
                Assert.Fail("Delete() is expected to NotFound the row, but got RTableStaleViewException !");
            }
        }