Пример #1
0
        public void CanProcessFailedPostAction()
        {
            var engineEnvironmentSettings = _environmentSettingsHelper.CreateEnvironment(virtualize: true);
            var postActionProcessor       = new CaptureMePostAction(expectedResult: false);

            engineEnvironmentSettings.Components.AddComponent(typeof(IPostActionProcessor), postActionProcessor);
            var postAction = new MockPostAction();
            MockCreationResult creationResult = new MockCreationResult(new List <IPostAction>()
            {
                postAction
            });
            MockCreationEffects creationEffects = new MockCreationEffects();
            var templateCreationResult          = new TemplateCreationResult(
                CreationResultStatus.Success,
                "TestTemplate",
                null,
                creationResult,
                "TestPath",
                creationEffects);

            PostActionDispatcher dispatcher = new PostActionDispatcher(
                engineEnvironmentSettings,
                new NewCommandCallbacks(),
                () => string.Empty);

            var result = dispatcher.Process(templateCreationResult, isDryRun: false, AllowRunScripts.Prompt);

            Assert.Equal(PostActionExecutionStatus.Failure, result);
            Assert.Equal(engineEnvironmentSettings, postActionProcessor.Calls.Single().EngineEnvironmentSettings);
            Assert.Equal(postAction, postActionProcessor.Calls.Single().PostAction);
            Assert.Equal(creationEffects, postActionProcessor.Calls.Single().CreationEffects);
            Assert.Equal(creationResult, postActionProcessor.Calls.Single().CreationResult);
            Assert.Equal("TestPath", postActionProcessor.Calls.Single().OutputPath);
        }
Пример #2
0
        public void CanDryRunSuccessPostAction()
        {
            var engineEnvironmentSettings = _environmentSettingsHelper.CreateEnvironment(virtualize: true);
            var postActionProcessor       = new CaptureMePostAction(expectedResult: true);

            engineEnvironmentSettings.Components.AddComponent(typeof(IPostActionProcessor), postActionProcessor);
            var postAction = new MockPostAction();

            MockCreationEffects creationEffects = new MockCreationEffects();
            var templateCreationResult          = new TemplateCreationResult(
                CreationResultStatus.Success,
                "TestTemplate",
                null,
                null,
                "TestPath",
                creationEffects);

            PostActionDispatcher dispatcher = new PostActionDispatcher(
                engineEnvironmentSettings,
                new NewCommandCallbacks(),
                () => string.Empty);

            var result = dispatcher.Process(templateCreationResult, isDryRun: true, AllowRunScripts.Prompt);

            Assert.Equal(PostActionExecutionStatus.Success, result);
            Assert.Empty(postActionProcessor.Calls);
        }
Пример #3
0
        public void CanProcessPostActionThrowingException()
        {
            var engineEnvironmentSettings = _environmentSettingsHelper.CreateEnvironment(virtualize: true);

            engineEnvironmentSettings.Components.AddComponent(typeof(IPostActionProcessor), new ThrowExceptionPostAction());
            var postAction = new MockPostAction();

            MockCreationResult creationResult = new MockCreationResult(new List <IPostAction>()
            {
                postAction
            });
            MockCreationEffects creationEffects = new MockCreationEffects();
            var templateCreationResult          = new TemplateCreationResult(
                CreationResultStatus.Success,
                "TestTemplate",
                null,
                creationResult,
                "TestPath",
                creationEffects);

            PostActionDispatcher dispatcher = new PostActionDispatcher(
                engineEnvironmentSettings,
                new NewCommandCallbacks(),
                () => string.Empty);

            var result = dispatcher.Process(templateCreationResult, isDryRun: false, AllowRunScripts.Yes);

            Assert.Equal(PostActionExecutionStatus.Failure, result);
        }
