public async Task <FetchResult> FetchAsync(string dtmi, Uri repositoryUri, CancellationToken cancellationToken = default) { Queue <string> work = new Queue <string>(); if (_tryExpanded) { work.Enqueue(GetPath(dtmi, repositoryUri, true)); } work.Enqueue(GetPath(dtmi, repositoryUri, false)); string remoteFetchError = string.Empty; while (work.Count != 0 && !cancellationToken.IsCancellationRequested) { string tryContentPath = work.Dequeue(); _logger.LogTrace(StandardStrings.FetchingContent(tryContentPath)); string content = await EvaluatePathAsync(tryContentPath, cancellationToken); if (!string.IsNullOrEmpty(content)) { return(new FetchResult() { Definition = content, Path = tryContentPath }); } remoteFetchError = StandardStrings.ErrorAccessRemoteRepositoryModel(tryContentPath); _logger.LogWarning(remoteFetchError); } throw new RequestFailedException(remoteFetchError); }
public async Task FetchLocalRepository(bool fetchExpanded) { // Casing is irrelevant for fetchers as they grab content based on file-path // which will always be lowercase. Casing IS important for the resolve flow // and is covered by tests there. string targetDtmi = "dtmi:com:example:temperaturecontroller;1"; ResolverClientOptions options = fetchExpanded ? new ResolverClientOptions(DependencyResolutionOption.TryFromExpanded) : new ResolverClientOptions(); string expectedPath = DtmiConventions.DtmiToQualifiedPath(targetDtmi, _localUri.AbsolutePath, fetchExpanded); LocalModelFetcher localFetcher = new LocalModelFetcher(_logger.Object, options); string fetcherPath = localFetcher.GetPath(targetDtmi, _localUri, fetchExpanded); Assert.AreEqual(fetcherPath, expectedPath); // Resolution correctness is covered in ResolverIntegrationTests FetchResult fetchResult = await localFetcher.FetchAsync(targetDtmi, _localUri); Assert.True(!string.IsNullOrEmpty(fetchResult.Definition)); Assert.True(!string.IsNullOrEmpty(fetchResult.Path)); Assert.AreEqual(fetchResult.FromExpanded, fetchExpanded); _logger.ValidateLog(StandardStrings.FetchingContent(fetcherPath), LogLevel.Trace, Times.Once()); }
// [TestCase(true)] - TODO: Uncomment when consistent remote repo available. public async Task FetchRemoteRepository(bool fetchExpanded) { string targetDtmi = "dtmi:com:example:temperaturecontroller;1"; RemoteModelFetcher remoteFetcher = new RemoteModelFetcher(_logger.Object, new ResolverClientOptions()); string expectedPath = DtmiConventions.DtmiToQualifiedPath(targetDtmi, _remoteUri.AbsoluteUri, fetchExpanded); string fetcherPath = remoteFetcher.GetPath(targetDtmi, _remoteUri, fetchExpanded); Assert.AreEqual(fetcherPath, expectedPath); // Resolution correctness is covered in ResolverIntegrationTests FetchResult fetchResult = await remoteFetcher.FetchAsync(targetDtmi, _remoteUri); Assert.True(!string.IsNullOrEmpty(fetchResult.Definition)); Assert.True(!string.IsNullOrEmpty(fetchResult.Path)); Assert.AreEqual(fetchResult.FromExpanded, fetchExpanded); _logger.ValidateLog($"{StandardStrings.FetchingContent(fetcherPath)}", LogLevel.Trace, Times.Once()); }
public FetchResult Fetch(string dtmi, Uri repositoryUri, CancellationToken cancellationToken = default) { string registryPath = repositoryUri.AbsolutePath; if (!Directory.Exists(registryPath)) { string dnfError = StandardStrings.ErrorAccessLocalRepository(registryPath); _logger.LogError(dnfError); throw new DirectoryNotFoundException(dnfError); } Queue <string> work = new Queue <string>(); if (_tryExpanded) { work.Enqueue(GetPath(dtmi, repositoryUri, true)); } work.Enqueue(GetPath(dtmi, repositoryUri, false)); string fnfError = string.Empty; while (work.Count != 0 && !cancellationToken.IsCancellationRequested) { string tryContentPath = work.Dequeue(); _logger.LogTrace(StandardStrings.FetchingContent(tryContentPath)); if (EvaluatePath(tryContentPath)) { return(new FetchResult() { Definition = File.ReadAllText(tryContentPath, Encoding.UTF8), Path = tryContentPath }); } fnfError = StandardStrings.ErrorAccessLocalRepositoryModel(tryContentPath); _logger.LogWarning(fnfError); } throw new FileNotFoundException(fnfError); }