예제 #1
0
        public void DumpedDataCanBeReloaded()
        {
            var cache = new CacheWithFail <string, Data>();

            cache.Add("Foo", new Data {
                String = "Foo", Int = 1
            });
            cache.Add("Bar", new Data {
                String = "Bar", Int = 2
            });

            var json = cache.DumpCacheAsJson();

            var newCache = new CacheWithFail <string, Data>();

            newCache.LoadCacheFromJson(json);

            Data data;

            newCache.TryGetValue("Foo", out data).Should().Be(CacheState.Found);
            data.String.Should().Be("Foo");
            data.Int.Should().Be(1);

            newCache.TryGetValue("Bar", out data).Should().Be(CacheState.Found);
            data.String.Should().Be("Bar");
            data.Int.Should().Be(2);
        }
예제 #2
0
        public async Task <TvShow> GetTvShowAsync(Video video, bool forceRefresh)
        {
            TvShow show;

            if (!video.ExternalIds.TmdbId.IsNullOrEmpty())
            {
                show = await _tvShowCache.GetOrAddAsync(video.ExternalIds.TmdbId,
                                                        async s => await _tmdbConnection.GetTvShowAsync(s, video.SeasonNumber, video.EpisodeNumber),
                                                        forceRefresh);

                if (show != null)
                {
                    _tvShowCacheByTitle.Add(new TitleYearExternalIdKey(video.Show, video.Year, show.ExternalExternalIds.ImdbId,
                                                                       show.ExternalExternalIds.TvdbId),
                                            show);

                    return(show);
                }
            }

            if (video.ExternalIds.ImdbId.IsNullOrEmpty() && video.ExternalIds.TvdbId.IsNullOrEmpty())
            {
                show = await _tmdbConnection.SearchForTvShowAsync(video.Show, video.ExternalIds,
                                                                  video.SeasonNumber, video.EpisodeNumber);

                if (show != null)
                {
                    _tvShowCache.Add(show.Id, show);
                    _tvShowCacheByTitle.Add(new TitleYearExternalIdKey(video.Show, video.Year, show.ExternalExternalIds.ImdbId,
                                                                       show.ExternalExternalIds.TvdbId), show);
                }

                return(show);
            }

            var key = new TitleYearExternalIdKey(video.Show, video.Year, video.ExternalIds.ImdbId, video.ExternalIds.TvdbId);

            show = await _tvShowCacheByTitle.GetOrAddAsync(key,
                                                           async s => await _tmdbConnection.SearchForTvShowAsync(video.Show, video.ExternalIds,
                                                                                                                 video.SeasonNumber, video.EpisodeNumber),
                                                           forceRefresh);

            if (show != null)
            {
                _tvShowCache.Add(show.Id, show);
            }

            return(show);
        }
예제 #3
0
        public async Task ClearClearsTheCacheButNotFailedItems()
        {
            var cache = new CacheWithFail <string, Data>();

            cache.Add("Foo", new Data {
                String = "Foo", Int = 1
            });

            await cache.GetOrAddAsync("Bar", async s => await Task.Run(() => (Data)null));

            cache.Clear();

            Data data;

            cache.TryGetValue("Foo", out data).Should().Be(CacheState.NotFound);

            var called = false;
            await cache.GetOrAddAsync("Bar", async s => await Task.Run(() =>
            {
                called = true;
                return((Data)null);
            }));

            called.Should().BeFalse();
        }
예제 #4
0
        public void ContainsKeyReturnsCorrectValue(string key, bool expected)
        {
            var cache = new CacheWithFail <string, Data>();

            cache.Add("Foo", new Data {
                String = "Foo", Int = 1
            });

            cache.ContainsKey(key).Should().Be(expected);
        }
