public void DeepEquals()
        {
            ISymbolStore storeA =
                new StadiaSymbolStore(fakeFileSystem, _httpClient, _crashReportClient);
            ISymbolStore storeB =
                new StadiaSymbolStore(fakeFileSystem, _httpClient, _crashReportClient);

            Assert.True(storeA.DeepEquals(storeB));
            Assert.True(storeB.DeepEquals(storeA));
        }
        public async Task FindFile_EmptyBuildIdAsync()
        {
            ISymbolStore store =
                new StadiaSymbolStore(fakeFileSystem, _httpClient, _crashReportClient);

            IFileReference fileReference =
                await store.FindFileAsync(FILENAME, BuildId.Empty, true, log);

            Assert.Null(fileReference);
            StringAssert.Contains(Strings.FailedToSearchStadiaStore(FILENAME, Strings.EmptyBuildId),
                                  log.ToString());
        }
        public async Task FindFile_HttpRequestExceptionAsync()
        {
            _crashReportClient.GenerateSymbolFileDownloadUrlAsync(BUILD_ID.ToHexString(), FILENAME)
            .Returns(_urlInStore);
            _fakeHttpMessageHandler.ExceptionMap[new Uri(_urlInStore)] =
                new HttpRequestException("message");
            ISymbolStore store =
                new StadiaSymbolStore(fakeFileSystem, _httpClient, _crashReportClient);

            IFileReference fileReference = await store.FindFileAsync(FILENAME, BUILD_ID, true, log);

            Assert.Null(fileReference);
            StringAssert.Contains(Strings.FailedToSearchStadiaStore(FILENAME, "message"),
                                  log.ToString());
        }
        public async Task FindFile_HttpNotFoundAsync()
        {
            _crashReportClient.GenerateSymbolFileDownloadUrlAsync(BUILD_ID.ToHexString(), FILENAME)
            .Returns(_urlInStore);
            // By default, HTTP client returns Not Found for every file.
            ISymbolStore store =
                new StadiaSymbolStore(fakeFileSystem, _httpClient, _crashReportClient);

            IFileReference fileReference = await store.FindFileAsync(FILENAME, BUILD_ID, true, log);

            Assert.Null(fileReference);
            StringAssert.Contains(
                Strings.FileNotFoundInStadiaStore(BUILD_ID.ToHexString(), FILENAME),
                log.ToString());
        }
        public async Task FindFile_APIExceptionAsync()
        {
            var ex = new CloudException(
                "Failed to generate download URL: permission denied",
                new RpcException(new Status(StatusCode.PermissionDenied, "message")));

            _crashReportClient.GenerateSymbolFileDownloadUrlAsync(BUILD_ID.ToHexString(), FILENAME)
            .Returns(x => Task.FromException <string>(ex));
            ISymbolStore store =
                new StadiaSymbolStore(fakeFileSystem, _httpClient, _crashReportClient);

            IFileReference fileReference = await store.FindFileAsync(FILENAME, BUILD_ID, true, log);

            Assert.Null(fileReference);
            StringAssert.Contains(Strings.FailedToSearchStadiaStore(FILENAME, ex.Message),
                                  log.ToString());
        }