CameraServiceTest.cpp revision 65ab47156e1c7dfcd8cc4266253a5ff30219e7f0
165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#define LOG_TAG "CameraServiceTest"
265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <stdio.h>
465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <stdlib.h>
565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <string.h>
665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <sys/types.h>
765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <sys/wait.h>
865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <unistd.h>
965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <surfaceflinger/ISurface.h>
1065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <camera/Camera.h>
1165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <camera/CameraParameters.h>
1265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <ui/GraphicBuffer.h>
1365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <camera/ICamera.h>
1465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <camera/ICameraClient.h>
1565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <camera/ICameraService.h>
1665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <ui/Overlay.h>
1765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <binder/IPCThreadState.h>
1865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <binder/IServiceManager.h>
1965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <binder/ProcessState.h>
2065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <utils/KeyedVector.h>
2165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <utils/Log.h>
2265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <utils/Vector.h>
2365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <utils/threads.h>
2465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
2565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianusing namespace android;
2665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
2765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian//
2865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian//  Assertion and Logging utilities
2965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian//
3065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#define INFO(...) \
3165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    do { \
3265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        printf(__VA_ARGS__); \
3365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        printf("\n"); \
3465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        LOGD(__VA_ARGS__); \
3565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    } while(0)
3665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
3765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid assert_fail(const char *file, int line, const char *func, const char *expr) {
3865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    INFO("assertion failed at file %s, line %d, function %s:",
3965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            file, line, func);
4065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    INFO("%s", expr);
4165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    abort();
4265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
4365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
4465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid assert_eq_fail(const char *file, int line, const char *func,
4565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        const char *expr, int actual) {
4665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    INFO("assertion failed at file %s, line %d, function %s:",
4765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            file, line, func);
4865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    INFO("(expected) %s != (actual) %d", expr, actual);
4965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    abort();
5065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
5165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
5265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#define ASSERT(e) \
5365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    do { \
5465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        if (!(e)) \
5565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            assert_fail(__FILE__, __LINE__, __func__, #e); \
5665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    } while(0)
5765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
5865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#define ASSERT_EQ(expected, actual) \
5965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    do { \
6065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        int _x = (actual); \
6165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        if (_x != (expected)) \
6265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            assert_eq_fail(__FILE__, __LINE__, __func__, #expected, _x); \
6365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    } while(0)
6465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
6565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian//
6665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian//  Holder service for pass objects between processes.
6765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian//
6865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianclass IHolder : public IInterface {
6965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianprotected:
7065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    enum {
7165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        HOLDER_PUT = IBinder::FIRST_CALL_TRANSACTION,
7265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        HOLDER_GET,
7365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        HOLDER_CLEAR
7465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    };
7565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianpublic:
7665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    DECLARE_META_INTERFACE(Holder);
7765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
7865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    virtual void put(sp<IBinder> obj) = 0;
7965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    virtual sp<IBinder> get() = 0;
8065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    virtual void clear() = 0;
8165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian};
8265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
8365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianclass BnHolder : public BnInterface<IHolder> {
8465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    virtual status_t onTransact(uint32_t code,
8565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                                const Parcel& data,
8665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                                Parcel* reply,
8765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                                uint32_t flags = 0);
8865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian};
8965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
9065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianclass BpHolder : public BpInterface<IHolder> {
9165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianpublic:
9265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    BpHolder(const sp<IBinder>& impl)
9365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        : BpInterface<IHolder>(impl) {
9465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }
9565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
9665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    virtual void put(sp<IBinder> obj) {
9765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        Parcel data, reply;
9865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        data.writeStrongBinder(obj);
9965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        remote()->transact(HOLDER_PUT, data, &reply, IBinder::FLAG_ONEWAY);
10065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }
10165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
10265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    virtual sp<IBinder> get() {
10365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        Parcel data, reply;
10465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        remote()->transact(HOLDER_GET, data, &reply);
10565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        return reply.readStrongBinder();
10665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }
10765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
10865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    virtual void clear() {
10965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        Parcel data, reply;
11065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        remote()->transact(HOLDER_CLEAR, data, &reply);
11165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }
11265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian};
11365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
11465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias AgopianIMPLEMENT_META_INTERFACE(Holder, "CameraServiceTest.Holder");
11565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
11665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianstatus_t BnHolder::onTransact(
11765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) {
11865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    switch(code) {
11965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        case HOLDER_PUT: {
12065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            put(data.readStrongBinder());
12165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            return NO_ERROR;
12265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        } break;
12365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        case HOLDER_GET: {
12465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            reply->writeStrongBinder(get());
12565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            return NO_ERROR;
12665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        } break;
12765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        case HOLDER_CLEAR: {
12865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            clear();
12965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            return NO_ERROR;
13065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        } break;
13165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        default:
13265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            return BBinder::onTransact(code, data, reply, flags);
13365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }
13465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
13565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
13665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianclass HolderService : public BnHolder {
13765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    virtual void put(sp<IBinder> obj) {
13865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        mObj = obj;
13965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }
14065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    virtual sp<IBinder> get() {
14165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        return mObj;
14265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }
14365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    virtual void clear() {
14465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        mObj.clear();
14565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }
14665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianprivate:
14765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    sp<IBinder> mObj;
14865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian};
14965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
15065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian//
15165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian//  A mock CameraClient
15265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian//
15365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianclass MCameraClient : public BnCameraClient {
15465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianpublic:
15565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    virtual void notifyCallback(int32_t msgType, int32_t ext1, int32_t ext2);
15665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    virtual void dataCallback(int32_t msgType, const sp<IMemory>& data);
15765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    virtual void dataCallbackTimestamp(nsecs_t timestamp,
15865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            int32_t msgType, const sp<IMemory>& data);
15965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
16065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    // new functions
16165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    void clearStat();
16265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    enum OP { EQ, GE, LE, GT, LT };
16365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    void assertNotify(int32_t msgType, OP op, int count);
16465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    void assertData(int32_t msgType, OP op, int count);
16565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    void waitNotify(int32_t msgType, OP op, int count);
16665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    void waitData(int32_t msgType, OP op, int count);
16765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    void assertDataSize(int32_t msgType, OP op, int dataSize);
16865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
16965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    void setReleaser(ICamera *releaser) {
17065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        mReleaser = releaser;
17165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }
17265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianprivate:
17365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    Mutex mLock;
17465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    Condition mCond;
17565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    DefaultKeyedVector<int32_t, int> mNotifyCount;
17665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    DefaultKeyedVector<int32_t, int> mDataCount;
17765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    DefaultKeyedVector<int32_t, int> mDataSize;
17865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    bool test(OP op, int v1, int v2);
17965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    void assertTest(OP op, int v1, int v2);
18065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
18165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    ICamera *mReleaser;
18265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian};
18365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
18465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid MCameraClient::clearStat() {
18565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    Mutex::Autolock _l(mLock);
18665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    mNotifyCount.clear();
18765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    mDataCount.clear();
18865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    mDataSize.clear();
18965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
19065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
19165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianbool MCameraClient::test(OP op, int v1, int v2) {
19265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    switch (op) {
19365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        case EQ: return v1 == v2;
19465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        case GT: return v1 > v2;
19565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        case LT: return v1 < v2;
19665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        case GE: return v1 >= v2;
19765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        case LE: return v1 <= v2;
19865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        default: ASSERT(0); break;
19965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }
20065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    return false;
20165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
20265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
20365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid MCameraClient::assertTest(OP op, int v1, int v2) {
20465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    if (!test(op, v1, v2)) {
20565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        LOGE("assertTest failed: op=%d, v1=%d, v2=%d", op, v1, v2);
20665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        ASSERT(0);
20765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }
20865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
20965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
21065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid MCameraClient::assertNotify(int32_t msgType, OP op, int count) {
21165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    Mutex::Autolock _l(mLock);
21265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    int v = mNotifyCount.valueFor(msgType);
21365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    assertTest(op, v, count);
21465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
21565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
21665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid MCameraClient::assertData(int32_t msgType, OP op, int count) {
21765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    Mutex::Autolock _l(mLock);
21865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    int v = mDataCount.valueFor(msgType);
21965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    assertTest(op, v, count);
22065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
22165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
22265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid MCameraClient::assertDataSize(int32_t msgType, OP op, int dataSize) {
22365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    Mutex::Autolock _l(mLock);
22465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    int v = mDataSize.valueFor(msgType);
22565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    assertTest(op, v, dataSize);
22665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
22765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
22865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid MCameraClient::notifyCallback(int32_t msgType, int32_t ext1, int32_t ext2) {
22965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    INFO("%s", __func__);
23065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    Mutex::Autolock _l(mLock);
23165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    ssize_t i = mNotifyCount.indexOfKey(msgType);
23265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    if (i < 0) {
23365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        mNotifyCount.add(msgType, 1);
23465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    } else {
23565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        ++mNotifyCount.editValueAt(i);
23665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }
23765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    mCond.signal();
23865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
23965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
24065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid MCameraClient::dataCallback(int32_t msgType, const sp<IMemory>& data) {
24165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    INFO("%s", __func__);
24265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    int dataSize = data->size();
24365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    INFO("data type = %d, size = %d", msgType, dataSize);
24465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    Mutex::Autolock _l(mLock);
24565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    ssize_t i = mDataCount.indexOfKey(msgType);
24665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    if (i < 0) {
24765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        mDataCount.add(msgType, 1);
24865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        mDataSize.add(msgType, dataSize);
24965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    } else {
25065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        ++mDataCount.editValueAt(i);
25165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        mDataSize.editValueAt(i) = dataSize;
25265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }
25365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    mCond.signal();
25465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
25565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    if (msgType == CAMERA_MSG_VIDEO_FRAME) {
25665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        ASSERT(mReleaser != NULL);
25765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        mReleaser->releaseRecordingFrame(data);
25865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }
25965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
26065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
26165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid MCameraClient::dataCallbackTimestamp(nsecs_t timestamp, int32_t msgType,
26265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        const sp<IMemory>& data) {
26365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    dataCallback(msgType, data);
26465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
26565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
26665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid MCameraClient::waitNotify(int32_t msgType, OP op, int count) {
26765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    INFO("waitNotify: %d, %d, %d", msgType, op, count);
26865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    Mutex::Autolock _l(mLock);
26965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    while (true) {
27065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        int v = mNotifyCount.valueFor(msgType);
27165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        if (test(op, v, count)) {
27265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            break;
27365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        }
27465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        mCond.wait(mLock);
27565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }
27665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
27765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
27865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid MCameraClient::waitData(int32_t msgType, OP op, int count) {
27965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    INFO("waitData: %d, %d, %d", msgType, op, count);
28065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    Mutex::Autolock _l(mLock);
28165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    while (true) {
28265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        int v = mDataCount.valueFor(msgType);
28365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        if (test(op, v, count)) {
28465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            break;
28565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        }
28665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        mCond.wait(mLock);
28765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }
28865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
28965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
29065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian//
29165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian//  A mock Surface
29265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian//
29365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianclass MSurface : public BnSurface {
29465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianpublic:
29565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    virtual status_t registerBuffers(const BufferHeap& buffers);
29665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    virtual void postBuffer(ssize_t offset);
29765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    virtual void unregisterBuffers();
29865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    virtual sp<OverlayRef> createOverlay(
29965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            uint32_t w, uint32_t h, int32_t format, int32_t orientation);
30065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    virtual sp<GraphicBuffer> requestBuffer(int bufferIdx, int usage);
30165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    virtual status_t setBufferCount(int bufferCount);
30265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
30365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    // new functions
30465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    void clearStat();
30565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    void waitUntil(int c0, int c1, int c2);
30665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
30765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianprivate:
30865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    // check callback count
30965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    Condition mCond;
31065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    Mutex mLock;
31165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    int registerBuffersCount;
31265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    int postBufferCount;
31365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    int unregisterBuffersCount;
31465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian};
31565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
31665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianstatus_t MSurface::registerBuffers(const BufferHeap& buffers) {
31765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    INFO("%s", __func__);
31865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    Mutex::Autolock _l(mLock);
31965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    ++registerBuffersCount;
32065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    mCond.signal();
32165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    return NO_ERROR;
32265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
32365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
32465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid MSurface::postBuffer(ssize_t offset) {
32565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    // INFO("%s", __func__);
32665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    Mutex::Autolock _l(mLock);
32765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    ++postBufferCount;
32865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    mCond.signal();
32965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
33065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
33165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid MSurface::unregisterBuffers() {
33265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    INFO("%s", __func__);
33365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    Mutex::Autolock _l(mLock);
33465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    ++unregisterBuffersCount;
33565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    mCond.signal();
33665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
33765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
33865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopiansp<GraphicBuffer> MSurface::requestBuffer(int bufferIdx, int usage) {
33965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    INFO("%s", __func__);
34065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    return NULL;
34165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
34265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
34365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianstatus_t MSurface::setBufferCount(int bufferCount) {
34465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    INFO("%s", __func__);
34565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    return NULL;
34665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
34765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
34865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid MSurface::clearStat() {
34965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    Mutex::Autolock _l(mLock);
35065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    registerBuffersCount = 0;
35165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    postBufferCount = 0;
35265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    unregisterBuffersCount = 0;
35365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
35465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
35565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid MSurface::waitUntil(int c0, int c1, int c2) {
35665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    INFO("waitUntil: %d %d %d", c0, c1, c2);
35765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    Mutex::Autolock _l(mLock);
35865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    while (true) {
35965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        if (registerBuffersCount >= c0 &&
36065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            postBufferCount >= c1 &&
36165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            unregisterBuffersCount >= c2) {
36265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            break;
36365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        }
36465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        mCond.wait(mLock);
36565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }
36665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
36765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
36865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopiansp<OverlayRef> MSurface::createOverlay(uint32_t w, uint32_t h, int32_t format,
36965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        int32_t orientation) {
37065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    // Not implemented.
37165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    ASSERT(0);
37265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    return NULL;
37365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
37465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
37565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian//
37665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian//  Utilities to use the Holder service
37765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian//
37865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopiansp<IHolder> getHolder() {
37965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    sp<IServiceManager> sm = defaultServiceManager();
38065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    ASSERT(sm != 0);
38165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    sp<IBinder> binder = sm->getService(String16("CameraServiceTest.Holder"));
38265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    ASSERT(binder != 0);
38365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    sp<IHolder> holder = interface_cast<IHolder>(binder);
38465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    ASSERT(holder != 0);
38565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    return holder;
38665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
38765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
38865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid putTempObject(sp<IBinder> obj) {
38965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    INFO("%s", __func__);
39065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    getHolder()->put(obj);
39165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
39265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
39365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopiansp<IBinder> getTempObject() {
39465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    INFO("%s", __func__);
39565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    return getHolder()->get();
39665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
39765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
39865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid clearTempObject() {
39965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    INFO("%s", __func__);
40065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    getHolder()->clear();
40165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
40265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
40365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian//
40465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian//  Get a Camera Service
40565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian//
40665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopiansp<ICameraService> getCameraService() {
40765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    sp<IServiceManager> sm = defaultServiceManager();
40865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    ASSERT(sm != 0);
40965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    sp<IBinder> binder = sm->getService(String16("media.camera"));
41065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    ASSERT(binder != 0);
41165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    sp<ICameraService> cs = interface_cast<ICameraService>(binder);
41265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    ASSERT(cs != 0);
41365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    return cs;
41465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
41565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
41665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianint getNumberOfCameras() {
41765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    sp<ICameraService> cs = getCameraService();
41865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    return cs->getNumberOfCameras();
41965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
42065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
42165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian//
42265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian// Various Connect Tests
42365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian//
42465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid testConnect(int cameraId) {
42565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    INFO("%s", __func__);
42665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    sp<ICameraService> cs = getCameraService();
42765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    sp<MCameraClient> cc = new MCameraClient();
42865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    sp<ICamera> c = cs->connect(cc, cameraId);
42965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    ASSERT(c != 0);
43065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    c->disconnect();
43165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
43265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
43365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid testAllowConnectOnceOnly(int cameraId) {
43465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    INFO("%s", __func__);
43565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    sp<ICameraService> cs = getCameraService();
43665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    // Connect the first client.
43765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    sp<MCameraClient> cc = new MCameraClient();
43865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    sp<ICamera> c = cs->connect(cc, cameraId);
43965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    ASSERT(c != 0);
44065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    // Same client -- ok.
44165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    ASSERT(cs->connect(cc, cameraId) != 0);
44265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    // Different client -- not ok.
44365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    sp<MCameraClient> cc2 = new MCameraClient();
44465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    ASSERT(cs->connect(cc2, cameraId) == 0);
44565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    c->disconnect();
44665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
44765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
44865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid testReconnectFailed() {
44965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    INFO("%s", __func__);
45065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    sp<ICamera> c = interface_cast<ICamera>(getTempObject());
45165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    sp<MCameraClient> cc = new MCameraClient();
45265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    ASSERT(c->connect(cc) != NO_ERROR);
45365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
45465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
45565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid testReconnectSuccess() {
45665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    INFO("%s", __func__);
45765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    sp<ICamera> c = interface_cast<ICamera>(getTempObject());
45865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    sp<MCameraClient> cc = new MCameraClient();
45965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    ASSERT(c->connect(cc) == NO_ERROR);
46065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    c->disconnect();
46165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
46265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
46365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid testLockFailed() {
46465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    INFO("%s", __func__);
46565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    sp<ICamera> c = interface_cast<ICamera>(getTempObject());
46665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    ASSERT(c->lock() != NO_ERROR);
46765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
46865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
46965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid testLockUnlockSuccess() {
47065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    INFO("%s", __func__);
47165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    sp<ICamera> c = interface_cast<ICamera>(getTempObject());
47265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    ASSERT(c->lock() == NO_ERROR);
47365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    ASSERT(c->unlock() == NO_ERROR);
47465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
47565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
47665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid testLockSuccess() {
47765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    INFO("%s", __func__);
47865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    sp<ICamera> c = interface_cast<ICamera>(getTempObject());
47965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    ASSERT(c->lock() == NO_ERROR);
48065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    c->disconnect();
48165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
48265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
48365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian//
48465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian// Run the connect tests in another process.
48565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian//
48665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianconst char *gExecutable;
48765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
48865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianstruct FunctionTableEntry {
48965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    const char *name;
49065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    void (*func)();
49165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian};
49265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
49365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias AgopianFunctionTableEntry function_table[] = {
49465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#define ENTRY(x) {#x, &x}
49565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    ENTRY(testReconnectFailed),
49665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    ENTRY(testReconnectSuccess),
49765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    ENTRY(testLockUnlockSuccess),
49865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    ENTRY(testLockFailed),
49965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    ENTRY(testLockSuccess),
50065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#undef ENTRY
50165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian};
50265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
50365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid runFunction(const char *tag) {
50465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    INFO("runFunction: %s", tag);
50565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    int entries = sizeof(function_table) / sizeof(function_table[0]);
50665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    for (int i = 0; i < entries; i++) {
50765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        if (strcmp(function_table[i].name, tag) == 0) {
50865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            (*function_table[i].func)();
50965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            return;
51065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        }
51165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }
51265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    ASSERT(0);
51365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
51465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
51565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid runInAnotherProcess(const char *tag) {
51665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    pid_t pid = fork();
51765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    if (pid == 0) {
51865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        execlp(gExecutable, gExecutable, tag, NULL);
51965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        ASSERT(0);
52065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    } else {
52165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        int status;
52265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        ASSERT_EQ(pid, wait(&status));
52365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        ASSERT_EQ(0, status);
52465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }
52565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
52665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
52765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid testReconnect(int cameraId) {
52865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    INFO("%s", __func__);
52965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    sp<ICameraService> cs = getCameraService();
53065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    sp<MCameraClient> cc = new MCameraClient();
53165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    sp<ICamera> c = cs->connect(cc, cameraId);
53265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    ASSERT(c != 0);
53365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    // Reconnect to the same client -- ok.
53465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    ASSERT(c->connect(cc) == NO_ERROR);
53565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    // Reconnect to a different client (but the same pid) -- ok.
53665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    sp<MCameraClient> cc2 = new MCameraClient();
53765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    ASSERT(c->connect(cc2) == NO_ERROR);
53865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    c->disconnect();
53965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    cc->assertNotify(CAMERA_MSG_ERROR, MCameraClient::EQ, 0);
54065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
54165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
54265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid testLockUnlock(int cameraId) {
54365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    sp<ICameraService> cs = getCameraService();
54465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    sp<MCameraClient> cc = new MCameraClient();
54565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    sp<ICamera> c = cs->connect(cc, cameraId);
54665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    ASSERT(c != 0);
54765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    // We can lock as many times as we want.
54865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    ASSERT(c->lock() == NO_ERROR);
54965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    ASSERT(c->lock() == NO_ERROR);
55065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    // Lock from a different process -- not ok.
55165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    putTempObject(c->asBinder());
55265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    runInAnotherProcess("testLockFailed");
55365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    // Unlock then lock from a different process -- ok.
55465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    ASSERT(c->unlock() == NO_ERROR);
55565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    runInAnotherProcess("testLockUnlockSuccess");
55665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    // Unlock then lock from a different process -- ok.
55765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    runInAnotherProcess("testLockSuccess");
55865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    clearTempObject();
55965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
56065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
56165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid testReconnectFromAnotherProcess(int cameraId) {
56265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    INFO("%s", __func__);
56365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
56465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    sp<ICameraService> cs = getCameraService();
56565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    sp<MCameraClient> cc = new MCameraClient();
56665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    sp<ICamera> c = cs->connect(cc, cameraId);
56765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    ASSERT(c != 0);
56865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    // Reconnect from a different process -- not ok.
56965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    putTempObject(c->asBinder());
57065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    runInAnotherProcess("testReconnectFailed");
57165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    // Unlock then reconnect from a different process -- ok.
57265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    ASSERT(c->unlock() == NO_ERROR);
57365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    runInAnotherProcess("testReconnectSuccess");
57465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    clearTempObject();
57565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
57665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
57765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian// We need to flush the command buffer after the reference
57865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian// to ICamera is gone. The sleep is for the server to run
57965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian// the destructor for it.
58065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianstatic void flushCommands() {
58165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    IPCThreadState::self()->flushCommands();
58265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    usleep(200000);  // 200ms
58365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
58465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
58565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian// Run a test case
58665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#define RUN(class_name, cameraId) do { \
58765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    { \
58865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        INFO(#class_name); \
58965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        class_name instance; \
59065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        instance.init(cameraId); \
59165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        instance.run(); \
59265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    } \
59365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    flushCommands(); \
59465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian} while(0)
59565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
59665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian// Base test case after the the camera is connected.
59765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianclass AfterConnect {
59865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianpublic:
59965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    void init(int cameraId) {
60065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        cs = getCameraService();
60165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        cc = new MCameraClient();
60265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        c = cs->connect(cc, cameraId);
60365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        ASSERT(c != 0);
60465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }
60565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
60665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianprotected:
60765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    sp<ICameraService> cs;
60865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    sp<MCameraClient> cc;
60965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    sp<ICamera> c;
61065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
61165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    ~AfterConnect() {
61265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        c->disconnect();
61365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        c.clear();
61465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        cc.clear();
61565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        cs.clear();
61665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }
61765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian};
61865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
61965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianclass TestSetPreviewDisplay : public AfterConnect {
62065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianpublic:
62165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    void run() {
62265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        sp<MSurface> surface = new MSurface();
62365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        ASSERT(c->setPreviewDisplay(surface) == NO_ERROR);
62465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        c->disconnect();
62565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        cc->assertNotify(CAMERA_MSG_ERROR, MCameraClient::EQ, 0);
62665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }
62765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian};
62865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
62965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianclass TestStartPreview : public AfterConnect {
63065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianpublic:
63165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    void run() {
63265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        sp<MSurface> surface = new MSurface();
63365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        ASSERT(c->setPreviewDisplay(surface) == NO_ERROR);
63465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
63565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        ASSERT(c->startPreview() == NO_ERROR);
63665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        ASSERT(c->previewEnabled() == true);
63765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
63865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        surface->waitUntil(1, 10, 0); // needs 1 registerBuffers and 10 postBuffer
63965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        surface->clearStat();
64065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
64165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        sp<MSurface> another_surface = new MSurface();
64265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        c->setPreviewDisplay(another_surface);  // just to make sure unregisterBuffers
64365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                                                // is called.
64465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        surface->waitUntil(0, 0, 1);  // needs unregisterBuffers
64565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
64665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        cc->assertNotify(CAMERA_MSG_ERROR, MCameraClient::EQ, 0);
64765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }
64865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian};
64965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
65065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianclass TestStartPreviewWithoutDisplay : public AfterConnect {
65165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianpublic:
65265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    void run() {
65365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        ASSERT(c->startPreview() == NO_ERROR);
65465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        ASSERT(c->previewEnabled() == true);
65565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        c->disconnect();
65665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        cc->assertNotify(CAMERA_MSG_ERROR, MCameraClient::EQ, 0);
65765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }
65865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian};
65965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
66065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian// Base test case after the the camera is connected and the preview is started.
66165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianclass AfterStartPreview : public AfterConnect {
66265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianpublic:
66365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    void init(int cameraId) {
66465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        AfterConnect::init(cameraId);
66565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        surface = new MSurface();
66665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        ASSERT(c->setPreviewDisplay(surface) == NO_ERROR);
66765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        ASSERT(c->startPreview() == NO_ERROR);
66865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }
66965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
67065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianprotected:
67165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    sp<MSurface> surface;
67265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
67365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    ~AfterStartPreview() {
67465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        surface.clear();
67565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }
67665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian};
67765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
67865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianclass TestAutoFocus : public AfterStartPreview {
67965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianpublic:
68065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    void run() {
68165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        cc->assertNotify(CAMERA_MSG_FOCUS, MCameraClient::EQ, 0);
68265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        c->autoFocus();
68365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        cc->waitNotify(CAMERA_MSG_FOCUS, MCameraClient::EQ, 1);
68465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        c->disconnect();
68565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        cc->assertNotify(CAMERA_MSG_ERROR, MCameraClient::EQ, 0);
68665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }
68765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian};
68865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
68965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianclass TestStopPreview : public AfterStartPreview {
69065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianpublic:
69165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    void run() {
69265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        ASSERT(c->previewEnabled() == true);
69365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        c->stopPreview();
69465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        ASSERT(c->previewEnabled() == false);
69565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        c->disconnect();
69665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        cc->assertNotify(CAMERA_MSG_ERROR, MCameraClient::EQ, 0);
69765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }
69865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian};
69965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
70065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianclass TestTakePicture: public AfterStartPreview {
70165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianpublic:
70265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    void run() {
70365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        ASSERT(c->takePicture() == NO_ERROR);
70465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        cc->waitNotify(CAMERA_MSG_SHUTTER, MCameraClient::EQ, 1);
70565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        cc->waitData(CAMERA_MSG_RAW_IMAGE, MCameraClient::EQ, 1);
70665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        cc->waitData(CAMERA_MSG_COMPRESSED_IMAGE, MCameraClient::EQ, 1);
70765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        c->stopPreview();
70865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        c->disconnect();
70965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        cc->assertNotify(CAMERA_MSG_ERROR, MCameraClient::EQ, 0);
71065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }
71165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian};
71265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
71365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianclass TestTakeMultiplePictures: public AfterStartPreview {
71465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianpublic:
71565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    void run() {
71665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        for (int i = 0; i < 10; i++) {
71765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            cc->clearStat();
71865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            ASSERT(c->takePicture() == NO_ERROR);
71965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            cc->waitNotify(CAMERA_MSG_SHUTTER, MCameraClient::EQ, 1);
72065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            cc->waitData(CAMERA_MSG_RAW_IMAGE, MCameraClient::EQ, 1);
72165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            cc->waitData(CAMERA_MSG_COMPRESSED_IMAGE, MCameraClient::EQ, 1);
72265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        }
72365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        c->disconnect();
72465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        cc->assertNotify(CAMERA_MSG_ERROR, MCameraClient::EQ, 0);
72565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }
72665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian};
72765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
72865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianclass TestGetParameters: public AfterStartPreview {
72965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianpublic:
73065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    void run() {
73165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        String8 param_str = c->getParameters();
73265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        INFO("%s", static_cast<const char*>(param_str));
73365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }
73465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian};
73565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
73665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianstatic bool getNextSize(const char **ptrS, int *w, int *h) {
73765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    const char *s = *ptrS;
73865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
73965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    // skip over ','
74065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    if (*s == ',') s++;
74165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
74265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    // remember start position in p
74365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    const char *p = s;
74465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    while (*s != '\0' && *s != 'x') {
74565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        s++;
74665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }
74765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    if (*s == '\0') return false;
74865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
74965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    // get the width
75065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    *w = atoi(p);
75165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
75265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    // skip over 'x'
75365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    ASSERT(*s == 'x');
75465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    p = s + 1;
75565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    while (*s != '\0' && *s != ',') {
75665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        s++;
75765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }
75865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
75965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    // get the height
76065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    *h = atoi(p);
76165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    *ptrS = s;
76265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    return true;
76365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
76465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
76565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianclass TestPictureSize : public AfterStartPreview {
76665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianpublic:
76765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    void checkOnePicture(int w, int h) {
76865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        const float rate = 0.9;  // byte per pixel limit
76965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        int pixels = w * h;
77065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
77165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        CameraParameters param(c->getParameters());
77265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        param.setPictureSize(w, h);
77365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        // disable thumbnail to get more accurate size.
77465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        param.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, 0);
77565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        param.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, 0);
77665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        c->setParameters(param.flatten());
77765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
77865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        cc->clearStat();
77965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        ASSERT(c->takePicture() == NO_ERROR);
78065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        cc->waitData(CAMERA_MSG_RAW_IMAGE, MCameraClient::EQ, 1);
78165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        //cc->assertDataSize(CAMERA_MSG_RAW_IMAGE, MCameraClient::EQ, pixels*3/2);
78265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        cc->waitData(CAMERA_MSG_COMPRESSED_IMAGE, MCameraClient::EQ, 1);
78365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        cc->assertDataSize(CAMERA_MSG_COMPRESSED_IMAGE, MCameraClient::LT,
78465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                int(pixels * rate));
78565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        cc->assertDataSize(CAMERA_MSG_COMPRESSED_IMAGE, MCameraClient::GT, 0);
78665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        cc->assertNotify(CAMERA_MSG_ERROR, MCameraClient::EQ, 0);
78765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }
78865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
78965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    void run() {
79065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        CameraParameters param(c->getParameters());
79165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        int w, h;
79265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        const char *s = param.get(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES);
79365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        while (getNextSize(&s, &w, &h)) {
79465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            LOGD("checking picture size %dx%d", w, h);
79565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            checkOnePicture(w, h);
79665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        }
79765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }
79865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian};
79965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
80065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianclass TestPreviewCallbackFlag : public AfterConnect {
80165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianpublic:
80265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    void run() {
80365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        sp<MSurface> surface = new MSurface();
80465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        ASSERT(c->setPreviewDisplay(surface) == NO_ERROR);
80565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
80665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        // Try all flag combinations.
80765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        for (int v = 0; v < 8; v++) {
80865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            LOGD("TestPreviewCallbackFlag: flag=%d", v);
80965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            usleep(100000); // sleep a while to clear the in-flight callbacks.
81065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            cc->clearStat();
81165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            c->setPreviewCallbackFlag(v);
81265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            ASSERT(c->previewEnabled() == false);
81365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            ASSERT(c->startPreview() == NO_ERROR);
81465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            ASSERT(c->previewEnabled() == true);
81565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            sleep(2);
81665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            c->stopPreview();
81765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            if ((v & FRAME_CALLBACK_FLAG_ENABLE_MASK) == 0) {
81865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                cc->assertData(CAMERA_MSG_PREVIEW_FRAME, MCameraClient::EQ, 0);
81965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            } else {
82065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                if ((v & FRAME_CALLBACK_FLAG_ONE_SHOT_MASK) == 0) {
82165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                    cc->assertData(CAMERA_MSG_PREVIEW_FRAME, MCameraClient::GE, 10);
82265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                } else {
82365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                    cc->assertData(CAMERA_MSG_PREVIEW_FRAME, MCameraClient::EQ, 1);
82465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                }
82565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            }
82665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        }
82765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }
82865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian};
82965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
83065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianclass TestRecording : public AfterConnect {
83165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianpublic:
83265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    void run() {
83365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        ASSERT(c->recordingEnabled() == false);
83465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        sp<MSurface> surface = new MSurface();
83565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        ASSERT(c->setPreviewDisplay(surface) == NO_ERROR);
83665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        c->setPreviewCallbackFlag(FRAME_CALLBACK_FLAG_ENABLE_MASK);
83765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        cc->setReleaser(c.get());
83865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        c->startRecording();
83965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        ASSERT(c->recordingEnabled() == true);
84065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        sleep(2);
84165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        c->stopRecording();
84265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        usleep(100000); // sleep a while to clear the in-flight callbacks.
84365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        cc->setReleaser(NULL);
84465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        cc->assertData(CAMERA_MSG_VIDEO_FRAME, MCameraClient::GE, 10);
84565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }
84665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian};
84765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
84865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianclass TestPreviewSize : public AfterStartPreview {
84965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianpublic:
85065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    void checkOnePicture(int w, int h) {
85165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        int size = w*h*3/2;  // should read from parameters
85265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
85365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        c->stopPreview();
85465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
85565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        CameraParameters param(c->getParameters());
85665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        param.setPreviewSize(w, h);
85765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        c->setPreviewCallbackFlag(FRAME_CALLBACK_FLAG_ENABLE_MASK);
85865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        c->setParameters(param.flatten());
85965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
86065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        c->startPreview();
86165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
86265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        cc->clearStat();
86365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        cc->waitData(CAMERA_MSG_PREVIEW_FRAME, MCameraClient::GE, 1);
86465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        cc->assertDataSize(CAMERA_MSG_PREVIEW_FRAME, MCameraClient::EQ, size);
86565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }
86665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
86765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    void run() {
86865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        CameraParameters param(c->getParameters());
86965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        int w, h;
87065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        const char *s = param.get(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES);
87165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        while (getNextSize(&s, &w, &h)) {
87265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            LOGD("checking preview size %dx%d", w, h);
87365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            checkOnePicture(w, h);
87465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        }
87565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }
87665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian};
87765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
87865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid runHolderService() {
87965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    defaultServiceManager()->addService(
88065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            String16("CameraServiceTest.Holder"), new HolderService());
88165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    ProcessState::self()->startThreadPool();
88265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
88365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
88465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianint main(int argc, char **argv)
88565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian{
88665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    if (argc != 1) {
88765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        runFunction(argv[1]);
88865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        return 0;
88965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }
89065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    INFO("CameraServiceTest start");
89165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    gExecutable = argv[0];
89265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    runHolderService();
89365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    int n = getNumberOfCameras();
89465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    INFO("%d Cameras available", n);
89565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
89665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    for (int id = 0; id < n; id++) {
89765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        INFO("Testing camera %d", id);
89865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        testConnect(id);                              flushCommands();
89965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        testAllowConnectOnceOnly(id);                 flushCommands();
90065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        testReconnect(id);                            flushCommands();
90165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        testLockUnlock(id);                           flushCommands();
90265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        testReconnectFromAnotherProcess(id);          flushCommands();
90365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
90465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        RUN(TestSetPreviewDisplay, id);
90565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        RUN(TestStartPreview, id);
90665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        RUN(TestStartPreviewWithoutDisplay, id);
90765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        RUN(TestAutoFocus, id);
90865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        RUN(TestStopPreview, id);
90965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        RUN(TestTakePicture, id);
91065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        RUN(TestTakeMultiplePictures, id);
91165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        RUN(TestGetParameters, id);
91265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        RUN(TestPictureSize, id);
91365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        RUN(TestPreviewCallbackFlag, id);
91465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        RUN(TestRecording, id);
91565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        RUN(TestPreviewSize, id);
91665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }
91765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
91865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    INFO("CameraServiceTest finished");
91965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
920