Esempio n. 1
0
        public void TestCommandRun()
        {
            string exeFile = typeof(SslTunnel.Server.Commands).Assembly.Location;

            Assert.IsTrue(File.Exists(exeFile));
            File.Copy(exeFile, Path.ChangeExtension(exeFile, ".nunittest.exe"), true);
            exeFile = Path.ChangeExtension(exeFile, ".nunittest.exe");
            int testPort = TestPort.Create();

            using (TextWriter config = File.CreateText(exeFile + ".config"))
            {
                config.WriteLine("<?xml version=\"1.0\" encoding=\"utf-8\" ?>");
                config.WriteLine("<configuration>");
                config.WriteLine("  <configSections>");
                config.WriteLine("	  <section name=\"TunnelConfig\" type=\"CSharpTest.Net.SslTunnel.Config, SslTunnel.Library\" />");
                config.WriteLine("  </configSections>");
                config.WriteLine("  <TunnelConfig>");
                config.WriteLine("	  <listener ip=\"127.0.0.1\" port=\"{0}\" serverCertFile=\"{1}\">", testPort, _serverCert.CertificateFile);
                config.WriteLine("	    <target ip=\"google.com\" port=\"80\" />");
                config.WriteLine("	  </listener>");
                config.WriteLine("  </TunnelConfig>");
                config.WriteLine("</configuration>");
            }

            ServicePointManager.ServerCertificateValidationCallback =
                delegate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
            {
                if (certificate.GetPublicKeyString() == _serverCert.Certificate.GetPublicKeyString())
                {
                    return(true);
                }
                return(sslPolicyErrors == SslPolicyErrors.None);
            };
            try
            {
                try
                {
                    using (TcpClient client = new TcpClient("127.0.0.1", testPort))
                    {
                        client.Connect();
                        client.Stream.WriteByte(0);
                    }

                    Assert.Fail("Connection should fail before we call Run()");
                }
                catch (SocketException e)
                {
                    Assert.AreEqual(SocketError.ConnectionRefused, e.SocketErrorCode);
                }

                AppDomainSetup setup = new AppDomainSetup();
                setup.ApplicationBase   = Path.GetDirectoryName(exeFile);
                setup.ApplicationName   = Path.GetFileName(exeFile);
                setup.ConfigurationFile = exeFile + ".config";
                AppDomain      domain    = AppDomain.CreateDomain("SslTunnel", AppDomain.CurrentDomain.Evidence, setup);
                BlockingReader blockRead = new BlockingReader(Environment.NewLine);
                Thread         thread    = null;
                try
                {
                    thread = new Thread(
                        delegate()
                    {
                        SetConsoleInput domainConsole = (SetConsoleInput)domain.CreateInstanceAndUnwrap(typeof(SetConsoleInput).Assembly.FullName, typeof(SetConsoleInput).FullName);
                        domainConsole.SetInput(blockRead);
                        domainConsole.SetOutput(_stdout);
                        domainConsole.SetError(_stderror);
                        domain.ExecuteAssembly(
                            exeFile,
#if NET20 || NET35
                            AppDomain.CurrentDomain.Evidence,
#endif
                            new string[] { "run" });
                    });
                    thread.Name = setup.ApplicationName;
                    thread.Start();

                    while (thread.IsAlive && Respose.Contains("Press [Enter] to quit...") == false && Respose.Contains("127.0.0.1") == false)
                    {
                        Thread.Sleep(100);
                    }

                    WebClient client   = new WebClient();
                    string    response = client.DownloadString("https://127.0.0.1:" + testPort);
                    Assert.IsTrue(response.Contains("<html"));
                    Assert.IsTrue(response.Contains("google.com"));
                }
                finally
                {
                    try
                    {
                        if (thread != null)
                        {
                            blockRead.WaitHandle.Set();
                            Assert.IsTrue(thread.Join(TimeSpan.FromMinutes(1)));
                        }
                        AppDomain.Unload(domain);
                        File.Delete(exeFile + ".config");
                        File.Delete(exeFile);
                    }
                    catch (Exception e) { Trace.TraceWarning(e.ToString()); }
                }
            }
            finally
            {
                ServicePointManager.ServerCertificateValidationCallback = null;
            }
        }
		public void TestCommandRun()
		{
			string exeFile = typeof(SslTunnel.Server.Commands).Assembly.Location;
			Assert.IsTrue(File.Exists(exeFile));
			File.Copy(exeFile, Path.ChangeExtension(exeFile, ".nunittest.exe"), true);
			exeFile = Path.ChangeExtension(exeFile, ".nunittest.exe");
			int testPort = TestPort.Create();

			using (TextWriter config = File.CreateText(exeFile + ".config"))
			{
				config.WriteLine("<?xml version=\"1.0\" encoding=\"utf-8\" ?>");
				config.WriteLine("<configuration>");
				config.WriteLine("  <configSections>");
				config.WriteLine("	  <section name=\"TunnelConfig\" type=\"CSharpTest.Net.SslTunnel.Config, SslTunnel.Library\" />");
				config.WriteLine("  </configSections>");
				config.WriteLine("  <TunnelConfig>");
				config.WriteLine("	  <listener ip=\"127.0.0.1\" port=\"{0}\" serverCertFile=\"{1}\">", testPort, _serverCert.CertificateFile);
				config.WriteLine("	    <target ip=\"google.com\" port=\"80\" />");
				config.WriteLine("	  </listener>");
				config.WriteLine("  </TunnelConfig>");
				config.WriteLine("</configuration>");
			}

			ServicePointManager.ServerCertificateValidationCallback =
				delegate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
				{
					if (certificate.GetPublicKeyString() == _serverCert.Certificate.GetPublicKeyString())
						return true;
					return sslPolicyErrors == SslPolicyErrors.None;
				};
			try
			{
				try
				{
					using (TcpClient client = new TcpClient("127.0.0.1", testPort))
					{
						client.Connect();
						client.Stream.WriteByte(0);
					}

					Assert.Fail("Connection should fail before we call Run()");
				}
				catch (SocketException e)
				{
					Assert.AreEqual(SocketError.ConnectionRefused, e.SocketErrorCode);
				}

				AppDomainSetup setup = new AppDomainSetup();
				setup.ApplicationBase = Path.GetDirectoryName(exeFile);
				setup.ApplicationName = Path.GetFileName(exeFile);
				setup.ConfigurationFile = exeFile + ".config";
				AppDomain domain = AppDomain.CreateDomain("SslTunnel", AppDomain.CurrentDomain.Evidence, setup);
				BlockingReader blockRead = new BlockingReader(Environment.NewLine);
				Thread thread = null;
				try
				{
					thread = new Thread(
						delegate()
						{
							SetConsoleInput domainConsole = (SetConsoleInput)domain.CreateInstanceAndUnwrap(typeof(SetConsoleInput).Assembly.FullName, typeof(SetConsoleInput).FullName);
							domainConsole.SetInput(blockRead);
							domainConsole.SetOutput(_stdout);
							domainConsole.SetError(_stderror);
							domain.ExecuteAssembly(
                                exeFile, 
#if NET20 || NET35
                                AppDomain.CurrentDomain.Evidence, 
#endif
                                new string[] { "run" });
						});
					thread.Name = setup.ApplicationName;
					thread.Start();

					while (thread.IsAlive && Respose.Contains("Press [Enter] to quit...") == false && Respose.Contains("127.0.0.1") == false)
						Thread.Sleep(100);

					WebClient client = new WebClient();
					string response = client.DownloadString("https://127.0.0.1:" + testPort);
					Assert.IsTrue(response.Contains("<html"));
					Assert.IsTrue(response.Contains("google.com"));
				}
				finally
				{
					try
					{
						if (thread != null)
						{
							blockRead.WaitHandle.Set();
							Assert.IsTrue(thread.Join(TimeSpan.FromMinutes(1)));
						}
						AppDomain.Unload(domain);
						File.Delete(exeFile + ".config");
						File.Delete(exeFile);
					}
					catch (Exception e) { Trace.TraceWarning(e.ToString()); }
				}
			}
			finally
			{
				ServicePointManager.ServerCertificateValidationCallback = null;
			}
		}