예제 #1
0
        public async Task ExampleUsage2()
        {
            // Get your key from https://console.developers.google.com/apis/credentials
            var apiKey = "AIzaSyCtcFQMgRIUHhSuXggm4BtXT4eZvUrBWN0";
            // See https://docs.google.com/spreadsheets/d/1Hwu4ZtRR0iXD65Wuj_XyJxLw4PN8SE0sRgnBKeVoq3A
            var            sheetId         = "1Hwu4ZtRR0iXD65Wuj_XyJxLw4PN8SE0sRgnBKeVoq3A";
            var            sheetName       = "MySheet1"; // Has to match the sheet name
            IKeyValueStore onlineNewsStore = new GoogleSheetsKeyValueStore(new InMemoryKeyValueStore(), apiKey, sheetId, sheetName);

            IKeyValueStore onDeviceEventsStore = new InMemoryKeyValueStore();
            IKeyValueStore newsStore           = new DualStore(onlineNewsStore, onDeviceEventsStore);

            var         newsLocalDataStore = new InMemoryKeyValueStore().GetTypeAdapter <News.LocalData>();
            NewsManager manager            = new NewsManager(newsLocalDataStore, newsStore.GetTypeAdapter <News>());

            var  title   = "First App Start";
            var  descr   = "You just started the app the first time!";
            var  url     = "https://github.com/cs-util-com/cscore";
            var  urlText = "Show details..";
            News n       = News.NewLocalNewsEvent(title, descr, url, urlText);
            await onDeviceEventsStore.Set(n.key, n);

            IEnumerable <News> allNews = await manager.GetAllNews();

            Assert.Contains(allNews, x => x.title == title);

            Log.d(JsonWriter.AsPrettyString(allNews));

            IEnumerable <News> unreadNews = await manager.GetAllUnreadNews();

            Assert.Contains(unreadNews, x => x.title == title);
        }
        public void PostsUpdateWhenTrackedTeamcityBuildChangesState()
        {
            var teamcityBuildApi = new Mock <ITeamcityBuildApi>();
            var teamcityBuild1   = new TeamcityBuildStatus("12345", "build name", BuildState.Running);
            var teamcityBuild2   = new TeamcityBuildStatus("12345", "build name", BuildState.Succeeded);
            var persistence      = new InMemoryKeyValueStore();

            teamcityBuildApi.Setup(x => x.GetBuild("12345")).ReturnsAsync(teamcityBuild1);

            var teamcityTracker = new TeamcityBuildTracker(CommandParser.For("track build#12345"), persistence, teamcityBuildApi.Object);

            teamcityTracker.ProcessMessage(new Message("a-channel", "a-user", "scbot track build#12345"));

            CollectionAssert.IsEmpty(teamcityTracker.ProcessTimerTick().Responses);

            teamcityBuildApi.Setup(x => x.GetBuild("12345")).ReturnsAsync(teamcityBuild2);

            var ping = teamcityTracker.ProcessTimerTick().Responses.Single();

            Assert.AreEqual("a-channel", ping.Channel);
            Assert.AreEqual("<http://teamcity/viewLog.html?buildId=12345|Build 12345> (build name) updated: build finished", ping.Message);

            // subsequent ticks should use updated values
            CollectionAssert.IsEmpty(teamcityTracker.ProcessTimerTick().Responses);
        }
