mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-05-11 07:02:31 +02:00
179 lines
4.5 KiB
ObjectPascal
179 lines
4.5 KiB
ObjectPascal
unit TestBase;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils, LazFileUtils, LazLogger, DbgIntfDebuggerBase,
|
|
TestDbgConfig, TTestDbgExecuteables, TestDbgTestSuites, TestDbgControl,
|
|
FpDebugDebugger, LazDebuggerIntf, LazDebuggerIntfBaseTypes, Dialogs, Forms,
|
|
FpDbgDwarfFreePascal;
|
|
|
|
type
|
|
|
|
{ THookedFpDebugDebugger }
|
|
|
|
THookedFpDebugDebugger = class(TFpDebugDebugger)
|
|
protected
|
|
procedure LockRelease; override;
|
|
public
|
|
LockRelCount: Integer;
|
|
end;
|
|
|
|
implementation
|
|
|
|
type
|
|
{ TTestFpDebugDebugger }
|
|
|
|
TTestFpDebugDebugger = class(TTestDbgDebugger)
|
|
protected
|
|
procedure DoBetweenWaitForFinish; override;
|
|
public
|
|
function StartDebugger(AppDir, TestExeName: String): Boolean;
|
|
override;
|
|
procedure CleanAfterTestDone; override;
|
|
end;
|
|
|
|
|
|
procedure BuildTestSuites;
|
|
var
|
|
FpcList, GdbList: TBaseList;
|
|
DbgInfo: TExternalExeInfo;
|
|
begin
|
|
FpcList := TBaseList(LoadConfig(ConfDir + 'fpclist.txt'));
|
|
|
|
DbgInfo.Name := 'FpDebug';
|
|
DbgInfo.CpuBitTypes := [cpu32,cpu64];
|
|
{$IFDEF WIN64}
|
|
DbgInfo.CpuBitTypes := [cpu32,cpu64];
|
|
{$ENDIF}
|
|
{$IFDEF WIN32} // Windows can not cross debug
|
|
DbgInfo.CpuBitTypes := [cpu32];
|
|
{$ENDIF}
|
|
DbgInfo.SymbolTypes := [stDwarf, stDwarfSet, stDwarf3, stDwarf4];
|
|
GdbList := TBaseList.Create;
|
|
GdbList.Add(DbgInfo);
|
|
|
|
CreateCompilerList(FpcList, TTestDbgCompiler);
|
|
CreateDebuggerList(GdbList, TTestFpDebugDebugger);
|
|
|
|
CreateTestSuites(TestDbgCompilerList, TestDbgDebuggerList, TDBGTestsuite);
|
|
|
|
TestControlRegisterCompilers(FpcList);
|
|
TestControlRegisterDebuggers(GdbList);
|
|
FpcList.Free;
|
|
GdbList.Free;
|
|
end;
|
|
|
|
function CheckAppDir(AppDir: string): Boolean;
|
|
begin
|
|
Result := DirectoryExistsUTF8(AppDir + 'TestApps') and
|
|
DirectoryExistsUTF8(AppDir + 'TestApps' + DirectorySeparator + 'lib');
|
|
end;
|
|
|
|
function AppDirStripAppBundle(AppDir: string): String;
|
|
var
|
|
p: LongInt;
|
|
begin
|
|
Result := AppDir;
|
|
p := pos('.app' + DirectorySeparator, AppDir);
|
|
while (p > 1) and (AppDir[p-1] <> DirectorySeparator) do
|
|
dec(p);
|
|
if p > 1 then
|
|
Result := Copy(AppDir, 1, p - 1);
|
|
end;
|
|
|
|
{ THookedFpDebugDebugger }
|
|
|
|
procedure THookedFpDebugDebugger.LockRelease;
|
|
begin
|
|
inc(LockRelCount);
|
|
inherited LockRelease;
|
|
end;
|
|
|
|
{ TTestFpDebugDebugger }
|
|
|
|
procedure TTestFpDebugDebugger.DoBetweenWaitForFinish;
|
|
begin
|
|
CheckSynchronize(25);
|
|
Application.ProcessMessages;
|
|
inherited DoBetweenWaitForFinish;
|
|
end;
|
|
|
|
function TTestFpDebugDebugger.StartDebugger(AppDir, TestExeName: String
|
|
): Boolean;
|
|
begin
|
|
Result := False;
|
|
FLazDebugger := THookedFpDebugDebugger.Create('');
|
|
//FLazDebugger.OnDbgOutput := @InternalDbgOutPut;
|
|
//FLazDebugger.OnFeedback := @InternalFeedBack;
|
|
//FLazDebugger.OnDbgEvent:=@InternalDbgEvent;
|
|
|
|
InitDebuggerMonitors(FLazDebugger);
|
|
|
|
FLazDebugger.Init;
|
|
if FLazDebugger.State = dsError then begin
|
|
FreeAndNil(FLazDebugger);
|
|
Exit;
|
|
end;
|
|
|
|
FLazDebugger.WorkingDir := AppDir;
|
|
FLazDebugger.FileName := TestExeName;
|
|
FLazDebugger.Arguments := '';
|
|
//FLazDebugger.ShowConsole := True;
|
|
Result := True;
|
|
end;
|
|
|
|
procedure TTestFpDebugDebugger.CleanAfterTestDone;
|
|
begin
|
|
if FLazDebugger = nil then exit;
|
|
try
|
|
FLazDebugger.Release;
|
|
FLazDebugger := nil;
|
|
ClearDebuggerMonitors;
|
|
except
|
|
end;
|
|
end;
|
|
|
|
initialization
|
|
DebugLogger.FindOrRegisterLogGroup('DBG_CMD_ECHO' , True )^.Enabled := True;
|
|
DebugLogger.FindOrRegisterLogGroup('DBG_VERBOSE' , True )^.Enabled := True;
|
|
DebugLogger.FindOrRegisterLogGroup('DBG_WARNINGS', True )^.Enabled := True;
|
|
DebugLogger.FindOrRegisterLogGroup('DBG_DISASSEMBLER', True )^.Enabled := True;
|
|
|
|
DebugLogger.FindOrRegisterLogGroup('FPDBG_DWARF_ERRORS', True);
|
|
DebugLogger.FindOrRegisterLogGroup('FPDBG_DWARF_SEARCH', True)^.Enabled := True;
|
|
DebugLogger.FindOrRegisterLogGroup('FPDBG_DWARF_WARNINGS', True)^.Enabled := True;
|
|
DebugLogger.FindOrRegisterLogGroup('FPDBG_DWARF_VERBOSE', True);
|
|
DebugLogger.FindOrRegisterLogGroup('FPDBG_DWARF_DATA_WARNINGS', True);
|
|
|
|
|
|
AppDir := AppendPathDelim(ExtractFilePath(ParamStr(0)));
|
|
if not(CheckAppDir(AppDir))
|
|
then begin
|
|
AppDir := AppDirStripAppBundle(AppDir);
|
|
if not(CheckAppDir(AppDir))
|
|
then
|
|
with TSelectDirectoryDialog.Create(nil) do begin
|
|
if Execute then AppDir := AppendPathDelim(FileName);
|
|
Free;
|
|
end;
|
|
end;
|
|
ConfDir := AppDir;
|
|
AppDir := AppendPathDelim(AppDir + 'testapps');
|
|
|
|
if DirectoryExistsUTF8(ConfDir+'logs') then
|
|
TestControlSetLogPath(ConfDir+'logs'+DirectorySeparator)
|
|
else if DirectoryExistsUTF8(ConfDir+'log') then
|
|
TestControlSetLogPath(ConfDir+'log'+DirectorySeparator)
|
|
else
|
|
TestControlSetLogPath(ConfDir);
|
|
|
|
BuildTestSuites;
|
|
|
|
finalization
|
|
|
|
end.
|
|
|