Explorar o código

增加ENetCS的单元测试

tanghai %!s(int64=13) %!d(string=hai) anos
pai
achega
dc2163ad38

+ 17 - 0
CSharp/CSharp.sln

@@ -49,6 +49,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ENetCS", "Platform\ENetCS\E
 		{C9992B7C-313E-4C9F-A954-640D01EDFB58} = {C9992B7C-313E-4C9F-A954-640D01EDFB58}
 	EndProjectSection
 EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "PlatformTest", "PlatformTest", "{84F19B42-2721-4149-B081-65632ACC0277}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ENetCSTest", "PlatformTest\ENetCSTest\ENetCSTest.csproj", "{901A8E5C-C4C6-4C3C-8E18-068D75119F5D}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -221,6 +225,18 @@ Global
 		{D0B4CFAC-A368-4742-9863-68776CFA9938}.Release|Mixed Platforms.Build.0 = Release|Any CPU
 		{D0B4CFAC-A368-4742-9863-68776CFA9938}.Release|Win32.ActiveCfg = Release|Any CPU
 		{D0B4CFAC-A368-4742-9863-68776CFA9938}.Release|x86.ActiveCfg = Release|Any CPU
+		{901A8E5C-C4C6-4C3C-8E18-068D75119F5D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{901A8E5C-C4C6-4C3C-8E18-068D75119F5D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{901A8E5C-C4C6-4C3C-8E18-068D75119F5D}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{901A8E5C-C4C6-4C3C-8E18-068D75119F5D}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{901A8E5C-C4C6-4C3C-8E18-068D75119F5D}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{901A8E5C-C4C6-4C3C-8E18-068D75119F5D}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{901A8E5C-C4C6-4C3C-8E18-068D75119F5D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{901A8E5C-C4C6-4C3C-8E18-068D75119F5D}.Release|Any CPU.Build.0 = Release|Any CPU
+		{901A8E5C-C4C6-4C3C-8E18-068D75119F5D}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{901A8E5C-C4C6-4C3C-8E18-068D75119F5D}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{901A8E5C-C4C6-4C3C-8E18-068D75119F5D}.Release|Win32.ActiveCfg = Release|Any CPU
+		{901A8E5C-C4C6-4C3C-8E18-068D75119F5D}.Release|x86.ActiveCfg = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
@@ -240,5 +256,6 @@ Global
 		{87537C92-B2C7-4E46-A6FB-02B73215C100} = {FD5F443E-CBEE-443E-821D-C47C86E09534}
 		{15B3E0D2-6217-493A-A690-158C497F5318} = {4FF1FBF3-F552-4D3D-AD97-E29385069206}
 		{E62B0633-1767-44A0-9479-C8E9D19DA4B8} = {01501C44-C95B-45B7-A898-76B4A7AC4EE8}
+		{901A8E5C-C4C6-4C3C-8E18-068D75119F5D} = {84F19B42-2721-4149-B081-65632ACC0277}
 	EndGlobalSection
 EndGlobal

+ 43 - 32
CSharp/Platform/ENetCS/Host.cs

@@ -19,6 +19,7 @@ namespace ENet
 		private Action<Event> acceptHandler;
 		private readonly object eventsLock = new object();
 		private Action events;
+		private bool isRunning = true;
 
 		public Host(Address address, uint peerLimit = NativeMethods.ENET_PROTOCOL_MAXIMUM_PEER_ID, 
 				uint channelLimit = 0, uint incomingBandwidth = 0, 
@@ -31,7 +32,9 @@ namespace ENet
 			CheckChannelLimit(channelLimit);
 
 			ENetAddress nativeAddress = address.Struct;
-			this.host = NativeMethods.enet_host_create(ref nativeAddress, peerLimit, channelLimit, incomingBandwidth, outgoingBandwidth);
+			this.host = NativeMethods.enet_host_create(
+					ref nativeAddress, peerLimit, 
+					channelLimit, incomingBandwidth, outgoingBandwidth);
 
 			if (this.host == IntPtr.Zero)
 			{
@@ -207,47 +210,55 @@ namespace ENet
 			local();
 		}
 
-		public void Run()
+		public void Stop()
 		{
-			this.OnExecuteEvents();
+			isRunning = false;
+		}
 
-			if (this.Service(0) < 0)
+		public void Run(int timeout = 0)
+		{
+			while (isRunning)
 			{
-				return;
-			}
+				this.OnExecuteEvents();
 
-			Event ev;
-			while (this.CheckEvents(out ev) > 0)
-			{
-				switch (ev.Type)
+				if (this.Service(timeout) < 0)
 				{
-					case EventType.Connect:
+					continue;
+				}
+
+				Event ev;
+				while (this.CheckEvents(out ev) > 0)
+				{
+					switch (ev.Type)
 					{
-						// 如果PeersManager包含了peer,则这次是connect事件
-						// 反之是accept事件
-						if (this.PeersManager.ContainsKey(ev.Ev.peer))
-						{
-							ev.Peer.PeerEvent.OnConnected(ev);
-						}
-						else
+						case EventType.Connect:
 						{
-							if (acceptHandler != null)
+							// 如果PeersManager包含了peer,则这次是connect事件
+							// 反之是accept事件
+							if (this.PeersManager.ContainsKey(ev.Ev.peer))
 							{
-								acceptHandler(ev);
-								acceptHandler = null;
+								ev.Peer.PeerEvent.OnConnected(ev);
 							}
+							else
+							{
+								if (acceptHandler != null)
+								{
+									acceptHandler(ev);
+									acceptHandler = null;
+								}
+							}
+							break;
+						}
+						case EventType.Receive:
+						{
+							ev.Peer.PeerEvent.OnReceived(ev);
+							break;
+						}
+						case EventType.Disconnect:
+						{
+							ev.Peer.PeerEvent.OnDisconnect(ev);
+							break;
 						}
-						break;
-					}
-					case EventType.Receive:
-					{
-						ev.Peer.PeerEvent.OnReceived(ev);
-						break;
-					}
-					case EventType.Disconnect:
-					{
-						ev.Peer.PeerEvent.OnDisconnect(ev);
-						break;
 					}
 				}
 			}

+ 0 - 6
CSharp/Platform/Helper/StringHelper.cs

@@ -10,11 +10,5 @@ namespace Helper
 			byte[] byteArray = Encoding.Default.GetBytes(str);
 			return byteArray;
 		}
-
-		public static string ToHex(this string str)
-		{
-			IEnumerable<byte> byteArray = str.ToBytes();
-			return byteArray.ToHex();
-		}
 	}
 }

+ 92 - 0
CSharp/PlatformTest/ENetCSTest/ENetCSTest.csproj

@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{901A8E5C-C4C6-4C3C-8E18-068D75119F5D}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>ENetCSTest</RootNamespace>
+    <AssemblyName>ENetCSTest</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+    <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
+    <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
+    <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages</ReferencePath>
+    <IsCodedUITest>False</IsCodedUITest>
+    <TestProjectType>UnitTest</TestProjectType>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\Bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <PlatformTarget>x86</PlatformTarget>
+    <AllowUnsafeBlocks>false</AllowUnsafeBlocks>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="WindowsBase" />
+  </ItemGroup>
+  <Choose>
+    <When Condition="('$(VisualStudioVersion)' == '10.0' or '$(VisualStudioVersion)' == '') and '$(TargetFrameworkVersion)' == 'v3.5'">
+      <ItemGroup>
+        <Reference Include="Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=10.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
+      </ItemGroup>
+    </When>
+    <Otherwise>
+      <ItemGroup>
+        <Reference Include="Microsoft.VisualStudio.QualityTools.UnitTestFramework" />
+      </ItemGroup>
+    </Otherwise>
+  </Choose>
+  <ItemGroup>
+    <Compile Include="ENetClientServerTest.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\Platform\ENetCS\ENetCS.csproj">
+      <Project>{D0B4CFAC-A368-4742-9863-68776CFA9938}</Project>
+      <Name>ENetCS</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Choose>
+    <When Condition="'$(VisualStudioVersion)' == '10.0' And '$(IsCodedUITest)' == 'True'">
+      <ItemGroup>
+        <Reference Include="Microsoft.VisualStudio.QualityTools.CodedUITestFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <Private>False</Private>
+        </Reference>
+        <Reference Include="Microsoft.VisualStudio.TestTools.UITest.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <Private>False</Private>
+        </Reference>
+        <Reference Include="Microsoft.VisualStudio.TestTools.UITest.Extension, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <Private>False</Private>
+        </Reference>
+        <Reference Include="Microsoft.VisualStudio.TestTools.UITesting, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+          <Private>False</Private>
+        </Reference>
+      </ItemGroup>
+    </When>
+  </Choose>
+  <Import Project="$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets" Condition="Exists('$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets')" />
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>

+ 57 - 0
CSharp/PlatformTest/ENetCSTest/ENetClientServerTest.cs

@@ -0,0 +1,57 @@
+using System;
+using System.Threading;
+using System.Windows.Threading;
+using ENet;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace ENetCSTest
+{
+	[TestClass]
+	public class ENetClientServerTest
+	{
+		private static async void Connect(Host host, Address address)
+		{
+			var peer = await host.ConnectAsync(address);
+			var sPacket = new Packet("0123456789", PacketFlags.Reliable);
+			peer.Send(0, sPacket);
+			var rPacket = await peer.ReceiveAsync();
+
+			Assert.AreEqual("9876543210", rPacket.Bytes.ToString());
+
+			await peer.DisconnectLaterAsync();
+		}
+
+		private static async void Accept(Host host)
+		{
+			var peer = await host.AcceptAsync();
+			var rPacket = await peer.ReceiveAsync();
+
+			Assert.AreEqual("0123456789", rPacket.Bytes.ToString());
+
+			var sPacket = new Packet("9876543210", PacketFlags.Reliable);
+			peer.Send(0, sPacket);
+			await peer.DisconnectLaterAsync();
+		}
+
+		[TestMethod]
+		public void ClientSendToServer()
+		{
+			Library.Initialize();
+
+			var address = new Address { HostName = "127.0.0.1", Port = 8888 };
+			var serverHost = new Host();
+			var clientHost = new Host(address);
+
+			var server = new Thread(() => serverHost.Run(10));
+			var client = new Thread(() => clientHost.Run(10));
+
+			serverHost.Events += () => Accept(serverHost);
+			clientHost.Events += () => Connect(clientHost, address);
+			server.Start();
+			client.Start();
+
+			server.Join();
+			client.Join();
+		}
+	}
+}

+ 36 - 0
CSharp/PlatformTest/ENetCSTest/Properties/AssemblyInfo.cs

@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// 有关程序集的常规信息通过以下特性集 
+// 控制。更改这些特性值可修改
+// 与程序集关联的信息。
+[assembly: AssemblyTitle("ENetCSTest")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("Microsoft")]
+[assembly: AssemblyProduct("ENetCSTest")]
+[assembly: AssemblyCopyright("Copyright © Microsoft 2012")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// 将 ComVisible 设置为 false 会使此程序集中的类型 
+// 对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型,
+// 请将该类型上的 ComVisible 特性设置为 true。
+[assembly: ComVisible(false)]
+
+// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
+[assembly: Guid("b52f4804-3f6e-4268-810a-08fe8ca12bd0")]
+
+// 程序集的版本信息由以下四个值组成:
+//
+//      主版本
+//      次版本
+//      生成号
+//      修订号
+//
+// 可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值,
+// 方法是按如下所示使用“*”:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]