예제 #3
0
        private static async Task AddAFewLocalNewsEvents(InMemoryKeyValueStore onDeviceEventsStore)
        {
            var a = new LocalAnalytics();
            // Set up a few simple usage rules to generate local news events from if they are true:
            var appUsed1DayRule      = a.NewAppUsedXDaysRule(days: 1);
            var featureNeverUsedRule = a.NewFeatureNotUsedXTimesRule("feature1", times: 1);

            var appNotUsedLast5Days = a.NewAppUsedInTheLastXDaysRule(5);
            var userCameBackRule    = a.NewConcatRule(appUsed1DayRule, appNotUsedLast5Days);

            var url     = "https://github.com/cs-util-com/cscore";
            var urlText = "Show details..";

            if (await appUsed1DayRule.isTrue())
            {
                var n = News.NewLocalNewsEvent("Achievement Unlocked", "You used the app 1 day", url, urlText);
                await onDeviceEventsStore.Set(n.key, n);
            }
            if (await featureNeverUsedRule.isTrue())
            {
                var n = News.NewLocalNewsEvent("Did you know you can do feature1?", "Feature 1 is the best", url, urlText);
                await onDeviceEventsStore.Set(n.key, n);
            }
            if (await userCameBackRule.isTrue())
            {
                var n = News.NewLocalNewsEvent("You did not use the app for a while", "How dare you", url, urlText);
                await onDeviceEventsStore.Set(n.key, n);
            }
        }
        public void ResetTest()
        {
            InMemoryKeyValueStore store1 = new InMemoryKeyValueStore("store");
            InMemoryKeyValueStore store2 = new InMemoryKeyValueStore("store");
            var dt          = DateTime.Now.GetMilliseconds();
            var valueSerdes = new ValueAndTimestampSerDes <string>(new StringSerDes());
            var bytes       = new Bytes(Encoding.UTF8.GetBytes("test"));
            var bytes2      = new Bytes(Encoding.UTF8.GetBytes("test2"));
            var provider    =
                new MockStateProvider <string, string>(1000 * 10, new StringSerDes(), new StringSerDes(), store1,
                                                       store2);
            var composite = new CompositeReadOnlyKeyValueStore <string, string>(provider, storeType, "store");

            store1.Put(bytes,
                       valueSerdes.Serialize(ValueAndTimestamp <string> .Make("coucou1", dt), new SerializationContext()));
            store2.Put(bytes2,
                       valueSerdes.Serialize(ValueAndTimestamp <string> .Make("coucou2", dt), new SerializationContext()));
            var enumerator = composite.Range("test", "test2");

            Assert.IsNotNull(enumerator);
            Assert.IsTrue(enumerator.MoveNext());
            Assert.AreEqual("test", enumerator.PeekNextKey());
            Assert.IsTrue(enumerator.MoveNext());
            Assert.AreEqual("test2", enumerator.PeekNextKey());
            Assert.IsFalse(enumerator.MoveNext());
            enumerator.Reset();
            Assert.IsTrue(enumerator.MoveNext());
            Assert.AreEqual("test", enumerator.PeekNextKey());
            Assert.IsTrue(enumerator.MoveNext());
            Assert.AreEqual("test2", enumerator.PeekNextKey());
            Assert.IsFalse(enumerator.MoveNext());
        }
예제 #5
0
        public async Task TestDualStore()
        {
            var firstStore = new InMemoryKeyValueStore();
            var secondStor = new InMemoryKeyValueStore();

            var dualStore = new DualStore(firstStore, secondStor);

            var key1   = "key1";
            var key2   = "key2";
            var value1 = "v1";
            var fallb1 = "f1";

            Assert.False(await dualStore.ContainsKey(key1));
            Assert.Null(await dualStore.Set(key1, value1));
            Assert.True(await dualStore.ContainsKey(key1));
            Assert.True(await firstStore.ContainsKey(key1));
            Assert.False(await secondStor.ContainsKey(key1));

            Assert.Single(await dualStore.GetAllKeys());
            Assert.Single(await firstStore.GetAllKeys());
            Assert.Empty(await secondStor.GetAllKeys());

            Assert.Equal(value1, await dualStore.Get(key1, fallb1));
            Assert.Equal(value1, await firstStore.Get(key1, fallb1));
            Assert.Equal(fallb1, await secondStor.Get(key1, fallb1));
            Assert.Equal(fallb1, await dualStore.Get(key2, fallb1));

            Assert.True(await dualStore.Remove(key1));
            Assert.Equal(fallb1, await dualStore.Get(key1, fallb1));
            Assert.Equal(fallb1, await firstStore.Get(key1, fallb1));
            Assert.False(await dualStore.Remove(key2));
        }
예제 #6
0
        public async Task TestReplaceAndRemove()
        {
            var key1      = "key1";
            var value1    = "value1";
            var fallback1 = "fallback1";

            var s1 = new InMemoryKeyValueStore();
            var s2 = NewFileBasedKeyValueStore("TestReplaceAndRemoveDir").WithFallbackStore(s1);
            var s3 = new InMemoryKeyValueStore().WithFallbackStore(s2);

            await s1.Set(key1, value1);

            // Test that replace with same value via s3 returns the old value (which is also value1):
            Assert.Equal(value1, await s3.Set(key1, value1));
            // s3 will ask s2 which will ask s1 so the value will be returned correctly:
            Assert.Equal(value1, await s3.Get(key1, fallback1));
            Assert.Single(await s3.GetAllKeys());

            Assert.True(await s3.Remove(key1));
            // Setting it again will return null since it was removed from all stores:
            Assert.Null(await s3.Set(key1, value1));
            Assert.True(await s1.Remove(key1));                  // Remove it only from s1
            Assert.Equal(value1, await s3.Get(key1, fallback1)); // Still cached in s3 and s2
            // s1 had the key already removed, so the combined remove result will be false:
            Assert.False(await s3.Remove(key1));
        }
