public void ProgramArguments_Constructor_OverrideAppSetting()
        {
            using (ShimsContext.Create())
            {
                // Need to shim the AppSettings collection since previous tests may have wrote particular values to
                // the collection, which is statically shared across tests.
                var appSettings = new NameValueCollection {{"savetemplate", "false"}};
                ShimConfigurationManager.AppSettingsGet = () => appSettings;

                var args = new [] { "/savetemplate", "true" };

                var programArgs = new ProgramArguments(args);

                CollectionAssert.Contains(programArgs.ArgumentMap.Keys, "savetemplate");
                Assert.AreEqual(programArgs.ArgumentMap["savetemplate"], "true");
            }
        }
        public void ProgramArguments_Constructor_BasicProcessingSuccess()
        {
            using (ShimsContext.Create())
            {
                // Need to shim the AppSettings collection since previous tests may have wrote particular values to
                // the collection, which is statically shared across tests.
                ShimConfigurationManager.AppSettingsGet = () => new NameValueCollection();

                var args = new [] {"/action", "someaction", "/savetemplate", "false"};

                var programArgs = new ProgramArguments(args);

                CollectionAssert.Contains(programArgs.ArgumentMap.Keys, "action");
                CollectionAssert.Contains(programArgs.ArgumentMap.Keys, "savetemplate");
                CollectionAssert.DoesNotContain(programArgs.ArgumentMap.Keys, "someaction");
                CollectionAssert.DoesNotContain(programArgs.ArgumentMap.Keys, "false");
                Assert.AreEqual(programArgs.ArgumentMap["action"], "someaction");
                Assert.AreEqual(programArgs.ArgumentMap["savetemplate"], "false");
            }
        }
        /// <summary>
        /// Main entry point to the SktapCLI application.
        /// </summary>
        /// <param name="args">Command-line arguments that were specified.</param>
        /// <returns>0 if the program succeeded, a value other than 0 if it failed.</returns>
        public static int Main(string[] args)
        {
            const int resultError = -1;

            InitializeLogFile();

            _logger.LogInfo("Starting new run...");

            try
            {
                _logger.LogInfo("Application configuration parameters:\n\n{0}", SkytapApi.ConfigParams.ToString());

                var inputs = new ProgramArguments(args);
                var commands = new Dictionary<string, ICommand>();

                _logger.LogInfo("EXE command-line: {0}", inputs.ToString());

                /* Populate Command Dictionary */
                var types = from t in Assembly.GetExecutingAssembly().GetTypes()
                            where t.GetInterfaces().Contains(typeof(ICommand)) && t.GetConstructor(Type.EmptyTypes) != null
                            select t;

                foreach (var type in types)
                {
                    var commandInstance = Activator.CreateInstance(type) as ICommand;
                    Debug.Assert(commandInstance != null);

                    commands.Add(commandInstance.Name.ToLowerInvariant(), commandInstance);
                }

                /* Validate action is valid, also that we have a username and password */
                if (!HasNeededParams(inputs, commands))
                {
                    PrintUsage(commands.Values.ToArray());

                    _logger.LogError(Resources.Program_Main_ERROR_DidNotSpecifyAllProgramArguments, inputs.ToString());

                    return resultError;
                }

                /* Validate the action requested has the arguments it needs */
                ICommand command = commands[inputs.ArgumentMap["action"]];

                if (!command.ValidateArgs(inputs.ArgumentMap))
                {
                    PrintUsage(new[] { command });

                    _logger.LogError(Resources.Program_Main_ERROR_InvalidCommandLineArgs, inputs.ToString());

                    return resultError;
                }

                /* All looks good, lets run it */
                return command.Invoke(inputs.ArgumentMap);
            }
            catch (Exception e)
            {
                _logger.LogError("Exception thrown: {0}\n", e.Message);
                _logger.LogError("Stack Trace: {0}\n", e.StackTrace);
                _logger.LogError("Arguments: {0}\n", String.Join(" ", args));

                return resultError;
            }
            finally
            {
                ShutdownLogFile();
            }
        }
 private static bool HasNeededParams(ProgramArguments inputs, Dictionary<String, ICommand> commands)
 {
     return (inputs.ArgumentMap.ContainsKey("action") && inputs.ArgumentMap.ContainsKey("username") &&
             inputs.ArgumentMap.ContainsKey("password") && commands.Keys.Contains(inputs.ArgumentMap["action"].ToLowerInvariant()) &&
             !String.IsNullOrEmpty(inputs.ArgumentMap["username"]) && !String.IsNullOrEmpty(inputs.ArgumentMap["password"]));
 }