public void TestHttpConfigManagerDoesNotWaitForTheConfigWhenDeferIsTrue()
        {
            var t = MockSendAsync(TestData.Datafile, TimeSpan.FromMilliseconds(150));

            var httpManager = new HttpProjectConfigManager.Builder()
                              .WithSdkKey("QBw9gFM8oTn7ogY9ANCC1z")
                              .WithLogger(LoggerMock.Object)
                              .WithPollingInterval(TimeSpan.FromSeconds(2))
                              // negligible timeout
                              .WithBlockingTimeoutPeriod(TimeSpan.FromMilliseconds(50))
                              .WithStartByDefault()
                              .Build(false);

            // When blocking timeout is 0 and defer is false and getconfig immediately called
            // should return null
            Assert.IsNull(httpManager.GetConfig());
            // wait until config is retrieved.
            t.Wait();
            // in case deadlock, it will release after 3sec.
            httpManager.OnReady().Wait(8000);

            HttpClientMock.Verify(_ => _.SendAsync(It.IsAny <HttpRequestMessage>()));
            Assert.NotNull(httpManager.GetConfig());

            httpManager.Dispose();
        }
        public void TestOnReadyPromiseResolvedImmediatelyWhenDatafileIsProvided()
        {
            // Revision - 42
            var t = MockSendAsync(TestData.SimpleABExperimentsDatafile, TimeSpan.FromMilliseconds(100));

            HttpProjectConfigManager httpManager = new HttpProjectConfigManager.Builder()
                                                   // Revision - 15
                                                   .WithSdkKey("10192104166")
                                                   .WithDatafile(TestData.Datafile)
                                                   .WithLogger(LoggerMock.Object)
                                                   .WithPollingInterval(TimeSpan.FromMilliseconds(1000))
                                                   .WithBlockingTimeoutPeriod(TimeSpan.FromMilliseconds(500))
                                                   .WithStartByDefault()
                                                   .Build();

            // OnReady waits until is resolved, need to add time in case of deadlock.
            httpManager.OnReady().Wait(10000);

            Assert.AreEqual("15", httpManager.GetConfig().Revision);

            // loaded datafile from config manager after a second.
            // This wait triggers when SendAsync is triggered, OnReadyPromise is already resolved because of hardcoded datafile.
            t.Wait();
            Task.Delay(200).Wait();
            Assert.AreEqual("42", httpManager.GetConfig().Revision);
            httpManager.Dispose();
        }
        public void TestHttpProjectConfigManagerDoesntRaiseExceptionForDefaultErrorHandler()
        {
            var t = MockSendAsync(TestData.Datafile);

            HttpProjectConfigManager httpManager = new HttpProjectConfigManager.Builder()
                                                   .WithSdkKey("10192104166")
                                                   .WithFormat("https://cdn.optimizely.com/json/{0}.json")
                                                   .WithLogger(LoggerMock.Object)
                                                   .WithPollingInterval(TimeSpan.FromMilliseconds(1000))
                                                   .WithBlockingTimeoutPeriod(TimeSpan.FromMilliseconds(500))
                                                   .WithStartByDefault()
                                                   .Build(true);

            t.Wait(1000);
            HttpClientMock.Verify(_ => _.SendAsync(
                                      It.Is <System.Net.Http.HttpRequestMessage>(requestMessage =>
                                                                                 requestMessage.RequestUri.ToString() == "https://cdn.optimizely.com/json/10192104166.json"
                                                                                 )));
            var datafileConfig = httpManager.GetConfig();

            Assert.IsNotNull(datafileConfig);
            Assert.IsNull(datafileConfig.GetExperimentFromKey("project_config_not_valid").Key);
            LoggerMock.Verify(_ => _.Log(LogLevel.DEBUG, "Making datafile request to url \"https://cdn.optimizely.com/json/10192104166.json\""));
            httpManager.Dispose();
        }
