blob: 4ab4bd1c176ad396bf38526c1616fc7eb8d860ed [file] [log] [blame]
//===-- TestCase.h ----------------------------------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#ifndef __PerfTestDriver__TestCase__
#define __PerfTestDriver__TestCase__
#include "Measurement.h"
#include "lldb/API/LLDB.h"
#include <getopt.h>
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<const char *> args = {});
void Loop();
void SetVerbose(bool);
bool GetVerbose();
virtual void WriteResults(Results &results) = 0;
template <typename G, typename A>
Measurement<G, A> CreateMeasurement(A a, const char *name = NULL,
const char *description = NULL) {
return Measurement<G, A>(a, name, description);
}
template <typename A>
TimeMeasurement<A> CreateTimeMeasurement(A a, const char *name = NULL,
const char *description = NULL) {
return TimeMeasurement<A>(a, name, description);
}
template <typename A>
MemoryMeasurement<A> CreateMemoryMeasurement(A a, const char *name = NULL,
const char *description = NULL) {
return MemoryMeasurement<A>(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__) */