Commit e4f3e7d5 authored by justcoding121's avatar justcoding121

setup integration tests for continous integration

parent 487ecbdf
...@@ -35,7 +35,7 @@ $MSBuild -replace ' ', '` ' ...@@ -35,7 +35,7 @@ $MSBuild -replace ' ', '` '
FormatTaskName (("-"*25) + "[{0}]" + ("-"*25)) FormatTaskName (("-"*25) + "[{0}]" + ("-"*25))
#default task #default task
Task default -depends Clean, Build, Document, Package Task default -depends Clean, Build, Document, Package, PrepareIntegrationTest
#cleans obj, b #cleans obj, b
Task Clean { Task Clean {
...@@ -123,3 +123,15 @@ Task Document -depends Build { ...@@ -123,3 +123,15 @@ Task Document -depends Build {
Task Package -depends Document { Task Package -depends Document {
exec { . $NuGet pack "$SolutionRoot\$ProjectName\$ProjectName.nuspec" -Properties Configuration=$Configuration -OutputDirectory "$RepoRoot" -Version "$Version" } exec { . $NuGet pack "$SolutionRoot\$ProjectName\$ProjectName.nuspec" -Properties Configuration=$Configuration -OutputDirectory "$RepoRoot" -Version "$Version" }
} }
#install root cetificate needed for integration tests
Task PrepareIntegrationTest {
$pfx = new-object System.Security.Cryptography.X509Certificates.X509Certificate2
$certPath = "$Here\lib\root-certificate-for-integration-test.pfx"
$pfxPass = ""
$pfx.import($certPath,$pfxPass,"Exportable,PersistKeySet")
$store = new-object System.Security.Cryptography.X509Certificates.X509Store([System.Security.Cryptography.X509Certificates.StoreName]::Root, "localmachine")
$store.open("MaxAllowed")
$store.add($pfx)
$store.close()
}
\ No newline at end of file
using System; using System;
using System.Net; using System.Net;
using System.Net.Http; using System.Net.Http;
using System.Net.Mime; using System.Threading.Tasks;
using System.Text;
using Microsoft.VisualStudio.TestTools.UnitTesting; using Microsoft.VisualStudio.TestTools.UnitTesting;
using Titanium.Web.Proxy.EventArguments;
using Titanium.Web.Proxy.Models;
namespace Titanium.Web.Proxy.IntegrationTests namespace Titanium.Web.Proxy.IntegrationTests
{ {
...@@ -11,36 +12,64 @@ namespace Titanium.Web.Proxy.IntegrationTests ...@@ -11,36 +12,64 @@ namespace Titanium.Web.Proxy.IntegrationTests
public class InterceptionTests public class InterceptionTests
{ {
[TestMethod] [TestMethod]
public void CanInterceptPostRequests() public async Task Can_Intercept_Post_Requests()
{ {
string testUrl = "http://interceptthis.com"; string testUrl = "http://interceptthis.com";
int proxyPort = 8086; int proxyPort = 8086;
var proxy = new ProxyTestController(); var proxy = new ProxyTestController();
proxy.StartProxy(proxyPort); proxy.StartProxy(proxyPort);
using (var client = CreateHttpClient(testUrl, proxyPort)) using (var client = TestHelper.CreateHttpClient(testUrl, proxyPort))
{ {
var response = client.PostAsync(new Uri(testUrl), new StringContent("hello!")).Result; var response = await client.PostAsync(new Uri(testUrl), new StringContent("hello!"));
Assert.AreEqual(HttpStatusCode.OK, response.StatusCode); Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
var body = response.Content.ReadAsStringAsync().Result; var body = await response.Content.ReadAsStringAsync();
Assert.IsTrue(body.Contains("TitaniumWebProxy-Stopped!!")); Assert.IsTrue(body.Contains("TitaniumWebProxy-Stopped!!"));
} }
} }
private HttpClient CreateHttpClient(string url, int localProxyPort) private class ProxyTestController
{ {
var handler = new HttpClientHandler private readonly ProxyServer proxyServer;
public ProxyTestController()
{
proxyServer = new ProxyServer();
proxyServer.CertificateManager.RootCertificateName = "root-certificate-for-integration-test.pfx";
}
public void StartProxy(int proxyPort)
{
proxyServer.BeforeRequest += OnRequest;
var explicitEndPoint = new ExplicitProxyEndPoint(IPAddress.Any, proxyPort, true);
proxyServer.AddEndPoint(explicitEndPoint);
proxyServer.Start();
}
public void Stop()
{ {
Proxy = new WebProxy($"http://localhost:{localProxyPort}", false), proxyServer.BeforeRequest -= OnRequest;
UseProxy = true proxyServer.Stop();
}; proxyServer.Dispose();
}
var client = new HttpClient(handler); public async Task OnRequest(object sender, SessionEventArgs e)
{
if (e.WebSession.Request.Url.Contains("interceptthis.com"))
{
if (e.WebSession.Request.HasBody)
{
var body = await e.GetRequestBodyAsString();
}
return client; e.Ok("<html><body>TitaniumWebProxy-Stopped!!</body></html>");
return;
} }
await Task.FromResult(0);
}
}
} }
} }
\ No newline at end of file
using System;
using System.Diagnostics;
using System.Net;
using System.Net.Security;
using System.Threading.Tasks;
using Titanium.Web.Proxy.EventArguments;
using Titanium.Web.Proxy.Models;
namespace Titanium.Web.Proxy.IntegrationTests
{
public class ProxyTestController
{
private readonly ProxyServer proxyServer;
public ProxyTestController()
{
proxyServer = new ProxyServer();
}
public void StartProxy(int proxyPort)
{
proxyServer.BeforeRequest += OnRequest;
proxyServer.BeforeResponse += OnResponse;
proxyServer.ServerCertificateValidationCallback += OnCertificateValidation;
proxyServer.ClientCertificateSelectionCallback += OnCertificateSelection;
var explicitEndPoint = new ExplicitProxyEndPoint(IPAddress.Any, proxyPort, true);
// An explicit endpoint is where the client knows about the existance of a proxy
// So client sends request in a proxy friendly manner
proxyServer.AddEndPoint(explicitEndPoint);
proxyServer.Start();
foreach (var endPoint in proxyServer.ProxyEndPoints)
{
Console.WriteLine("Listening on '{0}' endpoint at Ip {1} and port: {2} ",
endPoint.GetType().Name, endPoint.IpAddress, endPoint.Port);
}
}
public void Stop()
{
proxyServer.BeforeRequest -= OnRequest;
proxyServer.BeforeResponse -= OnResponse;
proxyServer.ServerCertificateValidationCallback -= OnCertificateValidation;
proxyServer.ClientCertificateSelectionCallback -= OnCertificateSelection;
proxyServer.Stop();
}
// intecept & cancel, redirect or update requests
public async Task OnRequest(object sender, SessionEventArgs e)
{
Debug.WriteLine(e.WebSession.Request.Url);
if (e.WebSession.Request.Url.Contains("interceptthis.com"))
{
if (e.WebSession.Request.HasBody)
{
var body = await e.GetRequestBodyAsString();
}
e.Ok("<html><body>TitaniumWebProxy-Stopped!!</body></html>");
return;
}
await Task.FromResult(0);
}
// Modify response
public async Task OnResponse(object sender, SessionEventArgs e)
{
await Task.FromResult(0);
}
/// <summary>
/// Allows overriding default certificate validation logic
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public Task OnCertificateValidation(object sender, CertificateValidationEventArgs e)
{
// set IsValid to true/false based on Certificate Errors
if (e.SslPolicyErrors == SslPolicyErrors.None)
{
e.IsValid = true;
}
return Task.FromResult(0);
}
/// <summary>
/// Allows overriding default client certificate selection logic during mutual authentication
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public Task OnCertificateSelection(object sender, CertificateSelectionEventArgs e)
{
// set e.clientCertificate to override
return Task.FromResult(0);
}
}
}
\ No newline at end of file
using System; using System;
using System.Net; using System.Net;
using System.Net.Http; using System.Net.Http;
using System.Net.Security;
using System.Threading.Tasks;
using Microsoft.VisualStudio.TestTools.UnitTesting; using Microsoft.VisualStudio.TestTools.UnitTesting;
using Titanium.Web.Proxy.EventArguments;
using Titanium.Web.Proxy.Models;
namespace Titanium.Web.Proxy.IntegrationTests namespace Titanium.Web.Proxy.IntegrationTests
{ {
[TestClass] [TestClass]
public class SslTests public class SslTests
{ {
//[TestMethod] [TestMethod]
//disable this test until CI is prepared to handle public async Task TestSsl()
public void TestSsl()
{ {
// expand this to stress test to find
// why in long run proxy becomes unresponsive as per issue #184
string testUrl = "https://google.com"; string testUrl = "https://google.com";
int proxyPort = 8086; int proxyPort = 8086;
var proxy = new ProxyTestController(); var proxy = new ProxyTestController();
proxy.StartProxy(proxyPort); proxy.StartProxy(proxyPort);
using (var client = CreateHttpClient(testUrl, proxyPort)) using (var client = TestHelper.CreateHttpClient(testUrl, proxyPort))
{ {
var response = client.GetAsync(new Uri(testUrl)).Result; var response = await client.GetAsync(new Uri(testUrl));
} }
} }
private HttpClient CreateHttpClient(string url, int localProxyPort)
private class ProxyTestController
{
private readonly ProxyServer proxyServer;
public ProxyTestController()
{ {
var handler = new HttpClientHandler proxyServer = new ProxyServer();
proxyServer.CertificateManager.RootCertificateName = "root-certificate-for-integration-test.pfx";
}
public void StartProxy(int proxyPort)
{ {
Proxy = new WebProxy($"http://localhost:{localProxyPort}", false), var explicitEndPoint = new ExplicitProxyEndPoint(IPAddress.Any, proxyPort, true);
UseProxy = true proxyServer.AddEndPoint(explicitEndPoint);
}; proxyServer.Start();
}
var client = new HttpClient(handler); public void Stop()
{
proxyServer.Stop();
proxyServer.Dispose();
}
return client;
} }
} }
} }
...@@ -71,9 +71,9 @@ ...@@ -71,9 +71,9 @@
</Choose> </Choose>
<ItemGroup> <ItemGroup>
<Compile Include="InterceptionTests.cs" /> <Compile Include="InterceptionTests.cs" />
<Compile Include="ProxyTestController.cs" />
<Compile Include="SslTests.cs" /> <Compile Include="SslTests.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Utilities\TestHelper.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\..\src\Titanium.Web.Proxy\Titanium.Web.Proxy.csproj"> <ProjectReference Include="..\..\src\Titanium.Web.Proxy\Titanium.Web.Proxy.csproj">
...@@ -81,6 +81,12 @@ ...@@ -81,6 +81,12 @@
<Name>Titanium.Web.Proxy</Name> <Name>Titanium.Web.Proxy</Name>
</ProjectReference> </ProjectReference>
</ItemGroup> </ItemGroup>
<ItemGroup>
<None Include="..\..\.build\lib\root-certificate-for-integration-test.pfx">
<Link>root-certificate-for-integration-test.pfx</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
<Choose> <Choose>
<When Condition="'$(VisualStudioVersion)' == '10.0' And '$(IsCodedUITest)' == 'True'"> <When Condition="'$(VisualStudioVersion)' == '10.0' And '$(IsCodedUITest)' == 'True'">
<ItemGroup> <ItemGroup>
......
using System.Net;
using System.Net.Http;
namespace Titanium.Web.Proxy.IntegrationTests
{
public static class TestHelper
{
public static HttpClient CreateHttpClient(string url, int localProxyPort)
{
var handler = new HttpClientHandler
{
Proxy = new WebProxy($"http://localhost:{localProxyPort}", false),
UseProxy = true
};
return new HttpClient(handler);
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment