mirror of
https://github.com/valitydev/thrift.git
synced 2024-11-07 10:48:51 +00:00
17c3ad9c8a
Client: Delphi Patch: Jens Geyer This closes #1348
229 lines
6.6 KiB
ObjectPascal
229 lines
6.6 KiB
ObjectPascal
(*
|
|
* Licensed to the Apache Software Foundation (ASF) under one
|
|
* or more contributor license agreements. See the NOTICE file
|
|
* distributed with this work for additional information
|
|
* regarding copyright ownership. The ASF licenses this file
|
|
* to you under the Apache License, Version 2.0 (the
|
|
* "License"); you may not use this file except in compliance
|
|
* with the License. You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing,
|
|
* software distributed under the License is distributed on an
|
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
* KIND, either express or implied. See the License for the
|
|
* specific language governing permissions and limitations
|
|
* under the License.
|
|
*)
|
|
|
|
program skiptest_version2;
|
|
|
|
{$APPTYPE CONSOLE}
|
|
|
|
uses
|
|
Classes, Windows, SysUtils,
|
|
Skiptest.Two,
|
|
Thrift in '..\..\src\Thrift.pas',
|
|
Thrift.Socket in '..\..\src\Thrift.Socket.pas',
|
|
Thrift.Transport in '..\..\src\Thrift.Transport.pas',
|
|
Thrift.Protocol in '..\..\src\Thrift.Protocol.pas',
|
|
Thrift.Protocol.JSON in '..\..\src\Thrift.Protocol.JSON.pas',
|
|
Thrift.Collections in '..\..\src\Thrift.Collections.pas',
|
|
Thrift.Server in '..\..\src\Thrift.Server.pas',
|
|
Thrift.Console in '..\..\src\Thrift.Console.pas',
|
|
Thrift.Utils in '..\..\src\Thrift.Utils.pas',
|
|
Thrift.TypeRegistry in '..\..\src\Thrift.TypeRegistry.pas',
|
|
Thrift.Stream in '..\..\src\Thrift.Stream.pas';
|
|
|
|
const
|
|
REQUEST_EXT = '.request';
|
|
RESPONSE_EXT = '.response';
|
|
|
|
function CreatePing : IPing;
|
|
var list : IThriftList<IPong>;
|
|
set_ : IHashSet<string>;
|
|
begin
|
|
result := TPingImpl.Create;
|
|
result.Version1 := Tskiptest_version_2Constants.SKIPTESTSERVICE_VERSION;
|
|
result.BoolVal := TRUE;
|
|
result.ByteVal := 2;
|
|
result.DbVal := 3;
|
|
result.I16Val := 4;
|
|
result.I32Val := 5;
|
|
result.I64Val := 6;
|
|
result.StrVal := 'seven';
|
|
|
|
result.StructVal := TPongImpl.Create;
|
|
result.StructVal.Version1 := -1;
|
|
result.StructVal.Version2 := -2;
|
|
|
|
list := TThriftListImpl<IPong>.Create;
|
|
list.Add( result.StructVal);
|
|
list.Add( result.StructVal);
|
|
|
|
set_ := THashSetImpl<string>.Create;
|
|
set_.Add( 'one');
|
|
set_.Add( 'uno');
|
|
set_.Add( 'eins');
|
|
set_.Add( 'een');
|
|
|
|
result.MapVal := TThriftDictionaryImpl< IThriftList<IPong>, IHashSet<string>>.Create;
|
|
result.MapVal.Add( list, set_);
|
|
end;
|
|
|
|
|
|
type
|
|
TDummyServer = class( TInterfacedObject, TSkipTestService.Iface)
|
|
protected
|
|
// TSkipTestService.Iface
|
|
function PingPong(const ping: IPing; const pong: IPong): IPing;
|
|
end;
|
|
|
|
|
|
function TDummyServer.PingPong(const ping: IPing; const pong: IPong): IPing;
|
|
// TSkipTestService.Iface
|
|
begin
|
|
Writeln('- performing request from version '+IntToStr(ping.Version1)+' client');
|
|
result := CreatePing;
|
|
end;
|
|
|
|
|
|
function CreateProtocol( protfact : IProtocolFactory; stm : TStream; aForInput : Boolean) : IProtocol;
|
|
var adapt : IThriftStream;
|
|
trans : ITransport;
|
|
begin
|
|
adapt := TThriftStreamAdapterDelphi.Create( stm, FALSE);
|
|
if aForInput
|
|
then trans := TStreamTransportImpl.Create( adapt, nil)
|
|
else trans := TStreamTransportImpl.Create( nil, adapt);
|
|
result := protfact.GetProtocol( trans);
|
|
end;
|
|
|
|
|
|
procedure CreateRequest( protfact : IProtocolFactory; fname : string);
|
|
var stm : TFileStream;
|
|
ping : IPing;
|
|
proto : IProtocol;
|
|
client : TSkipTestService.TClient; // we need access to send/recv_pingpong()
|
|
cliRef : IUnknown; // holds the refcount
|
|
begin
|
|
Writeln('- creating new request');
|
|
stm := TFileStream.Create( fname+REQUEST_EXT+'.tmp', fmCreate);
|
|
try
|
|
ping := CreatePing;
|
|
|
|
// save request data
|
|
proto := CreateProtocol( protfact, stm, FALSE);
|
|
client := TSkipTestService.TClient.Create( nil, proto);
|
|
cliRef := client as IUnknown;
|
|
client.send_PingPong( ping, ping.StructVal);
|
|
|
|
finally
|
|
client := nil; // not Free!
|
|
cliRef := nil;
|
|
stm.Free;
|
|
if client = nil then {warning suppressed};
|
|
end;
|
|
|
|
DeleteFile( fname+REQUEST_EXT);
|
|
RenameFile( fname+REQUEST_EXT+'.tmp', fname+REQUEST_EXT);
|
|
end;
|
|
|
|
|
|
procedure ReadResponse( protfact : IProtocolFactory; fname : string);
|
|
var stm : TFileStream;
|
|
ping : IPing;
|
|
proto : IProtocol;
|
|
client : TSkipTestService.TClient; // we need access to send/recv_pingpong()
|
|
cliRef : IUnknown; // holds the refcount
|
|
begin
|
|
Writeln('- reading response');
|
|
stm := TFileStream.Create( fname+RESPONSE_EXT, fmOpenRead);
|
|
try
|
|
// save request data
|
|
proto := CreateProtocol( protfact, stm, TRUE);
|
|
client := TSkipTestService.TClient.Create( proto, nil);
|
|
cliRef := client as IUnknown;
|
|
ping := client.recv_PingPong;
|
|
|
|
finally
|
|
client := nil; // not Free!
|
|
cliRef := nil;
|
|
stm.Free;
|
|
if client = nil then {warning suppressed};
|
|
end;
|
|
end;
|
|
|
|
|
|
procedure ProcessFile( protfact : IProtocolFactory; fname : string);
|
|
var stmIn, stmOut : TFileStream;
|
|
protIn, protOut : IProtocol;
|
|
server : IProcessor;
|
|
begin
|
|
Writeln('- processing request');
|
|
stmOut := nil;
|
|
stmIn := TFileStream.Create( fname+REQUEST_EXT, fmOpenRead);
|
|
try
|
|
stmOut := TFileStream.Create( fname+RESPONSE_EXT+'.tmp', fmCreate);
|
|
|
|
// process request and write response data
|
|
protIn := CreateProtocol( protfact, stmIn, TRUE);
|
|
protOut := CreateProtocol( protfact, stmOut, FALSE);
|
|
|
|
server := TSkipTestService.TProcessorImpl.Create( TDummyServer.Create);
|
|
server.Process( protIn, protOut);
|
|
|
|
finally
|
|
server := nil; // not Free!
|
|
stmIn.Free;
|
|
stmOut.Free;
|
|
if server = nil then {warning suppressed};
|
|
end;
|
|
|
|
DeleteFile( fname+RESPONSE_EXT);
|
|
RenameFile( fname+RESPONSE_EXT+'.tmp', fname+RESPONSE_EXT);
|
|
end;
|
|
|
|
|
|
procedure Test( protfact : IProtocolFactory; fname : string);
|
|
begin
|
|
// try to read an existing request
|
|
if FileExists( fname + REQUEST_EXT) then begin
|
|
ProcessFile( protfact, fname);
|
|
ReadResponse( protfact, fname);
|
|
end;
|
|
|
|
// create a new request and try to process
|
|
CreateRequest( protfact, fname);
|
|
ProcessFile( protfact, fname);
|
|
ReadResponse( protfact, fname);
|
|
end;
|
|
|
|
|
|
const
|
|
FILE_BINARY = 'pingpong.bin';
|
|
FILE_JSON = 'pingpong.json';
|
|
begin
|
|
try
|
|
Writeln( 'Delphi SkipTest '+IntToStr(Tskiptest_version_2Constants.SKIPTESTSERVICE_VERSION)+' using '+Thrift.Version);
|
|
|
|
Writeln;
|
|
Writeln('Binary protocol');
|
|
Test( TBinaryProtocolImpl.TFactory.Create, FILE_BINARY);
|
|
|
|
Writeln;
|
|
Writeln('JSON protocol');
|
|
Test( TJSONProtocolImpl.TFactory.Create, FILE_JSON);
|
|
|
|
Writeln;
|
|
Writeln('Test completed without errors.');
|
|
Writeln;
|
|
Write('Press ENTER to close ...'); Readln;
|
|
except
|
|
on E: Exception do
|
|
Writeln(E.ClassName, ': ', E.Message);
|
|
end;
|
|
end.
|
|
|