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