mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-04-19 05:49:25 +02:00
460 lines
14 KiB
ObjectPascal
460 lines
14 KiB
ObjectPascal
unit TestLazLoggerCase;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils, fpcunit, testutils, testregistry, LazLoggerBase, LazLogger, LazClasses;
|
|
|
|
type
|
|
TStringArray = array of string;
|
|
|
|
{ TTestLazLogger }
|
|
|
|
TTestLazLogger = class(TTestCase)
|
|
protected
|
|
FTheLogger: TLazLoggerFile;
|
|
FOnDbgOutCount, FOnDebugLnCount: Integer;
|
|
FOnDbgOutText, FOnDebugLnText: string;
|
|
FArgcMem, FArgVSaved: PPChar;
|
|
FArgCSaved: Integer;
|
|
FArgs: TStringArray;
|
|
|
|
procedure TestOnDbgOut(Sender: TObject; S: string; var Handled: Boolean);
|
|
procedure TestOnDebugln(Sender: TObject; S: string; var Handled: Boolean);
|
|
procedure InitLogger;
|
|
procedure AssertDbgOut(Name: string; ExpCount: integer; ExpText: String);
|
|
procedure AssertDebugLn(Name: string; ExpCount: integer; ExpText: String);
|
|
procedure SaveArgs;
|
|
procedure RestoreArgs;
|
|
procedure SetArgv(List: TStringArray);
|
|
procedure SetArgs(List: array of string);
|
|
published
|
|
procedure TestEvent;
|
|
procedure TestFilter;
|
|
procedure TestReCreate;
|
|
end;
|
|
|
|
TLazLoggerForTest = class(TLazLogger)
|
|
end;
|
|
|
|
implementation
|
|
|
|
procedure TTestLazLogger.TestOnDbgOut(Sender: TObject; S: string; var Handled: Boolean);
|
|
begin
|
|
inc(FOnDbgOutCount);
|
|
FOnDbgOutText := FOnDbgOutText + s;
|
|
Handled := True;
|
|
end;
|
|
|
|
procedure TTestLazLogger.TestOnDebugln(Sender: TObject; S: string; var Handled: Boolean);
|
|
begin
|
|
inc(FOnDebugLnCount);
|
|
FOnDebugLnText := FOnDebugLnText + s + LineEnding;
|
|
Handled := True;
|
|
end;
|
|
|
|
procedure TTestLazLogger.InitLogger;
|
|
begin
|
|
FreeAndNil(FTheLogger);
|
|
FTheLogger := TLazLoggerFile.Create;
|
|
FTheLogger.OnDebugLn := @TestOnDebugln;
|
|
FTheLogger.OnDbgOut := @TestOnDbgOut;
|
|
FOnDebugLnCount := 0;
|
|
FOnDebugLnText := '';
|
|
end;
|
|
|
|
procedure TTestLazLogger.AssertDbgOut(Name: string; ExpCount: integer; ExpText: String);
|
|
begin
|
|
AssertEquals(Name + ' DbgOut call count', ExpCount, FOnDbgOutCount);
|
|
AssertEquals(Name + ' DbgOut text', ExpText, FOnDbgOutText);
|
|
FOnDbgOutCount := 0;
|
|
FOnDbgOutText := '';
|
|
end;
|
|
|
|
procedure TTestLazLogger.AssertDebugLn(Name: string; ExpCount: integer; ExpText: String);
|
|
begin
|
|
AssertEquals(Name + ' DebugLn call count', ExpCount, FOnDebugLnCount);
|
|
AssertEquals(Name + ' DebugLn text', ExpText, FOnDebugLnText);
|
|
FOnDebugLnCount := 0;
|
|
FOnDebugLnText := '';
|
|
end;
|
|
|
|
procedure TTestLazLogger.SaveArgs;
|
|
begin
|
|
FArgVSaved := argv;
|
|
FArgCSaved := argc;
|
|
end;
|
|
|
|
procedure TTestLazLogger.RestoreArgs;
|
|
begin
|
|
argv := FArgVSaved;
|
|
argc := FArgCSaved;
|
|
end;
|
|
|
|
procedure TTestLazLogger.SetArgv(List: TStringArray);
|
|
var
|
|
i: Integer;
|
|
begin
|
|
if List = nil then begin
|
|
argc := 0;
|
|
argv := nil;
|
|
ReAllocMem(FArgcMem, 0);
|
|
exit;
|
|
end;
|
|
argc := Length(List);
|
|
ReAllocMem(FArgcMem, argc * SizeOf(PChar));
|
|
argv := FArgcMem;
|
|
for i := 0 to argc - 1 do
|
|
FArgcMem[i] := PChar(List[i]);
|
|
end;
|
|
|
|
procedure TTestLazLogger.SetArgs(List: array of string);
|
|
var
|
|
i: Integer;
|
|
begin
|
|
if Length(List) = 0 then begin
|
|
SetArgv(nil);
|
|
Exit;
|
|
end;
|
|
SetLength(FArgs, Length(List));
|
|
for i := 0 to Length(List) - 1 do
|
|
FArgs[i] := List[i];
|
|
SetArgv(FArgs);
|
|
end;
|
|
|
|
procedure TTestLazLogger.TestEvent;
|
|
begin
|
|
InitLogger;
|
|
|
|
FTheLogger.DebugLn('a');
|
|
AssertDebugLn('debugln a', 1, 'a'+LineEnding);
|
|
AssertDbgOut('debugln a', 0, '');
|
|
|
|
FTheLogger.DebugLn('b', 'c');
|
|
AssertDebugLn('debugln b,c', 1, 'bc'+LineEnding);
|
|
AssertDbgOut('debugln b,c', 0, '');
|
|
|
|
FTheLogger.DebugLn(['d', 1]);
|
|
AssertDebugLn('debugln d,1', 1, 'd1'+LineEnding);
|
|
AssertDbgOut('debugln d,1', 0, '');
|
|
|
|
FTheLogger.DebugLn('e %d', [1]);
|
|
AssertDebugLn('debugln e,1', 1, 'e 1'+LineEnding);
|
|
AssertDbgOut('debugln e,1', 0, '');
|
|
|
|
|
|
FTheLogger.DbgOut('a');
|
|
AssertDbgOut('DbgOut a', 1, 'a');
|
|
AssertDebugLn('DbgOut a', 0, '');
|
|
|
|
FTheLogger.DbgOut('b', 'c');
|
|
AssertDbgOut('DbgOut b,c', 1, 'bc');
|
|
AssertDebugLn('DbgOut b,c', 0, '');
|
|
|
|
FTheLogger.DbgOut(['d', 1]);
|
|
AssertDbgOut('DbgOut d,1', 1, 'd1');
|
|
AssertDebugLn('DbgOut d,1', 0, '');
|
|
|
|
FTheLogger.DbgOut('e %d', [1]);
|
|
AssertDbgOut('DbgOut e,1', 1, 'e 1');
|
|
AssertDebugLn('DbgOut e,1', 0, '');
|
|
|
|
FTheLogger.DebugLnEnter('a');
|
|
AssertDebugLn('DebugLnEnter() a', 1, 'a'+LineEnding);
|
|
AssertDbgOut('DebugLnEnter() a', 0, '');
|
|
|
|
FTheLogger.DebugLn('in enter');
|
|
AssertDebugLn('debugln in enter', 1, ' in enter'+LineEnding);
|
|
AssertDbgOut('debugln in enter', 0, '');
|
|
|
|
FTheLogger.DebugLnExit('b');
|
|
AssertDebugLn('DebugLnExit() b', 1, 'b'+LineEnding);
|
|
AssertDbgOut('DebugLnExit() b', 0, '');
|
|
|
|
FTheLogger.DebugLn('after exit');
|
|
AssertDebugLn('debugln after exit', 1, 'after exit'+LineEnding);
|
|
AssertDbgOut('debugln after exit', 0, '');
|
|
|
|
|
|
FreeAndNil(FTheLogger);
|
|
end;
|
|
|
|
procedure TTestLazLogger.TestFilter;
|
|
procedure FilterInit(List: array of string);
|
|
begin
|
|
SetArgs(List);
|
|
InitLogger;
|
|
FTheLogger.ParamForEnabledLogGroups := '--dbe=';
|
|
end;
|
|
|
|
procedure FilterInitNoParam(List: array of string);
|
|
begin
|
|
SetArgs(List);
|
|
InitLogger;
|
|
end;
|
|
|
|
Procedure TestNoGroup(Name: String);
|
|
begin
|
|
FTheLogger.DebugLn('NoGroup'+Name);
|
|
AssertDebugLn(Name + 'debugln NoGroup'+Name, 1, 'NoGroup'+Name+LineEnding);
|
|
|
|
FTheLogger.DebugLn('NoGroupNil'+Name);
|
|
AssertDebugLn(Name + 'debugln [nil] NoGroupNil'+Name, 1, 'NoGroupNil'+Name+LineEnding);
|
|
end;
|
|
|
|
Procedure TestGroup(Name: String; g: PLazLoggerLogGroup; ExpLog: Boolean);
|
|
begin
|
|
FTheLogger.DebugLn(g, 'Group'+Name);
|
|
if ExpLog then
|
|
AssertDebugLn(Name + 'debugln ['+g^.ConfigName+'] Group'+Name, 1, 'Group'+Name+LineEnding)
|
|
else
|
|
AssertDebugLn(Name + 'debugln ['+g^.ConfigName+'] Group'+Name, 0, '');
|
|
|
|
FTheLogger.DebugLn(g, ['Group2',Name]);
|
|
if ExpLog then
|
|
AssertDebugLn(Name + 'debugln ['+g^.ConfigName+'] [Group2,'+Name+']', 1, 'Group2'+Name+LineEnding)
|
|
else
|
|
AssertDebugLn(Name + 'debugln ['+g^.ConfigName+'] [Group2,'+Name+']', 0, '');
|
|
end;
|
|
|
|
var
|
|
g1: PLazLoggerLogGroup;
|
|
s, a: String;
|
|
begin
|
|
SaveArgs;
|
|
try
|
|
{%region g1 not default enabled}
|
|
s := 'g1(false)';
|
|
a := '';
|
|
FilterInit(['exe', '--debug-log=a', a]);
|
|
g1 := FTheLogger.RegisterLogGroup('g1');
|
|
TestNoGroup(Format('%s -- %s', [s, a]));
|
|
TestGroup (Format('%s -- %s', [s, a]), g1, False);
|
|
g1^.Enabled := True;
|
|
TestGroup (Format('%s -- %s', [s+'->enabled', a]), g1, True);
|
|
|
|
a := '--dbe=';
|
|
FilterInit(['exe', '--debug-log=a', a]);
|
|
g1 := FTheLogger.RegisterLogGroup('g1');
|
|
TestNoGroup(Format('%s -- %s', [s, a]));
|
|
TestGroup (Format('%s -- %s', [s, a]), g1, False);
|
|
|
|
a := '--dbe=g1';
|
|
FilterInit(['exe', '--debug-log=a', a]);
|
|
g1 := FTheLogger.RegisterLogGroup('g1');
|
|
TestNoGroup(Format('%s -- %s', [s, a]));
|
|
TestGroup (Format('%s -- %s', [s, a]), g1, True);
|
|
g1^.Enabled := False;
|
|
TestGroup (Format('%s -- %s', [s+'->disabled', a]), g1, False);
|
|
|
|
a := '--dbe=+g1';
|
|
FilterInit(['exe', '--debug-log=a', a]);
|
|
g1 := FTheLogger.RegisterLogGroup('g1');
|
|
TestNoGroup(Format('%s -- %s', [s, a]));
|
|
TestGroup (Format('%s -- %s', [s, a]), g1, True);
|
|
|
|
a := '--dbe=-g1';
|
|
FilterInit(['exe', '--debug-log=a', a]);
|
|
g1 := FTheLogger.RegisterLogGroup('g1');
|
|
TestNoGroup(Format('%s -- %s', [s, a]));
|
|
TestGroup (Format('%s -- %s', [s, a]), g1, False);
|
|
|
|
a := '--dbe=g2';
|
|
FilterInit(['exe', '--debug-log=a', a]);
|
|
g1 := FTheLogger.RegisterLogGroup('g1');
|
|
TestNoGroup(Format('%s -- %s', [s, a]));
|
|
TestGroup (Format('%s -- %s', [s, a]), g1, False);
|
|
|
|
a := '--dbe=g2,g1';
|
|
FilterInit(['exe', '--debug-log=a', a]);
|
|
g1 := FTheLogger.RegisterLogGroup('g1');
|
|
TestNoGroup(Format('%s -- %s', [s, a]));
|
|
TestGroup (Format('%s -- %s', [s, a]), g1, True);
|
|
|
|
a := '--dbe=g1,g2';
|
|
FilterInit(['exe', '--debug-log=a', a]);
|
|
g1 := FTheLogger.RegisterLogGroup('g1');
|
|
TestNoGroup(Format('%s -- %s', [s, a]));
|
|
TestGroup (Format('%s -- %s', [s, a]), g1, True);
|
|
|
|
a := '--dbe=-g2,g1';
|
|
FilterInit(['exe', '--debug-log=a', a]);
|
|
g1 := FTheLogger.RegisterLogGroup('g1');
|
|
TestNoGroup(Format('%s -- %s', [s, a]));
|
|
TestGroup (Format('%s -- %s', [s, a]), g1, True);
|
|
|
|
a := '--dbe=-';
|
|
FilterInit(['exe', '--debug-log=a', a]);
|
|
g1 := FTheLogger.RegisterLogGroup('g1');
|
|
TestNoGroup(Format('%s -- %s', [s, a]));
|
|
TestGroup (Format('%s -- %s', [s, a]), g1, False);
|
|
|
|
a := '--dbe=- --dbe=+g1';
|
|
FilterInit(['exe', '--debug-log=a', '--dbe=-', '--dbe=+g1']);
|
|
g1 := FTheLogger.RegisterLogGroup('g1');
|
|
TestNoGroup(Format('%s -- %s', [s, a]));
|
|
TestGroup (Format('%s -- %s', [s, a]), g1, True);
|
|
{%endregion g1 not default enabled}
|
|
|
|
{%region g1 default enabled}
|
|
s := 'g1(true)';
|
|
a := '';
|
|
FilterInit(['exe', '--debug-log=a', a]);
|
|
g1 := FTheLogger.RegisterLogGroup('g1', True);
|
|
TestNoGroup(Format('%s -- %s', [s, a]));
|
|
TestGroup (Format('%s -- %s', [s, a]), g1, True);
|
|
|
|
a := '--dbe=g1';
|
|
FilterInit(['exe', '--debug-log=a', a]);
|
|
g1 := FTheLogger.RegisterLogGroup('g1', True);
|
|
TestNoGroup(Format('%s -- %s', [s, a]));
|
|
TestGroup (Format('%s -- %s', [s, a]), g1, True);
|
|
|
|
a := '--dbe=+g1';
|
|
FilterInit(['exe', '--debug-log=a', a]);
|
|
g1 := FTheLogger.RegisterLogGroup('g1', True);
|
|
TestNoGroup(Format('%s -- %s', [s, a]));
|
|
TestGroup (Format('%s -- %s', [s, a]), g1, True);
|
|
|
|
a := '--dbe=-g1';
|
|
FilterInit(['exe', '--debug-log=a', a]);
|
|
g1 := FTheLogger.RegisterLogGroup('g1', True);
|
|
TestNoGroup(Format('%s -- %s', [s, a]));
|
|
TestGroup (Format('%s -- %s', [s, a]), g1, False);
|
|
|
|
a := '--dbe=-g2';
|
|
FilterInit(['exe', '--debug-log=a', a]);
|
|
g1 := FTheLogger.RegisterLogGroup('g1', True);
|
|
TestNoGroup(Format('%s -- %s', [s, a]));
|
|
TestGroup (Format('%s -- %s', [s, a]), g1, True);
|
|
|
|
a := '--dbe=g2,-g1';
|
|
FilterInit(['exe', '--debug-log=a', a]);
|
|
g1 := FTheLogger.RegisterLogGroup('g1', True);
|
|
TestNoGroup(Format('%s -- %s', [s, a]));
|
|
TestGroup (Format('%s -- %s', [s, a]), g1, False);
|
|
|
|
a := '--dbe=-';
|
|
FilterInit(['exe', '--debug-log=a', a]);
|
|
g1 := FTheLogger.RegisterLogGroup('g1', True);
|
|
TestNoGroup(Format('%s -- %s', [s, a]));
|
|
TestGroup (Format('%s -- %s', [s, a]), g1, False);
|
|
{%endregion g1 default enabled}
|
|
|
|
|
|
{%region g1 not default enabled / param after}
|
|
s := 'g1(false)';
|
|
a := '';
|
|
FilterInitNoParam(['exe', '--debug-log=a', a]);
|
|
g1 := FTheLogger.RegisterLogGroup('g1');
|
|
FTheLogger.ParamForEnabledLogGroups := '--dbe=';
|
|
TestNoGroup(Format('Param late: %s -- %s', [s, a]));
|
|
TestGroup (Format('Param late: %s -- %s', [s, a]), g1, False);
|
|
|
|
a := '--dbe=';
|
|
FilterInitNoParam(['exe', '--debug-log=a', a]);
|
|
FTheLogger.ParamForEnabledLogGroups := '--dbe=';
|
|
g1 := FTheLogger.RegisterLogGroup('g1');
|
|
TestNoGroup(Format('Param late: %s -- %s', [s, a]));
|
|
TestGroup (Format('Param late: %s -- %s', [s, a]), g1, False);
|
|
|
|
a := '--dbe=g1';
|
|
FilterInitNoParam(['exe', '--debug-log=a', a]);
|
|
FTheLogger.ParamForEnabledLogGroups := '--dbe=';
|
|
g1 := FTheLogger.RegisterLogGroup('g1');
|
|
TestNoGroup(Format('Param late: %s -- %s', [s, a]));
|
|
TestGroup (Format('Param late: %s -- %s', [s, a]), g1, True);
|
|
|
|
a := '--dbe=+g1';
|
|
FilterInitNoParam(['exe', '--debug-log=a', a]);
|
|
g1 := FTheLogger.RegisterLogGroup('g1');
|
|
FTheLogger.ParamForEnabledLogGroups := '--dbe=';
|
|
TestNoGroup(Format('Param late: %s -- %s', [s, a]));
|
|
TestGroup (Format('Param late: %s -- %s', [s, a]), g1, True);
|
|
|
|
a := '--dbe=-g1';
|
|
FilterInitNoParam(['exe', '--debug-log=a', a]);
|
|
g1 := FTheLogger.RegisterLogGroup('g1');
|
|
FTheLogger.ParamForEnabledLogGroups := '--dbe=';
|
|
TestNoGroup(Format('Param late: %s -- %s', [s, a]));
|
|
TestGroup (Format('Param late: %s -- %s', [s, a]), g1, False);
|
|
|
|
a := '--dbe=g2';
|
|
FilterInitNoParam(['exe', '--debug-log=a', a]);
|
|
g1 := FTheLogger.RegisterLogGroup('g1');
|
|
FTheLogger.ParamForEnabledLogGroups := '--dbe=';
|
|
TestNoGroup(Format('Param late: %s -- %s', [s, a]));
|
|
TestGroup (Format('Param late: %s -- %s', [s, a]), g1, False);
|
|
|
|
a := '--dbe=g2,g1';
|
|
FilterInitNoParam(['exe', '--debug-log=a', a]);
|
|
g1 := FTheLogger.RegisterLogGroup('g1');
|
|
FTheLogger.ParamForEnabledLogGroups := '--dbe=';
|
|
TestNoGroup(Format('Param late: %s -- %s', [s, a]));
|
|
TestGroup (Format('Param late: %s -- %s', [s, a]), g1, True);
|
|
|
|
a := '--dbe=g1,g2';
|
|
FilterInitNoParam(['exe', '--debug-log=a', a]);
|
|
g1 := FTheLogger.RegisterLogGroup('g1');
|
|
FTheLogger.ParamForEnabledLogGroups := '--dbe=';
|
|
TestNoGroup(Format('Param late: %s -- %s', [s, a]));
|
|
TestGroup (Format('Param late: %s -- %s', [s, a]), g1, True);
|
|
|
|
a := '--dbe=-g2,g1';
|
|
FilterInitNoParam(['exe', '--debug-log=a', a]);
|
|
g1 := FTheLogger.RegisterLogGroup('g1');
|
|
FTheLogger.ParamForEnabledLogGroups := '--dbe=';
|
|
TestNoGroup(Format('Param late: %s -- %s', [s, a]));
|
|
TestGroup (Format('Param late: %s -- %s', [s, a]), g1, True);
|
|
|
|
a := '--dbe=-';
|
|
FilterInitNoParam(['exe', '--debug-log=a', a]);
|
|
g1 := FTheLogger.RegisterLogGroup('g1');
|
|
FTheLogger.ParamForEnabledLogGroups := '--dbe=';
|
|
TestNoGroup(Format('Param late: %s -- %s', [s, a]));
|
|
TestGroup (Format('Param late: %s -- %s', [s, a]), g1, False);
|
|
|
|
a := '--dbe=- --dbe=+g1';
|
|
FilterInitNoParam(['exe', '--debug-log=a', '--dbe=-', '--dbe=+g1']);
|
|
g1 := FTheLogger.RegisterLogGroup('g1');
|
|
FTheLogger.ParamForEnabledLogGroups := '--dbe=';
|
|
TestNoGroup(Format('Param late: %s -- %s', [s, a]));
|
|
TestGroup (Format('Param late: %s -- %s', [s, a]), g1, True);
|
|
{%endregion g1 not default enabled}
|
|
finally
|
|
SetArgv(nil);
|
|
RestoreArgs;
|
|
FreeAndNil(FTheLogger);
|
|
end;
|
|
end;
|
|
|
|
function CreateDebugLogger: TRefCountedObject;
|
|
begin
|
|
Result := TLazLoggerForTest.Create;
|
|
TLazLoggerFile(Result).Assign(GetExistingDebugLogger);
|
|
end;
|
|
|
|
procedure TTestLazLogger.TestReCreate;
|
|
begin
|
|
AssertTrue('DebugLogger is TLazLoggerFile', DebugLogger is TLazLoggerFile);
|
|
|
|
DebugLogger.MaxNestPrefixLen := 122;
|
|
LazDebugLoggerCreator := @CreateDebugLogger;
|
|
|
|
AssertTrue('still DebugLogger is TLazLoggerFile', DebugLogger is TLazLoggerFile);
|
|
|
|
RecreateDebugLogger;
|
|
AssertTrue('DebugLogger is TLazLoggerForTest', LazLoggerBase.DebugLogger is TLazLoggerForTest);
|
|
AssertEquals('MaxNestPrefixLen = 122', 122, TLazLoggerForTest(LazLoggerBase.DebugLogger).MaxNestPrefixLen);
|
|
|
|
end;
|
|
|
|
|
|
initialization
|
|
|
|
RegisterTest(TTestLazLogger);
|
|
end.
|
|
|