Пример #4
0
        public void CanContinueOnErrorWhenConfigured()
        {
            var engineEnvironmentSettings = _environmentSettingsHelper.CreateEnvironment(virtualize: true);

            var trueProcessorGuid  = Guid.NewGuid();
            var falseProcessorGuid = Guid.NewGuid();
            var trueProcessor      = new CaptureMePostAction(expectedResult: true, guid: trueProcessorGuid);
            var falseProcessor     = new CaptureMePostAction(expectedResult: false, guid: falseProcessorGuid);

            engineEnvironmentSettings.Components.AddComponent(typeof(IPostActionProcessor), trueProcessor);
            engineEnvironmentSettings.Components.AddComponent(typeof(IPostActionProcessor), falseProcessor);

            var postAction1 = new MockPostAction
            {
                ActionId        = falseProcessorGuid,
                ContinueOnError = true
            };
            var postAction2 = new MockPostAction
            {
                ActionId        = trueProcessorGuid,
                ContinueOnError = true
            };

            MockCreationResult creationResult = new MockCreationResult(new List <IPostAction>()
            {
                postAction1, postAction2
            });
            MockCreationEffects creationEffects = new MockCreationEffects();
            var templateCreationResult          = new TemplateCreationResult(
                CreationResultStatus.Success,
                "TestTemplate",
                null,
                creationResult,
                "TestPath",
                creationEffects);

            PostActionDispatcher dispatcher = new PostActionDispatcher(
                engineEnvironmentSettings,
                new NewCommandCallbacks(),
                () => string.Empty);

            var result = dispatcher.Process(templateCreationResult, isDryRun: false, AllowRunScripts.Yes);

            // in case continue on error is true, success status is returned on failure
            Assert.Equal(PostActionExecutionStatus.Success, result);

            //2 post actions were executed
            Assert.Equal(1, trueProcessor.Calls.Count);
            Assert.Equal(1, falseProcessor.Calls.Count);
            Assert.Equal(postAction1, falseProcessor.Calls[0].PostAction);
            Assert.Equal(postAction2, trueProcessor.Calls[0].PostAction);
        }
Пример #5
0
        public void CanProcessRunScriptPostActionAndSuccessPostAction_WhenRunScriptPrompt_No()
        {
            var engineEnvironmentSettings = _environmentSettingsHelper.CreateEnvironment(virtualize: true);
            var postActionProcessor       = new CaptureMePostAction(expectedResult: true);

            engineEnvironmentSettings.Components.AddComponent(typeof(IPostActionProcessor), postActionProcessor);

            engineEnvironmentSettings.Components.AddComponent(typeof(IPostActionProcessor), new ProcessStartPostActionProcessor());
            var postAction1 = new MockPostAction
            {
                ActionId = ProcessStartPostActionProcessor.ActionProcessorId,
                //the post action will fail, but that is OK for test purpose
                Args = new Dictionary <string, string>()
                {
                    { "executable", "do-not-exist" }
                },
                ContinueOnError = true
            };

            var postAction2 = new MockPostAction
            {
                ActionId        = Guid.Empty, //CaptureMePostAction
                ContinueOnError = true
            };

            MockCreationResult creationResult = new MockCreationResult(new List <IPostAction>()
            {
                postAction1, postAction2
            });
            MockCreationEffects creationEffects = new MockCreationEffects();
            var templateCreationResult          = new TemplateCreationResult(
                CreationResultStatus.Success,
                "TestTemplate",
                null,
                creationResult,
                Path.GetTempPath(),
                creationEffects);

            PostActionDispatcher dispatcher = new PostActionDispatcher(
                engineEnvironmentSettings,
                new NewCommandCallbacks(),
                () => "N"); // the user forbids to run post action

            var result = dispatcher.Process(templateCreationResult, isDryRun: false, AllowRunScripts.Prompt);

            Assert.Equal(PostActionExecutionStatus.Cancelled, result);
            Assert.NotEqual(PostActionExecutionStatus.Failure, result);
            Assert.Single(postActionProcessor.Calls);
            Assert.Equal(postAction2, postActionProcessor.Calls.Single().PostAction);
        }
Пример #6
0
        public void CanProcessRunScriptPostAction_DryRun()
        {
            var engineEnvironmentSettings = _environmentSettingsHelper.CreateEnvironment(virtualize: true);

            engineEnvironmentSettings.Components.AddComponent(typeof(IPostActionProcessor), new ProcessStartPostActionProcessor());
            var postAction = new MockPostAction
            {
                ActionId = ProcessStartPostActionProcessor.ActionProcessorId,
                //the post action will fail, but that is OK for test purpose
                Args = new Dictionary <string, string>()
                {
                    { "executable", "do-not-exist" }
                }
            };

            MockCreationResult creationResult = new MockCreationResult(new List <IPostAction>()
            {
                postAction
            });
            MockCreationEffects creationEffects = new MockCreationEffects();
            var templateCreationResult          = new TemplateCreationResult(
                CreationResultStatus.Success,
                "TestTemplate",
                null,
                creationResult,
                Path.GetTempPath(),
                creationEffects);

            PostActionDispatcher dispatcher = new PostActionDispatcher(
                engineEnvironmentSettings,
                new NewCommandCallbacks(),
                () => "N"); // the user forbids to run post action

            //run script setting doesn't matter for dry run
            var result = dispatcher.Process(templateCreationResult, isDryRun: true, AllowRunScripts.Prompt);

            Assert.Equal(PostActionExecutionStatus.Success, result);
            result = dispatcher.Process(templateCreationResult, isDryRun: true, AllowRunScripts.Yes);
            Assert.Equal(PostActionExecutionStatus.Success, result);
            result = dispatcher.Process(templateCreationResult, isDryRun: true, AllowRunScripts.No);
            Assert.Equal(PostActionExecutionStatus.Success, result);
        }
