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