15912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown/* 25912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Copyright (C) 2010 The Android Open Source Project 35912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * 45912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Licensed under the Apache License, Version 2.0 (the "License"); 55912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * you may not use this file except in compliance with the License. 65912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * You may obtain a copy of the License at 75912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * 85912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * http://www.apache.org/licenses/LICENSE-2.0 95912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * 105912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Unless required by applicable law or agreed to in writing, software 115912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * distributed under the License is distributed on an "AS IS" BASIS, 125912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * See the License for the specific language governing permissions and 145912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * limitations under the License. 155912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown */ 165912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 175912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#ifndef TESTHELPERS_H 185912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#define TESTHELPERS_H 195912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 205912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <unistd.h> 215912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 225912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <utils/threads.h> 235912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 245912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownnamespace android { 255912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 265912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownclass Pipe { 275912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownpublic: 285912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown int sendFd; 295912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown int receiveFd; 305912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 315912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown Pipe() { 325912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown int fds[2]; 335912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown ::pipe(fds); 345912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 355912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown receiveFd = fds[0]; 365912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown sendFd = fds[1]; 375912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown } 385912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 395912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown ~Pipe() { 405912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown if (sendFd != -1) { 415912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown ::close(sendFd); 425912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown } 435912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 445912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown if (receiveFd != -1) { 455912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown ::close(receiveFd); 465912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown } 475912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown } 485912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 495912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown status_t writeSignal() { 505912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown ssize_t nWritten = ::write(sendFd, "*", 1); 515912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown return nWritten == 1 ? 0 : -errno; 525912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown } 535912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 545912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown status_t readSignal() { 555912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown char buf[1]; 565912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown ssize_t nRead = ::read(receiveFd, buf, 1); 575912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown return nRead == 1 ? 0 : nRead == 0 ? -EPIPE : -errno; 585912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown } 595912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}; 605912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 615912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownclass DelayedTask : public Thread { 625912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown int mDelayMillis; 635912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 645912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownpublic: 655912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown DelayedTask(int delayMillis) : mDelayMillis(delayMillis) { } 665912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 675912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownprotected: 685912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown virtual ~DelayedTask() { } 695912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 705912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown virtual void doTask() = 0; 715912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 725912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown virtual bool threadLoop() { 735912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown usleep(mDelayMillis * 1000); 745912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown doTask(); 755912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown return false; 765912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown } 775912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}; 785912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 795912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown} // namespace android 805912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 815912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#endif // TESTHELPERS_H 82