| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423 | using System;using System.Globalization;using System.Linq;using Microsoft.VisualStudio.TestTools.UnitTesting;using Renci.SshNet.Common;using Renci.SshNet.Messages.Authentication;using Renci.SshNet.Messages.Transport;namespace Renci.SshNet.Tests.Classes{    [TestClass]    public class SshMessageFactoryTest    {        private SshMessageFactory _sshMessageFactory;        [TestInitialize]        public void SetUp()        {            _sshMessageFactory = new SshMessageFactory();        }        [TestMethod]        public void CreateShouldThrowSshExceptionWhenMessageIsNotEnabled()        {            const byte messageNumber = 60;            try            {                _sshMessageFactory.Create(messageNumber);                Assert.Fail();            }            catch (SshException ex)            {                Assert.IsNull(ex.InnerException);                Assert.AreEqual(string.Format(CultureInfo.CurrentCulture, "Message type {0} is not valid in the current context.", messageNumber), ex.Message);            }        }        [TestMethod]        public void CreateShouldThrowSshExceptionWhenMessageDoesNotExist_OutsideOfMessageNumberRange()        {            const byte messageNumber = 255;            try            {                _sshMessageFactory.Create(messageNumber);                Assert.Fail();            }            catch (SshException ex)            {                Assert.IsNull(ex.InnerException);                Assert.AreEqual(string.Format(CultureInfo.CurrentCulture, "Message type {0} is not supported.", messageNumber), ex.Message);            }        }        [TestMethod]        public void CreateShouldThrowSshExceptionWhenMessageDoesNotExist_WithinMessageNumberRange()        {            const byte messageNumber = 5;            try            {                _sshMessageFactory.Create(messageNumber);                Assert.Fail();            }            catch (SshException ex)            {                Assert.IsNull(ex.InnerException);                Assert.AreEqual(string.Format(CultureInfo.CurrentCulture, "Message type {0} is not supported.", messageNumber), ex.Message);            }        }        [TestMethod]        public void CreateShouldThrowSshExceptionWhenMessageIsNotActivated()        {            const byte messageNumber = 60;            const string messageName = "SSH_MSG_USERAUTH_PASSWD_CHANGEREQ";            _sshMessageFactory.EnableAndActivateMessage(messageName);            _sshMessageFactory.DisableAndDeactivateMessage(messageName);            try            {                _sshMessageFactory.Create(messageNumber);                Assert.Fail();            }            catch (SshException ex)            {                Assert.IsNull(ex.InnerException);                Assert.AreEqual(string.Format(CultureInfo.CurrentCulture, "Message type {0} is not valid in the current context.", messageNumber), ex.Message);            }        }        [TestMethod]        public void CreateShouldReturnMessageInstanceCorrespondingToMessageNumberWhenMessageIsEnabledAndActivated()        {            const byte messageNumber = 60;            const string messageName = "SSH_MSG_USERAUTH_PASSWD_CHANGEREQ";            _sshMessageFactory.EnableAndActivateMessage(messageName);            var actual = _sshMessageFactory.Create(messageNumber);            Assert.IsNotNull(actual);            Assert.AreEqual(typeof(PasswordChangeRequiredMessage), actual.GetType());            _sshMessageFactory.DisableAndDeactivateMessage(messageName);            _sshMessageFactory.EnableAndActivateMessage("SSH_MSG_USERAUTH_INFO_REQUEST");            actual = _sshMessageFactory.Create(messageNumber);            Assert.IsNotNull(actual);            Assert.AreEqual(typeof(InformationRequestMessage), actual.GetType());        }        [TestMethod]        public void DisableAndDeactivateMessageShouldThrowSshExceptionWhenAnotherMessageWithSameMessageNumberIsEnabled()        {            _sshMessageFactory.EnableAndActivateMessage("SSH_MSG_USERAUTH_PASSWD_CHANGEREQ");            try            {                _sshMessageFactory.DisableAndDeactivateMessage("SSH_MSG_USERAUTH_INFO_REQUEST");                Assert.Fail();            }            catch (SshException ex)            {                Assert.IsNull(ex.InnerException);                Assert.AreEqual("Cannot enable message 'SSH_MSG_USERAUTH_INFO_REQUEST'. Message type 60 is already enabled for 'SSH_MSG_USERAUTH_PASSWD_CHANGEREQ'.", ex.Message);            }            // verify that the original message remains enabled            var actual = _sshMessageFactory.Create(60);            Assert.IsNotNull(actual);            Assert.AreEqual(typeof(PasswordChangeRequiredMessage), actual.GetType());        }        [TestMethod]        public void DisableAndDeactivateMessageShouldNotThrowExceptionWhenMessageIsAlreadyDisabled()        {            const byte messageNumber = 60;            _sshMessageFactory.EnableAndActivateMessage("SSH_MSG_USERAUTH_PASSWD_CHANGEREQ");            _sshMessageFactory.DisableAndDeactivateMessage("SSH_MSG_USERAUTH_PASSWD_CHANGEREQ");            _sshMessageFactory.DisableAndDeactivateMessage("SSH_MSG_USERAUTH_PASSWD_CHANGEREQ");            // verify that message remains disabled            try            {                _sshMessageFactory.Create(messageNumber);                Assert.Fail();            }            catch (SshException ex)            {                Assert.IsNull(ex.InnerException);                Assert.AreEqual(string.Format(CultureInfo.CurrentCulture, "Message type {0} is not valid in the current context.", messageNumber), ex.Message);            }        }        [TestMethod]        public void DisableAndDeactivateMessageShouldNotThrowExceptionWhenMessageWasNeverEnabled()        {            const byte messageNumber = 60;            _sshMessageFactory.DisableAndDeactivateMessage("SSH_MSG_USERAUTH_PASSWD_CHANGEREQ");            // verify that message is disabled            try            {                _sshMessageFactory.Create(messageNumber);                Assert.Fail();            }            catch (SshException ex)            {                Assert.IsNull(ex.InnerException);                Assert.AreEqual(string.Format(CultureInfo.CurrentCulture, "Message type {0} is not valid in the current context.", messageNumber), ex.Message);            }        }        [TestMethod]        public void DisableAndDeactivateMessageShouldThrowSshExceptionWhenMessageIsNotSupported()        {            const string messageName = "WHATEVER";            try            {                _sshMessageFactory.DisableAndDeactivateMessage("WHATEVER");                Assert.Fail();            }            catch (SshException ex)            {                Assert.IsNull(ex.InnerException);                Assert.AreEqual(string.Format("Message '{0}' is not supported.", messageName), ex.Message);            }        }        [TestMethod]        public void DisableAndDeactivateMessageShouldThrowArgumentNullExceptionWhenMessageNameIsNull()        {            const string messageName = null;            try            {                _sshMessageFactory.DisableAndDeactivateMessage(messageName);                Assert.Fail();            }            catch (ArgumentNullException ex)            {                Assert.IsNull(ex.InnerException);                Assert.AreEqual("messageName", ex.ParamName);            }        }        [TestMethod]        public void EnableAndActivateMessageShouldThrowSshExceptionWhenAnotherMessageWithSameMessageNumberIsAlreadyEnabled()        {            _sshMessageFactory.EnableAndActivateMessage("SSH_MSG_USERAUTH_PASSWD_CHANGEREQ");            try            {                _sshMessageFactory.EnableAndActivateMessage("SSH_MSG_USERAUTH_INFO_REQUEST");                Assert.Fail();            }            catch (SshException ex)            {                Assert.IsNull(ex.InnerException);                Assert.AreEqual("Cannot enable message 'SSH_MSG_USERAUTH_INFO_REQUEST'. Message type 60 is already enabled for 'SSH_MSG_USERAUTH_PASSWD_CHANGEREQ'.", ex.Message);            }            // verify that the original message remains enabled            var actual = _sshMessageFactory.Create(60);            Assert.IsNotNull(actual);            Assert.AreEqual(typeof(PasswordChangeRequiredMessage), actual.GetType());        }        [TestMethod]        public void EnableAndActivateMessageShouldNotThrowExceptionWhenMessageIsAlreadyEnabled()        {            _sshMessageFactory.EnableAndActivateMessage("SSH_MSG_USERAUTH_PASSWD_CHANGEREQ");            _sshMessageFactory.EnableAndActivateMessage("SSH_MSG_USERAUTH_PASSWD_CHANGEREQ");            var actual = _sshMessageFactory.Create(60);            Assert.IsNotNull(actual);            Assert.AreEqual(typeof(PasswordChangeRequiredMessage), actual.GetType());        }        [TestMethod]        public void EnableAndActivateMessageShouldThrowSshExceptionWhenMessageIsNotSupported()        {            const string messageName = "WHATEVER";            try            {                _sshMessageFactory.EnableAndActivateMessage("WHATEVER");                Assert.Fail();            }            catch (SshException ex)            {                Assert.IsNull(ex.InnerException);                Assert.AreEqual(string.Format("Message '{0}' is not supported.", messageName), ex.Message);            }        }        [TestMethod]        public void EnableAndActivateMessageShouldThrowArgumentNullExceptionWhenMessageNameIsNull()        {            const string messageName = null;            try            {                _sshMessageFactory.EnableAndActivateMessage(messageName);                Assert.Fail();            }            catch (ArgumentNullException ex)            {                Assert.IsNull(ex.InnerException);                Assert.AreEqual("messageName", ex.ParamName);            }        }        [TestMethod]        public void DisableNonKeyExchangeMessagesShouldDisableNonKeyExchangeMessages()        {            const byte messageNumber = 60;            _sshMessageFactory.EnableAndActivateMessage("SSH_MSG_USERAUTH_PASSWD_CHANGEREQ");            _sshMessageFactory.DisableNonKeyExchangeMessages(strict: false);            // verify that message is disabled            try            {                _sshMessageFactory.Create(messageNumber);                Assert.Fail();            }            catch (SshException ex)            {                Assert.IsNull(ex.InnerException);                Assert.AreEqual(string.Format(CultureInfo.CurrentCulture, "Message type {0} is not valid in the current context.", messageNumber), ex.Message);            }        }        [TestMethod]        public void DisableNonKeyExchangeMessagesShouldNotDisableKeyExchangeMessages()        {            const byte messageNumber = 21;            _sshMessageFactory.EnableAndActivateMessage("SSH_MSG_NEWKEYS");            _sshMessageFactory.DisableNonKeyExchangeMessages(strict: false);            // verify that message remains enabled            var actual = _sshMessageFactory.Create(messageNumber);            Assert.IsNotNull(actual);            Assert.AreEqual(typeof(NewKeysMessage), actual.GetType());        }        [TestMethod]        public void EnableActivatedMessagesShouldEnableMessagesThatWereEnabledPriorToInvokingDisableNonKeyExchangeMessages()        {            const byte messageNumber = 60;            _sshMessageFactory.EnableAndActivateMessage("SSH_MSG_USERAUTH_PASSWD_CHANGEREQ");            _sshMessageFactory.DisableNonKeyExchangeMessages(strict: false);            _sshMessageFactory.EnableActivatedMessages();            var actual = _sshMessageFactory.Create(messageNumber);            Assert.IsNotNull(actual);            Assert.AreEqual(typeof(PasswordChangeRequiredMessage), actual.GetType());        }        [TestMethod]        public void EnableActivatedMessagesShouldNotEnableMessagesThatWereDisabledPriorToInvokingDisableNonKeyExchangeMessages()        {            const byte messageNumber = 60;            _sshMessageFactory.DisableNonKeyExchangeMessages(strict: false);            _sshMessageFactory.EnableActivatedMessages();            try            {                _sshMessageFactory.Create(messageNumber);                Assert.Fail();            }            catch (SshException ex)            {                Assert.IsNull(ex.InnerException);                Assert.AreEqual(string.Format(CultureInfo.CurrentCulture, "Message type {0} is not valid in the current context.", messageNumber), ex.Message);            }        }        [TestMethod]        public void EnableActivatedMessagesShouldNotEnableMessagesThatWereDisabledAfterInvokingDisableNonKeyExchangeMessages()        {            const byte messageNumber = 60;            _sshMessageFactory.EnableAndActivateMessage("SSH_MSG_USERAUTH_PASSWD_CHANGEREQ");            _sshMessageFactory.DisableNonKeyExchangeMessages(strict: false);            _sshMessageFactory.DisableAndDeactivateMessage("SSH_MSG_USERAUTH_PASSWD_CHANGEREQ");            _sshMessageFactory.EnableActivatedMessages();            try            {                _sshMessageFactory.Create(messageNumber);                Assert.Fail();            }            catch (SshException ex)            {                Assert.IsNull(ex.InnerException);                Assert.AreEqual(string.Format(CultureInfo.CurrentCulture, "Message type {0} is not valid in the current context.", messageNumber), ex.Message);            }        }        [TestMethod]        public void EnableActivatedMessagesShouldThrowSshExceptionWhenAnothersMessageWithSameMessageNumberWasEnabledAfterInvokingDisableNonKeyExchangeMessages()        {            _sshMessageFactory.EnableAndActivateMessage("SSH_MSG_USERAUTH_PASSWD_CHANGEREQ");            _sshMessageFactory.DisableNonKeyExchangeMessages(strict: false);            _sshMessageFactory.EnableAndActivateMessage("SSH_MSG_USERAUTH_INFO_REQUEST");            try            {                _sshMessageFactory.EnableActivatedMessages();                Assert.Fail();            }            catch (SshException ex)            {                Assert.IsNull(ex.InnerException);                Assert.AreEqual("Cannot enable message 'SSH_MSG_USERAUTH_PASSWD_CHANGEREQ'. Message type 60 is already enabled for 'SSH_MSG_USERAUTH_INFO_REQUEST'.", ex.Message);            }        }        [TestMethod]        public void EnableActivatedMessagesShouldLeaveMessagesEnabledThatWereEnabledAfterInvokingDisableNonKeyExchangeMessages()        {            const byte messageNumber = 60;            _sshMessageFactory.DisableNonKeyExchangeMessages(strict: false);            _sshMessageFactory.EnableAndActivateMessage("SSH_MSG_USERAUTH_PASSWD_CHANGEREQ");            _sshMessageFactory.EnableActivatedMessages();            var actual = _sshMessageFactory.Create(messageNumber);            Assert.IsNotNull(actual);            Assert.AreEqual(typeof(PasswordChangeRequiredMessage), actual.GetType());        }        [TestMethod]        public void HighestMessageNumberShouldCorrespondWithHighestSupportedMessageNumber()        {            var highestSupportMessageNumber = SshMessageFactory.AllMessages.Max(m => m.Number);            Assert.AreEqual(highestSupportMessageNumber, SshMessageFactory.HighestMessageNumber);        }        [TestMethod]        public void TotalMessageCountShouldBeTotalNumberOfSupportedMessages()        {            var totalNumberOfSupportedMessages = SshMessageFactory.AllMessages.Length;            Assert.AreEqual(totalNumberOfSupportedMessages, SshMessageFactory.TotalMessageCount);        }    }}
 |