You've already forked lazarus-ccr
Complete DataFilter Implementation + tests
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@1798 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
@ -275,29 +275,8 @@ begin
|
||||
end;
|
||||
|
||||
function TBaseTransport.GetFilterString: string;
|
||||
var
|
||||
locPM : IPropertyManager;
|
||||
ls : TStringList;
|
||||
locRes, s : string;
|
||||
i : Integer;
|
||||
begin
|
||||
locRes := '';
|
||||
if ( FFilter <> nil ) then begin
|
||||
locRes := FFilter.GetName();
|
||||
locPM := FFilter.GetPropertyManager();
|
||||
ls := TStringList.Create();
|
||||
try
|
||||
if ( locPM.GetPropertyNames(ls) > 0 ) then begin
|
||||
for i := 0 to Pred(ls.Count) do begin
|
||||
s := ls[i];
|
||||
locRes := Format('%s,%s>%s',[locRes,s,locPM.GetProperty(s)]);
|
||||
end;
|
||||
end;
|
||||
finally
|
||||
ls.Free();
|
||||
end;
|
||||
end;
|
||||
Result := locRes;
|
||||
Result := GenerateFilterString(FFilter);
|
||||
end;
|
||||
|
||||
function TBaseTransport.GetTransportName() : string;
|
||||
@ -316,32 +295,8 @@ begin
|
||||
end;
|
||||
|
||||
procedure TBaseTransport.SetFilterString(const Value: string);
|
||||
var
|
||||
locBuffer, locName, locValue : string;
|
||||
locPM : IPropertyManager;
|
||||
locFilterManager : IDataFilterRegistry;
|
||||
locFilter : IDataFilter;
|
||||
begin
|
||||
locBuffer := Value;
|
||||
if IsStrEmpty(locBuffer) then begin
|
||||
FFilter := nil;
|
||||
Exit;
|
||||
end;
|
||||
|
||||
//The filter name
|
||||
locName := Trim(GetToken(locBuffer,','));
|
||||
locFilterManager := GetDataFilterRegistry();
|
||||
if not locFilterManager.Find(locName,locFilter) then
|
||||
raise ETransportExecption.CreateFmt(SERR_DataFilterNotFound,[locName]);
|
||||
locPM := locFilter.GetPropertyManager();
|
||||
while True do begin
|
||||
locName := GetToken(locBuffer,'>');
|
||||
if IsStrEmpty(locName) then
|
||||
Break;
|
||||
locValue := GetToken(locBuffer,',');
|
||||
locPM.SetProperty(locName,locValue);
|
||||
end;
|
||||
FFilter := locFilter;
|
||||
FFilter := ParseDataFilterString(Value);
|
||||
end;
|
||||
|
||||
end.
|
||||
|
@ -30,6 +30,8 @@ type
|
||||
function GetName() : string;
|
||||
function ExecuteInput(const AData; const ASize : Integer) : TByteDynArray;
|
||||
function ExecuteOutput(const AData; const ASize : Integer) : TByteDynArray;
|
||||
function GetNext() : IDataFilter;
|
||||
procedure SetNext(AItem: IDataFilter);
|
||||
end;
|
||||
|
||||
IDataFilterRegistry = interface
|
||||
@ -44,20 +46,51 @@ type
|
||||
);
|
||||
end;
|
||||
|
||||
function GetDataFilterRegistry():IDataFilterRegistry;
|
||||
{$TYPEINFO ON}
|
||||
|
||||
{ TBaseFilter }
|
||||
|
||||
implementation
|
||||
TBaseFilter = class(TSimpleFactoryItem,IDataFilter)
|
||||
private
|
||||
FPropertyManager : IPropertyManager;
|
||||
FNext : IDataFilter;
|
||||
protected
|
||||
function DoExecuteInput(const AData; const ASize : Integer) : TByteDynArray;virtual;abstract;
|
||||
function DoExecuteOutput(const AData; const ASize : Integer) : TByteDynArray;virtual;abstract;
|
||||
protected
|
||||
function GetPropertyManager() : IPropertyManager;
|
||||
function GetName() : string;virtual;abstract;
|
||||
function ExecuteInput(const AData; const ASize : Integer) : TByteDynArray;
|
||||
function ExecuteOutput(const AData; const ASize : Integer) : TByteDynArray;
|
||||
function GetNext() : IDataFilter;
|
||||
procedure SetNext(AItem: IDataFilter);
|
||||
public
|
||||
constructor Create(); override;
|
||||
end;
|
||||
{$TYPEINFO OFF}
|
||||
|
||||
type
|
||||
{ TDataFilterRegistry }
|
||||
|
||||
TDataFilterRegistry = class(TBaseFactoryRegistry,IInterface,IDataFilterRegistry)
|
||||
protected
|
||||
function Find(
|
||||
const AName : string;
|
||||
out ARes : IDataFilter
|
||||
):Boolean;
|
||||
end;
|
||||
|
||||
end;
|
||||
|
||||
function GetDataFilterRegistry():IDataFilterRegistry;
|
||||
function ParseDataFilterString(AValue : string) : IDataFilter; overload;
|
||||
function ParseDataFilterString(
|
||||
AValue : string;
|
||||
AFilterReg : IDataFilterRegistry
|
||||
) : IDataFilter;overload;
|
||||
function GenerateFilterString(AFilter : IDataFilter) : string;
|
||||
|
||||
implementation
|
||||
uses
|
||||
classes,
|
||||
wst_consts, imp_utils;
|
||||
|
||||
var
|
||||
DataFilterRegistryInst : IDataFilterRegistry = nil;
|
||||
@ -68,6 +101,146 @@ begin
|
||||
Result := DataFilterRegistryInst;
|
||||
end;
|
||||
|
||||
|
||||
function ParseDataFilterString(AValue : string; AFilterReg : IDataFilterRegistry) : IDataFilter;
|
||||
var
|
||||
locAll, locBuffer, locName, locValue : string;
|
||||
locPM : IPropertyManager;
|
||||
locFilterManager : IDataFilterRegistry;
|
||||
locHeader, locLast, locFilter : IDataFilter;
|
||||
begin
|
||||
locAll := Trim(AValue);
|
||||
if IsStrEmpty(locAll) then begin
|
||||
Result := nil;
|
||||
Exit;
|
||||
end;
|
||||
|
||||
if (AFilterReg = nil) then
|
||||
locFilterManager := GetDataFilterRegistry()
|
||||
else
|
||||
locFilterManager := AFilterReg;
|
||||
locHeader := nil;
|
||||
locLast := nil;
|
||||
while True do begin
|
||||
locBuffer := Trim(GetToken(locAll,'&'));
|
||||
if IsStrEmpty(locBuffer) then
|
||||
Break;
|
||||
//The filter name
|
||||
locName := Trim(GetToken(locBuffer,','));
|
||||
if not locFilterManager.Find(locName,locFilter) then
|
||||
raise ETransportExecption.CreateFmt(SERR_DataFilterNotFound,[locName]);
|
||||
locPM := locFilter.GetPropertyManager();
|
||||
while True do begin
|
||||
locName := GetToken(locBuffer,'>');
|
||||
if IsStrEmpty(locName) then
|
||||
Break;
|
||||
locValue := GetToken(locBuffer,',');
|
||||
locPM.SetProperty(locName,locValue);
|
||||
end;
|
||||
if (locHeader = nil) then begin
|
||||
locHeader := locFilter;
|
||||
locLast := locFilter;
|
||||
end else begin
|
||||
locLast.SetNext(locFilter);
|
||||
end;
|
||||
locLast := locFilter;
|
||||
end;
|
||||
Result := locHeader;
|
||||
end;
|
||||
|
||||
|
||||
function GenerateFilterString(AFilter : IDataFilter) : string;
|
||||
var
|
||||
locFilter : IDataFilter;
|
||||
locPM : IPropertyManager;
|
||||
ls : TStringList;
|
||||
locResAll, locResLine, s : string;
|
||||
i : Integer;
|
||||
begin
|
||||
locResAll := '';
|
||||
if ( AFilter <> nil ) then begin
|
||||
ls := TStringList.Create();
|
||||
try
|
||||
locFilter := AFilter;
|
||||
while (locFilter <> nil) do begin
|
||||
locResLine := locFilter.GetName();
|
||||
locPM := locFilter.GetPropertyManager();
|
||||
ls.Clear();
|
||||
if ( locPM.GetPropertyNames(ls) > 0 ) then begin
|
||||
for i := 0 to Pred(ls.Count) do begin
|
||||
s := ls[i];
|
||||
locResLine := Format('%s,%s>%s',[locResLine,s,locPM.GetProperty(s)]);
|
||||
end;
|
||||
end;
|
||||
if (locResAll = '') then
|
||||
locResAll := locResLine
|
||||
else
|
||||
locResAll := locResAll + '&' + locResLine;
|
||||
locFilter := locFilter.GetNext();
|
||||
end;
|
||||
finally
|
||||
ls.Free();
|
||||
end;
|
||||
end;
|
||||
Result := locResAll;
|
||||
end;
|
||||
|
||||
function ParseDataFilterString(AValue : string) : IDataFilter;
|
||||
begin
|
||||
Result := ParseDataFilterString(AValue,GetDataFilterRegistry());
|
||||
end;
|
||||
|
||||
{ TBaseFilter }
|
||||
|
||||
function TBaseFilter.GetPropertyManager() : IPropertyManager;
|
||||
begin
|
||||
Result := FPropertyManager;
|
||||
end;
|
||||
|
||||
function TBaseFilter.ExecuteInput(const AData; const ASize : Integer) : TByteDynArray;
|
||||
var
|
||||
n : IDataFilter;
|
||||
r : TByteDynArray;
|
||||
begin
|
||||
Result := DoExecuteInput(AData,ASize);
|
||||
n := GetNext();
|
||||
if (n <> nil) then begin
|
||||
r := Result;
|
||||
Result := n.ExecuteInput(r[Low(r)],Length(r));
|
||||
end;
|
||||
end;
|
||||
|
||||
function TBaseFilter.ExecuteOutput(const AData; const ASize : Integer) : TByteDynArray;
|
||||
var
|
||||
n : IDataFilter;
|
||||
r : TByteDynArray;
|
||||
begin
|
||||
n := GetNext();
|
||||
if (n = nil) then begin
|
||||
Result := DoExecuteOutput(AData,ASize);
|
||||
end else begin
|
||||
r := n.ExecuteOutput(AData,ASize);
|
||||
Result := DoExecuteOutput(r[Low(r)],Length(r));
|
||||
end;
|
||||
end;
|
||||
|
||||
function TBaseFilter.GetNext() : IDataFilter;
|
||||
begin
|
||||
Result := FNext;
|
||||
end;
|
||||
|
||||
procedure TBaseFilter.SetNext(AItem : IDataFilter);
|
||||
begin
|
||||
if (FNext <> AItem) then
|
||||
FNext := AItem;
|
||||
end;
|
||||
|
||||
constructor TBaseFilter.Create();
|
||||
begin
|
||||
inherited;
|
||||
FPropertyManager := TPublishedPropertyManager.Create(Self);
|
||||
end;
|
||||
|
||||
{ TDataFilterRegistry }
|
||||
|
||||
function TDataFilterRegistry.Find(
|
||||
|
407
wst/trunk/tests/test_suite/test_filter.pas
Normal file
407
wst/trunk/tests/test_suite/test_filter.pas
Normal file
@ -0,0 +1,407 @@
|
||||
{ This file is part of the Web Service Toolkit
|
||||
Copyright (c) 2011 by Inoussa OUEDRAOGO
|
||||
|
||||
This file is provide under modified LGPL licence
|
||||
( the files COPYING.modifiedLGPL and COPYING.LGPL).
|
||||
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
}
|
||||
{$INCLUDE wst_global.inc}
|
||||
|
||||
unit test_filter;
|
||||
|
||||
interface
|
||||
uses {$define fpc}
|
||||
SysUtils,
|
||||
{$IFDEF FPC}
|
||||
fpcunit, testregistry,
|
||||
{$ELSE}
|
||||
TestFrameWork,
|
||||
{$ENDIF}
|
||||
wst_types, filter_intf;
|
||||
|
||||
type
|
||||
|
||||
{ TTest_DataFilter }
|
||||
|
||||
TTest_DataFilter = class(TTestCase)
|
||||
protected
|
||||
procedure DoFilter(AFilter : IDataFilter);
|
||||
function CreateRegistry() : IDataFilterRegistry;
|
||||
published
|
||||
procedure one_filter();
|
||||
procedure two_filter();
|
||||
procedure three_filter();
|
||||
|
||||
procedure ParseDataFilterString_empty();
|
||||
procedure ParseDataFilterString_one();
|
||||
procedure ParseDataFilterString_two();
|
||||
procedure ParseDataFilterString_three();
|
||||
|
||||
procedure GetFilterString_empty();
|
||||
procedure GetFilterString_one();
|
||||
procedure GetFilterString_two();
|
||||
procedure GetFilterString_three();
|
||||
end;
|
||||
|
||||
{ THexDataFilter }
|
||||
|
||||
THexDataFilter = class(TBaseFilter,IDataFilter)
|
||||
protected
|
||||
function GetName() : string;override;
|
||||
function DoExecuteInput(const AData; const ASize : Integer) : TByteDynArray;override;
|
||||
function DoExecuteOutput(const AData; const ASize : Integer) : TByteDynArray;override;
|
||||
end;
|
||||
|
||||
{ TMod256DataFilter }
|
||||
|
||||
TMod256DataFilter = class(TBaseFilter,IDataFilter)
|
||||
protected
|
||||
function GetName() : string;override;
|
||||
function DoExecuteInput(const AData; const ASize : Integer) : TByteDynArray;override;
|
||||
function DoExecuteOutput(const AData; const ASize : Integer) : TByteDynArray;override;
|
||||
end;
|
||||
|
||||
{ TXorDataFilter }
|
||||
|
||||
TXorDataFilter = class(TBaseFilter,IDataFilter)
|
||||
private
|
||||
FXorConstant : Byte;
|
||||
protected
|
||||
function GetName() : string;override;
|
||||
function ExecuteXor(const AData; const ASize : Integer) : TByteDynArray;
|
||||
function DoExecuteInput(const AData; const ASize : Integer) : TByteDynArray;override;
|
||||
function DoExecuteOutput(const AData; const ASize : Integer) : TByteDynArray;override;
|
||||
published
|
||||
property XorConstant : Byte read FXorConstant write FXorConstant;
|
||||
end;
|
||||
|
||||
implementation
|
||||
uses
|
||||
Classes,
|
||||
wst_consts, basex_encode, imp_utils, base_service_intf;
|
||||
|
||||
|
||||
{ TXorDataFilter }
|
||||
|
||||
function TXorDataFilter.GetName() : string;
|
||||
begin
|
||||
Result := 'xor';
|
||||
end;
|
||||
|
||||
function TXorDataFilter.ExecuteXor(const AData; const ASize : Integer) : TByteDynArray;
|
||||
var
|
||||
i : Integer;
|
||||
pd, pr : PByte;
|
||||
begin
|
||||
SetLength(Result,ASize);
|
||||
pd := PByte(@AData);
|
||||
pr := @Result[Low(Result)];
|
||||
for i := 1 to ASize do begin
|
||||
pr^ := pd^ xor XorConstant;
|
||||
Inc(pr);
|
||||
Inc(pd);
|
||||
end;
|
||||
end;
|
||||
|
||||
function TXorDataFilter.DoExecuteInput(const AData; const ASize : Integer) : TByteDynArray;
|
||||
begin
|
||||
Result := ExecuteXor(AData,ASize);
|
||||
end;
|
||||
|
||||
function TXorDataFilter.DoExecuteOutput(const AData; const ASize : Integer) : TByteDynArray;
|
||||
begin
|
||||
Result := ExecuteXor(AData,ASize);
|
||||
end;
|
||||
|
||||
{ TTest_DataFilter }
|
||||
|
||||
procedure TTest_DataFilter.DoFilter(AFilter : IDataFilter);
|
||||
var
|
||||
f : IDataFilter;
|
||||
inBuffer, outBuffer, calcBuffer : TByteDynArray;
|
||||
s, s2 : ansistring;
|
||||
begin
|
||||
s := 'abcdefghijklmnopqrtsuvwxyz0123456789.,;:+/*-=';
|
||||
SetLength(inBuffer,Length(s));
|
||||
Move(s[1],inBuffer[0],Length(inBuffer));
|
||||
|
||||
f := AFilter;
|
||||
outBuffer := f.ExecuteInput(inBuffer[0],Length(inBuffer));
|
||||
Check(Length(outBuffer) > 0);
|
||||
calcBuffer := f.ExecuteOutput(outBuffer[0],Length(outBuffer));
|
||||
Check(Length(calcBuffer) > 0);
|
||||
SetLength(s2,Length(calcBuffer));
|
||||
Move(calcBuffer[0],s2[1],Length(calcBuffer));
|
||||
CheckEquals(s,s2);
|
||||
end;
|
||||
|
||||
function TTest_DataFilter.CreateRegistry() : IDataFilterRegistry;
|
||||
begin
|
||||
Result := TDataFilterRegistry.Create() as IDataFilterRegistry;
|
||||
Result.Register('xor',TSimpleItemFactory.Create(TXorDataFilter) as IItemFactory);
|
||||
Result.Register('mod256',TSimpleItemFactory.Create(TMod256DataFilter) as IItemFactory);
|
||||
Result.Register('hex',TSimpleItemFactory.Create(THexDataFilter) as IItemFactory);
|
||||
end;
|
||||
|
||||
procedure TTest_DataFilter.one_filter();
|
||||
begin
|
||||
DoFilter(THexDataFilter.Create() as IDataFilter);
|
||||
DoFilter(TMod256DataFilter.Create() as IDataFilter);
|
||||
DoFilter(TXorDataFilter.Create() as IDataFilter);
|
||||
end;
|
||||
|
||||
procedure TTest_DataFilter.two_filter();
|
||||
var
|
||||
f : IDataFilter;
|
||||
begin
|
||||
f := THexDataFilter.Create() as IDataFilter;
|
||||
f.SetNext(TMod256DataFilter.Create() as IDataFilter);
|
||||
DoFilter(f);
|
||||
|
||||
f := TXorDataFilter.Create() as IDataFilter;
|
||||
f.SetNext(THexDataFilter.Create() as IDataFilter);
|
||||
DoFilter(f);
|
||||
end;
|
||||
|
||||
procedure TTest_DataFilter.three_filter();
|
||||
var
|
||||
f : IDataFilter;
|
||||
begin
|
||||
f := THexDataFilter.Create() as IDataFilter;
|
||||
f.SetNext(TMod256DataFilter.Create() as IDataFilter);
|
||||
f.GetNext().SetNext(TXorDataFilter.Create() as IDataFilter);
|
||||
DoFilter(f);
|
||||
|
||||
f := TXorDataFilter.Create() as IDataFilter;
|
||||
f.SetNext(THexDataFilter.Create() as IDataFilter);
|
||||
f.GetNext().SetNext(TMod256DataFilter.Create() as IDataFilter);
|
||||
DoFilter(f);
|
||||
end;
|
||||
|
||||
procedure TTest_DataFilter.ParseDataFilterString_empty();
|
||||
var
|
||||
fr : IDataFilterRegistry;
|
||||
f : IDataFilter;
|
||||
begin
|
||||
fr := CreateRegistry();
|
||||
f := ParseDataFilterString('',fr);
|
||||
CheckNull(f);
|
||||
end;
|
||||
|
||||
procedure TTest_DataFilter.ParseDataFilterString_one();
|
||||
var
|
||||
fr : IDataFilterRegistry;
|
||||
f : IDataFilter;
|
||||
begin
|
||||
fr := CreateRegistry();
|
||||
|
||||
f := ParseDataFilterString('hex',fr);
|
||||
CheckNotNull(f);
|
||||
CheckNull(f.GetNext());
|
||||
CheckEquals('hex',f.GetName());
|
||||
|
||||
f := ParseDataFilterString('xor,XorConstant>17',fr);
|
||||
CheckNotNull(f);
|
||||
CheckNull(f.GetNext());
|
||||
CheckEquals('xor',f.GetName());
|
||||
CheckEquals('17',f.GetPropertyManager().GetProperty('XorConstant'))
|
||||
end;
|
||||
|
||||
procedure TTest_DataFilter.ParseDataFilterString_two();
|
||||
var
|
||||
fr : IDataFilterRegistry;
|
||||
f : IDataFilter;
|
||||
begin
|
||||
fr := CreateRegistry();
|
||||
|
||||
f := ParseDataFilterString('hex&mod256',fr);
|
||||
CheckNotNull(f);
|
||||
CheckEquals('hex',f.GetName());
|
||||
CheckNotNull(f.GetNext());
|
||||
CheckEquals('mod256',f.GetNext().GetName());
|
||||
CheckNull(f.GetNext().GetNext());
|
||||
|
||||
f := ParseDataFilterString('xor,XorConstant>17&hex',fr);
|
||||
CheckNotNull(f);
|
||||
CheckEquals('xor',f.GetName());
|
||||
CheckEquals('17',f.GetPropertyManager().GetProperty('XorConstant'));
|
||||
CheckNotNull(f.GetNext());
|
||||
CheckEquals('hex',f.GetNext().GetName());
|
||||
CheckNull(f.GetNext().GetNext());
|
||||
|
||||
f := ParseDataFilterString('hex&xor,XorConstant>17',fr);
|
||||
CheckNotNull(f);
|
||||
CheckEquals('hex',f.GetName());
|
||||
CheckNotNull(f.GetNext());
|
||||
CheckEquals('xor',f.GetNext().GetName());
|
||||
CheckEquals('17',f.GetNext().GetPropertyManager().GetProperty('XorConstant'));
|
||||
CheckNull(f.GetNext().GetNext());
|
||||
end;
|
||||
|
||||
procedure TTest_DataFilter.ParseDataFilterString_three();
|
||||
var
|
||||
fr : IDataFilterRegistry;
|
||||
f : IDataFilter;
|
||||
begin
|
||||
fr := CreateRegistry();
|
||||
|
||||
f := ParseDataFilterString('hex&mod256&xor,XorConstant>17',fr);
|
||||
CheckNotNull(f);
|
||||
CheckEquals('hex',f.GetName());
|
||||
CheckNotNull(f.GetNext());
|
||||
CheckEquals('mod256',f.GetNext().GetName());
|
||||
CheckNotNull(f.GetNext().GetNext());
|
||||
CheckEquals('xor',f.GetNext().GetNext().GetName());
|
||||
CheckEquals('17',f.GetNext().GetNext().GetPropertyManager().GetProperty('XorConstant'));
|
||||
CheckNull(f.GetNext().GetNext().GetNext());
|
||||
|
||||
f := ParseDataFilterString('xor,XorConstant>17&hex&mod256',fr);
|
||||
CheckNotNull(f);
|
||||
CheckEquals('xor',f.GetName());
|
||||
CheckEquals('17',f.GetPropertyManager().GetProperty('XorConstant'));
|
||||
CheckNotNull(f.GetNext());
|
||||
CheckEquals('hex',f.GetNext().GetName());
|
||||
CheckNotNull(f.GetNext().GetNext());
|
||||
CheckEquals('mod256',f.GetNext().GetNext().GetName());
|
||||
CheckNull(f.GetNext().GetNext().GetNext());
|
||||
|
||||
f := ParseDataFilterString('hex&xor,XorConstant>17&mod256',fr);
|
||||
CheckNotNull(f);
|
||||
CheckEquals('hex',f.GetName());
|
||||
CheckNotNull(f.GetNext());
|
||||
CheckEquals('xor',f.GetNext().GetName());
|
||||
CheckEquals('17',f.GetNext().GetPropertyManager().GetProperty('XorConstant'));
|
||||
CheckNotNull(f.GetNext().GetNext());
|
||||
CheckEquals('mod256',f.GetNext().GetNext().GetName());
|
||||
CheckNull(f.GetNext().GetNext().GetNext());
|
||||
end;
|
||||
|
||||
procedure TTest_DataFilter.GetFilterString_empty();
|
||||
begin
|
||||
CheckEquals('',GenerateFilterString(nil));
|
||||
end;
|
||||
|
||||
procedure TTest_DataFilter.GetFilterString_one();
|
||||
var
|
||||
f : IDataFilter;
|
||||
begin
|
||||
f := THexDataFilter.Create() as IDataFilter;
|
||||
CheckEquals('hex',GenerateFilterString(f));
|
||||
|
||||
f := TXorDataFilter.Create() as IDataFilter;
|
||||
f.GetPropertyManager().SetProperty('XorConstant','37');
|
||||
CheckEquals('xor,XorConstant>37',GenerateFilterString(f));
|
||||
end;
|
||||
|
||||
procedure TTest_DataFilter.GetFilterString_two();
|
||||
var
|
||||
f : IDataFilter;
|
||||
begin
|
||||
f := THexDataFilter.Create() as IDataFilter;
|
||||
f.SetNext(TMod256DataFilter.Create() as IDataFilter);
|
||||
CheckEquals('hex&mod256',GenerateFilterString(f));
|
||||
|
||||
f := TXorDataFilter.Create() as IDataFilter;
|
||||
f.GetPropertyManager().SetProperty('XorConstant','37');
|
||||
f.SetNext(THexDataFilter.Create() as IDataFilter);
|
||||
CheckEquals('xor,XorConstant>37&hex',GenerateFilterString(f));
|
||||
|
||||
f := THexDataFilter.Create() as IDataFilter;
|
||||
f.SetNext(TXorDataFilter.Create() as IDataFilter);
|
||||
f.GetNext().GetPropertyManager().SetProperty('XorConstant','37');
|
||||
CheckEquals('hex&xor,XorConstant>37',GenerateFilterString(f));
|
||||
end;
|
||||
|
||||
procedure TTest_DataFilter.GetFilterString_three();
|
||||
var
|
||||
f : IDataFilter;
|
||||
begin
|
||||
f := THexDataFilter.Create() as IDataFilter;
|
||||
f.SetNext(TMod256DataFilter.Create() as IDataFilter);
|
||||
f.GetNext().SetNext(TXorDataFilter.Create() as IDataFilter);
|
||||
f.GetNext().GetNext().GetPropertyManager().SetProperty('XorConstant','37');
|
||||
CheckEquals('hex&mod256&xor,XorConstant>37',GenerateFilterString(f));
|
||||
|
||||
f := TXorDataFilter.Create() as IDataFilter;
|
||||
f.GetPropertyManager().SetProperty('XorConstant','37');
|
||||
f.SetNext(THexDataFilter.Create() as IDataFilter);
|
||||
f.GetNext().SetNext(TMod256DataFilter.Create() as IDataFilter);
|
||||
CheckEquals('xor,XorConstant>37&hex&mod256',GenerateFilterString(f));
|
||||
|
||||
f := THexDataFilter.Create() as IDataFilter;
|
||||
f.SetNext(TXorDataFilter.Create() as IDataFilter);
|
||||
f.GetNext().GetPropertyManager().SetProperty('XorConstant','37');
|
||||
f.GetNext().SetNext(TMod256DataFilter.Create() as IDataFilter);
|
||||
CheckEquals('hex&xor,XorConstant>37&mod256',GenerateFilterString(f));
|
||||
end;
|
||||
|
||||
{ TMod256DataFilter }
|
||||
|
||||
function TMod256DataFilter.GetName() : string;
|
||||
begin
|
||||
Result := 'mod256';
|
||||
end;
|
||||
|
||||
function TMod256DataFilter.DoExecuteInput(const AData; const ASize : Integer) : TByteDynArray;
|
||||
begin
|
||||
SetLength(Result,ASize + 1);
|
||||
Move(AData,Result[0],ASize);
|
||||
Result[ASize] := ASize mod 256;
|
||||
end;
|
||||
|
||||
function TMod256DataFilter.DoExecuteOutput(const AData; const ASize : Integer) : TByteDynArray;
|
||||
var
|
||||
m : Byte;
|
||||
begin
|
||||
if (ASize < 1) then
|
||||
raise Exception.Create(SERR_InvalidEncodedData);
|
||||
m := PByteArray(@AData)^[ASize - 1];
|
||||
if (m <> ((ASize - 1) mod 256) ) then
|
||||
raise Exception.Create(SERR_InvalidEncodedData);
|
||||
|
||||
SetLength(Result,ASize - 1);
|
||||
Move(AData,Result[0],ASize-1);
|
||||
end;
|
||||
|
||||
{ THexDataFilter }
|
||||
|
||||
function THexDataFilter.GetName() : string;
|
||||
begin
|
||||
Result := 'hex';
|
||||
end;
|
||||
|
||||
function THexDataFilter.DoExecuteInput(const AData; const ASize : Integer) : TByteDynArray;
|
||||
begin
|
||||
if (ASize < 1) then begin
|
||||
Result := nil;
|
||||
exit;
|
||||
end;
|
||||
|
||||
SetLength(Result,(2*ASize));
|
||||
Base16Encode(AData,ASize,PAnsiChar(@Result[0]));
|
||||
end;
|
||||
|
||||
function THexDataFilter.DoExecuteOutput(const AData; const ASize : Integer) : TByteDynArray;
|
||||
var
|
||||
i : Integer;
|
||||
begin
|
||||
if (ASize < 1) then begin
|
||||
Result := nil;
|
||||
exit;
|
||||
end;
|
||||
|
||||
SetLength(Result, (ASize div 2));
|
||||
i := Base16Decode(PAnsiChar(@AData),Result[0],Length(Result));
|
||||
if (i <> Length(Result)) then
|
||||
SetLength(Result,i);
|
||||
end;
|
||||
|
||||
initialization
|
||||
RegisterTest('DataFilter',TTest_DataFilter.Suite);
|
||||
|
||||
end.
|
||||
|
@ -1,16 +1,18 @@
|
||||
<?xml version="1.0"?>
|
||||
<CONFIG>
|
||||
<ProjectOptions>
|
||||
<Version Value="9"/>
|
||||
<PathDelim Value="\"/>
|
||||
<Version Value="7"/>
|
||||
<General>
|
||||
<Flags>
|
||||
<LRSInOutputDirectory Value="False"/>
|
||||
</Flags>
|
||||
<SessionStorage Value="InProjectDir"/>
|
||||
<MainUnit Value="0"/>
|
||||
<TargetFileExt Value=".exe"/>
|
||||
</General>
|
||||
<BuildModes Count="1">
|
||||
<Item1 Name="default" Default="True"/>
|
||||
</BuildModes>
|
||||
<PublishOptions>
|
||||
<Version Value="2"/>
|
||||
<DestinationDirectory Value="$(TestDir)\publishedproject\"/>
|
||||
@ -20,11 +22,11 @@
|
||||
<RunParams>
|
||||
<local>
|
||||
<FormatVersion Value="1"/>
|
||||
<CommandLineParams Value="--suite=TTest_XsdParser"/>
|
||||
<CommandLineParams Value="--suite=DataFilter"/>
|
||||
<LaunchingApplication PathPlusParams="\usr\X11R6\bin\xterm -T 'Lazarus Run Output' -e $(LazarusDir)\tools\runwait.sh $(TargetCmdLine)"/>
|
||||
</local>
|
||||
</RunParams>
|
||||
<Units Count="39">
|
||||
<Units Count="42">
|
||||
<Unit0>
|
||||
<Filename Value="wst_test_suite.lpr"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
@ -220,20 +222,35 @@
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="test_date_utils"/>
|
||||
</Unit38>
|
||||
<Unit39>
|
||||
<Filename Value="test_filter.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="test_filter"/>
|
||||
</Unit39>
|
||||
<Unit40>
|
||||
<Filename Value="..\..\filter_intf.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="filter_intf"/>
|
||||
</Unit40>
|
||||
<Unit41>
|
||||
<Filename Value="..\..\same_process_protocol.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="same_process_protocol"/>
|
||||
</Unit41>
|
||||
</Units>
|
||||
</ProjectOptions>
|
||||
<CompilerOptions>
|
||||
<Version Value="8"/>
|
||||
<Version Value="9"/>
|
||||
<PathDelim Value="\"/>
|
||||
<SearchPaths>
|
||||
<IncludeFiles Value="..\..\"/>
|
||||
<OtherUnitFiles Value="..\..\;..\..\ws_helper\;..\..\wst_rtti_filter\;..\..\fcl-json\src\"/>
|
||||
<IncludeFiles Value="..\.."/>
|
||||
<Libraries Value="..\.."/>
|
||||
<OtherUnitFiles Value="..\..;..\..\ws_helper;..\..\wst_rtti_filter;..\..\fcl-json\src"/>
|
||||
<UnitOutputDirectory Value="obj"/>
|
||||
</SearchPaths>
|
||||
<Parsing>
|
||||
<SyntaxOptions>
|
||||
<IncludeAssertionCode Value="True"/>
|
||||
<UseAnsiStrings Value="True"/>
|
||||
</SyntaxOptions>
|
||||
</Parsing>
|
||||
<CodeGeneration>
|
||||
@ -247,8 +264,10 @@
|
||||
</Debugging>
|
||||
</Linking>
|
||||
<Other>
|
||||
<CustomOptions Value="-Xi -FE.
|
||||
"/>
|
||||
<CompilerMessages>
|
||||
<UseMsgFile Value="True"/>
|
||||
</CompilerMessages>
|
||||
<CustomOptions Value="-Xi"/>
|
||||
<CompilerPath Value="$(CompPath)"/>
|
||||
</Other>
|
||||
</CompilerOptions>
|
||||
|
@ -8,18 +8,18 @@ uses
|
||||
cthreads, cwstring,
|
||||
{$ENDIF}
|
||||
|
||||
custapp, classes, sysutils, fpcunit, testreport, testregistry,
|
||||
TestFormatter_unit, testmetadata_unit,
|
||||
server_service_soap, soap_formatter, base_binary_formatter,
|
||||
base_service_intf, base_soap_formatter, binary_formatter, binary_streamer,
|
||||
server_binary_formatter, metadata_repository,
|
||||
metadata_generator, server_service_intf, metadata_wsdl, base_xmlrpc_formatter, wst_fpc_xml, test_utilities,
|
||||
server_service_xmlrpc, test_parsers, wsdl_generator, xsd_generator,
|
||||
xsd_consts, base_json_formatter, wsdl_parser, test_support, basex_encode,
|
||||
test_basex_encode, json_formatter, server_service_json, test_json,
|
||||
test_suite_utils, test_generators, test_std_cursors, test_rtti_filter,
|
||||
test_wst_cursors, test_registry, test_soap_specific, test_generators_runtime,
|
||||
test_date_utils;
|
||||
custapp, classes, sysutils, fpcunit, testreport, testregistry,
|
||||
TestFormatter_unit, testmetadata_unit, server_service_soap, soap_formatter,
|
||||
base_binary_formatter, base_service_intf, base_soap_formatter,
|
||||
binary_formatter, binary_streamer, server_binary_formatter,
|
||||
metadata_repository, metadata_generator, server_service_intf, metadata_wsdl,
|
||||
base_xmlrpc_formatter, wst_fpc_xml, test_utilities, server_service_xmlrpc,
|
||||
test_parsers, wsdl_generator, xsd_generator, xsd_consts, base_json_formatter,
|
||||
wsdl_parser, test_support, basex_encode, test_basex_encode, json_formatter,
|
||||
server_service_json, filter_intf, same_process_protocol, test_json,
|
||||
test_suite_utils, test_generators, test_std_cursors, test_rtti_filter,
|
||||
test_wst_cursors, test_registry, test_soap_specific, test_generators_runtime,
|
||||
test_date_utils, test_filter;
|
||||
|
||||
Const
|
||||
ShortOpts = 'alh';
|
||||
|
@ -1,19 +1,21 @@
|
||||
<?xml version="1.0"?>
|
||||
<CONFIG>
|
||||
<ProjectOptions>
|
||||
<Version Value="9"/>
|
||||
<PathDelim Value="\"/>
|
||||
<Version Value="7"/>
|
||||
<General>
|
||||
<Flags>
|
||||
<LRSInOutputDirectory Value="False"/>
|
||||
</Flags>
|
||||
<SessionStorage Value="InProjectDir"/>
|
||||
<MainUnit Value="0"/>
|
||||
<TargetFileExt Value=".exe"/>
|
||||
</General>
|
||||
<VersionInfo>
|
||||
<ProjectVersion Value=""/>
|
||||
<StringTable ProductVersion=""/>
|
||||
</VersionInfo>
|
||||
<BuildModes Count="1">
|
||||
<Item1 Name="default" Default="True"/>
|
||||
</BuildModes>
|
||||
<PublishOptions>
|
||||
<Version Value="2"/>
|
||||
<DestinationDirectory Value="$(TestDir)\publishedproject\"/>
|
||||
@ -37,7 +39,7 @@
|
||||
<PackageName Value="fpcunittestrunner"/>
|
||||
</Item3>
|
||||
</RequiredPackages>
|
||||
<Units Count="23">
|
||||
<Units Count="24">
|
||||
<Unit0>
|
||||
<Filename Value="wst_test_suite_gui.lpr"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
@ -152,22 +154,28 @@
|
||||
<Filename Value="wst_tests_defines.inc"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
</Unit22>
|
||||
<Unit23>
|
||||
<Filename Value="test_filter.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="test_filter"/>
|
||||
</Unit23>
|
||||
</Units>
|
||||
</ProjectOptions>
|
||||
<CompilerOptions>
|
||||
<Version Value="8"/>
|
||||
<Version Value="9"/>
|
||||
<PathDelim Value="\"/>
|
||||
<Target>
|
||||
<Filename Value="wst_test_suite_gui"/>
|
||||
</Target>
|
||||
<SearchPaths>
|
||||
<IncludeFiles Value="..\..\"/>
|
||||
<OtherUnitFiles Value="..\..\;..\..\ws_helper\;..\..\wst_rtti_filter\;..\..\fcl-json\src\"/>
|
||||
<IncludeFiles Value="..\.."/>
|
||||
<OtherUnitFiles Value="..\..;..\..\ws_helper;..\..\wst_rtti_filter;..\..\fcl-json\src"/>
|
||||
<UnitOutputDirectory Value="obj"/>
|
||||
</SearchPaths>
|
||||
<Parsing>
|
||||
<SyntaxOptions>
|
||||
<CStyleOperator Value="False"/>
|
||||
<UseAnsiStrings Value="False"/>
|
||||
</SyntaxOptions>
|
||||
</Parsing>
|
||||
<CodeGeneration>
|
||||
@ -187,8 +195,6 @@
|
||||
</Options>
|
||||
</Linking>
|
||||
<Other>
|
||||
<CustomOptions Value="
|
||||
"/>
|
||||
<CompilerPath Value="$(CompPath)"/>
|
||||
</Other>
|
||||
</CompilerOptions>
|
||||
|
@ -6,20 +6,18 @@ uses
|
||||
{$IFDEF UNIX}
|
||||
cthreads, cwstring,
|
||||
{$ENDIF}
|
||||
Interfaces, Forms, GuiTestRunner,
|
||||
TestFormatter_unit, testmetadata_unit,
|
||||
server_service_soap, soap_formatter, base_binary_formatter,
|
||||
base_service_intf, base_soap_formatter, binary_formatter, binary_streamer,
|
||||
server_binary_formatter, metadata_repository,
|
||||
metadata_generator, server_service_intf, metadata_wsdl,
|
||||
base_xmlrpc_formatter, wst_fpc_xml, test_utilities,
|
||||
server_service_xmlrpc, test_parsers, wsdl_generator, xsd_generator,
|
||||
xsd_consts, base_json_formatter, wsdl_parser, test_support, basex_encode,
|
||||
test_basex_encode, json_formatter, server_service_json, test_json,
|
||||
test_suite_utils, test_generators, fpcunittestrunner, test_std_cursors,
|
||||
test_rtti_filter, rtti_filters, wst_cursors, test_wst_cursors, test_registry, test_soap_specific,
|
||||
test_generators_runtime, test_date_utils, config_objects, test_support_client,
|
||||
wst_consts;
|
||||
Interfaces, Forms, GuiTestRunner, TestFormatter_unit, testmetadata_unit,
|
||||
server_service_soap, soap_formatter, base_binary_formatter, base_service_intf,
|
||||
base_soap_formatter, binary_formatter, binary_streamer,
|
||||
server_binary_formatter, metadata_repository, metadata_generator,
|
||||
server_service_intf, metadata_wsdl, base_xmlrpc_formatter, wst_fpc_xml,
|
||||
test_utilities, server_service_xmlrpc, test_parsers, wsdl_generator,
|
||||
xsd_generator, xsd_consts, base_json_formatter, wsdl_parser, test_support,
|
||||
basex_encode, test_basex_encode, json_formatter, server_service_json,
|
||||
test_json, test_suite_utils, test_generators, fpcunittestrunner,
|
||||
test_std_cursors, test_rtti_filter, rtti_filters, wst_cursors,
|
||||
test_wst_cursors, test_registry, test_soap_specific, test_generators_runtime,
|
||||
test_date_utils, config_objects, test_support_client, test_filter, wst_consts;
|
||||
|
||||
begin
|
||||
Application.Initialize;
|
||||
|
Reference in New Issue
Block a user