예제 #7
0
        public InMemoryKeyValueStoreTests()
        {
            // Object under test
            _inMemoryStore = new InMemoryKeyValueStore();

            AddNoiseToStore();
        }
예제 #8
0
        public async Task ExampleUsage1()
        {
            // Get your key from https://console.developers.google.com/apis/credentials
            var exampleApiKey = "AIzaSyCtcFQMgRIUHhSuXggm4BtXT4eZvUrBWN0";
            // See https://docs.google.com/spreadsheets/d/1qZjRA_uLsImX-VHpJ1nnrCIASmU20Tbaakf5Le5Wrs8
            var spreadsheetId = "1qZjRA_uLsImX-VHpJ1nnrCIASmU20Tbaakf5Le5Wrs8";
            var sheetName     = "UpdateEntriesV2"; // Has to match the sheet name
            var cache         = new InMemoryKeyValueStore();
            var store         = new GoogleSheetsKeyValueStore(cache, exampleApiKey, spreadsheetId, sheetName);

            // Use the GoogleSheets store as the source for the update information:
            var updateChecker = new DefaultAppUpdateChecker(store, null);

            var entries = await updateChecker.DownloadAllUpdateEntries();

            Assert.Equal(5, entries.Count());

            // Use the EnvironmentV2.instance.systemInfo values to match against all entries:
            var matchingEntries = await updateChecker.DownloadMatchingUpdateEntries();

            if (matchingEntries.Count > 0)
            {
                Assert.Single(matchingEntries);
                var instructions = matchingEntries.First().GetUpdateInstructions();
                Assert.Equal("https://github.com/cs-util-com/cscore", instructions.url);
                Log.d("instructions: " + JsonWriter.AsPrettyString(instructions));
            }
            else
            {
                Log.e("Test cant be fully done on current system: "
                      + JsonWriter.AsPrettyString(EnvironmentV2.instance.systemInfo));
            }
        }
예제 #9
0
        private ExecutionContext ProvisionExecutionContext(CancellationToken cancellationToken, string data)
        {
            var kv = new InMemoryKeyValueStore <string, object>();

            if (!string.IsNullOrWhiteSpace(data))
            {
                try
                {
                    var deserialized = JsonSerializer.Deserialize <Dictionary <string, string> >(data);
                    foreach (var(k, v) in deserialized)
                    {
                        kv.AddOrUpdate(k, v);
                    }
                }
                catch (Exception e)
                {
                    Trace.TraceError(e.ToString());
                    throw;
                }
            }
            else
            {
                Trace.TraceInformation("no data passed to execution context");
            }

            var scope   = _backgroundServices.CreateScope();
            var context = new ExecutionContext(scope, kv, cancellationToken);

            return(context);
        }
