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); }
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()); }
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)); }
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)); }
public InMemoryKeyValueStoreTests() { // Object under test _inMemoryStore = new InMemoryKeyValueStore(); AddNoiseToStore(); }
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)); } }
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); }
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); }
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); }
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(); }
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()); }
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)); }
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()); }
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()); }
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()); }
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); }
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()); }
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)); }
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()); }
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); }