108965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian/* 208965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian * Copyright (C) 2010 The Android Open Source Project 308965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian * 408965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian * Licensed under the Apache License, Version 2.0 (the "License"); 508965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian * you may not use this file except in compliance with the License. 608965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian * You may obtain a copy of the License at 708965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian * 808965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian * http://www.apache.org/licenses/LICENSE-2.0 908965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian * 1008965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian * Unless required by applicable law or agreed to in writing, software 1108965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian * distributed under the License is distributed on an "AS IS" BASIS, 1208965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1308965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian * See the License for the specific language governing permissions and 1408965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian * limitations under the License. 1508965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian */ 1608965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian 1708965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian#ifndef TESTHELPERS_H 1808965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian#define TESTHELPERS_H 1908965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian 2008965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian#include <utils/threads.h> 2108965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian 2208965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopiannamespace android { 2308965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian 2408965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopianclass Pipe { 2508965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopianpublic: 2608965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian int sendFd; 2708965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian int receiveFd; 2808965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian 2908965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian Pipe() { 3008965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian int fds[2]; 3108965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian ::pipe(fds); 3208965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian 3308965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian receiveFd = fds[0]; 3408965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian sendFd = fds[1]; 3508965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian } 3608965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian 3708965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian ~Pipe() { 3808965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian if (sendFd != -1) { 3908965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian ::close(sendFd); 4008965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian } 4108965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian 4208965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian if (receiveFd != -1) { 4308965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian ::close(receiveFd); 4408965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian } 4508965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian } 4608965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian 4708965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian status_t writeSignal() { 4808965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian ssize_t nWritten = ::write(sendFd, "*", 1); 4908965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian return nWritten == 1 ? 0 : -errno; 5008965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian } 5108965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian 5208965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian status_t readSignal() { 5308965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian char buf[1]; 5408965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian ssize_t nRead = ::read(receiveFd, buf, 1); 5508965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian return nRead == 1 ? 0 : nRead == 0 ? -EPIPE : -errno; 5608965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian } 5708965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian}; 5808965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian 5908965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopianclass DelayedTask : public Thread { 6008965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian int mDelayMillis; 6108965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian 6208965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopianpublic: 6308965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian DelayedTask(int delayMillis) : mDelayMillis(delayMillis) { } 6408965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian 6508965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopianprotected: 6608965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian virtual ~DelayedTask() { } 6708965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian 6808965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian virtual void doTask() = 0; 6908965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian 7008965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian virtual bool threadLoop() { 7108965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian usleep(mDelayMillis * 1000); 7208965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian doTask(); 7308965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian return false; 7408965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian } 7508965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian}; 7608965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian 7708965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian} // namespace android 7808965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian 7908965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian#endif // TESTHELPERS_H 80