public void ChangePassword()
        {
            // Arrange
            var passwordDatabaseMock = new Mock <IPasswordDatabase>();
            var passwordChangerMock  = new Mock <IPasswordChanger>();

            var now = DateTime.Now;

            var clockMock = new Mock <IClock>();

            clockMock.Setup(x => x.Now).Returns(now);

            var passwordChangerService = new PasswordChangerServiceWrapper(
                passwordDatabaseMock.Object,
                passwordChangerMock.Object,
                clockMock.Object
                );

            var hostPwEntryMock = new Mock <IHostPwEntry>();

            hostPwEntryMock.SetupGet(x => x.IPAddress).Returns("localhost");
            hostPwEntryMock.Setup(x => x.GetUsername()).Returns("username");
            hostPwEntryMock.Setup(x => x.GetPassword()).Returns("password");

            // Act
            passwordChangerService.ChangePassword(hostPwEntryMock.Object, "newPassword");

            // Assert
            hostPwEntryMock.Verify(x => x.UpdatePassword("newPassword"), Times.Once);
            hostPwEntryMock.VerifySet(v => v.LastModificationTime = now, Times.Once);

            passwordDatabaseMock.Verify(v => v.Save(), Times.Never);
            passwordChangerMock.Verify(v => v.ChangePassword("localhost", "username", "password", "newPassword"), Times.Once);
            clockMock.Verify(v => v.Now, Times.Once);
        }
        public void SaveDatabase()
        {
            // Arrange
            var passwordDatabaseMock = new Mock <IPasswordDatabase>();
            var passwordChangerMock  = new Mock <IPasswordChanger>();

            var now = DateTime.Now;

            var clockMock = new Mock <IClock>();

            clockMock.Setup(x => x.Now).Returns(now);

            var passwordChangerService = new PasswordChangerServiceWrapper(
                passwordDatabaseMock.Object,
                passwordChangerMock.Object,
                clockMock.Object
                );

            // Act
            passwordChangerService.SaveDatabase();

            // Assert
            passwordDatabaseMock.Verify(v => v.Save(), Times.Once);
            passwordChangerMock.Verify(v => v.ChangePassword(It.IsAny <String>(), It.IsAny <String>(), It.IsAny <String>(), It.IsAny <String>()), Times.Never);
            clockMock.Verify(v => v.Now, Times.Never);
        }
        private ToolStripMenuItem createChangePasswordMenuItem(HostPwEntry hostPwEntry)
        {
            IPasswordChanger pwChanger = null;
            var hostTypeMapper         = new HostTypeMapper(new HostTypeSafeConverter());
            var hostType = hostTypeMapper.Get(hostPwEntry);

            if (hostType == HostType.ESXi && QuickConnectUtils.IsVSpherePowerCLIInstalled())
            {
                pwChanger = new ESXiPasswordChanger();
            }
            else if (hostType == HostType.Windows &&
                     !String.IsNullOrEmpty(this.Settings.PsPasswdPath) &&
                     File.Exists(this.Settings.PsPasswdPath) &&
                     PsPasswdWrapper.IsPsPasswdUtility(this.Settings.PsPasswdPath) &&
                     PsPasswdWrapper.IsSupportedVersion(this.Settings.PsPasswdPath)
                     )
            {
                pwChanger = new WindowsPasswordChanger(new PsPasswdWrapper(this.Settings.PsPasswdPath));
            }
            else if (hostType == HostType.Linux)
            {
                PuttyOptions puttyOptions = null;
                bool         success      = PuttyOptionsParser.TryParse(hostPwEntry.AdditionalOptions, out puttyOptions);
                // Disable change password menu item if authentication is done using SSH key file.
                if (!success || (success && !puttyOptions.HasKeyFile()))
                {
                    int?sshPort = null;
                    if (success)
                    {
                        sshPort = puttyOptions.Port;
                    }
                    pwChanger = new LinuxPasswordChanger()
                    {
                        SshPort = sshPort
                    };
                }
            }
            var menuItem = new ToolStripMenuItem()
            {
                Text    = ChangePasswordMenuItemText,
                Enabled = hostPwEntry.HasIPAddress && pwChanger != null
            };

            menuItem.Click += new EventHandler(
                delegate(object obj, EventArgs ev) {
                try {
                    var pwDatabase       = new PasswordDatabase(this.pluginHost.Database);
                    var pwChangerService = new PasswordChangerServiceWrapper(pwDatabase, pwChanger);
                    using (var formPasswordChange = new FormPasswordChanger(hostPwEntry, pwChangerService)) {
                        formPasswordChange.ShowDialog();
                    }
                }
                catch (Exception ex) {
                    log(ex);
                }
            }
                );
            return(menuItem);
        }
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            var pwDatabase  = new FakePasswordDatabase();
            var hostPwEntry = new InMemoryHostPwEntry()
            {
                Username  = "******",
                Password  = "******",
                IPAddress = "host",
            };

            hostPwEntry.ConnectionMethods.Add(ConnectionMethodType.RemoteDesktop);
            var pwChanger = new FakePasswordChanger(HostType.Windows)
            {
                ThreadSleepDuration = 20000
            };
            var pwChangerService   = new PasswordChangerServiceWrapper(pwDatabase, pwChanger, new SystemClock());
            var formPasswordChange = new FormPasswordChanger(hostPwEntry, pwChangerService);

            Application.Run(formPasswordChange);
        }