Пример #7
0
        private static int Main(string[] args)
        {
            string profileDir = GetHomeDirectory();
            string hivePath   = Path.Combine(profileDir, ".templateengine", HostName, HostVersion);

            ITemplateEngineHost host = CreateHost(HostName, HostVersion);

            EnvironmentSettings = new EngineEnvironmentSettings(host, x => new SettingsLoader(x), hivePath);
            EnvironmentSettings.SettingsLoader.Components.OfType <IIdentifiedComponent>().ToList();
            _paths = new Paths(EnvironmentSettings);

            //NOTE: With the base directory virtualized, packages cannot be installed from NuGet,
            //  only local packages and folders
            EnvironmentSettings.Host.VirtualizeDirectory(_paths.User.Content);
            EnvironmentSettings.Host.VirtualizeDirectory(_paths.User.Packages);
            _settingsLoader = (SettingsLoader)EnvironmentSettings.SettingsLoader;
            _hostDataLoader = new HostSpecificDataLoader(EnvironmentSettings.SettingsLoader);

            CommandLineParser parser = new CommandLineParser(args)
                                       .AddOptionWithConstrainedValue("--operation", new[]
            {
                "list",
                "create"
            })
                                       .AddOptionWithValue("--require")
                                       .AddOptionWithValue("--source");

            if (!parser.TryGetValues("--require", out IReadOnlyList <string> requireDirectives) ||
                !parser.TryGetSingleValue("--operation", out string operation))
            {
                Console.SetOut(Console.Error);
                Console.WriteLine("ERROR: Expected \"--require\" and/or \"--operation\" parameter.");
                return(-1);
            }

            IInstaller installer = new Installer(EnvironmentSettings);

            if (!parser.TryGetValues("--source", out IReadOnlyList <string> sources))
            {
                sources = null;
            }

            installer.InstallPackages(requireDirectives, sources?.ToList());

            //All required templates/components/lang packs have now been configured
            //Desired operation information starts at args[commandArgsStart]

            _templateCreator = new TemplateCreator(EnvironmentSettings);
            IReadOnlyList <TemplateInfo> rawTemplates = _settingsLoader.UserTemplateCache.TemplateInfo;

            var templates = new JArray();

            foreach (var rawTemplate in rawTemplates)
            {
                var template = JObject.FromObject(rawTemplate);
                template.Add("Parameters", JArray.FromObject(rawTemplate.Parameters));
                templates.Add(template);
            }


            if (string.Equals(operation, "list"))
            {
                Console.WriteLine(templates);
                return(0);
            }

            parser = parser.AddOptionWithValue("--identity");

            if (!parser.TryGetSingleValue("--identity", out string identity))
            {
                Console.SetOut(Console.Error);
                Console.WriteLine("ERROR: Expected \"--identity\" parameter.");
                return(-1);
            }

            TemplateInfo info = rawTemplates.FirstOrDefault(x => string.Equals(x.Identity, identity, StringComparison.Ordinal));

            if (info == null)
            {
                Console.SetOut(Console.Error);
                Console.WriteLine("ERROR: Failed to find template with identity \"{0}\".", identity);
                return(-1);
            }

            if (string.Equals(operation, "create"))
            {
                Dictionary <string, string> templateArgs = new Dictionary <string, string>(StringComparer.Ordinal);

                foreach (ITemplateParameter x in info.Parameters)
                {
                    if (x.DataType != null && x.DataType.StartsWith("bool", StringComparison.OrdinalIgnoreCase))
                    {
                        parser = parser.AddOptionWithBooleanValue($"--arg:{x.Name}", string.IsNullOrEmpty(x.DefaultValue) || string.Equals(x.DefaultValue, "true"));
                    }
                    else if (x.DataType != null && x.DataType.Equals("choice", StringComparison.OrdinalIgnoreCase))
                    {
                        parser = parser.AddOptionWithConstrainedValue($"--arg:{x.Name}", x.Choices.Keys.ToList());
                    }
                    else
                    {
                        parser = parser.AddOptionWithValue($"--arg:{x.Name}");
                    }

                    if (parser.TryGetSingleValue($"--arg:{x.Name}", out string val))
                    {
                        templateArgs[x.Name] = val;
                    }
                }

                TemplateCreationResult result = _templateCreator.InstantiateAsync(info, null, null, null, templateArgs, true, false, null).Result;
                if (result.Status == CreationResultStatus.Success)
                {
                    PostActionDispatcher postActionDispatcher = new PostActionDispatcher(EnvironmentSettings, result, AllowPostActionsSetting.Yes, false);
                    postActionDispatcher.Process(null);
                }

                Console.WriteLine(JObject.FromObject(result));
                return((int)result.Status);
            }

            return(0);
        }