예제 #10
0
        public async Task ExampleUsage2()
        {
            var storeDir = EnvironmentV2.instance.GetOrAddTempFolder("KeyValueStoreTests").GetChildDir("ExampleUsage2Dir");

            storeDir.DeleteV2(); // Cleanup before tests if the test file exists
            string   myKey1 = "test123";
            MyClass1 x1     = new MyClass1()
            {
                myString1 = "Abc", myString2 = "Abc2"
            };
            {   // Create a fast memory store and combine it with a LiteDB store that is persisted to disk:
                IKeyValueStore store = new InMemoryKeyValueStore().WithFallbackStore(new FileBasedKeyValueStore(storeDir));
                await store.Set(myKey1, x1);

                MyClass1 x2 = await store.Get <MyClass1>(myKey1, null);

                Assert.Equal(x1.myString1, x2.myString1);
                Assert.Equal(x1.myString2, x2.myString2);
            }
            { // Create a second store and check that the changes were persisted:
                IKeyValueStore store2 = new FileBasedKeyValueStore(storeDir);
                Assert.True(await store2.ContainsKey(myKey1));
                MyClass1 x2 = await store2.Get <MyClass1>(myKey1, null);

                Assert.Equal(x1.myString1, x2.myString1);
                Assert.Equal(x1.myString2, x2.myString2);
                Assert.True(await store2.Remove(myKey1));
                Assert.False(await store2.ContainsKey(myKey1));
            }
        }
        public void ReverseAllTest()
        {
            InMemoryKeyValueStore store1 = new InMemoryKeyValueStore("store");
            InMemoryKeyValueStore store2 = new InMemoryKeyValueStore("store");
            var dt          = DateTime.Now.GetMilliseconds();
            var valueSerdes = new ValueAndTimestampSerDes <string>(new StringSerDes());
            var bytes       = new Bytes(Encoding.UTF8.GetBytes("test"));
            var bytes2      = new Bytes(Encoding.UTF8.GetBytes("test2"));
            var provider    =
                new MockStateProvider <string, string>(1000 * 10, new StringSerDes(), new StringSerDes(), store1,
                                                       store2);
            var composite = new CompositeReadOnlyKeyValueStore <string, string>(provider, storeType, "store");

            store1.Put(bytes,
                       valueSerdes.Serialize(ValueAndTimestamp <string> .Make("coucou1", dt), new SerializationContext()));
            store1.Put(bytes2,
                       valueSerdes.Serialize(ValueAndTimestamp <string> .Make("coucou1bis", dt), new SerializationContext()));
            store2.Put(bytes,
                       valueSerdes.Serialize(ValueAndTimestamp <string> .Make("coucou2", dt), new SerializationContext()));
            store2.Put(bytes2,
                       valueSerdes.Serialize(ValueAndTimestamp <string> .Make("coucou2bis", dt), new SerializationContext()));
            var result = composite.ReverseAll().ToList();

            Assert.IsNotNull(result);
            Assert.AreEqual(4, result.Count);
            Assert.AreEqual("test2", result[0].Key);
            Assert.AreEqual("coucou1bis", result[0].Value);
            Assert.AreEqual("test", result[1].Key);
            Assert.AreEqual("coucou1", result[1].Value);
            Assert.AreEqual("test2", result[2].Key);
            Assert.AreEqual("coucou2bis", result[2].Value);
            Assert.AreEqual("test", result[3].Key);
            Assert.AreEqual("coucou2", result[3].Value);
        }
예제 #12
0
        public void PostsUpdateWhenTrackedZendeskTicketChanges()
        {
            var zendeskApi  = new Mock <IZendeskTicketApi>();
            var ticket1     = new ZendeskTicket("12345", "description", "open", new ZendeskTicket.Comment[3]);
            var ticket2     = new ZendeskTicket("12345", "description", "open", new ZendeskTicket.Comment[5]);
            var persistence = new InMemoryKeyValueStore();

            zendeskApi.Setup(x => x.FromId("12345")).ReturnsAsync(ticket1);

            var commandParser  = CommandParser.For("track ZD#12345");
            var zendeskTracker = new ZendeskTicketTracker(commandParser, persistence, zendeskApi.Object);

            zendeskTracker.ProcessMessage(new Message("a-channel", "a-user", "scbot track ZD#12345"));

            CollectionAssert.IsEmpty(zendeskTracker.ProcessTimerTick().Responses);

            zendeskApi.Setup(x => x.FromId("12345")).ReturnsAsync(ticket2);

            var ping = zendeskTracker.ProcessTimerTick().Responses.Single();

            Assert.AreEqual("a-channel", ping.Channel);
            Assert.AreEqual("<https://redgatesupport.zendesk.com/agent/tickets/12345|ZD#12345> (description) updated: 2 comments added", ping.Message);

            // subsequent ticks should use updated values
            CollectionAssert.IsEmpty(zendeskTracker.ProcessTimerTick().Responses);
        }
