using System;
using System.Net;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Moq;
using Renci.SshNet.Connection;
using Renci.SshNet.Tests.Common;
namespace Renci.SshNet.Tests.Classes
{
    /// 
    /// Provides functionality to connect and interact with SSH server.
    /// 
    [TestClass]
    public partial class SessionTest : TestBase
    {
        private Mock _serviceFactoryMock;
        private Mock _socketFactoryMock;
        protected override void OnInit()
        {
            base.OnInit();
            _serviceFactoryMock = new Mock(MockBehavior.Strict);
            _socketFactoryMock = new Mock(MockBehavior.Strict);
        }
        [TestMethod]
        public void ConstructorShouldThrowArgumentNullExceptionWhenConnectionInfoIsNull()
        {
            const ConnectionInfo connectionInfo = null;
            try
            {
                _ = new Session(connectionInfo, _serviceFactoryMock.Object, _socketFactoryMock.Object);
                Assert.Fail();
            }
            catch (ArgumentNullException ex)
            {
                Assert.IsNull(ex.InnerException);
                Assert.AreEqual("connectionInfo", ex.ParamName);
            }
        }
        [TestMethod]
        public void ConstructorShouldThrowArgumentNullExceptionWhenServiceFactoryIsNull()
        {
            var serverEndPoint = new IPEndPoint(IPAddress.Loopback, 8122);
            var connectionInfo = CreateConnectionInfo(serverEndPoint, TimeSpan.FromSeconds(5));
            IServiceFactory serviceFactory = null;
            try
            {
                _ = new Session(connectionInfo, serviceFactory, _socketFactoryMock.Object);
                Assert.Fail();
            }
            catch (ArgumentNullException ex)
            {
                Assert.IsNull(ex.InnerException);
                Assert.AreEqual("serviceFactory", ex.ParamName);
            }
        }
        [TestMethod]
        public void ConstructorShouldThrowArgumentNullExceptionWhenSocketFactoryIsNull()
        {
            var serverEndPoint = new IPEndPoint(IPAddress.Loopback, 8122);
            var connectionInfo = CreateConnectionInfo(serverEndPoint, TimeSpan.FromSeconds(5));
            const ISocketFactory socketFactory = null;
            try
            {
                _ = new Session(connectionInfo, _serviceFactoryMock.Object, socketFactory);
                Assert.Fail();
            }
            catch (ArgumentNullException ex)
            {
                Assert.IsNull(ex.InnerException);
                Assert.AreEqual("socketFactory", ex.ParamName);
            }
        }
        private static ConnectionInfo CreateConnectionInfo(IPEndPoint serverEndPoint, TimeSpan timeout)
        {
            return new ConnectionInfo(serverEndPoint.Address.ToString(), serverEndPoint.Port, "eric", new NoneAuthenticationMethod("eric"))
            {
                Timeout = timeout
            };
        }
    }
}