예제 #4
0
        public void TestPollingGivenOnlySdkKeyGetOptimizelyConfig()
        {
            HttpProjectConfigManager httpManager = new HttpProjectConfigManager.Builder()
                                                   .WithSdkKey("QBw9gFM8oTn7ogY9ANCC1z")
                                                   .WithLogger(LoggerMock.Object)
                                                   .WithPollingInterval(TimeSpan.FromMilliseconds(1000))
                                                   .WithBlockingTimeoutPeriod(TimeSpan.FromMilliseconds(500))
                                                   .WithStartByDefault()
                                                   .Build(true);

            Assert.NotNull(httpManager.GetConfig());

            var optimizely = new Optimizely(httpManager);

            var optimizelyConfig = optimizely.GetOptimizelyConfig();

            Assert.NotNull(optimizelyConfig);
            Assert.NotNull(optimizelyConfig.ExperimentsMap);
            Assert.NotNull(optimizelyConfig.FeaturesMap);
            Assert.NotNull(optimizelyConfig.Revision);

            optimizely.Dispose();

            var optimizelyConfigAfterDispose = optimizely.GetOptimizelyConfig();

            Assert.Null(optimizelyConfigAfterDispose);
        }
        public void TestHttpConfigManagerDoesNotSendConfigUpdateNotificationWhenDatafileIsProvided()
        {
            var t = MockSendAsync(TestData.Datafile, TimeSpan.FromMilliseconds(100));

            var httpManager = new HttpProjectConfigManager.Builder()
                              .WithSdkKey("QBw9gFM8oTn7ogY9ANCC1z")
                              .WithDatafile(TestData.Datafile)
                              .WithLogger(LoggerMock.Object)
                              .WithPollingInterval(TimeSpan.FromMilliseconds(1000))
                              .WithBlockingTimeoutPeriod(TimeSpan.FromMilliseconds(500))
                              .Build();


            httpManager.NotifyOnProjectConfigUpdate += NotificationCallbackMock.Object.TestConfigUpdateCallback;

            NotificationCallbackMock.Verify(nc => nc.TestConfigUpdateCallback(), Times.Never);
            Assert.NotNull(httpManager.GetConfig()); Assert.NotNull(httpManager.GetConfig());
            httpManager.Dispose();
        }
        public void TestHttpConfigManagerSendConfigUpdateNotificationWhenProjectConfigGetsUpdated()
        {
            var t = MockSendAsync(TestData.Datafile);

            var httpManager = new HttpProjectConfigManager.Builder()
                              .WithSdkKey("QBw9gFM8oTn7ogY9ANCC1z")
                              .WithLogger(LoggerMock.Object)
                              .WithPollingInterval(TimeSpan.FromMilliseconds(1000))
                              .WithBlockingTimeoutPeriod(TimeSpan.FromMilliseconds(1000))
                              .WithStartByDefault(false)
                              .Build(true);

            httpManager.NotifyOnProjectConfigUpdate += NotificationCallbackMock.Object.TestConfigUpdateCallback;
            httpManager.Start();

            Assert.NotNull(httpManager.GetConfig());
            Task.Delay(200).Wait();
            NotificationCallbackMock.Verify(nc => nc.TestConfigUpdateCallback(), Times.AtLeastOnce);
            httpManager.Dispose();
        }
        public void TestOnReadyPromiseWaitsForProjectConfigRetrievalWhenDatafileIsNotProvided()
        {
            // Revision - 42
            var t = MockSendAsync(TestData.SimpleABExperimentsDatafile, TimeSpan.FromMilliseconds(1000));

            HttpProjectConfigManager httpManager = new HttpProjectConfigManager.Builder()
                                                   .WithSdkKey("QBw9gFM8oTn7ogY9ANCC1z")
                                                   .WithLogger(LoggerMock.Object)
                                                   .WithPollingInterval(TimeSpan.FromSeconds(2))
                                                   .WithBlockingTimeoutPeriod(TimeSpan.FromSeconds(1))
                                                   .WithStartByDefault(true)
                                                   .Build();

            t.Wait();

            // OnReady waits until is resolved, need to add time in case of deadlock.
            httpManager.OnReady().Wait(10000);
            Assert.NotNull(httpManager.GetConfig());
            httpManager.Dispose();
        }
        public void TestHttpConfigManagerRetreiveProjectConfigBySDKKey()
        {
            var t = MockSendAsync(TestData.Datafile);

            HttpProjectConfigManager httpManager = new HttpProjectConfigManager.Builder()
                                                   .WithSdkKey("QBw9gFM8oTn7ogY9ANCC1z")
                                                   .WithLogger(LoggerMock.Object)
                                                   .WithPollingInterval(TimeSpan.FromMilliseconds(1000))
                                                   .WithBlockingTimeoutPeriod(TimeSpan.FromMilliseconds(500))
                                                   .WithStartByDefault()
                                                   .Build();

            t.Wait(1000);
            HttpClientMock.Verify(_ => _.SendAsync(
                                      It.Is <System.Net.Http.HttpRequestMessage>(requestMessage =>
                                                                                 requestMessage.RequestUri.ToString() == "https://cdn.optimizely.com/datafiles/QBw9gFM8oTn7ogY9ANCC1z.json"
                                                                                 )));
            Assert.IsNotNull(httpManager.GetConfig());
            httpManager.Dispose();
        }