예제 #13
0
        public void EnumeratorReverseRangeAll()
        {
            var store = new InMemoryKeyValueStore("store");

            var serdes = new StringSerDes();

            string deserialize(byte[] bytes)
            {
                return(serdes.Deserialize(bytes, new SerializationContext()));
            }

            byte[] key  = serdes.Serialize("key", new SerializationContext()), value = serdes.Serialize("value", new SerializationContext());
            byte[] key2 = serdes.Serialize("key2", new SerializationContext()), value2 = serdes.Serialize("value2", new SerializationContext());
            byte[] key3 = serdes.Serialize("key3", new SerializationContext()), value3 = serdes.Serialize("value3", new SerializationContext());

            store.Put(new Bytes(key), value);
            store.Put(new Bytes(key2), value2);
            store.Put(new Bytes(key3), value3);

            var enumerator = store.ReverseRange(new Bytes(key), new Bytes(key2));

            Assert.IsTrue(enumerator.MoveNext());
            Assert.AreEqual("key2", deserialize(enumerator.Current.Value.Key.Get));
            Assert.AreEqual("value2", deserialize(enumerator.Current.Value.Value));
            Assert.IsTrue(enumerator.MoveNext());
            Assert.AreEqual("key", deserialize(enumerator.Current.Value.Key.Get));
            Assert.AreEqual("value", deserialize(enumerator.Current.Value.Value));
            Assert.IsFalse(enumerator.MoveNext());
            enumerator.Dispose();
        }
예제 #14
0
        public async Task ExampleUsage1()
        {
            // Get your key from https://console.developers.google.com/apis/credentials
            var apiKey = "AIzaSyCtcFQMgRIUHhSuXggm4BtXT4eZvUrBWN0";
            // See https://docs.google.com/spreadsheets/d/1Hwu4ZtRR0iXD65Wuj_XyJxLw4PN8SE0sRgnBKeVoq3A
            var            sheetId   = "1Hwu4ZtRR0iXD65Wuj_XyJxLw4PN8SE0sRgnBKeVoq3A";
            var            sheetName = "MySheet1"; // Has to match the sheet name
            IKeyValueStore newsStore = new GoogleSheetsKeyValueStore(new InMemoryKeyValueStore(), apiKey, sheetId, sheetName);

            var         newsLocalDataStore = new InMemoryKeyValueStore().GetTypeAdapter <News.LocalData>();
            NewsManager manager            = new NewsManager(newsLocalDataStore, newsStore.GetTypeAdapter <News>());

            IEnumerable <News> allNews = await manager.GetAllNews();

            var news1 = allNews.First();

            Assert.NotNull(news1);
            Assert.Equal("New", news1.type);
            Assert.Equal(News.NewsType.New, news1.GetNewsType());
            Assert.True(news1.GetDate(true).IsUtc());

            // Mark that the user has read the news:
            await manager.MarkNewsAsRead(news1);

            Assert.True(allNews.First().localData.isRead);
            Assert.True((await manager.GetAllNews()).First().localData.isRead);
            Assert.True((await newsLocalDataStore.Get(news1.key, null)).isRead);

            IEnumerable <News> unreadNews = await manager.GetAllUnreadNews();

            Assert.Contains(news1, allNews);
            Assert.DoesNotContain(news1, unreadNews);
        }
        public void CreateInMemoryKeyValueStore()
        {
            var store = new InMemoryKeyValueStore("store");

            Assert.IsFalse(store.Persistent);
            Assert.AreEqual("store", store.Name);
            Assert.AreEqual(0, store.ApproximateNumEntries());
        }
