public async Task LoadUnmanagedFromDependencyContext_PreferInstalledRuntime_Returns_RuntimeCandidate()
        {
            var testContext = await SetupLoadedPluginTextContext((plc) => plc.NativeDependencyLoadPreference = NativeDependencyLoadPreference.PreferInstalledRuntime);

            var loadContext = testContext.Sut();
            var initialPluginLoadDirectory = testContext.InitialPluginLoadDirectory;
            var resolver = testContext.GetMock <IAssemblyDependencyResolver>();
            var pluginDependencyContext  = testContext.GetMock <IPluginDependencyContext>();
            var pluginDependencyResolver = testContext.GetMock <IPluginDependencyResolver>();

            var nativeDependency = "Nativelib.dll";
            var pathToDependency = "/var/path/to/dependency/Nativelib.dll";
            var runtimeCandidate = "/var/path/to/runtime/Nativelib.dll";

            resolver.Setup(r => r.ResolveUnmanagedDllToPath(nativeDependency)).Returns((string)null);
            var platformDependency = new PlatformDependency
            {
                DependencyNameWithoutExtension = "Nativelib"
            };
            var additionalProbingPaths = Enumerable.Empty <string>();

            pluginDependencyContext.SetupGet(c => c.AdditionalProbingPaths).Returns(additionalProbingPaths);
            pluginDependencyContext.SetupGet(c => c.PlatformDependencies).Returns(new[] {
                platformDependency,
                new PlatformDependency
                {
                    DependencyNameWithoutExtension = "OtherNativelib"
                }
            });
            pluginDependencyResolver
            .Setup(r => r.ResolvePlatformDependencyToPath(initialPluginLoadDirectory, platformDependency, additionalProbingPaths))
            .Returns(pathToDependency);
            pluginDependencyResolver.Setup(r => r.ResolvePlatformDependencyPathToRuntime(It.IsAny <PluginPlatformVersion>(), pathToDependency)).Returns(runtimeCandidate);

            var result = InvokeProtectedMethodOnLoadContextAndGetResult <ValueOrProceed <string> >(
                loadContext,
                "LoadUnmanagedFromDependencyContext",
                new object[] { initialPluginLoadDirectory, nativeDependency });

            Assert.IsNotNull(result.Value);
            Assert.AreEqual(runtimeCandidate, result.Value);
            Assert.IsFalse(result.CanProceed);
        }
Beispiel #2
0
        public virtual string ResolvePlatformDependencyToPath(string dependencyPath, IEnumerable <string> probingPaths, PlatformDependency dependency)
        {
            foreach (var candidate in runtimePlatformContext.GetPlatformDependencyNames(dependency.DependencyNameWithoutExtension))
            {
                var candidateLocation = Path.Combine(dependencyPath, candidate);
                if (File.Exists(candidateLocation))
                {
                    return(candidateLocation);
                }
            }

            var local = Path.Combine(dependencyPath, dependency.DependencyPath);

            if (File.Exists(local))
            {
                return(local);
            }

            foreach (var searchPath in probingPaths)
            {
                var candidate = Path.Combine(searchPath, dependency.ProbingPath);
                if (File.Exists(candidate))
                {
                    return(candidate);
                }
            }

            return(null);
        }
        public string ResolvePlatformDependencyToPath(string dependencyPath, IEnumerable <string> probingPaths, PlatformDependency dependency)
        {
            foreach (var candidate in runtimePlatformContext.GetPlatformDependencyNames(dependency.DependencyNameWithoutExtension))
            {
                var platformNetworkFileLocation = $"{this.options.BaseUrl}/{candidate}";
                var platformNetworkFile         = NetworkUtil.Download(this.httpClient, platformNetworkFileLocation);
                if (platformNetworkFile != null)
                {
                    var localLocation = NetworkUtil.SaveToTempFolder(this.tempPathProvider.ProvideTempPath(Path.GetFileName(candidate)), platformNetworkFile);
                    return(localLocation);
                }
            }

            var networkFileLocation = $"{this.options.BaseUrl}/{dependency.DependencyPath}";
            var networkFile         = NetworkUtil.Download(this.httpClient, networkFileLocation);

            if (networkFile != null)
            {
                var localLocation = NetworkUtil.SaveToTempFolder(this.tempPathProvider.ProvideTempPath(Path.GetFileName(dependency.DependencyPath)), networkFile);
                return(localLocation);
            }

            foreach (var searchPath in probingPaths)
            {
                networkFileLocation = $"{this.options.BaseUrl}/{Path.Combine(searchPath, dependency.ProbingPath)}";
                networkFile         = NetworkUtil.Download(this.httpClient, networkFileLocation);
                if (networkFile != null)
                {
                    var localLocation = NetworkUtil.SaveToTempFolder(this.tempPathProvider.ProvideTempPath(Path.GetFileName(dependency.ProbingPath)), networkFile);
                    return(localLocation);
                }
            }

            return(null);
        }