From 6807ce3af4b52642bc24f98a5dd7d147ea201f9f Mon Sep 17 00:00:00 2001 From: castaneai Date: Mon, 20 Jul 2015 11:52:50 +0900 Subject: [PATCH] =?UTF-8?q?=E3=83=86=E3=82=B9=E3=83=88=E3=82=92=E4=B8=80?= =?UTF-8?q?=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AgiriTest/AgiriTest.cs | 114 ------------- TestClient/main.cpp | 33 ---- agiri.sln | 22 ++- agiri/agiri.vcxproj.user | 1 + test/AgiriTest/AgiriTest.cs | 159 ++++++++++++++++++ .../AgiriTest}/AgiriTest.csproj | 2 +- test/AgiriTest/AgiriTest.csproj.user | 6 + {AgiriTest => test/AgiriTest}/Message.cs | 0 .../AgiriTest/NinjaConnection.cs | 12 +- .../AgiriTest}/Properties/AssemblyInfo.cs | 0 test/test_client/main.cpp | 47 ++++++ .../test_client/test_client.vcxproj | 3 +- .../test_client/test_client.vcxproj.filters | 0 .../test_client/test_client.vcxproj.user | 0 14 files changed, 246 insertions(+), 153 deletions(-) delete mode 100644 AgiriTest/AgiriTest.cs delete mode 100644 TestClient/main.cpp create mode 100644 test/AgiriTest/AgiriTest.cs rename {AgiriTest => test/AgiriTest}/AgiriTest.csproj (98%) create mode 100644 test/AgiriTest/AgiriTest.csproj.user rename {AgiriTest => test/AgiriTest}/Message.cs (100%) rename AgiriTest/Sniffer.cs => test/AgiriTest/NinjaConnection.cs (92%) rename {AgiriTest => test/AgiriTest}/Properties/AssemblyInfo.cs (100%) create mode 100644 test/test_client/main.cpp rename TestClient/TestClient.vcxproj => test/test_client/test_client.vcxproj (97%) rename TestClient/TestClient.vcxproj.filters => test/test_client/test_client.vcxproj.filters (100%) rename TestClient/TestClient.vcxproj.user => test/test_client/test_client.vcxproj.user (100%) diff --git a/AgiriTest/AgiriTest.cs b/AgiriTest/AgiriTest.cs deleted file mode 100644 index 8973683..0000000 --- a/AgiriTest/AgiriTest.cs +++ /dev/null @@ -1,114 +0,0 @@ -using System; -using System.Linq; -using System.Diagnostics; -using System.IO; -using System.Net; -using System.Net.Sockets; -using System.Text; -using Microsoft.VisualStudio.TestTools.UnitTesting; - -namespace AgiriTest -{ - [TestClass] - public class AgiriTest - { - /// - /// クライアント側(agiri.dllを差し込む側) - /// DLLを差し込むので,外部プロセスとして起動する - /// - private static Process clientProcess; - - private TcpListener testServer; - - private const UInt16 agiriPort = 10800; - - [TestInitialize] - public void Startup() - { - testServer = new TcpListener(new IPEndPoint(IPAddress.Loopback, 10000)); - testServer.Start(); - var solutionDir = Path.GetFullPath(Directory.GetCurrentDirectory() + @"\..\..\.."); - var clientPath = solutionDir + @"\Debug\TestClient.exe"; - clientProcess = Process.Start(clientPath); - } - - [TestCleanup] - public void Cleanup() - { - clientProcess.CloseMainWindow(); - testServer.Stop(); - } - - /// - /// agiriの差込用ソケットに接続できるかどうかテスト - /// - [TestMethod] - public void TestConnect() - { - var agiriClient = new NinjaConnection(agiriPort); - agiriClient.Close(); - } - - /// - /// agiriと通信できるかテスト (ping-pong) - /// - [TestMethod, Timeout(3000)] - public void TestNinjaConnection() - { - using (var agiriClient = new NinjaConnection(agiriPort)) { - // agiriにpingを送ったらpongが返ってくるか? - var pingRequest = new Message(Command.PingRequest); - agiriClient.Send(pingRequest); - var pongResponse = agiriClient.Receive(); - Assert.AreEqual(Command.PongResponse, pongResponse.Command); - Assert.IsTrue(Enumerable.SequenceEqual(new byte[0], pongResponse.Data)); - } - } - - /// - /// ソケット一覧を取得できるか - /// - [TestMethod] - public void TestListSocket() - { - using (var agiriClient = new NinjaConnection(agiriPort)) { - var sockets = agiriClient.GetAllSockets(); - } - } - - /// - /// snifferからsendパケットを差し込むことができるか - /// - [TestMethod] - public void TestInjectOutgoingPacket() - { - var testClientConn = testServer.AcceptTcpClient(); - using (var agiriClient = new NinjaConnection(agiriPort)) { - var sockets = agiriClient.GetAllSockets().Where(si => si.EndPoint.Port == 10000).ToList(); - var targetSocket = sockets.First(); - agiriClient.InjectOutgoingPacket(targetSocket.SocketID, Encoding.ASCII.GetBytes("abcdefg\n")); - var injectedPacketReader = new StreamReader(testClientConn.GetStream()); - var injectedPacket = injectedPacketReader.ReadLine(); - Assert.AreEqual("abcdefg", injectedPacket); - } - } - - /// - /// recvパケットをsnifferに横流しできるか - /// - [TestMethod] - public void TestSniffIncomingPacket() - { - var testClientConn = testServer.AcceptTcpClient(); - using (var sniffer = new NinjaConnection(agiriPort)) { - var targetSocket = sniffer.GetAllSockets().Where(si => si.EndPoint.Port == 10000).First(); - sniffer.StartSniffIncomingPacket(targetSocket.SocketID); - var writer = new StreamWriter(testClientConn.GetStream()); - writer.Write("SNIFFED"); - writer.Flush(); - var received = sniffer.ReceiveSniffedIncomingPacket(targetSocket.SocketID); - Assert.AreEqual("SNIFFED", Encoding.ASCII.GetString(received)); - } - } - } -} diff --git a/TestClient/main.cpp b/TestClient/main.cpp deleted file mode 100644 index eb0a1aa..0000000 --- a/TestClient/main.cpp +++ /dev/null @@ -1,33 +0,0 @@ -#pragma comment(lib, "ws2_32.lib") - -#include -#include - -int main(void) -{ - WSADATA data; - WSAStartup(MAKEWORD(2, 0), &data); - - if (LoadLibraryA("agiri.dll") == 0) { - printf("[ERROR!]LoadLibrary agiri.dll [code:%d]\n", GetLastError()); - return -1; - } - - SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); - sockaddr_in address = { 0 }; - address.sin_family = AF_INET; - address.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); - address.sin_port = htons(10000); - if (connect(s, reinterpret_cast(&address), sizeof(address)) == SOCKET_ERROR) { - printf("[ERROR!]connect failed.\n"); - return -1; - } - printf("test connection established. socket_handle: %d\n", (int)s); - - while (true) { - char recvBuf[1024] = { 0 }; - int recvLen = recv(s, recvBuf, 1024, 0); - printf("recv: %s\n", recvBuf); - } - return 0; -} \ No newline at end of file diff --git a/agiri.sln b/agiri.sln index ffde3fd..b790f6b 100644 --- a/agiri.sln +++ b/agiri.sln @@ -5,9 +5,13 @@ VisualStudioVersion = 12.0.31101.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "agiri", "agiri\agiri.vcxproj", "{BC877335-7A01-4B43-B3A9-99FE244BCA2D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AgiriTest", "AgiriTest\AgiriTest.csproj", "{F60BA12F-8A36-4CBF-9E65-8BA9E398F4BF}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AgiriBoss", "AgiriBoss\AgiriBoss.csproj", "{39E053B5-71B1-4328-ACE7-43BF0C2CF85C}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TestClient", "TestClient\TestClient.vcxproj", "{BACF50F1-AB0A-47E7-BBED-E845EBE00322}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{73B805CD-D5E5-4D18-9E7F-C17B66AB01A4}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AgiriTest", "test\AgiriTest\AgiriTest.csproj", "{F60BA12F-8A36-4CBF-9E65-8BA9E398F4BF}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_client", "test\test_client\test_client.vcxproj", "{BACF50F1-AB0A-47E7-BBED-E845EBE00322}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -29,6 +33,16 @@ Global {BC877335-7A01-4B43-B3A9-99FE244BCA2D}.Release|Mixed Platforms.Build.0 = Release|Win32 {BC877335-7A01-4B43-B3A9-99FE244BCA2D}.Release|Win32.ActiveCfg = Release|Win32 {BC877335-7A01-4B43-B3A9-99FE244BCA2D}.Release|Win32.Build.0 = Release|Win32 + {39E053B5-71B1-4328-ACE7-43BF0C2CF85C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {39E053B5-71B1-4328-ACE7-43BF0C2CF85C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {39E053B5-71B1-4328-ACE7-43BF0C2CF85C}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {39E053B5-71B1-4328-ACE7-43BF0C2CF85C}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {39E053B5-71B1-4328-ACE7-43BF0C2CF85C}.Debug|Win32.ActiveCfg = Debug|Any CPU + {39E053B5-71B1-4328-ACE7-43BF0C2CF85C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {39E053B5-71B1-4328-ACE7-43BF0C2CF85C}.Release|Any CPU.Build.0 = Release|Any CPU + {39E053B5-71B1-4328-ACE7-43BF0C2CF85C}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {39E053B5-71B1-4328-ACE7-43BF0C2CF85C}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {39E053B5-71B1-4328-ACE7-43BF0C2CF85C}.Release|Win32.ActiveCfg = Release|Any CPU {F60BA12F-8A36-4CBF-9E65-8BA9E398F4BF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F60BA12F-8A36-4CBF-9E65-8BA9E398F4BF}.Debug|Any CPU.Build.0 = Debug|Any CPU {F60BA12F-8A36-4CBF-9E65-8BA9E398F4BF}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU @@ -53,4 +67,8 @@ Global GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {F60BA12F-8A36-4CBF-9E65-8BA9E398F4BF} = {73B805CD-D5E5-4D18-9E7F-C17B66AB01A4} + {BACF50F1-AB0A-47E7-BBED-E845EBE00322} = {73B805CD-D5E5-4D18-9E7F-C17B66AB01A4} + EndGlobalSection EndGlobal diff --git a/agiri/agiri.vcxproj.user b/agiri/agiri.vcxproj.user index d7ec32a..c95f2cb 100644 --- a/agiri/agiri.vcxproj.user +++ b/agiri/agiri.vcxproj.user @@ -5,5 +5,6 @@ WindowsLocalDebugger $(SolutionDir)\$(Configuration) false + 10000 \ No newline at end of file diff --git a/test/AgiriTest/AgiriTest.cs b/test/AgiriTest/AgiriTest.cs new file mode 100644 index 0000000..fa04b80 --- /dev/null +++ b/test/AgiriTest/AgiriTest.cs @@ -0,0 +1,159 @@ +using System; +using System.Linq; +using System.Diagnostics; +using System.IO; +using System.Net; +using System.Net.Sockets; +using System.Text; +using System.Threading; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace AgiriTest +{ + [TestClass] + public class AgiriTest + { + public TestContext TestContext { get; set; } + + /// + /// テスト用サーバーのデフォルトの待ち受けポート番号 + /// + private const ushort defaultTestServerListenPort = 10000; + + /// + /// agiriのポート番号 + /// + private const ushort agiriPort = 10800; + + /// + /// テスト用サーバー + /// + private TcpListener testServer; + + /// + /// テスト用クライアント + /// + private Process testClientProcess; + + /// + /// テスト用サーバーを起動する + /// + /// + /// + private static TcpListener startTestServer(ushort listenPort = defaultTestServerListenPort) + { + var testServer = new TcpListener(IPAddress.Loopback, listenPort); + testServer.Start(); + return testServer; + } + + /// + /// テスト用クライアントを起動する + /// + /// + private Process startTestClientProcess() + { + var solutionDir = Path.GetFullPath(AppDomain.CurrentDomain.BaseDirectory + "/../../../.."); + var clientPath = solutionDir + "/Debug/test_client.exe"; + return Process.Start(clientPath, defaultTestServerListenPort.ToString()); + } + + [TestInitialize] + public void BeforeEach() + { + testServer = startTestServer(); + testClientProcess = startTestClientProcess(); + } + + [TestCleanup] + public void AfterEach() + { + testClientProcess.CloseMainWindow(); + testServer.Stop(); + } + + private void agiriContext(Action action) + { + using (var testClientConnection = testServer.AcceptTcpClient()) + using (var testClientReader = new StreamReader(testClientConnection.GetStream())) + using (var testClientWriter = new StreamWriter(testClientConnection.GetStream())) + using (var ninjaConnection = new NinjaConnection(agiriPort)) { + action(testClientReader, testClientWriter, ninjaConnection); + } + } + + /// + /// テスト用クライアントにagiri.dllを注入できたか + /// + [TestMethod] + public void TestEstablishNinjaConnection() + { + using (var ninjaConnection = new NinjaConnection(agiriPort)) { + } + } + + /// + /// agiri.dllと複数のNinjaConnectionを確立できるか + /// + [TestMethod] + public void TestEstablishMultipleNinjaConnection() + { + using (var firstNinja = new NinjaConnection(agiriPort)) + using (var secondNinja = new NinjaConnection(agiriPort)) { + } + } + + /// + /// agiri.dllと通信できるか (pingリクエストを送るとpongレスポンスが返ってくるか) + /// + [TestMethod] + public void TestNinjaConnection() + { + using (var ninjaConnection = new NinjaConnection(agiriPort)) { + Assert.IsTrue(ninjaConnection.Ping()); + } + } + + /// + /// ソケット一覧を取得できるか + /// + [TestMethod] + public void TestListSocket() + { + agiriContext((reader, writer, ninja) => { + var sockets = ninja.GetAllSockets(); + Assert.IsTrue(sockets.Any(s => s.EndPoint.Port == defaultTestServerListenPort), "ソケット一覧にはテストサーバーへの接続ソケットが含まれているはず"); + }); + } + + /// + /// snifferからsendパケットを差し込むことができるか + /// + [TestMethod] + public void TestInjectOutgoingPacket() + { + agiriContext((reader, writer, ninja) => { + var targetSocket = ninja.GetAllSockets().First(si => si.EndPoint.Port == defaultTestServerListenPort); + ninja.InjectOutgoingPacket(targetSocket.SocketID, Encoding.ASCII.GetBytes("abcdefg\n")); + Assert.AreEqual("abcdefg", reader.ReadLine(), "agiriから差し込まれたメッセージがテスト用サーバーに届くはず"); + }); + } + + /// + /// recvパケットをsnifferに横流しできるか + /// + [TestMethod] + public void TestSniffIncomingPacket() + { + agiriContext((reader, writer, ninja) => { + var targetSocket = ninja.GetAllSockets().First(s => s.EndPoint.Port == defaultTestServerListenPort); + ninja.StartSniffIncomingPacket(targetSocket.SocketID); + writer.Write("SNIFFED"); + writer.Flush(); + var received = ninja.ReceiveSniffedIncomingPacket(targetSocket.SocketID); + Assert.AreEqual("SNIFFED", Encoding.ASCII.GetString(received), "テスト用サーバーがテスト用クライアントに返した内容をagiriが横取りできたはず"); + }); + } + + } +} diff --git a/AgiriTest/AgiriTest.csproj b/test/AgiriTest/AgiriTest.csproj similarity index 98% rename from AgiriTest/AgiriTest.csproj rename to test/AgiriTest/AgiriTest.csproj index fc891f8..20c667c 100644 --- a/AgiriTest/AgiriTest.csproj +++ b/test/AgiriTest/AgiriTest.csproj @@ -52,7 +52,7 @@ - + diff --git a/test/AgiriTest/AgiriTest.csproj.user b/test/AgiriTest/AgiriTest.csproj.user new file mode 100644 index 0000000..0db07ec --- /dev/null +++ b/test/AgiriTest/AgiriTest.csproj.user @@ -0,0 +1,6 @@ + + + + false + + \ No newline at end of file diff --git a/AgiriTest/Message.cs b/test/AgiriTest/Message.cs similarity index 100% rename from AgiriTest/Message.cs rename to test/AgiriTest/Message.cs diff --git a/AgiriTest/Sniffer.cs b/test/AgiriTest/NinjaConnection.cs similarity index 92% rename from AgiriTest/Sniffer.cs rename to test/AgiriTest/NinjaConnection.cs index 974e489..1321084 100644 --- a/AgiriTest/Sniffer.cs +++ b/test/AgiriTest/NinjaConnection.cs @@ -19,9 +19,9 @@ public sealed class NinjaConnection : IDisposable private readonly BinaryReader reader; private readonly BinaryWriter writer; - public NinjaConnection(ushort serverPort) + public NinjaConnection(ushort peerPort) { - var serverEP = new IPEndPoint(IPAddress.Loopback, serverPort); + var serverEP = new IPEndPoint(IPAddress.Loopback, peerPort); tcpClient = new TcpClient(); tcpClient.Connect(serverEP); reader = new BinaryReader(tcpClient.GetStream()); @@ -57,6 +57,14 @@ public void Close() writer.Close(); } + public bool Ping() + { + var request = new Message(Command.PingRequest); + Send(request); + var response = Receive(); + return response.Command == Command.PongResponse; + } + public IList GetAllSockets() { var result = new List(); diff --git a/AgiriTest/Properties/AssemblyInfo.cs b/test/AgiriTest/Properties/AssemblyInfo.cs similarity index 100% rename from AgiriTest/Properties/AssemblyInfo.cs rename to test/AgiriTest/Properties/AssemblyInfo.cs diff --git a/test/test_client/main.cpp b/test/test_client/main.cpp new file mode 100644 index 0000000..94cd8ff --- /dev/null +++ b/test/test_client/main.cpp @@ -0,0 +1,47 @@ +#pragma comment(lib, "ws2_32.lib") + +#include +#include + +int main(int argc, char** argv) +{ + if (argc != 2) { + printf("Usage: TestClient \n"); + return 0; + } + int connectPort = atoi(argv[1]); + + WSADATA data; + WSAStartup(MAKEWORD(2, 0), &data); + + if (LoadLibraryA("agiri.dll") == 0) { + printf("[ERROR!]LoadLibrary agiri.dll [code:%d]\n", GetLastError()); + return -1; + } + + while (true) { + SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + sockaddr_in address = { 0 }; + address.sin_family = AF_INET; + address.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); + address.sin_port = htons(connectPort); + if (connect(s, reinterpret_cast(&address), sizeof(address)) == SOCKET_ERROR) { + printf("[ERROR!]connect failed.\n"); + return -1; + } + printf("test connection (handle: %d) established.\n", s); + + while (true) { + char recvBuf[1024] = { 0 }; + int recvLen = recv(s, recvBuf, 1024, 0); + if (recvLen <= 0) { + printf("test connection (handle: %d) closed.\n", s); + break; + } + if (recvLen > 0) { + printf("recv: %s\n", recvBuf); + } + } + } + return 0; +} \ No newline at end of file diff --git a/TestClient/TestClient.vcxproj b/test/test_client/test_client.vcxproj similarity index 97% rename from TestClient/TestClient.vcxproj rename to test/test_client/test_client.vcxproj index 680aa0e..fe23a26 100644 --- a/TestClient/TestClient.vcxproj +++ b/test/test_client/test_client.vcxproj @@ -13,7 +13,8 @@ {BACF50F1-AB0A-47E7-BBED-E845EBE00322} Win32Proj - TestClient + test_client + test_client diff --git a/TestClient/TestClient.vcxproj.filters b/test/test_client/test_client.vcxproj.filters similarity index 100% rename from TestClient/TestClient.vcxproj.filters rename to test/test_client/test_client.vcxproj.filters diff --git a/TestClient/TestClient.vcxproj.user b/test/test_client/test_client.vcxproj.user similarity index 100% rename from TestClient/TestClient.vcxproj.user rename to test/test_client/test_client.vcxproj.user