private static async Task <T> ThrowsException <T>(ITestServer server) where T : Exception
        {
            return(await server.ExecuteAsync(async address =>
            {
                // Arrange
                var retryHandler = new HttpRetryHandler();
                var countingHandler = new CountingHandler {
                    InnerHandler = new HttpClientHandler()
                };
                var httpClient = new HttpClient(countingHandler);
                var request = new HttpRetryHandlerRequest(httpClient, () => new HttpRequestMessage(HttpMethod.Get, address))
                {
                    MaxTries = 2,
                    RetryDelay = TimeSpan.Zero
                };

                // Act
                Func <Task> actionAsync = () => retryHandler.SendAsync(
                    request,
                    new TestLogger(),
                    CancellationToken.None);

                // Act & Assert
                var exception = await Assert.ThrowsAsync <T>(actionAsync);
                Assert.Equal(2, countingHandler.Hits);
                return exception;
            }));
        }
        private static async Task <T> ThrowsException <T>(ITestServer server) where T : Exception
        {
            return(await server.ExecuteAsync(async address =>
            {
                int maxTries = 2;
                TimeSpan retryDelay = TimeSpan.Zero;

                TestEnvironmentVariableReader testEnvironmentVariableReader = new TestEnvironmentVariableReader(
                    new Dictionary <string, string>()
                {
                    [EnhancedHttpRetryHelper.RetryCountEnvironmentVariableName] = maxTries.ToString(),
                    [EnhancedHttpRetryHelper.DelayInMillisecondsEnvironmentVariableName] = retryDelay.TotalMilliseconds.ToString()
                });

                // Arrange
                var retryHandler = new HttpRetryHandler(testEnvironmentVariableReader);
                var countingHandler = new CountingHandler {
                    InnerHandler = new HttpClientHandler()
                };
                var httpClient = new HttpClient(countingHandler);
                var request = new HttpRetryHandlerRequest(httpClient, () => new HttpRequestMessage(HttpMethod.Get, address))
                {
                    MaxTries = maxTries,
                    RetryDelay = retryDelay
                };

                // Act
                Func <Task> actionAsync = () => retryHandler.SendAsync(
                    request,
                    new TestLogger(),
                    CancellationToken.None);

                // Act & Assert
                var exception = await Assert.ThrowsAsync <T>(actionAsync);
                Assert.Equal(2, countingHandler.Hits);
                return exception;
            }));
        }
