Ejemplo n.º 1
0
        public void VerifySdkReferenceParseWith(string sdkString)
        {
            SdkReference sdk;
            var          parsed = SdkReference.TryParse(sdkString, out sdk);

            Assert.False(parsed);
            Assert.Null(sdk);
        }
Ejemplo n.º 2
0
        public void VerifySdkReferenceParseWith(string sdkString)
        {
            SdkReference sdk;
            var          parsed = SdkReference.TryParse(sdkString, out sdk);

            parsed.ShouldBeFalse();
            sdk.ShouldBeNull();
        }
Ejemplo n.º 3
0
 public SdkResultImpl(SdkReference sdkReference, string path, string version, IEnumerable <string> warnings)
 {
     Success  = true;
     Sdk      = sdkReference;
     Path     = path;
     Version  = version;
     Warnings = warnings;
 }
        /// <inheritdoc cref="ISdkResolverService.ResolveSdk"/>
        public override SdkResult ResolveSdk(int submissionId, SdkReference sdk, LoggingContext loggingContext, ElementLocation sdkReferenceLocation, string solutionPath, string projectPath, bool interactive, bool isRunningInVisualStudio)
        {
            ErrorUtilities.VerifyThrowInternalNull(sdk, nameof(sdk));
            ErrorUtilities.VerifyThrowInternalNull(loggingContext, nameof(loggingContext));
            ErrorUtilities.VerifyThrowInternalNull(sdkReferenceLocation, nameof(sdkReferenceLocation));
            ErrorUtilities.VerifyThrowInternalLength(projectPath, nameof(projectPath));

            return(_cachedSdkResolver.ResolveSdk(submissionId, sdk, loggingContext, sdkReferenceLocation, solutionPath, projectPath, interactive, isRunningInVisualStudio));
        }
Ejemplo n.º 5
0
        /// <inheritdoc cref="ISdkResolverService.ResolveSdk"/>
        public override SdkResult ResolveSdk(int submissionId, SdkReference sdk, LoggingContext loggingContext, ElementLocation sdkReferenceLocation, SdkEnv sdkEnv, bool interactive)
        {
            ErrorUtilities.VerifyThrowInternalNull(sdk, nameof(sdk));
            ErrorUtilities.VerifyThrowInternalNull(loggingContext, nameof(loggingContext));
            ErrorUtilities.VerifyThrowInternalNull(sdkReferenceLocation, nameof(sdkReferenceLocation));
            ErrorUtilities.VerifyThrowInternalLength(sdkEnv.projectPath, nameof(sdkEnv.projectPath));

            return(_cachedSdkResolver.ResolveSdk(submissionId, sdk, loggingContext, sdkReferenceLocation, sdkEnv, interactive));
        }
Ejemplo n.º 6
0
        public override SdkResultBase Resolve(SdkReference sdk, SdkResolverContextBase context, SdkResultFactoryBase factory)
        {
            var sdkPath = Path.Combine(BuildEnvironmentHelper.Instance.MSBuildSDKsPath, sdk.Name, "Sdk");

            // Note: On failure MSBuild will log a generic message, no need to indicate a failure reason here.
            return(FileUtilities.DirectoryExistsNoThrow(sdkPath)
                ? factory.IndicateSuccess(sdkPath, string.Empty)
                : factory.IndicateFailure(null));
        }
 public SdkResultImpl(SdkReference sdkReference, IEnumerable <string> paths, string version,
                      IDictionary <string, string> propertiesToAdd, IDictionary <string, SdkResultItem> itemsToAdd, IEnumerable <string> warnings)
     : this(sdkReference, paths.FirstOrDefault(), version, propertiesToAdd, itemsToAdd, warnings)
 {
     if (paths.Count() > 1)
     {
         AdditionalPaths = paths.Skip(1).ToList();
     }
 }