예제 #5
0
        public async Task <Movie> GetMovieAsync(Video video, bool forceRefresh)
        {
            Movie movie;

            if (!video.ExternalIds.TmdbId.IsNullOrEmpty())
            {
                movie = await _movieCache.GetOrAddAsync(video.ExternalIds.TmdbId,
                                                        async s => await _tmdbConnection.GetMovieAsync(s),
                                                        forceRefresh);

                if (movie != null)
                {
                    _movieCacheByTitle.Add(new TitleYearExternalIdKey(video.Title, video.Year, movie.ImdbId), movie);
                    return(movie);
                }
            }

            if (video.ExternalIds.ImdbId.IsNullOrEmpty())
            {
                movie = await _tmdbConnection.SearchForMovieAsync(video.Title, video.Year, video.ExternalIds);

                if (movie != null)
                {
                    _movieCache.Add(movie.Id, movie);
                    _movieCacheByTitle.Add(new TitleYearExternalIdKey(video.Title, video.Year, movie.ImdbId), movie);
                }

                return(movie);
            }

            var key = new TitleYearExternalIdKey(video.Title, video.Year, video.ExternalIds.ImdbId);

            movie = await _movieCacheByTitle.GetOrAddAsync(key,
                                                           async s => await _tmdbConnection.SearchForMovieAsync(video.Title, video.Year, video.ExternalIds),
                                                           forceRefresh);

            if (movie != null)
            {
                _movieCache.Add(movie.Id, movie);
            }

            return(movie);
        }
예제 #6
0
        public void DumpedDataCanBeReloaded()
        {
            var cache = new CacheWithFail<string, Data>();
            cache.Add("Foo", new Data { String = "Foo", Int = 1 });
            cache.Add("Bar", new Data { String = "Bar", Int = 2 });

            var json = cache.DumpCacheAsJson();

            var newCache = new CacheWithFail<string, Data>();
            newCache.LoadCacheFromJson(json);

            Data data;

            newCache.TryGetValue("Foo", out data).Should().Be(CacheState.Found);
            data.String.Should().Be("Foo");
            data.Int.Should().Be(1);

            newCache.TryGetValue("Bar", out data).Should().Be(CacheState.Found);
            data.String.Should().Be("Bar");
            data.Int.Should().Be(2);
        }
예제 #7
0
        public async Task IfItemIsInCacheFuncIsNotCalled()
        {
            var cache = new CacheWithFail<string, Data>();
            cache.Add("Foo", new Data { String = "Foo", Int = 1 });
            var called = false;

            await cache.GetOrAddAsync("Foo", async s => await Task.Run(() =>
            {
                called = true;
                return new Data { String = "Foo", Int = 1 };
            }));

            called.Should().BeFalse();
        }
예제 #8
0
        public async Task IfAddFailsThenFuncIsNotCalledAgain()
        {
            var cache = new CacheWithFail<string, Data>();
            cache.Add("Foo", new Data { String = "Foo", Int = 1 });

            await cache.GetOrAddAsync("Bar", async s => await Task.Run(() => (Data)null));

            var called = false;
            await cache.GetOrAddAsync("Bar", async s => await Task.Run(() =>
            {
                called = true;
                return (Data)null;
            }));

            called.Should().BeFalse();
        }
예제 #9
0
        public async Task ClearClearsTheCache()
        {
            var cache = new CacheWithFail <string, Data>();

            cache.Add("Foo", new Data {
                String = "Foo", Int = 1
            });

            await cache.GetOrAddAsync("Bar", async s => await Task.Run(() => (Data)null));

            cache.Clear();

            Data data;

            cache.TryGetValue("Foo", out data).Should().Be(CacheState.NotFound);
        }
예제 #10
0
        public async Task IfAddFailsThenFuncIsNotCalledAgain()
        {
            var cache = new CacheWithFail <string, Data>();

            cache.Add("Foo", new Data {
                String = "Foo", Int = 1
            });

            await cache.GetOrAddAsync("Bar", async s => await Task.Run(() => (Data)null));

            var called = false;
            await cache.GetOrAddAsync("Bar", async s => await Task.Run(() =>
            {
                called = true;
                return((Data)null);
            }));

            called.Should().BeFalse();
        }