示例#3
0
        private async Task BasicOfflineTest()
        {
            await ClearStore();

            DateTime now  = DateTime.UtcNow;
            int      seed = now.Year * 10000 + now.Month * 100 + now.Day;

            Log("Using random seed: {0}", seed);
            Random rndGen = new Random(seed);

            CountingHandler handler = new CountingHandler();
            var             requestsSentToServer = 0;
            var             offlineReadyClient   = CreateClient(handler);

            var localStore = new MobileServiceSQLiteStore(StoreFileName);

            Log("Defined the table on the local store");
            localStore.DefineTable <OfflineReadyItem>();

            await offlineReadyClient.SyncContext.InitializeAsync(localStore);

            Log("Initialized the store and sync context");

            var localTable  = offlineReadyClient.GetSyncTable <OfflineReadyItem>();
            var remoteTable = offlineReadyClient.GetTable <OfflineReadyItem>();

            var item = new OfflineReadyItem(rndGen);

            try
            {
                await localTable.InsertAsync(item);

                Log("Inserted the item to the local store:", item);

                Log("Validating that the item is not in the server table");
                try
                {
                    requestsSentToServer++;
                    await remoteTable.LookupAsync(item.Id);

                    Assert.Fail("Error, item is present in the server");
                }
                catch (MobileServiceInvalidOperationException ex)
                {
                    Log("Ok, item is not in the server: {0}", ex.Message);
                }

                Func <int, bool> validateRequestCount = expectedCount =>
                {
                    Log("So far {0} requests sent to the server", handler.RequestCount);
                    if (handler.RequestCount != expectedCount)
                    {
                        Log("Error, expected {0} requests to have been sent to the server", expectedCount);
                        return(false);
                    }
                    else
                    {
                        return(true);
                    }
                };

                if (!validateRequestCount(requestsSentToServer))
                {
                    Assert.Fail(string.Format("Error, expected {0} requests to have been sent to the server", requestsSentToServer));
                }
                Log("Pushing changes to the server");
                await offlineReadyClient.SyncContext.PushAsync();

                requestsSentToServer++;

                if (!validateRequestCount(requestsSentToServer))
                {
                    Assert.Fail(string.Format("Error, expected {0} requests to have been sent to the server", requestsSentToServer));
                }

                Log("Push done; now verifying that item is in the server");

                var serverItem = await remoteTable.LookupAsync(item.Id);

                requestsSentToServer++;
                Log("Retrieved item from server: {0}", serverItem);
                if (serverItem.Equals(item))
                {
                    Log("Items are the same");
                }
                else
                {
                    Assert.Fail(string.Format("Items are different. Local: {0}; remote: {1}", item, serverItem));
                }

                Log("Now updating the item locally");
                item.Flag = !item.Flag;
                item.Age++;
                item.Date = new DateTime(now.Year, now.Month, now.Day, now.Hour, now.Minute, now.Second, now.Millisecond, DateTimeKind.Utc);
                await localTable.UpdateAsync(item);

                Log("Item has been updated");

                var newItem = new OfflineReadyItem(rndGen);
                Log("Adding a new item to the local table: {0}", newItem);
                await localTable.InsertAsync(newItem);

                if (!validateRequestCount(requestsSentToServer))
                {
                    Assert.Fail(string.Format("Error, expected {0} requests to have been sent to the server", requestsSentToServer));
                }

                Log("Pushing the new changes to the server");
                await offlineReadyClient.SyncContext.PushAsync();

                requestsSentToServer += 2;

                if (!validateRequestCount(requestsSentToServer))
                {
                    Assert.Fail(string.Format("Error, expected {0} requests to have been sent to the server", requestsSentToServer));
                }

                Log("Push done. Verifying changes on the server");
                serverItem = await remoteTable.LookupAsync(item.Id);

                requestsSentToServer++;
                if (serverItem.Equals(item))
                {
                    Log("Updated items are the same");
                }
                else
                {
                    Assert.Fail(string.Format("Items are different. Local: {0}; remote: {1}", item, serverItem));
                }

                serverItem = await remoteTable.LookupAsync(newItem.Id);

                requestsSentToServer++;
                if (serverItem.Equals(newItem))
                {
                    Log("New inserted item is the same");
                }
                else
                {
                    Assert.Fail(string.Format("Items are different. Local: {0}; remote: {1}", item, serverItem));
                }

                Log("Cleaning up");
                await localTable.DeleteAsync(item);

                await localTable.DeleteAsync(newItem);

                Log("Local table cleaned up. Now sync'ing once more");
                await offlineReadyClient.SyncContext.PushAsync();

                requestsSentToServer += 2;
                if (!validateRequestCount(requestsSentToServer))
                {
                    Assert.Fail(string.Format("Error, expected {0} requests to have been sent to the server", requestsSentToServer));
                }
                Log("Done");
            }
            catch (MobileServicePushFailedException ex)
            {
                Log("Push Result status from MobileServicePushFailedException: " + ex.PushResult.Status);
                throw;
            }
            finally
            {
                localStore.Dispose();
                ClearStore().Wait();
            }
        }
        private static ZumoTest CreateBasicTest()
        {
            return(new ZumoTest("Basic offline scenario", async delegate(ZumoTest test)
            {
                DateTime now = DateTime.UtcNow;
                int seed = now.Year * 10000 + now.Month * 100 + now.Day;
                test.AddLog("Using random seed: {0}", seed);
                Random rndGen = new Random(seed);

                CountingHandler handler = new CountingHandler();
                var requestsSentToServer = 0;
                var offlineReadyClient = CreateClient(handler);

                var localStore = new MobileServiceSQLiteStore(StoreFileName);
                test.AddLog("Defined the table on the local store");
                localStore.DefineTable <OfflineReadyItem>();

                await offlineReadyClient.SyncContext.InitializeAsync(localStore);
                test.AddLog("Initialized the store and sync context");

                var localTable = offlineReadyClient.GetSyncTable <OfflineReadyItem>();
                var remoteTable = offlineReadyClient.GetTable <OfflineReadyItem>();

                var item = new OfflineReadyItem(rndGen);
                await localTable.InsertAsync(item);
                test.AddLog("Inserted the item to the local store:", item);

                test.AddLog("Validating that the item is not in the server table");
                try
                {
                    requestsSentToServer++;
                    await remoteTable.LookupAsync(item.Id);
                    test.AddLog("Error, item is present in the server");
                    return false;
                }
                catch (MobileServiceInvalidOperationException ex)
                {
                    test.AddLog("Ok, item is not in the server: {0}", ex.Message);
                }

                Func <int, bool> validateRequestCount = expectedCount =>
                {
                    test.AddLog("So far {0} requests sent to the server", handler.RequestCount);
                    if (handler.RequestCount != expectedCount)
                    {
                        test.AddLog("Error, expected {0} requests to have been sent to the server", expectedCount);
                        return false;
                    }
                    else
                    {
                        return true;
                    }
                };

                if (!validateRequestCount(requestsSentToServer))
                {
                    return false;
                }

                test.AddLog("Pushing changes to the server");
                await offlineReadyClient.SyncContext.PushAsync();
                requestsSentToServer++;

                if (!validateRequestCount(requestsSentToServer))
                {
                    return false;
                }

                test.AddLog("Push done; now verifying that item is in the server");

                var serverItem = await remoteTable.LookupAsync(item.Id);
                requestsSentToServer++;
                test.AddLog("Retrieved item from server: {0}", serverItem);
                if (serverItem.Equals(item))
                {
                    test.AddLog("Items are the same");
                }
                else
                {
                    test.AddLog("Items are different. Local: {0}; remote: {1}", item, serverItem);
                    return false;
                }

                test.AddLog("Now updating the item locally");
                item.Flag = !item.Flag;
                item.Age++;
                item.Date = new DateTime(now.Year, now.Month, now.Day, now.Hour, now.Minute, now.Second, now.Millisecond, DateTimeKind.Utc);
                await localTable.UpdateAsync(item);
                test.AddLog("Item has been updated");

                var newItem = new OfflineReadyItem(rndGen);
                test.AddLog("Adding a new item to the local table: {0}", newItem);
                await localTable.InsertAsync(newItem);

                if (!validateRequestCount(requestsSentToServer))
                {
                    return false;
                }

                test.AddLog("Pushing the new changes to the server");
                await offlineReadyClient.SyncContext.PushAsync();
                requestsSentToServer += 2;

                if (!validateRequestCount(requestsSentToServer))
                {
                    return false;
                }

                test.AddLog("Push done. Verifying changes on the server");
                serverItem = await remoteTable.LookupAsync(item.Id);
                requestsSentToServer++;
                if (serverItem.Equals(item))
                {
                    test.AddLog("Updated items are the same");
                }
                else
                {
                    test.AddLog("Items are different. Local: {0}; remote: {1}", item, serverItem);
                    return false;
                }

                serverItem = await remoteTable.LookupAsync(newItem.Id);
                requestsSentToServer++;
                if (serverItem.Equals(newItem))
                {
                    test.AddLog("New inserted item is the same");
                }
                else
                {
                    test.AddLog("Items are different. Local: {0}; remote: {1}", item, serverItem);
                    return false;
                }

                test.AddLog("Cleaning up");
                await localTable.DeleteAsync(item);
                await localTable.DeleteAsync(newItem);
                test.AddLog("Local table cleaned up. Now sync'ing once more");
                await offlineReadyClient.SyncContext.PushAsync();
                requestsSentToServer += 2;
                if (!validateRequestCount(requestsSentToServer))
                {
                    return false;
                }
                test.AddLog("Done");
                return true;
            }, ZumoTestGlobals.RuntimeFeatureNames.STRING_ID_TABLES));
        }
        public async Task BasicOfflineTest()
        {
            ClearStore();
            DateTime now    = DateTime.UtcNow;
            int      seed   = now.Year * 10000 + now.Month * 100 + now.Day;
            Random   rndGen = new Random(seed);

            CountingHandler handler = new CountingHandler();
            var             requestsSentToServer = 0;
            var             offlineReadyClient   = CreateClient(handler);

            var localStore = new MobileServiceSQLiteStore(StoreFileName);

            localStore.DefineTable <OfflineReadyItem>();

            await offlineReadyClient.SyncContext.InitializeAsync(localStore);

            var localTable  = offlineReadyClient.GetSyncTable <OfflineReadyItem>();
            var remoteTable = offlineReadyClient.GetTable <OfflineReadyItem>();

            var item = new OfflineReadyItem(rndGen);

            try
            {
                await localTable.InsertAsync(item);

                await Assert.ThrowsAsync <MobileServiceInvalidOperationException>(async() =>
                {
                    requestsSentToServer++;
                    await remoteTable.LookupAsync(item.Id);
                });

                Func <int, bool> validateRequestCount = expectedCount => (handler.RequestCount == expectedCount);
                Assert.True(validateRequestCount(requestsSentToServer));

                await offlineReadyClient.SyncContext.PushAsync();

                requestsSentToServer++;

                Assert.True(validateRequestCount(requestsSentToServer));

                var serverItem = await remoteTable.LookupAsync(item.Id);

                requestsSentToServer++;
                Assert.Equal(serverItem, item);

                item.Flag = !item.Flag;
                item.Age++;
                item.Date = new DateTime(now.Year, now.Month, now.Day, now.Hour, now.Minute, now.Second, now.Millisecond, DateTimeKind.Utc);
                await localTable.UpdateAsync(item);

                var newItem = new OfflineReadyItem(rndGen);
                await localTable.InsertAsync(newItem);

                Assert.True(validateRequestCount(requestsSentToServer));

                await offlineReadyClient.SyncContext.PushAsync();

                requestsSentToServer += 2;

                Assert.True(validateRequestCount(requestsSentToServer));

                serverItem = await remoteTable.LookupAsync(item.Id);

                requestsSentToServer++;
                Assert.Equal(serverItem, item);

                serverItem = await remoteTable.LookupAsync(newItem.Id);

                requestsSentToServer++;
                Assert.Equal(serverItem, newItem);

                await localTable.DeleteAsync(item);

                await localTable.DeleteAsync(newItem);

                await offlineReadyClient.SyncContext.PushAsync();

                requestsSentToServer += 2;
                Assert.True(validateRequestCount(requestsSentToServer));
            }
            catch (MobileServicePushFailedException)
            {
                throw;
            }
            finally
            {
                localStore.Dispose();
                ClearStore();
            }
        }