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