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 |
||||
|
||||
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= |
||||
@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 |
||||
|
@ -1,5 +1,2 @@ |
||||
@echo off |
||||
|
||||
%WINDIR%\Microsoft.NET\Framework\v4.0.30319\msbuild build.csproj /m /t:Build /p:BuildConfiguration=Debug_Silverlight2 /p:Platform="Any CPU" |
||||
|
||||
pause |
||||
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" |
||||
|
@ -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 |
||||
|
||||
%WINDIR%\Microsoft.NET\Framework\v4.0.30319\msbuild %~dp0\build.csproj /m /t:RunBenchmarks /p:BuildConfiguration=Release /p:Platform="Any CPU" |
||||
|
||||
pause |
||||
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" |
||||
|
@ -1,8 +1,8 @@ |
||||
@echo off |
||||
SET BUILD_TARGET=%1 |
||||
SET BUILD_CONFIG=%2 |
||||
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\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"?> |
||||
<configuration> |
||||
|
||||
<startup> |
||||
<requiredRuntime version="v2.0.50727" /> |
||||
</startup> |
||||
|
||||
<!-- |
||||
Application settings for NUnit-console.exe. Do NOT put settings |
||||
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