Ejemplo n.º 8
0
        /// <summary>
        /// Determines if the <see cref="SdkReference"/> is the same as the specified version.  If the <paramref name="sdk"/> object has <code>null</code> for the version,
        /// this method will always return true since <code>null</code> can match any version.
        /// </summary>
        /// <param name="sdk">An <see cref="SdkReference"/> object.</param>
        /// <param name="version">The version to compare.</param>
        /// <returns><code>true</code> if the specified SDK reference has the same version as the specified result, otherwise <code>false</code>.</returns>
        public static bool IsReferenceSameVersion(SdkReference sdk, string version)
        {
            // If the reference has a null version, it matches any result
            if (String.IsNullOrEmpty(sdk.Version))
            {
                return(true);
            }

            return(String.Equals(sdk.Version, version, StringComparison.OrdinalIgnoreCase));
        }
Ejemplo n.º 9
0
        public override SdkResult Resolve(SdkReference sdkReference, SdkResolverContext resolverContext, SdkResultFactory factory)
        {
            var sdksPath = MSBuildProjectService.GetDefaultSdksPath(TargetRuntime);
            var sdkPath  = Path.Combine(sdksPath, sdkReference.Name, "Sdk");

            // Note: On failure MSBuild will log a generic message, no need to indicate a failure reason here.
            return(System.IO.Directory.Exists(sdkPath)
                                ? factory.IndicateSuccess(sdkPath, string.Empty)
                                : factory.IndicateFailure(null));
        }
        public void AssertFirstResolverCanResolve()
        {
            var sdk = new SdkReference("1sdkName", "referencedVersion", "minimumVersion");

            SdkResolution resolution = new SdkResolution(new MockLoaderStrategy());
            var           result     = resolution.GetSdkPath(sdk, _loggingContext, new MockElementLocation("file"), "sln", "projectPath");

            Assert.Equal("resolverpath1", result);
            Assert.Equal("MockSdkResolver1 running", _log.ToString().Trim());
        }
