commit
926f4dd33d
48 changed files with 833 additions and 1245 deletions
@ -1,10 +0,0 @@ |
|||||||
@echo off |
|
||||||
SET BUILD_TARGET=%1 |
|
||||||
SET BUILD_CONFIG=%2 |
|
||||||
|
|
||||||
IF "%BUILD_TARGET%"=="" SET BUILD_TARGET=Rebuild |
|
||||||
IF "%BUILD_CONFIG%"=="" SET BUILD_CONFIG=Debug |
|
||||||
|
|
||||||
CMD.exe /Q /C "CD %~dp0 && %WINDIR%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe build.csproj %3 %4 %5 %6 /t:%BUILD_TARGET% /p:BuildConfiguration=%BUILD_CONFIG% /p:Platform="Any CPU" /p:BuildTools=4.0 /toolsversion:4.0" |
|
||||||
|
|
||||||
pause |
|
@ -0,0 +1,8 @@ |
|||||||
|
@echo off |
||||||
|
SET BUILD_TARGET=%~1 |
||||||
|
SET BUILD_CONFIG=%~2 |
||||||
|
|
||||||
|
IF "%BUILD_TARGET%"=="" SET BUILD_TARGET=Rebuild |
||||||
|
IF "%BUILD_CONFIG%"=="" SET BUILD_CONFIG=Debug |
||||||
|
|
||||||
|
CMD.exe /Q /C "CD %~dp0 && %WINDIR%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe build.csproj /toolsversion:4.0 %3 %4 %5 %6 "/t:%BUILD_TARGET%" "/p:BuildConfiguration=%BUILD_CONFIG%;TargetVersion=2" |
@ -1,42 +1,2 @@ |
|||||||
@ECHO OFF |
@echo off |
||||||
|
CMD.exe /Q /C "CD %~dp0 && %WINDIR%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe build.csproj /t:FullBuild /toolsversion:4.0 %1 %2 %3 %4 %5 %6 |
||||||
SET PREV_WORKING_DIR=%CD% |
|
||||||
CD %~dp0 |
|
||||||
|
|
||||||
REM -- 3.5 Debug build, ensure this continues to work |
|
||||||
%WINDIR%\Microsoft.NET\Framework\v3.5\MSBuild.exe build.csproj /t:Rebuild /p:BuildConfiguration=Debug /p:Platform="Any CPU" /p:BuildTools=3.5 /toolsversion:3.5" |
|
||||||
IF ERRORLEVEL 1 GOTO ERROR |
|
||||||
|
|
||||||
REM -- 4.0 Debug build |
|
||||||
%WINDIR%\Microsoft.NET\Framework\v4.0.30319\msbuild build.csproj /m /t:Rebuild /p:BuildConfiguration=Debug /p:Platform="Any CPU" |
|
||||||
IF ERRORLEVEL 1 GOTO ERROR |
|
||||||
|
|
||||||
REM -- 4.0 Release build |
|
||||||
%WINDIR%\Microsoft.NET\Framework\v4.0.30319\msbuild build.csproj /m /t:Rebuild /p:BuildConfiguration=Release /p:Platform="Any CPU" |
|
||||||
IF ERRORLEVEL 1 GOTO ERROR |
|
||||||
|
|
||||||
IF EXIST "%ProgramFiles%\MSBuild\Microsoft\Silverlight\v2.0\Microsoft.Silverlight.CSharp.targets" GOTO SILVERLIGHT |
|
||||||
IF EXIST "%ProgramFiles(x86)%\MSBuild\Microsoft\Silverlight\v2.0\Microsoft.Silverlight.CSharp.targets" GOTO SILVERLIGHT |
|
||||||
|
|
||||||
ECHO Unable to locate %ProgramFiles(x86)%\MSBuild\Microsoft\Silverlight\v2.0 |
|
||||||
GOTO ERROR |
|
||||||
|
|
||||||
:SILVERLIGHT |
|
||||||
|
|
||||||
REM -- 4.0 Debug_Silverlight2 build |
|
||||||
%WINDIR%\Microsoft.NET\Framework\v4.0.30319\msbuild build.csproj /m /t:Rebuild /p:BuildConfiguration=Debug_Silverlight2 /p:Platform="Any CPU" |
|
||||||
IF ERRORLEVEL 1 GOTO ERROR |
|
||||||
|
|
||||||
REM -- 4.0 Release_Silverlight2 build |
|
||||||
%WINDIR%\Microsoft.NET\Framework\v4.0.30319\msbuild build.csproj /m /t:Rebuild /p:BuildConfiguration=Release_Silverlight2 /p:Platform="Any CPU" |
|
||||||
IF ERRORLEVEL 1 GOTO ERROR |
|
||||||
|
|
||||||
GOTO END |
|
||||||
|
|
||||||
:ERROR |
|
||||||
CD %PREV_WORKING_DIR% |
|
||||||
PAUSE |
|
||||||
|
|
||||||
:END |
|
||||||
CD %PREV_WORKING_DIR% |
|
||||||
SET PREV_WORKING_DIR= |
|
||||||
|
@ -1,5 +1,2 @@ |
|||||||
@echo off |
@echo off |
||||||
|
CMD.exe /Q /C "CD %~dp0 && %WINDIR%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe build.csproj /toolsversion:4.0 /t:Rebuild %1 %2 %3 %4 "/p:BuildConfiguration=Debug_Silverlight;TargetVersion=2" |
||||||
%WINDIR%\Microsoft.NET\Framework\v4.0.30319\msbuild build.csproj /m /t:Build /p:BuildConfiguration=Debug_Silverlight2 /p:Platform="Any CPU" |
|
||||||
|
|
||||||
pause |
|
||||||
|
@ -1,19 +0,0 @@ |
|||||||
@ECHO OFF |
|
||||||
%WINDIR%\Microsoft.NET\Framework\v4.0.30319\msbuild build.csproj /m /t:PrepareOutputDirectory |
|
||||||
IF ERRORLEVEL 1 GOTO END |
|
||||||
|
|
||||||
%WINDIR%\Microsoft.NET\Framework\v4.0.30319\msbuild build.csproj /m /t:Rebuild;PreparePackageComponent /p:BuildConfiguration=Debug /p:Platform="Any CPU" %PROTOBUF_KEY_FILE% |
|
||||||
IF ERRORLEVEL 1 GOTO END |
|
||||||
|
|
||||||
%WINDIR%\Microsoft.NET\Framework\v4.0.30319\msbuild build.csproj /m /t:Rebuild;PreparePackageComponent /p:BuildConfiguration=Debug_Silverlight2 /p:Platform="Any CPU" %PROTOBUF_KEY_FILE% |
|
||||||
IF ERRORLEVEL 1 GOTO END |
|
||||||
|
|
||||||
%WINDIR%\Microsoft.NET\Framework\v4.0.30319\msbuild build.csproj /m /t:Rebuild;PreparePackageComponent /p:BuildConfiguration=Release /p:Platform="Any CPU" %PROTOBUF_KEY_FILE% |
|
||||||
IF ERRORLEVEL 1 GOTO END |
|
||||||
|
|
||||||
%WINDIR%\Microsoft.NET\Framework\v4.0.30319\msbuild build.csproj /m /t:Rebuild;PreparePackageComponent /p:BuildConfiguration=Release_Silverlight2 /p:Platform="Any CPU" %PROTOBUF_KEY_FILE% |
|
||||||
IF ERRORLEVEL 1 GOTO END |
|
||||||
|
|
||||||
%WINDIR%\Microsoft.NET\Framework\v4.0.30319\msbuild build.csproj /m /t:GeneratePackage /p:PackageName=AllBinariesAndSource.zip /p:Platform="Any CPU" |
|
||||||
|
|
||||||
:END |
|
@ -1,13 +0,0 @@ |
|||||||
@ECHO OFF |
|
||||||
%WINDIR%\Microsoft.NET\Framework\v4.0.30319\msbuild build.csproj /m /t:PrepareOutputDirectory |
|
||||||
IF ERRORLEVEL 1 GOTO END |
|
||||||
|
|
||||||
%WINDIR%\Microsoft.NET\Framework\v4.0.30319\msbuild build.csproj /m /t:Rebuild;PreparePackageComponent /p:BuildConfiguration=Release /p:Platform="Any CPU" %PROTOBUF_KEY_FILE% |
|
||||||
IF ERRORLEVEL 1 GOTO END |
|
||||||
|
|
||||||
%WINDIR%\Microsoft.NET\Framework\v4.0.30319\msbuild build.csproj /m /t:Rebuild;PreparePackageComponent /p:BuildConfiguration=Release_Silverlight2 /p:Platform="Any CPU" %PROTOBUF_KEY_FILE% |
|
||||||
IF ERRORLEVEL 1 GOTO END |
|
||||||
|
|
||||||
%WINDIR%\Microsoft.NET\Framework\v4.0.30319\msbuild build.csproj /m /t:GeneratePackage /p:PackageName=ReleaseBinaries.zip /p:Platform="Any CPU" |
|
||||||
|
|
||||||
:END |
|
@ -1,5 +1,2 @@ |
|||||||
@echo off |
@echo off |
||||||
|
CMD.exe /Q /C "CD %~dp0 && %WINDIR%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe build.csproj /toolsversion:4.0 /t:RunBenchmarks %1 %2 %3 %4 "/p:BuildConfiguration=Release;TargetVersion=2" |
||||||
%WINDIR%\Microsoft.NET\Framework\v4.0.30319\msbuild %~dp0\build.csproj /m /t:RunBenchmarks /p:BuildConfiguration=Release /p:Platform="Any CPU" |
|
||||||
|
|
||||||
pause |
|
||||||
|
@ -1,8 +1,8 @@ |
|||||||
@echo off |
@echo off |
||||||
SET BUILD_TARGET=%1 |
SET BUILD_TARGET=%~1 |
||||||
SET BUILD_CONFIG=%2 |
SET BUILD_CONFIG=%~2 |
||||||
|
|
||||||
IF "%BUILD_TARGET%"=="" SET BUILD_TARGET=Rebuild |
IF "%BUILD_TARGET%"=="" SET BUILD_TARGET=Rebuild |
||||||
IF "%BUILD_CONFIG%"=="" SET BUILD_CONFIG=Debug |
IF "%BUILD_CONFIG%"=="" SET BUILD_CONFIG=Debug |
||||||
|
|
||||||
CMD.exe /Q /C "CD %~dp0 && %WINDIR%\Microsoft.NET\Framework\v3.5\MSBuild.exe build.csproj %3 %4 %5 %6 /t:%BUILD_TARGET% /p:BuildConfiguration=%BUILD_CONFIG% /p:Platform="Any CPU" /p:BuildTools=3.5 /toolsversion:3.5" |
CMD.exe /Q /C "CD %~dp0 && %WINDIR%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe build.csproj /toolsversion:4.0 %3 %4 %5 %6 "/t:%BUILD_TARGET%" "/p:BuildConfiguration=%BUILD_CONFIG%;TargetVersion=3" |
||||||
|
@ -0,0 +1,8 @@ |
|||||||
|
@echo off |
||||||
|
SET BUILD_TARGET=%~1 |
||||||
|
SET BUILD_CONFIG=%~2 |
||||||
|
|
||||||
|
IF "%BUILD_TARGET%"=="" SET BUILD_TARGET=Rebuild |
||||||
|
IF "%BUILD_CONFIG%"=="" SET BUILD_CONFIG=Debug |
||||||
|
|
||||||
|
CMD.exe /Q /C "CD %~dp0 && %WINDIR%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe build.csproj /toolsversion:4.0 %3 %4 %5 %6 "/t:%BUILD_TARGET%" "/p:BuildConfiguration=%BUILD_CONFIG%;TargetVersion=4" |
@ -1,5 +1,10 @@ |
|||||||
<?xml version="1.0" encoding="Windows-1252"?> |
<?xml version="1.0" encoding="Windows-1252"?> |
||||||
<configuration> |
<configuration> |
||||||
|
|
||||||
|
<startup> |
||||||
|
<requiredRuntime version="v2.0.50727" /> |
||||||
|
</startup> |
||||||
|
|
||||||
<!-- |
<!-- |
||||||
Application settings for NUnit-console.exe. Do NOT put settings |
Application settings for NUnit-console.exe. Do NOT put settings |
||||||
for use by your tests here. |
for use by your tests here. |
@ -0,0 +1,102 @@ |
|||||||
|
<?xml version="1.0" encoding="Windows-1252"?> |
||||||
|
<configuration> |
||||||
|
|
||||||
|
<startup> |
||||||
|
<requiredRuntime version="v2.0.50727" /> |
||||||
|
</startup> |
||||||
|
|
||||||
|
<!-- |
||||||
|
Application settings for NUnit-console.exe. Do NOT put settings |
||||||
|
for use by your tests here. |
||||||
|
--> |
||||||
|
<appSettings> |
||||||
|
|
||||||
|
<!-- |
||||||
|
Specify the location to be used by .NET for the cache |
||||||
|
--> |
||||||
|
<add key="shadowfiles.path" value="%temp%\nunit20\ShadowCopyCache" /> |
||||||
|
|
||||||
|
</appSettings> |
||||||
|
|
||||||
|
<!-- |
||||||
|
The startup section may be used to specify the runtime versions |
||||||
|
supported in the order that they will be used if more than one |
||||||
|
is present. As supplied, this section is commented out, which |
||||||
|
causes nunit-console to use the version of the framework with |
||||||
|
which it was built. |
||||||
|
|
||||||
|
Since .NET 1.0 does not recognize the <supportedRuntime> elements, |
||||||
|
a <requiredRuntime> element is used in case it is the only version |
||||||
|
of the framework that is installed. |
||||||
|
--> |
||||||
|
<!-- |
||||||
|
<startup> |
||||||
|
<supportedRuntime version="v2.0.50727" /> |
||||||
|
<supportedRuntime version="v2.0.50215" /> |
||||||
|
<supportedRuntime version="v2.0.40607" /> |
||||||
|
<supportedRuntime version="v1.1.4322" /> |
||||||
|
<supportedRuntime version="v1.0.3705" /> |
||||||
|
|
||||||
|
<requiredRuntime version="v1.0.3705" /> |
||||||
|
</startup> |
||||||
|
--> |
||||||
|
|
||||||
|
<!-- |
||||||
|
The following <runtime> section allows running nunit under |
||||||
|
.NET 1.0 by redirecting assemblies. The appliesTo attribute |
||||||
|
causes the section to be ignored except under .NET 1.0version 1 |
||||||
|
on a machine with only the .NET version 1.0 runtime installed. |
||||||
|
If application and its tests were built for .NET 1.1 you will |
||||||
|
also need to redirect system assemblies in the test config file. |
||||||
|
--> |
||||||
|
|
||||||
|
<runtime> |
||||||
|
|
||||||
|
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1" |
||||||
|
appliesTo="v1.0.3705"> |
||||||
|
|
||||||
|
<dependentAssembly> |
||||||
|
<assemblyIdentity name="System" |
||||||
|
publicKeyToken="b77a5c561934e089" |
||||||
|
culture="neutral"/> |
||||||
|
<bindingRedirect oldVersion="1.0.5000.0" |
||||||
|
newVersion="1.0.3300.0"/> |
||||||
|
</dependentAssembly> |
||||||
|
|
||||||
|
<dependentAssembly> |
||||||
|
<assemblyIdentity name="System.Data" |
||||||
|
publicKeyToken="b77a5c561934e089" |
||||||
|
culture="neutral"/> |
||||||
|
<bindingRedirect oldVersion="1.0.5000.0" |
||||||
|
newVersion="1.0.3300.0"/> |
||||||
|
</dependentAssembly> |
||||||
|
|
||||||
|
<dependentAssembly> |
||||||
|
<assemblyIdentity name="System.Drawing" |
||||||
|
publicKeyToken="b03f5f7f11d50a3a" |
||||||
|
culture="neutral"/> |
||||||
|
<bindingRedirect oldVersion="1.0.5000.0" |
||||||
|
newVersion="1.0.3300.0"/> |
||||||
|
</dependentAssembly> |
||||||
|
|
||||||
|
<dependentAssembly> |
||||||
|
<assemblyIdentity name="System.Windows.Forms" |
||||||
|
publicKeyToken="b77a5c561934e089" |
||||||
|
culture="neutral"/> |
||||||
|
<bindingRedirect oldVersion="1.0.5000.0" |
||||||
|
newVersion="1.0.3300.0"/> |
||||||
|
</dependentAssembly> |
||||||
|
|
||||||
|
<dependentAssembly> |
||||||
|
<assemblyIdentity name="System.Xml" |
||||||
|
publicKeyToken="b77a5c561934e089" |
||||||
|
culture="neutral"/> |
||||||
|
<bindingRedirect oldVersion="1.0.5000.0" |
||||||
|
newVersion="1.0.3300.0"/> |
||||||
|
</dependentAssembly> |
||||||
|
|
||||||
|
</assemblyBinding> |
||||||
|
|
||||||
|
</runtime> |
||||||
|
|
||||||
|
</configuration> |
@ -0,0 +1,102 @@ |
|||||||
|
<?xml version="1.0" encoding="Windows-1252"?> |
||||||
|
<configuration> |
||||||
|
|
||||||
|
<startup useLegacyV2RuntimeActivationPolicy="true"> |
||||||
|
<requiredRuntime version="v4.0.30319" safemode="true"/> |
||||||
|
</startup> |
||||||
|
|
||||||
|
<!-- |
||||||
|
Application settings for NUnit-console.exe. Do NOT put settings |
||||||
|
for use by your tests here. |
||||||
|
--> |
||||||
|
<appSettings> |
||||||
|
|
||||||
|
<!-- |
||||||
|
Specify the location to be used by .NET for the cache |
||||||
|
--> |
||||||
|
<add key="shadowfiles.path" value="%temp%\nunit20\ShadowCopyCache" /> |
||||||
|
|
||||||
|
</appSettings> |
||||||
|
|
||||||
|
<!-- |
||||||
|
The startup section may be used to specify the runtime versions |
||||||
|
supported in the order that they will be used if more than one |
||||||
|
is present. As supplied, this section is commented out, which |
||||||
|
causes nunit-console to use the version of the framework with |
||||||
|
which it was built. |
||||||
|
|
||||||
|
Since .NET 1.0 does not recognize the <supportedRuntime> elements, |
||||||
|
a <requiredRuntime> element is used in case it is the only version |
||||||
|
of the framework that is installed. |
||||||
|
--> |
||||||
|
<!-- |
||||||
|
<startup> |
||||||
|
<supportedRuntime version="v2.0.50727" /> |
||||||
|
<supportedRuntime version="v2.0.50215" /> |
||||||
|
<supportedRuntime version="v2.0.40607" /> |
||||||
|
<supportedRuntime version="v1.1.4322" /> |
||||||
|
<supportedRuntime version="v1.0.3705" /> |
||||||
|
|
||||||
|
<requiredRuntime version="v1.0.3705" /> |
||||||
|
</startup> |
||||||
|
--> |
||||||
|
|
||||||
|
<!-- |
||||||
|
The following <runtime> section allows running nunit under |
||||||
|
.NET 1.0 by redirecting assemblies. The appliesTo attribute |
||||||
|
causes the section to be ignored except under .NET 1.0version 1 |
||||||
|
on a machine with only the .NET version 1.0 runtime installed. |
||||||
|
If application and its tests were built for .NET 1.1 you will |
||||||
|
also need to redirect system assemblies in the test config file. |
||||||
|
--> |
||||||
|
|
||||||
|
<runtime> |
||||||
|
|
||||||
|
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1" |
||||||
|
appliesTo="v1.0.3705"> |
||||||
|
|
||||||
|
<dependentAssembly> |
||||||
|
<assemblyIdentity name="System" |
||||||
|
publicKeyToken="b77a5c561934e089" |
||||||
|
culture="neutral"/> |
||||||
|
<bindingRedirect oldVersion="1.0.5000.0" |
||||||
|
newVersion="1.0.3300.0"/> |
||||||
|
</dependentAssembly> |
||||||
|
|
||||||
|
<dependentAssembly> |
||||||
|
<assemblyIdentity name="System.Data" |
||||||
|
publicKeyToken="b77a5c561934e089" |
||||||
|
culture="neutral"/> |
||||||
|
<bindingRedirect oldVersion="1.0.5000.0" |
||||||
|
newVersion="1.0.3300.0"/> |
||||||
|
</dependentAssembly> |
||||||
|
|
||||||
|
<dependentAssembly> |
||||||
|
<assemblyIdentity name="System.Drawing" |
||||||
|
publicKeyToken="b03f5f7f11d50a3a" |
||||||
|
culture="neutral"/> |
||||||
|
<bindingRedirect oldVersion="1.0.5000.0" |
||||||
|
newVersion="1.0.3300.0"/> |
||||||
|
</dependentAssembly> |
||||||
|
|
||||||
|
<dependentAssembly> |
||||||
|
<assemblyIdentity name="System.Windows.Forms" |
||||||
|
publicKeyToken="b77a5c561934e089" |
||||||
|
culture="neutral"/> |
||||||
|
<bindingRedirect oldVersion="1.0.5000.0" |
||||||
|
newVersion="1.0.3300.0"/> |
||||||
|
</dependentAssembly> |
||||||
|
|
||||||
|
<dependentAssembly> |
||||||
|
<assemblyIdentity name="System.Xml" |
||||||
|
publicKeyToken="b77a5c561934e089" |
||||||
|
culture="neutral"/> |
||||||
|
<bindingRedirect oldVersion="1.0.5000.0" |
||||||
|
newVersion="1.0.3300.0"/> |
||||||
|
</dependentAssembly> |
||||||
|
|
||||||
|
</assemblyBinding> |
||||||
|
|
||||||
|
</runtime> |
||||||
|
|
||||||
|
</configuration> |
@ -1,386 +0,0 @@ |
|||||||
#region Copyright notice and license |
|
||||||
|
|
||||||
// Protocol Buffers - Google's data interchange format |
|
||||||
// Copyright 2008 Google Inc. All rights reserved. |
|
||||||
// http://github.com/jskeet/dotnet-protobufs/ |
|
||||||
// Original C++/Java/Python code: |
|
||||||
// http://code.google.com/p/protobuf/ |
|
||||||
// |
|
||||||
// Redistribution and use in source and binary forms, with or without |
|
||||||
// modification, are permitted provided that the following conditions are |
|
||||||
// met: |
|
||||||
// |
|
||||||
// * Redistributions of source code must retain the above copyright |
|
||||||
// notice, this list of conditions and the following disclaimer. |
|
||||||
// * Redistributions in binary form must reproduce the above |
|
||||||
// copyright notice, this list of conditions and the following disclaimer |
|
||||||
// in the documentation and/or other materials provided with the |
|
||||||
// distribution. |
|
||||||
// * Neither the name of Google Inc. nor the names of its |
|
||||||
// contributors may be used to endorse or promote products derived from |
|
||||||
// this software without specific prior written permission. |
|
||||||
// |
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|
||||||
|
|
||||||
#endregion |
|
||||||
|
|
||||||
using System; |
|
||||||
using Google.ProtocolBuffers; |
|
||||||
using Google.ProtocolBuffers.Serialization.Http; |
|
||||||
using Google.ProtocolBuffers.TestProtos; |
|
||||||
using NUnit.Framework; |
|
||||||
using System.IO; |
|
||||||
using Google.ProtocolBuffers.Serialization; |
|
||||||
using System.Text; |
|
||||||
|
|
||||||
namespace Google.ProtocolBuffers |
|
||||||
{ |
|
||||||
/// <summary> |
|
||||||
/// This class verifies the correct code is generated from unittest_rpc_interop.proto and provides a small demonstration |
|
||||||
/// of using the new IRpcDispatch to write a client/server |
|
||||||
/// </summary> |
|
||||||
[TestFixture] |
|
||||||
public class TestRpcForMimeTypes |
|
||||||
{ |
|
||||||
/// <summary> |
|
||||||
/// A sample implementation of the ISearchService for testing |
|
||||||
/// </summary> |
|
||||||
private class ExampleSearchImpl : ISearchService |
|
||||||
{ |
|
||||||
SearchResponse ISearchService.Search(SearchRequest searchRequest) |
|
||||||
{ |
|
||||||
if (searchRequest.CriteriaCount == 0) |
|
||||||
{ |
|
||||||
throw new ArgumentException("No criteria specified.", new InvalidOperationException()); |
|
||||||
} |
|
||||||
SearchResponse.Builder resp = SearchResponse.CreateBuilder(); |
|
||||||
foreach (string criteria in searchRequest.CriteriaList) |
|
||||||
{ |
|
||||||
resp.AddResults( |
|
||||||
SearchResponse.Types.ResultItem.CreateBuilder().SetName(criteria).SetUrl("http://search.com"). |
|
||||||
Build()); |
|
||||||
} |
|
||||||
return resp.Build(); |
|
||||||
} |
|
||||||
|
|
||||||
SearchResponse ISearchService.RefineSearch(RefineSearchRequest refineSearchRequest) |
|
||||||
{ |
|
||||||
SearchResponse.Builder resp = refineSearchRequest.PreviousResults.ToBuilder(); |
|
||||||
foreach (string criteria in refineSearchRequest.CriteriaList) |
|
||||||
{ |
|
||||||
resp.AddResults( |
|
||||||
SearchResponse.Types.ResultItem.CreateBuilder().SetName(criteria).SetUrl("http://refine.com"). |
|
||||||
Build()); |
|
||||||
} |
|
||||||
return resp.Build(); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
/// <summary> |
|
||||||
/// An example extraction of the wire protocol |
|
||||||
/// </summary> |
|
||||||
private interface IHttpTransfer |
|
||||||
{ |
|
||||||
void Execute(string method, string contentType, Stream input, string acceptType, Stream output); |
|
||||||
} |
|
||||||
|
|
||||||
/// <summary> |
|
||||||
/// An example of a server responding to a web/http request |
|
||||||
/// </summary> |
|
||||||
private class ExampleHttpServer : IHttpTransfer |
|
||||||
{ |
|
||||||
public readonly MessageFormatOptions Options = |
|
||||||
new MessageFormatOptions |
|
||||||
{ |
|
||||||
ExtensionRegistry = ExtensionRegistry.Empty, |
|
||||||
FormattedOutput = true, |
|
||||||
XmlReaderOptions = XmlReaderOptions.ReadNestedArrays, |
|
||||||
XmlReaderRootElementName = "request", |
|
||||||
XmlWriterOptions = XmlWriterOptions.OutputNestedArrays, |
|
||||||
XmlWriterRootElementName = "response" |
|
||||||
}; |
|
||||||
|
|
||||||
private readonly IRpcServerStub _stub; |
|
||||||
|
|
||||||
public ExampleHttpServer(ISearchService implementation) |
|
||||||
{ |
|
||||||
//on the server, we create a dispatch to call the appropriate method by name |
|
||||||
IRpcDispatch dispatch = new SearchService.Dispatch(implementation); |
|
||||||
//we then wrap that dispatch in a server stub which will deserialize the wire bytes to the message |
|
||||||
//type appropriate for the method name being invoked. |
|
||||||
_stub = new SearchService.ServerStub(dispatch); |
|
||||||
} |
|
||||||
|
|
||||||
void IHttpTransfer.Execute(string method, string contentType, Stream input, string acceptType, Stream output) |
|
||||||
{ |
|
||||||
//Extension for: Google.ProtocolBuffers.Serialization.Http.ServiceExtensions.HttpCallMethod(_stub, |
|
||||||
_stub.HttpCallMethod( |
|
||||||
method, Options, |
|
||||||
contentType, input, |
|
||||||
acceptType, output |
|
||||||
); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
/// <summary> |
|
||||||
/// An example of a client sending a wire request |
|
||||||
/// </summary> |
|
||||||
private class ExampleClient : IRpcDispatch |
|
||||||
{ |
|
||||||
public readonly MessageFormatOptions Options = |
|
||||||
new MessageFormatOptions |
|
||||||
{ |
|
||||||
ExtensionRegistry = ExtensionRegistry.Empty, |
|
||||||
FormattedOutput = true, |
|
||||||
XmlReaderOptions = XmlReaderOptions.ReadNestedArrays, |
|
||||||
XmlReaderRootElementName = "response", |
|
||||||
XmlWriterOptions = XmlWriterOptions.OutputNestedArrays, |
|
||||||
XmlWriterRootElementName = "request" |
|
||||||
}; |
|
||||||
|
|
||||||
|
|
||||||
private readonly IHttpTransfer _wire; |
|
||||||
private readonly string _mimeType; |
|
||||||
|
|
||||||
public ExampleClient(IHttpTransfer wire, string mimeType) |
|
||||||
{ |
|
||||||
_wire = wire; |
|
||||||
_mimeType = mimeType; |
|
||||||
} |
|
||||||
|
|
||||||
TMessage IRpcDispatch.CallMethod<TMessage, TBuilder>(string method, IMessageLite request, |
|
||||||
IBuilderLite<TMessage, TBuilder> response) |
|
||||||
{ |
|
||||||
MemoryStream input = new MemoryStream(); |
|
||||||
MemoryStream output = new MemoryStream(); |
|
||||||
|
|
||||||
//Write to _mimeType format |
|
||||||
request.WriteTo(Options, _mimeType, input); |
|
||||||
|
|
||||||
input.Position = 0; |
|
||||||
_wire.Execute(method, _mimeType, input, _mimeType, output); |
|
||||||
|
|
||||||
//Read from _mimeType format |
|
||||||
output.Position = 0; |
|
||||||
response.MergeFrom(Options, _mimeType, output); |
|
||||||
|
|
||||||
return response.Build(); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
/// <summary> |
|
||||||
/// Test sending and recieving messages via text/json |
|
||||||
/// </summary> |
|
||||||
[Test] |
|
||||||
public void TestClientServerWithJsonFormat() |
|
||||||
{ |
|
||||||
ExampleHttpServer server = new ExampleHttpServer(new ExampleSearchImpl()); |
|
||||||
//obviously if this was a 'real' transport we would not use the server, rather the server would be listening, the client transmitting |
|
||||||
IHttpTransfer wire = server; |
|
||||||
|
|
||||||
ISearchService client = new SearchService(new ExampleClient(wire, "text/json")); |
|
||||||
//now the client has a real, typed, interface to work with: |
|
||||||
SearchResponse result = client.Search(SearchRequest.CreateBuilder().AddCriteria("Test").Build()); |
|
||||||
Assert.AreEqual(1, result.ResultsCount); |
|
||||||
Assert.AreEqual("Test", result.ResultsList[0].Name); |
|
||||||
Assert.AreEqual("http://search.com", result.ResultsList[0].Url); |
|
||||||
|
|
||||||
//The test part of this, call the only other method |
|
||||||
result = |
|
||||||
client.RefineSearch( |
|
||||||
RefineSearchRequest.CreateBuilder().SetPreviousResults(result).AddCriteria("Refine").Build()); |
|
||||||
Assert.AreEqual(2, result.ResultsCount); |
|
||||||
Assert.AreEqual("Test", result.ResultsList[0].Name); |
|
||||||
Assert.AreEqual("http://search.com", result.ResultsList[0].Url); |
|
||||||
|
|
||||||
Assert.AreEqual("Refine", result.ResultsList[1].Name); |
|
||||||
Assert.AreEqual("http://refine.com", result.ResultsList[1].Url); |
|
||||||
} |
|
||||||
|
|
||||||
/// <summary> |
|
||||||
/// Test sending and recieving messages via text/json |
|
||||||
/// </summary> |
|
||||||
[Test] |
|
||||||
public void TestClientServerWithXmlFormat() |
|
||||||
{ |
|
||||||
ExampleHttpServer server = new ExampleHttpServer(new ExampleSearchImpl()); |
|
||||||
//obviously if this was a 'real' transport we would not use the server, rather the server would be listening, the client transmitting |
|
||||||
IHttpTransfer wire = server; |
|
||||||
|
|
||||||
ISearchService client = new SearchService(new ExampleClient(wire, "text/xml")); |
|
||||||
//now the client has a real, typed, interface to work with: |
|
||||||
SearchResponse result = client.Search(SearchRequest.CreateBuilder().AddCriteria("Test").Build()); |
|
||||||
Assert.AreEqual(1, result.ResultsCount); |
|
||||||
Assert.AreEqual("Test", result.ResultsList[0].Name); |
|
||||||
Assert.AreEqual("http://search.com", result.ResultsList[0].Url); |
|
||||||
|
|
||||||
//The test part of this, call the only other method |
|
||||||
result = |
|
||||||
client.RefineSearch( |
|
||||||
RefineSearchRequest.CreateBuilder().SetPreviousResults(result).AddCriteria("Refine").Build()); |
|
||||||
Assert.AreEqual(2, result.ResultsCount); |
|
||||||
Assert.AreEqual("Test", result.ResultsList[0].Name); |
|
||||||
Assert.AreEqual("http://search.com", result.ResultsList[0].Url); |
|
||||||
|
|
||||||
Assert.AreEqual("Refine", result.ResultsList[1].Name); |
|
||||||
Assert.AreEqual("http://refine.com", result.ResultsList[1].Url); |
|
||||||
} |
|
||||||
|
|
||||||
/// <summary> |
|
||||||
/// Test sending and recieving messages via text/json |
|
||||||
/// </summary> |
|
||||||
[Test] |
|
||||||
public void TestClientServerWithProtoFormat() |
|
||||||
{ |
|
||||||
ExampleHttpServer server = new ExampleHttpServer(new ExampleSearchImpl()); |
|
||||||
//obviously if this was a 'real' transport we would not use the server, rather the server would be listening, the client transmitting |
|
||||||
IHttpTransfer wire = server; |
|
||||||
|
|
||||||
ISearchService client = new SearchService(new ExampleClient(wire, "application/x-protobuf")); |
|
||||||
//now the client has a real, typed, interface to work with: |
|
||||||
SearchResponse result = client.Search(SearchRequest.CreateBuilder().AddCriteria("Test").Build()); |
|
||||||
Assert.AreEqual(1, result.ResultsCount); |
|
||||||
Assert.AreEqual("Test", result.ResultsList[0].Name); |
|
||||||
Assert.AreEqual("http://search.com", result.ResultsList[0].Url); |
|
||||||
|
|
||||||
//The test part of this, call the only other method |
|
||||||
result = |
|
||||||
client.RefineSearch( |
|
||||||
RefineSearchRequest.CreateBuilder().SetPreviousResults(result).AddCriteria("Refine").Build()); |
|
||||||
Assert.AreEqual(2, result.ResultsCount); |
|
||||||
Assert.AreEqual("Test", result.ResultsList[0].Name); |
|
||||||
Assert.AreEqual("http://search.com", result.ResultsList[0].Url); |
|
||||||
|
|
||||||
Assert.AreEqual("Refine", result.ResultsList[1].Name); |
|
||||||
Assert.AreEqual("http://refine.com", result.ResultsList[1].Url); |
|
||||||
} |
|
||||||
|
|
||||||
/// <summary> |
|
||||||
/// Test sending and recieving messages via text/json |
|
||||||
/// </summary> |
|
||||||
[Test] |
|
||||||
public void TestClientServerWithCustomFormat() |
|
||||||
{ |
|
||||||
ExampleHttpServer server = new ExampleHttpServer(new ExampleSearchImpl()); |
|
||||||
//Setup our custom mime-type format as the only format supported: |
|
||||||
server.Options.MimeInputTypes.Clear(); |
|
||||||
server.Options.MimeInputTypes.Add("foo/bar", CodedInputStream.CreateInstance); |
|
||||||
server.Options.MimeOutputTypes.Clear(); |
|
||||||
server.Options.MimeOutputTypes.Add("foo/bar", CodedOutputStream.CreateInstance); |
|
||||||
|
|
||||||
//obviously if this was a 'real' transport we would not use the server, rather the server would be listening, the client transmitting |
|
||||||
IHttpTransfer wire = server; |
|
||||||
|
|
||||||
ExampleClient exclient = new ExampleClient(wire, "foo/bar"); |
|
||||||
//Add our custom mime-type format |
|
||||||
exclient.Options.MimeInputTypes.Add("foo/bar", CodedInputStream.CreateInstance); |
|
||||||
exclient.Options.MimeOutputTypes.Add("foo/bar", CodedOutputStream.CreateInstance); |
|
||||||
ISearchService client = new SearchService(exclient); |
|
||||||
|
|
||||||
//now the client has a real, typed, interface to work with: |
|
||||||
SearchResponse result = client.Search(SearchRequest.CreateBuilder().AddCriteria("Test").Build()); |
|
||||||
Assert.AreEqual(1, result.ResultsCount); |
|
||||||
Assert.AreEqual("Test", result.ResultsList[0].Name); |
|
||||||
Assert.AreEqual("http://search.com", result.ResultsList[0].Url); |
|
||||||
|
|
||||||
//The test part of this, call the only other method |
|
||||||
result = |
|
||||||
client.RefineSearch( |
|
||||||
RefineSearchRequest.CreateBuilder().SetPreviousResults(result).AddCriteria("Refine").Build()); |
|
||||||
Assert.AreEqual(2, result.ResultsCount); |
|
||||||
Assert.AreEqual("Test", result.ResultsList[0].Name); |
|
||||||
Assert.AreEqual("http://search.com", result.ResultsList[0].Url); |
|
||||||
|
|
||||||
Assert.AreEqual("Refine", result.ResultsList[1].Name); |
|
||||||
Assert.AreEqual("http://refine.com", result.ResultsList[1].Url); |
|
||||||
} |
|
||||||
|
|
||||||
/// <summary> |
|
||||||
/// Test sending and recieving messages via text/json |
|
||||||
/// </summary> |
|
||||||
[Test] |
|
||||||
public void TestServerWithUriFormat() |
|
||||||
{ |
|
||||||
ExampleHttpServer server = new ExampleHttpServer(new ExampleSearchImpl()); |
|
||||||
//obviously if this was a 'real' transport we would not use the server, rather the server would be listening, the client transmitting |
|
||||||
IHttpTransfer wire = server; |
|
||||||
|
|
||||||
MemoryStream input = new MemoryStream(Encoding.UTF8.GetBytes("?Criteria=Test&Criteria=Test+of%20URI")); |
|
||||||
MemoryStream output = new MemoryStream(); |
|
||||||
|
|
||||||
//Call the server |
|
||||||
wire.Execute("Search", |
|
||||||
MessageFormatOptions.ContentFormUrlEncoded, input, |
|
||||||
MessageFormatOptions.ContentTypeProtoBuffer, output |
|
||||||
); |
|
||||||
|
|
||||||
SearchResponse result = SearchResponse.ParseFrom(output.ToArray()); |
|
||||||
Assert.AreEqual(2, result.ResultsCount); |
|
||||||
Assert.AreEqual("Test", result.ResultsList[0].Name); |
|
||||||
Assert.AreEqual("http://search.com", result.ResultsList[0].Url); |
|
||||||
|
|
||||||
Assert.AreEqual("Test of URI", result.ResultsList[1].Name); |
|
||||||
Assert.AreEqual("http://search.com", result.ResultsList[1].Url); |
|
||||||
} |
|
||||||
|
|
||||||
/// <summary> |
|
||||||
/// Test sending and recieving messages via text/json |
|
||||||
/// </summary> |
|
||||||
[Test, ExpectedException(typeof(ArgumentOutOfRangeException))] |
|
||||||
public void TestInvalidMimeType() |
|
||||||
{ |
|
||||||
ExampleHttpServer server = new ExampleHttpServer(new ExampleSearchImpl()); |
|
||||||
//obviously if this was a 'real' transport we would not use the server, rather the server would be listening, the client transmitting |
|
||||||
IHttpTransfer wire = server; |
|
||||||
|
|
||||||
MemoryStream input = new MemoryStream(); |
|
||||||
MemoryStream output = new MemoryStream(); |
|
||||||
|
|
||||||
//Call the server |
|
||||||
wire.Execute("Search", |
|
||||||
"bad/mime", input, |
|
||||||
MessageFormatOptions.ContentTypeProtoBuffer, output |
|
||||||
); |
|
||||||
Assert.Fail(); |
|
||||||
} |
|
||||||
|
|
||||||
/// <summary> |
|
||||||
/// Test sending and recieving messages via text/json |
|
||||||
/// </summary> |
|
||||||
[Test] |
|
||||||
public void TestDefaultMimeType() |
|
||||||
{ |
|
||||||
ExampleHttpServer server = new ExampleHttpServer(new ExampleSearchImpl()); |
|
||||||
|
|
||||||
//obviously if this was a 'real' transport we would not use the server, rather the server would be listening, the client transmitting |
|
||||||
IHttpTransfer wire = server; |
|
||||||
|
|
||||||
|
|
||||||
MemoryStream input = new MemoryStream(new SearchRequest.Builder().AddCriteria("Test").Build().ToByteArray()); |
|
||||||
MemoryStream output = new MemoryStream(); |
|
||||||
|
|
||||||
//With this default set, any invalid/unknown mime-type will be mapped to use that format |
|
||||||
server.Options.DefaultContentType = MessageFormatOptions.ContentTypeProtoBuffer; |
|
||||||
|
|
||||||
wire.Execute("Search", |
|
||||||
"foo", input, |
|
||||||
"bar", output |
|
||||||
); |
|
||||||
|
|
||||||
SearchResponse result = SearchResponse.ParseFrom(output.ToArray()); |
|
||||||
Assert.AreEqual(1, result.ResultsCount); |
|
||||||
Assert.AreEqual("Test", result.ResultsList[0].Name); |
|
||||||
Assert.AreEqual("http://search.com", result.ResultsList[0].Url); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
@ -1,171 +0,0 @@ |
|||||||
#region Copyright notice and license |
|
||||||
|
|
||||||
// Protocol Buffers - Google's data interchange format |
|
||||||
// Copyright 2008 Google Inc. All rights reserved. |
|
||||||
// http://github.com/jskeet/dotnet-protobufs/ |
|
||||||
// Original C++/Java/Python code: |
|
||||||
// http://code.google.com/p/protobuf/ |
|
||||||
// |
|
||||||
// Redistribution and use in source and binary forms, with or without |
|
||||||
// modification, are permitted provided that the following conditions are |
|
||||||
// met: |
|
||||||
// |
|
||||||
// * Redistributions of source code must retain the above copyright |
|
||||||
// notice, this list of conditions and the following disclaimer. |
|
||||||
// * Redistributions in binary form must reproduce the above |
|
||||||
// copyright notice, this list of conditions and the following disclaimer |
|
||||||
// in the documentation and/or other materials provided with the |
|
||||||
// distribution. |
|
||||||
// * Neither the name of Google Inc. nor the names of its |
|
||||||
// contributors may be used to endorse or promote products derived from |
|
||||||
// this software without specific prior written permission. |
|
||||||
// |
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|
||||||
|
|
||||||
#endregion |
|
||||||
|
|
||||||
using System; |
|
||||||
using Google.ProtocolBuffers; |
|
||||||
using Google.ProtocolBuffers.TestProtos; |
|
||||||
using NUnit.Framework; |
|
||||||
|
|
||||||
namespace Google.ProtocolBuffers |
|
||||||
{ |
|
||||||
/// <summary> |
|
||||||
/// This class verifies the correct code is generated from unittest_rpc_interop.proto and provides a small demonstration |
|
||||||
/// of using the new IRpcDispatch to write a client/server |
|
||||||
/// </summary> |
|
||||||
[TestFixture] |
|
||||||
public class TestRpcGenerator |
|
||||||
{ |
|
||||||
/// <summary> |
|
||||||
/// A sample implementation of the ISearchService for testing |
|
||||||
/// </summary> |
|
||||||
private class ExampleSearchImpl : ISearchService |
|
||||||
{ |
|
||||||
SearchResponse ISearchService.Search(SearchRequest searchRequest) |
|
||||||
{ |
|
||||||
if (searchRequest.CriteriaCount == 0) |
|
||||||
{ |
|
||||||
throw new ArgumentException("No criteria specified.", new InvalidOperationException()); |
|
||||||
} |
|
||||||
SearchResponse.Builder resp = SearchResponse.CreateBuilder(); |
|
||||||
foreach (string criteria in searchRequest.CriteriaList) |
|
||||||
{ |
|
||||||
resp.AddResults( |
|
||||||
SearchResponse.Types.ResultItem.CreateBuilder().SetName(criteria).SetUrl("http://search.com"). |
|
||||||
Build()); |
|
||||||
} |
|
||||||
return resp.Build(); |
|
||||||
} |
|
||||||
|
|
||||||
SearchResponse ISearchService.RefineSearch(RefineSearchRequest refineSearchRequest) |
|
||||||
{ |
|
||||||
SearchResponse.Builder resp = refineSearchRequest.PreviousResults.ToBuilder(); |
|
||||||
foreach (string criteria in refineSearchRequest.CriteriaList) |
|
||||||
{ |
|
||||||
resp.AddResults( |
|
||||||
SearchResponse.Types.ResultItem.CreateBuilder().SetName(criteria).SetUrl("http://refine.com"). |
|
||||||
Build()); |
|
||||||
} |
|
||||||
return resp.Build(); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
/// <summary> |
|
||||||
/// An example extraction of the wire protocol |
|
||||||
/// </summary> |
|
||||||
private interface IWireTransfer |
|
||||||
{ |
|
||||||
byte[] Execute(string method, byte[] message); |
|
||||||
} |
|
||||||
|
|
||||||
/// <summary> |
|
||||||
/// An example of a server responding to a wire request |
|
||||||
/// </summary> |
|
||||||
private class ExampleServerHost : IWireTransfer |
|
||||||
{ |
|
||||||
private readonly IRpcServerStub _stub; |
|
||||||
|
|
||||||
public ExampleServerHost(ISearchService implementation) |
|
||||||
{ |
|
||||||
//on the server, we create a dispatch to call the appropriate method by name |
|
||||||
IRpcDispatch dispatch = new SearchService.Dispatch(implementation); |
|
||||||
//we then wrap that dispatch in a server stub which will deserialize the wire bytes to the message |
|
||||||
//type appropriate for the method name being invoked. |
|
||||||
_stub = new SearchService.ServerStub(dispatch); |
|
||||||
} |
|
||||||
|
|
||||||
byte[] IWireTransfer.Execute(string method, byte[] message) |
|
||||||
{ |
|
||||||
//now when we recieve a wire transmission to invoke a method by name with a byte[] or stream payload |
|
||||||
//we just simply call the sub: |
|
||||||
IMessageLite response = _stub.CallMethod(method, CodedInputStream.CreateInstance(message), |
|
||||||
ExtensionRegistry.Empty); |
|
||||||
//now we return the expected response message: |
|
||||||
return response.ToByteArray(); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
/// <summary> |
|
||||||
/// An example of a client sending a wire request |
|
||||||
/// </summary> |
|
||||||
private class ExampleClient : IRpcDispatch |
|
||||||
{ |
|
||||||
private readonly IWireTransfer _wire; |
|
||||||
|
|
||||||
public ExampleClient(IWireTransfer wire) |
|
||||||
{ |
|
||||||
_wire = wire; |
|
||||||
} |
|
||||||
|
|
||||||
TMessage IRpcDispatch.CallMethod<TMessage, TBuilder>(string method, IMessageLite request, |
|
||||||
IBuilderLite<TMessage, TBuilder> response) |
|
||||||
{ |
|
||||||
byte[] rawResponse = _wire.Execute(method, request.ToByteArray()); |
|
||||||
response.MergeFrom(rawResponse); |
|
||||||
return response.Build(); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
/// <summary> |
|
||||||
/// Put it all together to create one seamless client/server experience full of rich-type goodness ;) |
|
||||||
/// All you need to do is send/recieve the method name and message bytes across the wire. |
|
||||||
/// </summary> |
|
||||||
[Test] |
|
||||||
public void TestClientServerDispatch() |
|
||||||
{ |
|
||||||
ExampleServerHost server = new ExampleServerHost(new ExampleSearchImpl()); |
|
||||||
//obviously if this was a 'real' transport we would not use the server, rather the server would be listening, the client transmitting |
|
||||||
IWireTransfer wire = server; |
|
||||||
|
|
||||||
ISearchService client = new SearchService(new ExampleClient(wire)); |
|
||||||
//now the client has a real, typed, interface to work with: |
|
||||||
SearchResponse result = client.Search(SearchRequest.CreateBuilder().AddCriteria("Test").Build()); |
|
||||||
Assert.AreEqual(1, result.ResultsCount); |
|
||||||
Assert.AreEqual("Test", result.ResultsList[0].Name); |
|
||||||
Assert.AreEqual("http://search.com", result.ResultsList[0].Url); |
|
||||||
|
|
||||||
//The test part of this, call the only other method |
|
||||||
result = |
|
||||||
client.RefineSearch( |
|
||||||
RefineSearchRequest.CreateBuilder().SetPreviousResults(result).AddCriteria("Refine").Build()); |
|
||||||
Assert.AreEqual(2, result.ResultsCount); |
|
||||||
Assert.AreEqual("Test", result.ResultsList[0].Name); |
|
||||||
Assert.AreEqual("http://search.com", result.ResultsList[0].Url); |
|
||||||
|
|
||||||
Assert.AreEqual("Refine", result.ResultsList[1].Name); |
|
||||||
Assert.AreEqual("http://refine.com", result.ResultsList[1].Url); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
Loading…
Reference in new issue