1*35238bceSAndroid Build Coastguard Worker #ifndef _XSWIN32TESTPROCESS_HPP 2*35238bceSAndroid Build Coastguard Worker #define _XSWIN32TESTPROCESS_HPP 3*35238bceSAndroid Build Coastguard Worker /*------------------------------------------------------------------------- 4*35238bceSAndroid Build Coastguard Worker * drawElements Quality Program Execution Server 5*35238bceSAndroid Build Coastguard Worker * --------------------------------------------- 6*35238bceSAndroid Build Coastguard Worker * 7*35238bceSAndroid Build Coastguard Worker * Copyright 2014 The Android Open Source Project 8*35238bceSAndroid Build Coastguard Worker * 9*35238bceSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 10*35238bceSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 11*35238bceSAndroid Build Coastguard Worker * You may obtain a copy of the License at 12*35238bceSAndroid Build Coastguard Worker * 13*35238bceSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 14*35238bceSAndroid Build Coastguard Worker * 15*35238bceSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 16*35238bceSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 17*35238bceSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18*35238bceSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 19*35238bceSAndroid Build Coastguard Worker * limitations under the License. 20*35238bceSAndroid Build Coastguard Worker * 21*35238bceSAndroid Build Coastguard Worker *//*! 22*35238bceSAndroid Build Coastguard Worker * \file 23*35238bceSAndroid Build Coastguard Worker * \brief TestProcess implementation for Win32. 24*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/ 25*35238bceSAndroid Build Coastguard Worker 26*35238bceSAndroid Build Coastguard Worker #include "xsDefs.hpp" 27*35238bceSAndroid Build Coastguard Worker #include "xsTestProcess.hpp" 28*35238bceSAndroid Build Coastguard Worker #include "deThread.hpp" 29*35238bceSAndroid Build Coastguard Worker 30*35238bceSAndroid Build Coastguard Worker #include <vector> 31*35238bceSAndroid Build Coastguard Worker #include <string> 32*35238bceSAndroid Build Coastguard Worker 33*35238bceSAndroid Build Coastguard Worker #if !defined(VC_EXTRALEAN) 34*35238bceSAndroid Build Coastguard Worker #define VC_EXTRALEAN 1 35*35238bceSAndroid Build Coastguard Worker #endif 36*35238bceSAndroid Build Coastguard Worker #if !defined(WIN32_LEAN_AND_MEAN) 37*35238bceSAndroid Build Coastguard Worker #define WIN32_LEAN_AND_MEAN 1 38*35238bceSAndroid Build Coastguard Worker #endif 39*35238bceSAndroid Build Coastguard Worker #if !defined(NOMINMAX) 40*35238bceSAndroid Build Coastguard Worker #define NOMINMAX 1 41*35238bceSAndroid Build Coastguard Worker #endif 42*35238bceSAndroid Build Coastguard Worker #include <windows.h> 43*35238bceSAndroid Build Coastguard Worker 44*35238bceSAndroid Build Coastguard Worker namespace xs 45*35238bceSAndroid Build Coastguard Worker { 46*35238bceSAndroid Build Coastguard Worker namespace win32 47*35238bceSAndroid Build Coastguard Worker { 48*35238bceSAndroid Build Coastguard Worker 49*35238bceSAndroid Build Coastguard Worker class Error : public std::runtime_error 50*35238bceSAndroid Build Coastguard Worker { 51*35238bceSAndroid Build Coastguard Worker public: 52*35238bceSAndroid Build Coastguard Worker Error(DWORD error, const char *msg); 53*35238bceSAndroid Build Coastguard Worker 54*35238bceSAndroid Build Coastguard Worker private: 55*35238bceSAndroid Build Coastguard Worker DWORD m_error; 56*35238bceSAndroid Build Coastguard Worker }; 57*35238bceSAndroid Build Coastguard Worker 58*35238bceSAndroid Build Coastguard Worker class Event 59*35238bceSAndroid Build Coastguard Worker { 60*35238bceSAndroid Build Coastguard Worker public: 61*35238bceSAndroid Build Coastguard Worker Event(bool manualReset, bool initialState); 62*35238bceSAndroid Build Coastguard Worker ~Event(void); 63*35238bceSAndroid Build Coastguard Worker 64*35238bceSAndroid Build Coastguard Worker void setSignaled(void); 65*35238bceSAndroid Build Coastguard Worker void reset(void); 66*35238bceSAndroid Build Coastguard Worker getHandle(void) const67*35238bceSAndroid Build Coastguard Worker HANDLE getHandle(void) const 68*35238bceSAndroid Build Coastguard Worker { 69*35238bceSAndroid Build Coastguard Worker return m_handle; 70*35238bceSAndroid Build Coastguard Worker } 71*35238bceSAndroid Build Coastguard Worker 72*35238bceSAndroid Build Coastguard Worker private: 73*35238bceSAndroid Build Coastguard Worker Event(const Event &other); 74*35238bceSAndroid Build Coastguard Worker Event &operator=(const Event &other); 75*35238bceSAndroid Build Coastguard Worker 76*35238bceSAndroid Build Coastguard Worker HANDLE m_handle; 77*35238bceSAndroid Build Coastguard Worker }; 78*35238bceSAndroid Build Coastguard Worker 79*35238bceSAndroid Build Coastguard Worker class CaseListWriter : public de::Thread 80*35238bceSAndroid Build Coastguard Worker { 81*35238bceSAndroid Build Coastguard Worker public: 82*35238bceSAndroid Build Coastguard Worker CaseListWriter(void); 83*35238bceSAndroid Build Coastguard Worker ~CaseListWriter(void); 84*35238bceSAndroid Build Coastguard Worker 85*35238bceSAndroid Build Coastguard Worker void start(const char *caseList, HANDLE dst); 86*35238bceSAndroid Build Coastguard Worker void stop(void); 87*35238bceSAndroid Build Coastguard Worker 88*35238bceSAndroid Build Coastguard Worker void run(void); 89*35238bceSAndroid Build Coastguard Worker 90*35238bceSAndroid Build Coastguard Worker private: 91*35238bceSAndroid Build Coastguard Worker std::vector<char> m_caseList; 92*35238bceSAndroid Build Coastguard Worker HANDLE m_dst; 93*35238bceSAndroid Build Coastguard Worker Event m_cancelEvent; 94*35238bceSAndroid Build Coastguard Worker }; 95*35238bceSAndroid Build Coastguard Worker 96*35238bceSAndroid Build Coastguard Worker class FileReader : public de::Thread 97*35238bceSAndroid Build Coastguard Worker { 98*35238bceSAndroid Build Coastguard Worker public: 99*35238bceSAndroid Build Coastguard Worker FileReader(ThreadedByteBuffer *dst); 100*35238bceSAndroid Build Coastguard Worker ~FileReader(void); 101*35238bceSAndroid Build Coastguard Worker 102*35238bceSAndroid Build Coastguard Worker void start(HANDLE file); 103*35238bceSAndroid Build Coastguard Worker void stop(void); 104*35238bceSAndroid Build Coastguard Worker 105*35238bceSAndroid Build Coastguard Worker void run(void); 106*35238bceSAndroid Build Coastguard Worker 107*35238bceSAndroid Build Coastguard Worker private: 108*35238bceSAndroid Build Coastguard Worker ThreadedByteBuffer *m_dstBuf; 109*35238bceSAndroid Build Coastguard Worker HANDLE m_handle; 110*35238bceSAndroid Build Coastguard Worker Event m_cancelEvent; 111*35238bceSAndroid Build Coastguard Worker }; 112*35238bceSAndroid Build Coastguard Worker 113*35238bceSAndroid Build Coastguard Worker class TestLogReader 114*35238bceSAndroid Build Coastguard Worker { 115*35238bceSAndroid Build Coastguard Worker public: 116*35238bceSAndroid Build Coastguard Worker TestLogReader(void); 117*35238bceSAndroid Build Coastguard Worker ~TestLogReader(void); 118*35238bceSAndroid Build Coastguard Worker 119*35238bceSAndroid Build Coastguard Worker void start(const char *filename); 120*35238bceSAndroid Build Coastguard Worker void stop(void); 121*35238bceSAndroid Build Coastguard Worker isRunning(void) const122*35238bceSAndroid Build Coastguard Worker bool isRunning(void) const 123*35238bceSAndroid Build Coastguard Worker { 124*35238bceSAndroid Build Coastguard Worker return m_reader.isStarted(); 125*35238bceSAndroid Build Coastguard Worker } 126*35238bceSAndroid Build Coastguard Worker read(uint8_t * dst,int numBytes)127*35238bceSAndroid Build Coastguard Worker int read(uint8_t *dst, int numBytes) 128*35238bceSAndroid Build Coastguard Worker { 129*35238bceSAndroid Build Coastguard Worker return m_logBuffer.tryRead(numBytes, dst); 130*35238bceSAndroid Build Coastguard Worker } 131*35238bceSAndroid Build Coastguard Worker 132*35238bceSAndroid Build Coastguard Worker private: 133*35238bceSAndroid Build Coastguard Worker ThreadedByteBuffer m_logBuffer; 134*35238bceSAndroid Build Coastguard Worker HANDLE m_logFile; 135*35238bceSAndroid Build Coastguard Worker 136*35238bceSAndroid Build Coastguard Worker FileReader m_reader; 137*35238bceSAndroid Build Coastguard Worker }; 138*35238bceSAndroid Build Coastguard Worker 139*35238bceSAndroid Build Coastguard Worker // \note deProcess uses anonymous pipes that don't have overlapped IO available. 140*35238bceSAndroid Build Coastguard Worker // For ExecServer purposes we need overlapped IO, and it makes the handles 141*35238bceSAndroid Build Coastguard Worker // incompatible with deFile. Thus separate Process implementation is used for now. 142*35238bceSAndroid Build Coastguard Worker class Process 143*35238bceSAndroid Build Coastguard Worker { 144*35238bceSAndroid Build Coastguard Worker public: 145*35238bceSAndroid Build Coastguard Worker Process(void); 146*35238bceSAndroid Build Coastguard Worker ~Process(void); 147*35238bceSAndroid Build Coastguard Worker 148*35238bceSAndroid Build Coastguard Worker void start(const char *commandLine, const char *workingDirectory); 149*35238bceSAndroid Build Coastguard Worker 150*35238bceSAndroid Build Coastguard Worker void waitForFinish(void); 151*35238bceSAndroid Build Coastguard Worker void terminate(void); 152*35238bceSAndroid Build Coastguard Worker void kill(void); 153*35238bceSAndroid Build Coastguard Worker 154*35238bceSAndroid Build Coastguard Worker bool isRunning(void); getExitCode(void) const155*35238bceSAndroid Build Coastguard Worker int getExitCode(void) const 156*35238bceSAndroid Build Coastguard Worker { 157*35238bceSAndroid Build Coastguard Worker return m_exitCode; 158*35238bceSAndroid Build Coastguard Worker } 159*35238bceSAndroid Build Coastguard Worker getStdIn(void) const160*35238bceSAndroid Build Coastguard Worker HANDLE getStdIn(void) const 161*35238bceSAndroid Build Coastguard Worker { 162*35238bceSAndroid Build Coastguard Worker return m_standardIn; 163*35238bceSAndroid Build Coastguard Worker } getStdOut(void) const164*35238bceSAndroid Build Coastguard Worker HANDLE getStdOut(void) const 165*35238bceSAndroid Build Coastguard Worker { 166*35238bceSAndroid Build Coastguard Worker return m_standardOut; 167*35238bceSAndroid Build Coastguard Worker } getStdErr(void) const168*35238bceSAndroid Build Coastguard Worker HANDLE getStdErr(void) const 169*35238bceSAndroid Build Coastguard Worker { 170*35238bceSAndroid Build Coastguard Worker return m_standardErr; 171*35238bceSAndroid Build Coastguard Worker } 172*35238bceSAndroid Build Coastguard Worker 173*35238bceSAndroid Build Coastguard Worker private: 174*35238bceSAndroid Build Coastguard Worker Process(const Process &other); 175*35238bceSAndroid Build Coastguard Worker Process &operator=(const Process &other); 176*35238bceSAndroid Build Coastguard Worker 177*35238bceSAndroid Build Coastguard Worker void stopProcess(bool kill); 178*35238bceSAndroid Build Coastguard Worker void cleanupHandles(void); 179*35238bceSAndroid Build Coastguard Worker 180*35238bceSAndroid Build Coastguard Worker enum State 181*35238bceSAndroid Build Coastguard Worker { 182*35238bceSAndroid Build Coastguard Worker STATE_NOT_STARTED = 0, 183*35238bceSAndroid Build Coastguard Worker STATE_RUNNING, 184*35238bceSAndroid Build Coastguard Worker STATE_FINISHED, 185*35238bceSAndroid Build Coastguard Worker 186*35238bceSAndroid Build Coastguard Worker STATE_LAST 187*35238bceSAndroid Build Coastguard Worker }; 188*35238bceSAndroid Build Coastguard Worker 189*35238bceSAndroid Build Coastguard Worker State m_state; 190*35238bceSAndroid Build Coastguard Worker int m_exitCode; 191*35238bceSAndroid Build Coastguard Worker 192*35238bceSAndroid Build Coastguard Worker PROCESS_INFORMATION m_procInfo; 193*35238bceSAndroid Build Coastguard Worker HANDLE m_standardIn; 194*35238bceSAndroid Build Coastguard Worker HANDLE m_standardOut; 195*35238bceSAndroid Build Coastguard Worker HANDLE m_standardErr; 196*35238bceSAndroid Build Coastguard Worker }; 197*35238bceSAndroid Build Coastguard Worker 198*35238bceSAndroid Build Coastguard Worker } // namespace win32 199*35238bceSAndroid Build Coastguard Worker 200*35238bceSAndroid Build Coastguard Worker class Win32TestProcess : public TestProcess 201*35238bceSAndroid Build Coastguard Worker { 202*35238bceSAndroid Build Coastguard Worker public: 203*35238bceSAndroid Build Coastguard Worker Win32TestProcess(void); 204*35238bceSAndroid Build Coastguard Worker virtual ~Win32TestProcess(void); 205*35238bceSAndroid Build Coastguard Worker 206*35238bceSAndroid Build Coastguard Worker virtual void start(const char *name, const char *params, const char *workingDir, const char *caseList); 207*35238bceSAndroid Build Coastguard Worker virtual void terminate(void); 208*35238bceSAndroid Build Coastguard Worker virtual void cleanup(void); 209*35238bceSAndroid Build Coastguard Worker 210*35238bceSAndroid Build Coastguard Worker virtual bool isRunning(void); 211*35238bceSAndroid Build Coastguard Worker virtual int getExitCode(void) const; 212*35238bceSAndroid Build Coastguard Worker 213*35238bceSAndroid Build Coastguard Worker virtual int readTestLog(uint8_t *dst, int numBytes); readInfoLog(uint8_t * dst,int numBytes)214*35238bceSAndroid Build Coastguard Worker virtual int readInfoLog(uint8_t *dst, int numBytes) 215*35238bceSAndroid Build Coastguard Worker { 216*35238bceSAndroid Build Coastguard Worker return m_infoBuffer.tryRead(numBytes, dst); 217*35238bceSAndroid Build Coastguard Worker } 218*35238bceSAndroid Build Coastguard Worker 219*35238bceSAndroid Build Coastguard Worker private: 220*35238bceSAndroid Build Coastguard Worker Win32TestProcess(const Win32TestProcess &other); 221*35238bceSAndroid Build Coastguard Worker Win32TestProcess &operator=(const Win32TestProcess &other); 222*35238bceSAndroid Build Coastguard Worker 223*35238bceSAndroid Build Coastguard Worker win32::Process *m_process; 224*35238bceSAndroid Build Coastguard Worker uint64_t m_processStartTime; 225*35238bceSAndroid Build Coastguard Worker std::string m_logFileName; 226*35238bceSAndroid Build Coastguard Worker 227*35238bceSAndroid Build Coastguard Worker ThreadedByteBuffer m_infoBuffer; 228*35238bceSAndroid Build Coastguard Worker 229*35238bceSAndroid Build Coastguard Worker // Threads. 230*35238bceSAndroid Build Coastguard Worker win32::CaseListWriter m_caseListWriter; 231*35238bceSAndroid Build Coastguard Worker win32::FileReader m_stdOutReader; 232*35238bceSAndroid Build Coastguard Worker win32::FileReader m_stdErrReader; 233*35238bceSAndroid Build Coastguard Worker win32::TestLogReader m_testLogReader; 234*35238bceSAndroid Build Coastguard Worker }; 235*35238bceSAndroid Build Coastguard Worker 236*35238bceSAndroid Build Coastguard Worker } // namespace xs 237*35238bceSAndroid Build Coastguard Worker 238*35238bceSAndroid Build Coastguard Worker #endif // _XSWIN32TESTPROCESS_HPP 239