예제 #11
0
        public async Task ForceReloadForcesAReload()
        {
            var cache = new CacheWithFail <string, Data>();

            cache.Add("Foo", new Data {
                String = "Foo", Int = 1
            });
            var called = false;

            await cache.GetOrAddAsync("Foo", async s => await Task.Run(() =>
            {
                called = true;
                return(new Data {
                    String = "Foo", Int = 1
                });
            }), true);

            called.Should().BeTrue();
        }
예제 #12
0
        public async Task IfItemIsInCacheFuncIsNotCalled()
        {
            var cache = new CacheWithFail <string, Data>();

            cache.Add("Foo", new Data {
                String = "Foo", Int = 1
            });
            var called = false;

            await cache.GetOrAddAsync("Foo", async s => await Task.Run(() =>
            {
                called = true;
                return(new Data {
                    String = "Foo", Int = 1
                });
            }));

            called.Should().BeFalse();
        }
예제 #13
0
        public async Task IfAddFailsThenFuncIsCalledAgainAfterTimeout()
        {
            var cache = new CacheWithFail <string, Data>(TimeSpan.FromMilliseconds(100));

            cache.Add("Foo", new Data {
                String = "Foo", Int = 1
            });

            await cache.GetOrAddAsync("Bar", async s => await Task.Run(() => (Data)null));

            await Task.Delay(1000);

            var called = false;
            await cache.GetOrAddAsync("Bar", async s => await Task.Run(() =>
            {
                called = true;
                return((Data)null);
            }));

            called.Should().BeTrue();
        }
예제 #14
0
        public async Task IfAddFailsThenFuncIsCalledAgainAfterTimeout()
        {
            var cache = new CacheWithFail<string, Data>(TimeSpan.FromMilliseconds(100));
            cache.Add("Foo", new Data { String = "Foo", Int = 1 });

            await cache.GetOrAddAsync("Bar", async s => await Task.Run(() => (Data)null));

            await Task.Delay(1000);

            var called = false;
            await cache.GetOrAddAsync("Bar", async s => await Task.Run(() =>
            {
                called = true;
                return (Data)null;
            }));

            called.Should().BeTrue();
        }
예제 #15
0
        public async Task ClearClearsTheCache()
        {
            var cache = new CacheWithFail<string, Data>();
            cache.Add("Foo", new Data { String = "Foo", Int = 1 });

            await cache.GetOrAddAsync("Bar", async s => await Task.Run(() => (Data)null));

            cache.Clear();

            Data data;
            cache.TryGetValue("Foo", out data).Should().Be(CacheState.NotFound);
        }
예제 #16
0
        public async Task ClearClearsTheCacheButNotFailedItems()
        {
            var cache = new CacheWithFail<string, Data>();
            cache.Add("Foo", new Data { String = "Foo", Int = 1 });

            await cache.GetOrAddAsync("Bar", async s => await Task.Run(() => (Data)null));

            cache.Clear();

            Data data;
            cache.TryGetValue("Foo", out data).Should().Be(CacheState.NotFound);

            var called = false;
            await cache.GetOrAddAsync("Bar", async s => await Task.Run(() =>
            {
                called = true;
                return (Data)null;
            }));

            called.Should().BeFalse();
        }
예제 #17
0
        public void ContainsKeyReturnsCorrectValue(string key, bool expected)
        {
            var cache = new CacheWithFail<string, Data>();
            cache.Add("Foo", new Data { String = "Foo", Int = 1 });

            cache.ContainsKey(key).Should().Be(expected);
        }
예제 #18
0
        public async Task ForceReloadForcesAReload()
        {
            var cache = new CacheWithFail<string, Data>();
            cache.Add("Foo", new Data { String = "Foo", Int = 1 });
            var called = false;

            await cache.GetOrAddAsync("Foo", async s => await Task.Run(() =>
            {
                called = true;
                return new Data { String = "Foo", Int = 1 };
            }), true);

            called.Should().BeTrue();
        }