예제 #16
0
        public async Task ExtendedTest1()
        {
            // Get your key from https://console.developers.google.com/apis/credentials
            var apiKey = "AIzaSyCtcFQMgRIUHhSuXggm4BtXT4eZvUrBWN0";
            // See https://docs.google.com/spreadsheets/d/1KBamVmgEUX-fyogMJ48TT6h2kAMKyWU1uBL5skCGRBM
            var sheetId           = "1KBamVmgEUX-fyogMJ48TT6h2kAMKyWU1uBL5skCGRBM";
            var sheetName         = "MySheet1"; // Has to match the sheet name
            var googleSheetsStore = new GoogleSheetsKeyValueStore(new InMemoryKeyValueStore(), apiKey, sheetId, sheetName);


            var localStore = new InMemoryKeyValueStore();
            var testStore  = new FeatureFlagStore(localStore, googleSheetsStore);

            IoC.inject.SetSingleton <FeatureFlagManager <FeatureFlag> >(new FeatureFlagManager <FeatureFlag>(testStore));

            var key1 = "MyFlag1";
            var key2 = "MyFlag2";
            var key3 = "MyFlag3";

            Assert.NotNull(await googleSheetsStore.Get <FeatureFlag>(key1, null));
            Assert.NotNull(await googleSheetsStore.Get <FeatureFlag>(key2, null));
            Assert.NotNull(await testStore.Get(key2, null));
            Assert.NotNull(await FeatureFlagManager <FeatureFlag> .instance.GetFeatureFlag(key2));

            Assert.False(await FeatureFlag.IsEnabled(key1));
            Assert.True(await FeatureFlag.IsEnabled(key2));

            var flag3_1 = await FeatureFlagManager <FeatureFlag> .instance.GetFeatureFlag(key3);

            Assert.Equal(40, flag3_1.rolloutPercentage);

            var localState3_1 = await localStore.Get <IFeatureFlagLocalState>(key3, null);

            var percent3_1 = localState3_1.randomPercentage;

            Assert.NotEqual(0, percent3_1);
            if (percent3_1 < flag3_1.rolloutPercentage)
            {
                Assert.True(await FeatureFlag.IsEnabled(key3));
            }
            else
            {
                Assert.False(await FeatureFlag.IsEnabled(key3));
            }
            localState3_1.randomPercentage = flag3_1.rolloutPercentage - 1;
            await localStore.Set(key3, localState3_1);

            var localState3_2 = await localStore.Get <IFeatureFlagLocalState>(key3, null);

            Assert.NotEqual(percent3_1, localState3_2.randomPercentage);

            var flag3_2 = await FeatureFlagManager <FeatureFlag> .instance.GetFeatureFlag(key3);

            Assert.Equal(localState3_2.randomPercentage, flag3_2.localState.randomPercentage);
            Assert.True(await flag3_2.IsEnabled());
            Assert.True(await FeatureFlag.IsEnabled(key3));
        }
예제 #17
0
        public void EmptyEnumerator()
        {
            var store = new InMemoryKeyValueStore("store");

            var enumerator = store.All().GetEnumerator();

            Assert.IsFalse(enumerator.MoveNext());
            enumerator.Dispose();
        }
        public void PutKeyNotExist()
        {
            var serdes = new StringSerDes();

            byte[] key   = serdes.Serialize("key", new SerializationContext()), value = serdes.Serialize("value", new SerializationContext());
            var    store = new InMemoryKeyValueStore("store");

            store.Put(new Bytes(key), value);
            Assert.AreEqual(1, store.ApproximateNumEntries());
        }
        public void DeletKeyNotExist()
        {
            var serdes = new StringSerDes();

            byte[] key = serdes.Serialize("key", new SerializationContext());

            var store = new InMemoryKeyValueStore("store");
            var r     = store.Delete(new Bytes(key));

            Assert.IsNull(r);
            Assert.AreEqual(0, store.ApproximateNumEntries());
        }
예제 #20
0
        private static async Task <ProgressionSystem <FeatureFlag> > NewInMemoryTestXpSystem(string apiKey, string sheetId, string sheetName)
        {
            var cachedFlags          = new InMemoryKeyValueStore();
            var googleSheetsStore    = new GoogleSheetsKeyValueStore(cachedFlags, apiKey, sheetId, sheetName);
            var cachedFlagsLocalData = new InMemoryKeyValueStore();
            var analytics            = new LocalAnalytics(new InMemoryKeyValueStore());

            analytics.createStoreFor = (_ => new InMemoryKeyValueStore().GetTypeAdapter <AppFlowEvent>());
            var featureFlagStore = new FeatureFlagStore(cachedFlagsLocalData, googleSheetsStore);

            return(await DefaultProgressionSystem.Setup(featureFlagStore, analytics));
        }
        public void PutIfAbsent()
        {
            var serdes = new StringSerDes();

            byte[] key3 = serdes.Serialize("key3", new SerializationContext()), value3 = serdes.Serialize("value3", new SerializationContext());

            var store = new InMemoryKeyValueStore("store");

            store.PutIfAbsent(new Bytes(key3), value3);
            store.PutIfAbsent(new Bytes(key3), value3);

            Assert.AreEqual(1, store.ApproximateNumEntries());
        }
