예제 #1
0
        private async Task IdentifyCompletesOnlyWhenNewFlagsAreAvailable(Func <LdClient, User, Task> identifyTask)
        {
            var userA = User.WithKey("a");
            var userB = User.WithKey("b");

            var flagKey    = "flag";
            var userAFlags = new DataSetBuilder()
                             .Add(flagKey, 1, LdValue.Of("a-value"), 0).Build();
            var userBFlags = new DataSetBuilder()
                             .Add(flagKey, 2, LdValue.Of("b-value"), 1).Build();

            var startedIdentifyUserB   = new SemaphoreSlim(0, 1);
            var canFinishIdentifyUserB = new SemaphoreSlim(0, 1);
            var finishedIdentifyUserB  = new SemaphoreSlim(0, 1);

            var dataSourceFactory = new MockDataSourceFactoryFromLambda((ctx, updates, user, bg) =>
                                                                        new MockDataSourceFromLambda(user, async() =>
            {
                switch (user.Key)
                {
                case "a":
                    updates.Init(user, userAFlags);
                    break;

                case "b":
                    startedIdentifyUserB.Release();
                    await canFinishIdentifyUserB.WaitAsync();
                    updates.Init(user, userBFlags);
                    break;
                }
            }));

            var config = BasicConfig()
                         .DataSource(dataSourceFactory)
                         .Build();

            using (var client = await LdClient.InitAsync(config, userA))
            {
                Assert.True(client.Initialized);
                Assert.Equal("a-value", client.StringVariation(flagKey, null));

                var identifyUserBTask = Task.Run(async() =>
                {
                    await identifyTask(client, userB);
                    finishedIdentifyUserB.Release();
                });

                await startedIdentifyUserB.WaitAsync();

                Assert.False(client.Initialized);
                Assert.Null(client.StringVariation(flagKey, null));

                canFinishIdentifyUserB.Release();
                await finishedIdentifyUserB.WaitAsync();

                Assert.True(client.Initialized);
                Assert.Equal("b-value", client.StringVariation(flagKey, null));
            }
        }
예제 #2
0
        public void FlagsAreSavedToPersistentStorageByDefault()
        {
            var storage      = new MockPersistentDataStore();
            var initialFlags = new DataSetBuilder().Add("flag", 1, LdValue.Of(100), 0).Build();
            var config       = BasicConfig()
                               .DataSource(MockPollingProcessor.Factory(initialFlags))
                               .Persistence(Components.Persistence().Storage(storage.AsSingletonFactory()))
                               .Build();

            using (var client = TestUtil.CreateClient(config, BasicUser))
            {
                var storedData = storage.InspectUserData(config.MobileKey, BasicUser.Key);
                Assert.NotNull(storedData);
                AssertHelpers.DataSetsEqual(initialFlags, storedData.Value);
            }
        }
예제 #3
0
        public void FlagsAreLoadedFromPersistentStorageByDefault()
        {
            var storage = new MockPersistentDataStore();
            var data    = new DataSetBuilder().Add("flag", 1, LdValue.Of(100), 0).Build();
            var config  = BasicConfig()
                          .Persistence(Components.Persistence().Storage(storage.AsSingletonFactory()))
                          .Offline(true)
                          .Build();

            storage.SetupUserData(config.MobileKey, BasicUser.Key, data);

            using (var client = TestUtil.CreateClient(config, BasicUser))
            {
                Assert.Equal(100, client.IntVariation("flag", 99));
            }
        }