blob: 2067969f81a7a290510afa164462e20438ecef62 [file] [log] [blame]
Enrico Granataf58cece2013-03-08 20:29:13 +00001//
2// TestCase.cpp
3// PerfTestDriver
4//
5// Created by Enrico Granata on 3/7/13.
6// Copyright (c) 2013 Apple Inc. All rights reserved.
7//
8
9#include "TestCase.h"
10#include "Xcode.h"
11
12using namespace lldb::perf;
13
14TestCase::TestCase () :
15m_debugger(),
16m_target(),
17m_process(),
18m_thread(),
19m_listener(),
20m_verbose(false)
21{}
22
23void
24TestCase::Setup (int argc, const char** argv)
25{
26 SBDebugger::Initialize();
27 SBHostOS::ThreadCreated ("<lldb-tester.app.main>");
28 m_debugger = SBDebugger::Create(false);
29 m_listener = m_debugger.GetListener();
30}
31
32bool
33TestCase::Launch (const char** args, const char* cwd)
34{
35 m_process = m_target.LaunchSimple(args,NULL,cwd);
36 m_process.GetBroadcaster().AddListener(m_listener, SBProcess::eBroadcastBitStateChanged | SBProcess::eBroadcastBitInterrupt);
37 return m_process.IsValid ();
38}
39
40void
41TestCase::SetVerbose (bool b)
42{
43 m_verbose = b;
44}
45
46bool
47TestCase::GetVerbose ()
48{
49 return m_verbose;
50}
51
52void
53TestCase::Loop ()
54{
55 int step = 0;
56 SBEvent evt;
57 while (true)
58 {
59 m_listener.WaitForEvent (UINT32_MAX,evt);
60 StateType state = SBProcess::GetStateFromEvent (evt);
61 if (m_verbose)
62 printf("event = %s\n",SBDebugger::StateAsCString(state));
63 if (SBProcess::GetRestartedFromEvent(evt))
64 continue;
65 switch (state)
66 {
67 case eStateInvalid:
68 case eStateDetached:
69 case eStateCrashed:
70 case eStateUnloaded:
71 break;
72 case eStateExited:
73 return;
74 case eStateConnected:
75 case eStateAttaching:
76 case eStateLaunching:
77 case eStateRunning:
78 case eStateStepping:
79 continue;
80 case eStateStopped:
81 case eStateSuspended:
82 {
83 bool fatal = false;
84 for (auto thread_index = 0; thread_index < m_process.GetNumThreads(); thread_index++)
85 {
86 SBThread thread(m_process.GetThreadAtIndex(thread_index));
87 SBFrame frame(thread.GetFrameAtIndex(0));
88 StopReason stop_reason = thread.GetStopReason();
89 if (m_verbose) printf("tid = 0x%llx pc = 0x%llx ",thread.GetThreadID(),frame.GetPC());
90 switch (stop_reason)
91 {
92 case eStopReasonNone:
93 if (m_verbose) printf("none\n");
94 break;
95
96 case eStopReasonTrace:
97 if (m_verbose) printf("trace\n");
98 break;
99
100 case eStopReasonPlanComplete:
101 if (m_verbose) printf("plan complete\n");
102 break;
103 case eStopReasonThreadExiting:
104 if (m_verbose) printf("thread exiting\n");
105 break;
106 case eStopReasonExec:
107 if (m_verbose) printf("exec\n");
108 break;
109 case eStopReasonInvalid:
110 if (m_verbose) printf("invalid\n");
111 break;
112 case eStopReasonException:
113 if (m_verbose) printf("exception\n");
114 fatal = true;
115 break;
116 case eStopReasonBreakpoint:
117 if (m_verbose) printf("breakpoint id = %lld.%lld\n",thread.GetStopReasonDataAtIndex(0),thread.GetStopReasonDataAtIndex(1));
118 break;
119 case eStopReasonWatchpoint:
120 if (m_verbose) printf("watchpoint id = %lld\n",thread.GetStopReasonDataAtIndex(0));
121 break;
122 case eStopReasonSignal:
123 if (m_verbose) printf("signal %d\n",(int)thread.GetStopReasonDataAtIndex(0));
124 break;
125 }
126 }
127 if (fatal)
128 {
129 if (m_verbose) Xcode::RunCommand(m_debugger,"bt all",true);
130 exit(1);
131 }
132 if (m_verbose)
133 printf("RUNNING STEP %d\n",step);
134 auto action = TestStep(step);
135 step++;
136 switch (action.type)
137 {
138 case ActionWanted::Type::eAWContinue:
139 m_debugger.HandleCommand("continue");
140 break;
141 case ActionWanted::Type::eAWFinish:
142 if (action.thread.IsValid() == false)
143 {
144 if (m_verbose) Xcode::RunCommand(m_debugger,"bt all",true);
145 if (m_verbose) printf("[finish invalid] I am gonna die at step %d\n",step);
146 exit(501);
147 }
148 m_process.SetSelectedThread(action.thread);
149 m_debugger.HandleCommand("finish");
150 break;
151 case ActionWanted::Type::eAWNext:
152 if (action.thread.IsValid() == false)
153 {
154 if (m_verbose) Xcode::RunCommand(m_debugger,"bt all",true);
155 if (m_verbose) printf("[next invalid] I am gonna die at step %d\n",step);
156 exit(500);
157 }
158 m_process.SetSelectedThread(action.thread);
159 m_debugger.HandleCommand("next");
160 break;
161 case ActionWanted::Type::eAWKill:
162 if (m_verbose) printf("I want to die\n");
163 m_process.Kill();
164 return;
165 }
166 }
167 }
168 }
169 if (GetVerbose()) printf("I am gonna die at step %d\n",step);
170}
171
172void
173TestCase::Run (TestCase& test, int argc, const char** argv)
174{
175 test.Setup(argc, argv);
176 test.Loop();
177 test.Results();
178}