//===-- TestCase.h ----------------------------------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #ifndef __PerfTestDriver__TestCase__ #define __PerfTestDriver__TestCase__ #include "Measurement.h" #include "lldb/API/LLDB.h" #include namespace lldb_perf { class Results; class TestCase { public: TestCase(); struct ActionWanted { enum class Type { eStepOver, eContinue, eStepOut, eRelaunch, eCallNext, eNone, eKill } type; lldb::SBThread thread; lldb::SBLaunchInfo launch_info; ActionWanted() : type(Type::eContinue), thread(), launch_info(NULL) {} void None() { type = Type::eNone; thread = lldb::SBThread(); } void Continue() { type = Type::eContinue; thread = lldb::SBThread(); } void StepOver(lldb::SBThread t) { type = Type::eStepOver; thread = t; } void StepOut(lldb::SBThread t) { type = Type::eStepOut; thread = t; } void Relaunch(lldb::SBLaunchInfo l) { type = Type::eRelaunch; thread = lldb::SBThread(); launch_info = l; } void Kill() { type = Type::eKill; thread = lldb::SBThread(); } void CallNext() { type = Type::eCallNext; thread = lldb::SBThread(); } }; virtual ~TestCase() {} virtual bool Setup(int &argc, const char **&argv); virtual void TestStep(int counter, ActionWanted &next_action) = 0; bool Launch(lldb::SBLaunchInfo &launch_info); bool Launch(std::initializer_list args = {}); void Loop(); void SetVerbose(bool); bool GetVerbose(); virtual void WriteResults(Results &results) = 0; template Measurement CreateMeasurement(A a, const char *name = NULL, const char *description = NULL) { return Measurement(a, name, description); } template TimeMeasurement CreateTimeMeasurement(A a, const char *name = NULL, const char *description = NULL) { return TimeMeasurement(a, name, description); } template MemoryMeasurement CreateMemoryMeasurement(A a, const char *name = NULL, const char *description = NULL) { return MemoryMeasurement(a, name, description); } static int Run(TestCase &test, int argc, const char **argv); virtual bool ParseOption(int short_option, const char *optarg) { return false; } virtual struct option *GetLongOptions() { return NULL; } lldb::SBDebugger &GetDebugger() { return m_debugger; } lldb::SBTarget &GetTarget() { return m_target; } lldb::SBProcess &GetProcess() { return m_process; } lldb::SBThread &GetThread() { return m_thread; } int GetStep() { return m_step; } static const int RUN_SUCCESS = 0; static const int RUN_SETUP_ERROR = 100; protected: lldb::SBDebugger m_debugger; lldb::SBTarget m_target; lldb::SBProcess m_process; lldb::SBThread m_thread; lldb::SBListener m_listener; bool m_verbose; int m_step; }; } #endif /* defined(__PerfTestDriver__TestCase__) */