Ejemplo n.º 11
0
 public override SdkResult Resolve(SdkReference sdk, SdkResolverContext resolverContext,
                                   SdkResultFactory factory)
 {
     return(sdk.Name switch
     {
         SdkName when sdk.Version == SdkExpectedVersion =>
         factory.IndicateSuccess(ResolvedPath, SdkExpectedVersion),
         SdkName => factory.IndicateFailure(new[] { ErrorVersion }),
         _ => factory.IndicateFailure(new[] { ErrorName })
     });
Ejemplo n.º 12
0
            public override Framework.SdkResult Resolve(SdkReference sdkReference, SdkResolverContext resolverContext, SdkResultFactory factory)
            {
                resolverContext.Logger.LogMessage($"{nameof(resolverContext.ProjectFilePath)} = {resolverContext.ProjectFilePath}", MessageImportance.High);
                resolverContext.Logger.LogMessage($"{nameof(resolverContext.SolutionFilePath)} = {resolverContext.SolutionFilePath}", MessageImportance.High);
                resolverContext.Logger.LogMessage($"{nameof(resolverContext.MSBuildVersion)} = {resolverContext.MSBuildVersion}", MessageImportance.High);

                return(_mapping.ContainsKey(sdkReference.Name)
                    ? factory.IndicateSuccess(_mapping[sdkReference.Name], null)
                    : factory.IndicateFailure(new[] { $"Not in {nameof(_mapping)}" }));
            }
Ejemplo n.º 13
0
            public override SdkResultBase Resolve(SdkReference sdk, SdkResolverContextBase resolverContext, SdkResultFactoryBase factory)
            {
                resolverContext.Logger.LogMessage("MockSdkResolver1 running", MessageImportance.Normal);

                if (sdk.Name.StartsWith("1"))
                {
                    return(factory.IndicateSuccess("resolverpath1", "version1"));
                }

                return(factory.IndicateFailure(new[] { "ERROR1" }));
            }
Ejemplo n.º 14
0
        public void AssertFirstResolverCanResolve()
        {
            SdkResolverService.Instance.InitializeForTests(new MockLoaderStrategy());

            SdkReference sdk = new SdkReference("1sdkName", "referencedVersion", "minimumVersion");

            var result = SdkResolverService.Instance.ResolveSdk(BuildEventContext.InvalidSubmissionId, sdk, _loggingContext, new MockElementLocation("file"), "sln", "projectPath", interactive: false, isRunningInVisualStudio: false);

            result.Path.ShouldBe("resolverpath1");
            _logger.BuildMessageEvents.Select(i => i.Message).ShouldContain("MockSdkResolver1 running");
        }
Ejemplo n.º 15
0
            public override SdkResultBase Resolve(SdkReference sdk, SdkResolverContextBase resolverContext, SdkResultFactoryBase factory)
            {
                resolverContext.Logger.LogMessage("MockSdkResolverWithResolvableSdkPattern2 running", MessageImportance.Normal);

                if (sdk.Name.StartsWith("2"))
                {
                    return(factory.IndicateSuccess("resolverpathwithresolvablesdkpattern2", "version4", new[] { "WARNING4" }));
                }

                return(factory.IndicateFailure(new[] { "ERROR4" }, new[] { "WARNING4" }));
            }
Ejemplo n.º 16
0
        public void AssertErrorLoggedWhenResolverThrows()
        {
            SdkResolverService.Instance.InitializeForTests(new MockLoaderStrategy(includeErrorResolver: true));

            SdkReference sdk = new SdkReference("1sdkName", "referencedVersion", "minimumVersion");

            string result = SdkResolverService.Instance.ResolveSdk(BuildEventContext.InvalidSubmissionId, sdk, _loggingContext, new MockElementLocation("file"), "sln", "projectPath");

            Assert.Equal("resolverpath1", result);
            Assert.Contains("EXMESSAGE", _log.ToString());
        }
Ejemplo n.º 17
0
        public void VerifySdkReferenceParseNoVersion()
        {
            string       sdkString = "Name";
            SdkReference sdk;
            var          parsed = SdkReference.TryParse(sdkString, out sdk);

            Assert.True(parsed);
            Assert.Equal("Name", sdk.Name);
            Assert.Null(sdk.Version);
            Assert.Null(sdk.MinimumVersion);
        }
Ejemplo n.º 18
0
        public void AssertErrorLoggedWhenResolverThrows()
        {
            SdkResolverService.Instance.InitializeForTests(new MockLoaderStrategy(includeErrorResolver: true));

            SdkReference sdk = new SdkReference("1sdkName", "version1", "minimumVersion");

            var result = SdkResolverService.Instance.ResolveSdk(BuildEventContext.InvalidSubmissionId, sdk, _loggingContext, new MockElementLocation("file"), "sln", "projectPath", interactive: false, isRunningInVisualStudio: false);

            result.Path.ShouldBe("resolverpath1");
            _logger.Warnings.Select(i => i.Message).ShouldBe(new [] { "The SDK resolver \"MockSdkResolverThrows\" failed to run. EXMESSAGE" });
        }
 public SdkResultImpl(SdkReference sdkReference, string path, string version,
                      IDictionary <string, string> propertiesToAdd, IDictionary <string, SdkResultItem> itemsToAdd, IEnumerable <string> warnings)
 {
     Success         = true;
     Sdk             = sdkReference;
     PropertiesToAdd = propertiesToAdd;
     ItemsToAdd      = itemsToAdd;
     Path            = path;
     Version         = version;
     Warnings        = warnings;
 }
Ejemplo n.º 20
0
 public virtual SdkResult ResolveSdk(int submissionId, SdkReference sdk, LoggingContext loggingContext, ElementLocation sdkReferenceLocation, string solutionPath, string projectPath, bool interactive, bool isRunningInVisualStudio)
 {
     if (ChangeWaves.AreFeaturesEnabled(ChangeWaves.Wave17_4))
     {
         return(ResolveSdkUsingResolversWithPatternsFirst(submissionId, sdk, loggingContext, sdkReferenceLocation, solutionPath, projectPath, interactive, isRunningInVisualStudio));
     }
     else
     {
         return(ResolveSdkUsingAllResolvers(submissionId, sdk, loggingContext, sdkReferenceLocation, solutionPath, projectPath, interactive, isRunningInVisualStudio));
     }
 }
Ejemplo n.º 21
0
        public void AssertFirstResolverCanResolve()
        {
            SdkResolverService.Instance.InitializeForTests(new MockLoaderStrategy());

            SdkReference sdk = new SdkReference("1sdkName", "referencedVersion", "minimumVersion");

            string result = SdkResolverService.Instance.ResolveSdk(BuildEventContext.InvalidSubmissionId, sdk, _loggingContext, new MockElementLocation("file"), "sln", "projectPath");

            Assert.Equal("resolverpath1", result);
            Assert.Contains("MockSdkResolver1 running", _log.ToString().Trim());
        }
            public override SdkResult Resolve(SdkReference sdk, SdkResolverContext resolverContext, SdkResultFactory factory)
            {
                resolverContext.Logger.LogMessage("MockSdkResolver2 running", MessageImportance.Normal);

                if (sdk.Name.StartsWith("2"))
                {
                    return(factory.IndicateSuccess("resolverpath2", "version2", new[] { "WARNING2" }));
                }

                return(factory.IndicateFailure(new[] { "ERROR2" }, new[] { "WARNING2" }));
            }
Ejemplo n.º 23
0
        /// <summary>
        /// Processes all requests that are currently in the queue.
        /// </summary>
        private void ProcessRequests()
        {
            // Store a list of threads which are resolving SDKs
            List <Task> tasks = new List <Task>(_requests.Count);

            SdkResolverRequest item;

            while (_requests.TryDequeue(out item))
            {
                SdkResolverRequest request = item;

                // Start a thread to resolve an SDK and add it to the list of threads
                tasks.Add(Task.Run(() =>
                {
                    SdkResult response = null;
                    try
                    {
                        // Create an SdkReference from the request
                        SdkReference sdkReference = new SdkReference(request.Name, request.Version, request.MinimumVersion);

                        ILoggingService loggingService = Host.GetComponent(BuildComponentType.LoggingService) as ILoggingService;

                        // This call is usually cached so is very fast but can take longer for a new SDK that is downloaded.  Other queued threads for different SDKs will complete sooner and continue on which unblocks evaluations
                        response = ResolveSdk
                                   (
                            request.SubmissionId,
                            sdkReference,
                            new EvaluationLoggingContext(loggingService, request.BuildEventContext, request.ProjectPath),
                            request.ElementLocation,
                            new SdkEnv(request.SolutionPath, request.ProjectPath),
                            request.Interactive
                                   );
                    }
                    catch (Exception e)
                    {
                        ILoggingService loggingService = Host.GetComponent(BuildComponentType.LoggingService) as ILoggingService;

                        EvaluationLoggingContext loggingContext = new EvaluationLoggingContext(loggingService, request.BuildEventContext, request.ProjectPath);

                        loggingService.LogFatalBuildError(loggingContext.BuildEventContext, e, new BuildEventFileInfo(request.ElementLocation));
                    }
                    finally
                    {
                        // Get the node manager and send the response back to the node that requested the SDK
                        INodeManager nodeManager = Host.GetComponent(BuildComponentType.NodeManager) as INodeManager;

                        nodeManager.SendData(request.NodeId, response);
                    }
                }));
            }

            // Wait for all tasks to complete
            Task.WaitAll(tasks.ToArray());
        }
Ejemplo n.º 24
0
        public void VerifySdkReferenceParseNoVersion()
        {
            string       sdkString = "Name";
            SdkReference sdk;
            var          parsed = SdkReference.TryParse(sdkString, out sdk);

            parsed.ShouldBeTrue();
            sdk.Name.ShouldBe("Name");
            sdk.Version.ShouldBeNull();
            sdk.MinimumVersion.ShouldBeNull();
        }
Ejemplo n.º 25
0
        public override SdkResult Resolve(SdkReference sdkReference, SdkResolverContext resolverContext, SdkResultFactory factory)
        {
            if (sdkReference.Name != "Mono.UE4.Sdk")
            {
                return(factory.IndicateFailure(new[] { $"Not a UE4 SDK reference" }));
            }

            //provide a way to force a specific directory
            string engineDir = Environment.GetEnvironmentVariable("MONOUE_SDKRESOLVER_OVERRIDE_ENGINE_DIR");

            if (string.IsNullOrEmpty(engineDir))
            {
                var uproject = GetUProjectFromMSBuildProject(resolverContext.SolutionFilePath, resolverContext.ProjectFilePath);
                if (uproject == null)
                {
                    return(factory.IndicateFailureAndLog(new[] { $"Could not find a uproject file" }));
                }

                var engineAssociation = ReadEngineAssociationFromUProject(uproject);
                engineDir = GetEngineFromID(engineAssociation);

                if (string.IsNullOrEmpty(engineDir))
                {
                    string installedLocationsInfo = ". Found: " + string.Join(", ", EnumerateEngineInstallations().ToList().Select(x => x.ID));
                    return(factory.IndicateFailureAndLog(new[] { $"Could not find UE4 engine matching '{engineAssociation}' {installedLocationsInfo}" }));
                }
            }

            if (!Directory.Exists(engineDir))
            {
                return(factory.IndicateFailureAndLog(new[] { $"UE4 engine directory '{engineDir}' does not exist" }));
            }

            if (!IsValidEngineDirectory(engineDir))
            {
                return(factory.IndicateFailureAndLog(new[] { $"Engine '{engineDir}' is not a valid installation" }));
            }

            if (!IsMonoUEEngineDirectory(engineDir))
            {
                return(factory.IndicateFailureAndLog(new[] { $"Engine '{engineDir}' does not contain MonoUE plugin" }));
            }

            var sdkDir = Path.Combine(engineDir, "Engine", "Plugins", "MonoUE", "MSBuild", "Sdks", sdkReference.Name, "Sdk");

            if (Directory.Exists(sdkDir))
            {
                string engineVersion = GetEngineVersion(engineDir);
                return(factory.IndicateSuccess(sdkDir, "1.0"));
            }

            return(factory.IndicateFailureAndLog(new[] { $"Did not find SDK '{sdkReference.Name}'" }));
        }
Ejemplo n.º 26
0
        public void VerifySdkReferenceParseWithWhitespace()
        {
            string       sdkString = "   \r\n  \t Name  \t  \n     \n  \r /   min=Version  \t  ";
            SdkReference sdk;
            var          parsed = SdkReference.TryParse(sdkString, out sdk);

            Assert.True(parsed);
            Assert.Equal("Name", sdk.Name);
            Assert.Null(sdk.Version);
            Assert.Equal("Version", sdk.MinimumVersion);
            Assert.Equal("Name/min=Version", sdk.ToString());
        }
Ejemplo n.º 27
0
        /// <summary>
        ///     Get path on disk to the referenced SDK.
        /// </summary>
        /// <param name="sdk">SDK referenced by the Project.</param>
        /// <param name="logger">Logging service.</param>
        /// <param name="buildEventContext">Build event context for logging.</param>
        /// <param name="projectFile">Location of the element within the project which referenced the SDK.</param>
        /// <param name="solutionPath">Path to the solution if known.</param>
        /// <returns>Path to the root of the referenced SDK.</returns>
        internal string GetSdkPath(SdkReference sdk, ILoggingService logger, MSBuildContext buildEventContext,
                                   string projectFile, string solutionPath)
        {
            if (_resolvers == null)
            {
                Initialize(logger);
            }

            var results = new List <SdkResultImpl> ();

            try {
                var buildEngineLogger = new SdkLoggerImpl(logger, buildEventContext);
                foreach (var sdkResolver in _resolvers)
                {
                    var context       = new SdkResolverContextImpl(buildEngineLogger, projectFile, solutionPath, msbuildVersion);
                    var resultFactory = new SdkResultFactoryImpl(sdk);
                    try {
                        var result = (SdkResultImpl)sdkResolver.Resolve(sdk, context, resultFactory);
                        if (result != null && result.Success)
                        {
                            LogWarnings(logger, buildEventContext, projectFile, result);
                            return(result.Path);
                        }

                        if (result != null)
                        {
                            results.Add(result);
                        }
                    } catch (Exception e) {
                        logger.LogFatalBuildError(buildEventContext, e, projectFile);
                    }
                }
            } catch (Exception e) {
                logger.LogFatalBuildError(buildEventContext, e, projectFile);
                throw;
            }

            foreach (var result in results)
            {
                LogWarnings(logger, buildEventContext, projectFile, result);

                if (result.Errors != null)
                {
                    foreach (var error in result.Errors)
                    {
                        logger.LogErrorFromText(buildEventContext, subcategoryResourceName: null, errorCode: null,
                                                helpKeyword: null, file: projectFile, message: error);
                    }
                }
            }

            return(null);
        }
Ejemplo n.º 28
0
        public void SdkResultCanReturnMultiplePaths(bool includePropertiesAndItems)
        {
            string expectedPath1 = "First/Path/To/Return/From/Resolver";
            string expectedPath2 = "Second/Path/To/Return/From/Resolver";

            var sdk = new SdkReference("foo", "1.0", null);

            Dictionary <string, string>        propertiesToAdd = null;
            Dictionary <string, SdkResultItem> itemsToAdd      = null;

            if (includePropertiesAndItems)
            {
                CreateMockSdkResultPropertiesAndItems(out propertiesToAdd, out itemsToAdd);
            }

            var resolver = new SdkUtilities.ConfigurableMockSdkResolver(
                new SdkResultImpl(
                    sdk,
                    new []
            {
                expectedPath1,
                expectedPath2
            },
                    version: "1.0",
                    propertiesToAdd,
                    itemsToAdd,
                    warnings: null
                    ));

            SdkResolverService.Instance.InitializeForTests(null, new List <SdkResolver>()
            {
                resolver
            });

            var result = SdkResolverService.Instance.ResolveSdk(BuildEventContext.InvalidSubmissionId, sdk, _loggingContext, new MockElementLocation("file"), "sln", "projectPath", interactive: false, isRunningInVisualStudio: false);

            result.Success.ShouldBeTrue();

            var resultPaths = new List <string>();

            resultPaths.Add(result.Path);
            resultPaths.AddRange(result.AdditionalPaths);

            resultPaths.ShouldBeSameIgnoringOrder(new[]
            {
                expectedPath1,
                expectedPath2
            });

            ValidateExpectedPropertiesAndItems(includePropertiesAndItems, result);

            _logger.WarningCount.ShouldBe(0);
        }
Ejemplo n.º 29
0
        public void VerifySdkReferenceParseWithWhitespace()
        {
            string       sdkString = "   \r\n  \t Name  \t  \n     \n  \r /   min=Version  \t  ";
            SdkReference sdk;
            var          parsed = SdkReference.TryParse(sdkString, out sdk);

            parsed.ShouldBeTrue();
            sdk.Name.ShouldBe("Name");
            sdk.Version.ShouldBeNull();
            sdk.MinimumVersion.ShouldBe("Version");
            sdk.ToString().ShouldBe("Name/min=Version");
        }
Ejemplo n.º 30
0
        public void AssertResolverThrows()
        {
            SdkResolverService.Instance.InitializeForTests(new MockLoaderStrategy(includeErrorResolver: true));

            SdkReference sdk = new SdkReference("1sdkName", "version1", "minimumVersion");

            // When an SDK resolver throws, the expander will catch it and stop the build.
            SdkResolverException e = Should.Throw <SdkResolverException>(() => SdkResolverService.Instance.ResolveSdk(BuildEventContext.InvalidSubmissionId, sdk, _loggingContext, new MockElementLocation("file"), "sln", "projectPath", interactive: false, isRunningInVisualStudio: false));

            e.Resolver.Name.ShouldBe("MockSdkResolverThrows");
            e.Sdk.Name.ShouldBe("1sdkName");
        }