Protocol conformity and serialization tests for UUIDs
diff --git a/lib/delphi/test/serializer/TestSerializer.Tests.pas b/lib/delphi/test/serializer/TestSerializer.Tests.pas
index 466fb26..7f5b829 100644
--- a/lib/delphi/test/serializer/TestSerializer.Tests.pas
+++ b/lib/delphi/test/serializer/TestSerializer.Tests.pas
@@ -49,7 +49,7 @@
type
TFactoryPair = record
- prot : IProtocolFactory;
+ proto : IProtocolFactory;
trans : ITransportFactory;
end;
@@ -72,8 +72,9 @@
class procedure Deserialize( const input : TBytes; const target : IBase; const factory : TFactoryPair); overload;
class procedure Deserialize( const input : TStream; const target : IBase; const factory : TFactoryPair); overload;
- class procedure ValidateReadToEnd( const input : TBytes; const serial : TDeserializer); overload;
- class procedure ValidateReadToEnd( const input : TStream; const serial : TDeserializer); overload;
+ class procedure Deserialize( const input : TBytes; out target : TGuid; const factory : TFactoryPair); overload;
+
+ class procedure ValidateReadToEnd( const serial : TDeserializer); overload;
class function LengthOf( const bytes : TBytes) : Integer; overload; inline;
class function LengthOf( const bytes : IThriftBytes) : Integer; overload; inline;
@@ -90,6 +91,9 @@
procedure Test_ExceptionStruct( const method : TMethod; const factory : TFactoryPair; const stream : TFileStream);
procedure Test_SimpleException( const method : TMethod; const factory : TFactoryPair; const stream : TFileStream);
+ procedure Test_ProtocolConformity( const factory : TFactoryPair; const stream : TFileStream);
+ procedure Test_UuidDeserialization( const factory : TFactoryPair; const stream : TFileStream);
+
public
constructor Create;
destructor Destroy; override;
@@ -143,7 +147,7 @@
procedure TTestSerializer.AddFactoryCombination( const aProto : IProtocolFactory; const aTrans : ITransportFactory);
var rec : TFactoryPair;
begin
- rec.prot := aProto;
+ rec.proto := aProto;
rec.trans := aTrans;
FProtocols.Add( rec);
end;
@@ -177,6 +181,53 @@
end;
+procedure TTestSerializer.Test_ProtocolConformity( const factory : TFactoryPair; const stream : TFileStream);
+begin
+ Test_UuidDeserialization( factory, stream);
+ // add more tests here
+end;
+
+
+procedure TTestSerializer.Test_UuidDeserialization( const factory : TFactoryPair; const stream : TFileStream);
+
+ function CreateGuidBytes : TBytes;
+ var obj : TObject;
+ i : Integer;
+ begin
+ obj := factory.proto as TObject;
+
+ if obj is TJSONProtocolImpl.TFactory then begin
+ result := TEncoding.UTF8.GetBytes('"00112233-4455-6677-8899-aabbccddeeff"');
+ Exit;
+ end;
+
+ if (obj is TBinaryProtocolImpl.TFactory)
+ or (obj is TCompactProtocolImpl.TFactory)
+ then begin
+ SetLength(result,16);
+ for i := 0 to Length(result)-1 do result[i] := (i * $10) + i;
+ Exit;
+ end;
+
+ raise Exception.Create('Unhandled case');
+ end;
+
+
+var tested, correct : TGuid;
+ bytes : TBytes;
+begin
+ // write
+ bytes := CreateGuidBytes();
+
+ // init + read
+ Deserialize( bytes, tested, factory);
+
+ // check
+ correct := TGuid.Create('{00112233-4455-6677-8899-aabbccddeeff}');
+ ASSERT( tested = correct);
+end;
+
+
procedure TTestSerializer.Test_OneOfEach( const method : TMethod; const factory : TFactoryPair; const stream : TFileStream);
var tested, correct : IOneOfEach;
bytes : TBytes;
@@ -385,6 +436,11 @@
for factory in FProtocols do begin
Writeln('- '+UserFriendlyName(factory));
+ // protocol conformity tests
+ if (method = TMethod.mt_Bytes) and (factory.trans = nil)
+ then Test_ProtocolConformity( factory, stream);
+
+ // normal objects
Test_OneOfEach( method, factory, stream);
Test_CompactStruct( method, factory, stream);
Test_ExceptionStruct( method, factory, stream);
@@ -402,7 +458,7 @@
class function TTestSerializer.UserFriendlyName( const factory : TFactoryPair) : string;
begin
- result := Copy( (factory.prot as TObject).ClassName, 2, MAXINT);
+ result := Copy( (factory.proto as TObject).ClassName, 2, MAXINT);
if factory.trans <> nil
then result := Copy( (factory.trans as TObject).ClassName, 2, MAXINT) +' '+ result;
@@ -472,7 +528,7 @@
config := TThriftConfigurationImpl.Create;
//config.MaxMessageSize := 0; // we don't read anything here
- serial := TSerializer.Create( factory.prot, factory.trans, config);
+ serial := TSerializer.Create( factory.proto, factory.trans, config);
try
result := serial.Serialize( input);
finally
@@ -488,7 +544,7 @@
config := TThriftConfigurationImpl.Create;
//config.MaxMessageSize := 0; // we don't read anything here
- serial := TSerializer.Create( factory.prot, factory.trans, config);
+ serial := TSerializer.Create( factory.proto, factory.trans, config);
try
serial.Serialize( input, aStream);
finally
@@ -504,10 +560,10 @@
config := TThriftConfigurationImpl.Create;
config.MaxMessageSize := Length(input);
- serial := TDeserializer.Create( factory.prot, factory.trans, config);
+ serial := TDeserializer.Create( factory.proto, factory.trans, config);
try
serial.Deserialize( input, target);
- ValidateReadToEnd( input, serial);
+ ValidateReadToEnd( serial);
finally
serial.Free;
end;
@@ -521,44 +577,49 @@
config := TThriftConfigurationImpl.Create;
config.MaxMessageSize := input.Size;
- serial := TDeserializer.Create( factory.prot, factory.trans, config);
+ serial := TDeserializer.Create( factory.proto, factory.trans, config);
try
serial.Deserialize( input, target);
- ValidateReadToEnd( input, serial);
+ ValidateReadToEnd( serial);
finally
serial.Free;
end;
end;
-class procedure TTestSerializer.ValidateReadToEnd( const input : TBytes; const serial : TDeserializer);
+class procedure TTestSerializer.Deserialize( const input : TBytes; out target : TGuid; const factory : TFactoryPair);
+var serial : TDeserializer;
+ config : IThriftConfiguration;
+begin
+ config := TThriftConfigurationImpl.Create;
+ config.MaxMessageSize := Length(input);
+
+ serial := TDeserializer.Create( factory.proto, factory.trans, config);
+ try
+ serial.Stream.Write(input[0], Length(input));
+ serial.Stream.Position := 0;
+ serial.Transport.ResetMessageSizeAndConsumedBytes(); // size has changed
+
+ target := serial.Protocol.ReadUuid;
+ finally
+ serial.Free;
+ end;
+end;
+
+
+class procedure TTestSerializer.ValidateReadToEnd( const serial : TDeserializer);
// we should not have any more byte to read
var dummy : IBase;
begin
try
dummy := TOneOfEachImpl.Create;
- serial.Deserialize( input, dummy);
+ serial.Deserialize( nil, dummy);
raise EInOutError.Create('Expected exception not thrown?');
except
- on e:TTransportExceptionEndOfFile do {expected};
+ on e:TTransportException do {expected};
on e:Exception do raise; // unexpected
end;
end;
-class procedure TTestSerializer.ValidateReadToEnd( const input : TStream; const serial : TDeserializer);
-// we should not have any more byte to read
-var dummy : IBase;
-begin
- try
- input.Position := 0;
- dummy := TOneOfEachImpl.Create;
- serial.Deserialize( input, dummy);
- raise EInOutError.Create('Expected exception not thrown?');
- except
- on e:TTransportExceptionEndOfFile do {expected};
- on e:Exception do raise; // unexpected
- end;
-end;
-
end.