예제 #22
0
        public void ExampleUsage1()
        {
            IKeyValueStore store  = new InMemoryKeyValueStore();
            string         myKey1 = "myKey1";
            MyClass1       x1     = new MyClass1()
            {
                myString1 = "Abc", myString2 = "Abc2"
            };

            store.Set(myKey1, x1);
            MyClass1 x2 = store.Get <MyClass1>(myKey1, defaultValue: null).Result;

            Assert.Equal(x1.myString1, x2.myString1);
            Assert.Equal(x1.myString2, x2.myString2);
        }
        public void ComplainsIfBuildNotFound()
        {
            var teamcityBuildApi = new Mock <ITeamcityBuildApi>();
            var unknown          = TeamcityBuildStatus.Unknown;
            var persistence      = new InMemoryKeyValueStore();

            teamcityBuildApi.Setup(x => x.GetBuild("12345")).ReturnsAsync(unknown);

            var teamcityTracker = new TeamcityBuildTracker(CommandParser.For("track build#12345"), persistence, teamcityBuildApi.Object);

            var result = teamcityTracker.ProcessMessage(new Message("a-channel", "a-user", "scbot track build#12345"));

            // TODO: better message
            Assert.AreEqual("Could not find build#12345. It might not have started, or might not be tracked by the api", result.Responses.Single().Message);
        }
        public void CountTest()
        {
            InMemoryKeyValueStore store1 = new InMemoryKeyValueStore("store");
            InMemoryKeyValueStore store2 = new InMemoryKeyValueStore("store");
            var dt          = DateTime.Now.GetMilliseconds();
            var valueSerdes = new ValueAndTimestampSerDes <string>(new StringSerDes());
            var bytes       = new Bytes(Encoding.UTF8.GetBytes("test"));
            var bytes2      = new Bytes(Encoding.UTF8.GetBytes("test2"));
            var provider    = new MockStateProvider <string, string>(1000 * 10, new StringSerDes(), new StringSerDes(), store1, store2);
            var composite   = new CompositeReadOnlyKeyValueStore <string, string>(provider, storeType, "store");

            store1.Put(bytes, valueSerdes.Serialize(ValueAndTimestamp <string> .Make("coucou1", dt), new SerializationContext()));
            store2.Put(bytes2, valueSerdes.Serialize(ValueAndTimestamp <string> .Make("coucou2", dt), new SerializationContext()));
            Assert.AreEqual(2, composite.ApproximateNumEntries());
        }
예제 #25
0
        public void GetTest()
        {
            InMemoryKeyValueStore store1 = new InMemoryKeyValueStore("store");
            InMemoryKeyValueStore store2 = new InMemoryKeyValueStore("store");
            var dt          = DateTime.Now.GetMilliseconds();
            var valueSerdes = new ValueAndTimestampSerDes <string>(new StringSerDes());
            var bytes       = new Bytes(Encoding.UTF8.GetBytes("test"));
            var provider    = new MockStateProvider <string, string>(1000 * 10, new StringSerDes(), new StringSerDes(), store1, store2);
            var composite   = new CompositeReadOnlyKeyValueStore <string, string>(provider, storeType, "store");

            store1.Put(bytes, valueSerdes.Serialize(ValueAndTimestamp <string> .Make("coucou1", dt)));
            var result = composite.Get("test");

            Assert.IsNotNull(result);
            Assert.AreEqual("coucou1", result);
        }
예제 #26
0
        public void EnumeratorReset()
        {
            var store = new InMemoryKeyValueStore("store");

            var serdes = new StringSerDes();

            byte[] key = serdes.Serialize("key", new SerializationContext()), value = serdes.Serialize("value", new SerializationContext());

            store.Put(new Bytes(key), value);

            var enumerator = store.All().GetEnumerator();

            Assert.IsTrue(enumerator.MoveNext());
            Assert.IsFalse(enumerator.MoveNext());
            Assert.Throws <NotSupportedException>(() => enumerator.Reset());
        }
