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