예제 #27
0
        public void CanTrackTicketFromUrl()
        {
            var zendeskApi  = new Mock <IZendeskTicketApi>(MockBehavior.Strict);
            var ticket1     = new ZendeskTicket("12345", "description", "open", new ZendeskTicket.Comment[3]);
            var ticket2     = new ZendeskTicket("12345", "description", "open", new ZendeskTicket.Comment[5]);
            var persistence = new InMemoryKeyValueStore();

            zendeskApi.Setup(x => x.FromId("12345")).ReturnsAsync(ticket1);

            var commandParser  = CommandParser.For("track <https://redgatesupport.zendesk.com/agent/tickets/12345>");
            var zendeskTracker = new ZendeskTicketTracker(commandParser, persistence, zendeskApi.Object);

            var result = zendeskTracker.ProcessMessage(new Message("a-channel", "a-user", @"scbot track <https://redgatesupport.zendesk.com/agent/tickets/12345>"));

            Assert.AreEqual("Now tracking ZD#12345. To stop tracking, use `untrack ZD#12345`", result.Responses.Single().Message);
        }
        public void DeleteKeyExist()
        {
            var serdes = new StringSerDes();

            byte[] key = serdes.Serialize("key"),
            value = serdes.Serialize("value");

            var store = new InMemoryKeyValueStore("store");

            store.Put(new Bytes(key), value);
            Assert.AreEqual(1, store.ApproximateNumEntries());
            var v = store.Delete(new Bytes(key));

            Assert.AreEqual(0, store.ApproximateNumEntries());
            Assert.AreEqual("value", serdes.Deserialize(v));
        }
예제 #29
0
        public override IEnumerator RunTest()
        {
            // Get your key from https://console.developers.google.com/apis/credentials
            var apiKey = "AIzaSyCtcFQMgRIUHhSuXggm4BtXT4eZvUrBWN0";
            // See https://docs.google.com/spreadsheets/d/1Hwu4ZtRR0iXD65Wuj_XyJxLw4PN8SE0sRgnBKeVoq3A
            var sheetId   = "1Hwu4ZtRR0iXD65Wuj_XyJxLw4PN8SE0sRgnBKeVoq3A";
            var sheetName = "MySheet1"; // Has to match the sheet name

            var onDeviceEventsStore = new InMemoryKeyValueStore();

            yield return(AddAFewLocalNewsEvents(onDeviceEventsStore).AsCoroutine());

            NewsManager manager = NewsManager.NewManagerViaGSheets(apiKey, sheetId, sheetName, onDeviceEventsStore);

            yield return(LoadAllNews(manager).AsCoroutine());
        }
예제 #30
0
        public async Task TestGoogleSheetsKeyValueStore()
        {
            // Get your key from https://console.developers.google.com/apis/credentials
            var apiKey = "AIzaSyCtcFQMgRIUHhSuXggm4BtXT4eZvUrBWN0";
            // See https://docs.google.com/spreadsheets/d/13R9y6lnUMgRPC0PinJ23tACC6Flgogxa7h7SVaaLhT0
            var sheetId   = "13R9y6lnUMgRPC0PinJ23tACC6Flgogxa7h7SVaaLhT0";
            var sheetName = "UpdateEntriesV1"; // Has to match the sheet name

            var refreshDelayInMs = 1000;
            // The cache is where the data from the sheet will be locally stored in:
            var cache = new InMemoryKeyValueStore(); // Could also persist to disc here
            var store = new GoogleSheetsKeyValueStore(cache, apiKey, sheetId, sheetName, refreshDelayInMs);

            var download1 = store.dowloadOnlineDataDebounced();
            var download2 = store.dowloadOnlineDataDebounced();
            var download3 = store.dowloadOnlineDataDebounced();

            // After the refresh delay redownload was allowed again:
            await TaskV2.Delay(refreshDelayInMs * 3);

            Assert.True(await download1); // first trigger downloaded the data
            Assert.NotEmpty(store.latestRawSheetData);
            // Triggering it instant a second time will not download the data again:
            Assert.False(await download2); // Second trigger was skipped
            Assert.True(await download3);

            var entry1 = await store.Get <MySheetEntry>("1", null);

            Assert.NotNull(entry1);
            Assert.Equal("a", entry1.myString1);
            Assert.Equal(new List <int>()
            {
                1, 2, 3, 4
            }, entry1.myArray1);
            Assert.Equal("b", entry1.myObj1.a);
            Assert.Equal(5, entry1.myInt1);
            Assert.Equal(1.4, entry1.myDouble1);

            var entry2 = await store.Get <MySheetEntry>("2", null);

            Assert.NotNull(entry2);
            Assert.Null(entry2.myString1);
            Assert.Empty(entry2.myArray1);
            Assert.Null(entry2.myObj1);
            Assert.Equal(0, entry2.myInt1);
            Assert.Equal(0, entry2.myDouble1);
        }