diff options
author | Mathias Agopian <mathias@google.com> | 2013-03-13 21:40:06 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2013-03-13 21:40:07 +0000 |
commit | 9dd73dd2634d41766e6cfd67edd96a018a8ad7d7 (patch) | |
tree | c58c8ce66a2ada523a251b4f4fe380bb7d6723dc | |
parent | 126568c7aeeb5570789e70a310477f44dbdbd885 (diff) | |
parent | 3eca0ac4428aa74f197a2a498d84490c4e30f11d (diff) | |
download | frameworks_av-9dd73dd2634d41766e6cfd67edd96a018a8ad7d7.zip frameworks_av-9dd73dd2634d41766e6cfd67edd96a018a8ad7d7.tar.gz frameworks_av-9dd73dd2634d41766e6cfd67edd96a018a8ad7d7.tar.bz2 |
Merge "remove CameraServiceTest which wasn't used" into jb-mr2-dev
4 files changed, 0 insertions, 1140 deletions
diff --git a/services/camera/tests/CameraServiceTest/Android.mk b/services/camera/tests/CameraServiceTest/Android.mk deleted file mode 100644 index 41b6f63..0000000 --- a/services/camera/tests/CameraServiceTest/Android.mk +++ /dev/null @@ -1,26 +0,0 @@ -LOCAL_PATH:= $(call my-dir) - -include $(CLEAR_VARS) - -LOCAL_SRC_FILES:= CameraServiceTest.cpp - -LOCAL_MODULE:= CameraServiceTest - -LOCAL_MODULE_TAGS := tests - -LOCAL_C_INCLUDES += \ - frameworks/av/libs - -LOCAL_CFLAGS := - -LOCAL_SHARED_LIBRARIES += \ - libbinder \ - libcutils \ - libutils \ - libui \ - libcamera_client \ - libgui - -# Disable it because the ISurface interface may change, and before we have a -# chance to fix this test, we don't want to break normal builds. -#include $(BUILD_EXECUTABLE) diff --git a/services/camera/tests/CameraServiceTest/CameraServiceTest.cpp b/services/camera/tests/CameraServiceTest/CameraServiceTest.cpp deleted file mode 100644 index e417b79..0000000 --- a/services/camera/tests/CameraServiceTest/CameraServiceTest.cpp +++ /dev/null @@ -1,924 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#define LOG_TAG "CameraServiceTest" - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <sys/types.h> -#include <sys/wait.h> -#include <unistd.h> -#include <camera/Camera.h> -#include <camera/CameraParameters.h> -#include <ui/GraphicBuffer.h> -#include <camera/ICamera.h> -#include <camera/ICameraClient.h> -#include <camera/ICameraService.h> -#include <binder/IPCThreadState.h> -#include <binder/IServiceManager.h> -#include <binder/ProcessState.h> -#include <utils/KeyedVector.h> -#include <utils/Log.h> -#include <utils/Vector.h> -#include <utils/threads.h> - -using namespace android; - -// -// Assertion and Logging utilities -// -#define INFO(...) \ - do { \ - printf(__VA_ARGS__); \ - printf("\n"); \ - ALOGD(__VA_ARGS__); \ - } while(0) - -void assert_fail(const char *file, int line, const char *func, const char *expr) { - INFO("assertion failed at file %s, line %d, function %s:", - file, line, func); - INFO("%s", expr); - abort(); -} - -void assert_eq_fail(const char *file, int line, const char *func, - const char *expr, int actual) { - INFO("assertion failed at file %s, line %d, function %s:", - file, line, func); - INFO("(expected) %s != (actual) %d", expr, actual); - abort(); -} - -#define ASSERT(e) \ - do { \ - if (!(e)) \ - assert_fail(__FILE__, __LINE__, __func__, #e); \ - } while(0) - -#define ASSERT_EQ(expected, actual) \ - do { \ - int _x = (actual); \ - if (_x != (expected)) \ - assert_eq_fail(__FILE__, __LINE__, __func__, #expected, _x); \ - } while(0) - -// -// Holder service for pass objects between processes. -// -class IHolder : public IInterface { -protected: - enum { - HOLDER_PUT = IBinder::FIRST_CALL_TRANSACTION, - HOLDER_GET, - HOLDER_CLEAR - }; -public: - DECLARE_META_INTERFACE(Holder); - - virtual void put(sp<IBinder> obj) = 0; - virtual sp<IBinder> get() = 0; - virtual void clear() = 0; -}; - -class BnHolder : public BnInterface<IHolder> { - virtual status_t onTransact(uint32_t code, - const Parcel& data, - Parcel* reply, - uint32_t flags = 0); -}; - -class BpHolder : public BpInterface<IHolder> { -public: - BpHolder(const sp<IBinder>& impl) - : BpInterface<IHolder>(impl) { - } - - virtual void put(sp<IBinder> obj) { - Parcel data, reply; - data.writeStrongBinder(obj); - remote()->transact(HOLDER_PUT, data, &reply, IBinder::FLAG_ONEWAY); - } - - virtual sp<IBinder> get() { - Parcel data, reply; - remote()->transact(HOLDER_GET, data, &reply); - return reply.readStrongBinder(); - } - - virtual void clear() { - Parcel data, reply; - remote()->transact(HOLDER_CLEAR, data, &reply); - } -}; - -IMPLEMENT_META_INTERFACE(Holder, "CameraServiceTest.Holder"); - -status_t BnHolder::onTransact( - uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) { - switch(code) { - case HOLDER_PUT: { - put(data.readStrongBinder()); - return NO_ERROR; - } break; - case HOLDER_GET: { - reply->writeStrongBinder(get()); - return NO_ERROR; - } break; - case HOLDER_CLEAR: { - clear(); - return NO_ERROR; - } break; - default: - return BBinder::onTransact(code, data, reply, flags); - } -} - -class HolderService : public BnHolder { - virtual void put(sp<IBinder> obj) { - mObj = obj; - } - virtual sp<IBinder> get() { - return mObj; - } - virtual void clear() { - mObj.clear(); - } -private: - sp<IBinder> mObj; -}; - -// -// A mock CameraClient -// -class MCameraClient : public BnCameraClient { -public: - virtual void notifyCallback(int32_t msgType, int32_t ext1, int32_t ext2); - virtual void dataCallback(int32_t msgType, const sp<IMemory>& data); - virtual void dataCallbackTimestamp(nsecs_t timestamp, - int32_t msgType, const sp<IMemory>& data); - - // new functions - void clearStat(); - enum OP { EQ, GE, LE, GT, LT }; - void assertNotify(int32_t msgType, OP op, int count); - void assertData(int32_t msgType, OP op, int count); - void waitNotify(int32_t msgType, OP op, int count); - void waitData(int32_t msgType, OP op, int count); - void assertDataSize(int32_t msgType, OP op, int dataSize); - - void setReleaser(ICamera *releaser) { - mReleaser = releaser; - } -private: - Mutex mLock; - Condition mCond; - DefaultKeyedVector<int32_t, int> mNotifyCount; - DefaultKeyedVector<int32_t, int> mDataCount; - DefaultKeyedVector<int32_t, int> mDataSize; - bool test(OP op, int v1, int v2); - void assertTest(OP op, int v1, int v2); - - ICamera *mReleaser; -}; - -void MCameraClient::clearStat() { - Mutex::Autolock _l(mLock); - mNotifyCount.clear(); - mDataCount.clear(); - mDataSize.clear(); -} - -bool MCameraClient::test(OP op, int v1, int v2) { - switch (op) { - case EQ: return v1 == v2; - case GT: return v1 > v2; - case LT: return v1 < v2; - case GE: return v1 >= v2; - case LE: return v1 <= v2; - default: ASSERT(0); break; - } - return false; -} - -void MCameraClient::assertTest(OP op, int v1, int v2) { - if (!test(op, v1, v2)) { - ALOGE("assertTest failed: op=%d, v1=%d, v2=%d", op, v1, v2); - ASSERT(0); - } -} - -void MCameraClient::assertNotify(int32_t msgType, OP op, int count) { - Mutex::Autolock _l(mLock); - int v = mNotifyCount.valueFor(msgType); - assertTest(op, v, count); -} - -void MCameraClient::assertData(int32_t msgType, OP op, int count) { - Mutex::Autolock _l(mLock); - int v = mDataCount.valueFor(msgType); - assertTest(op, v, count); -} - -void MCameraClient::assertDataSize(int32_t msgType, OP op, int dataSize) { - Mutex::Autolock _l(mLock); - int v = mDataSize.valueFor(msgType); - assertTest(op, v, dataSize); -} - -void MCameraClient::notifyCallback(int32_t msgType, int32_t ext1, int32_t ext2) { - INFO("%s", __func__); - Mutex::Autolock _l(mLock); - ssize_t i = mNotifyCount.indexOfKey(msgType); - if (i < 0) { - mNotifyCount.add(msgType, 1); - } else { - ++mNotifyCount.editValueAt(i); - } - mCond.signal(); -} - -void MCameraClient::dataCallback(int32_t msgType, const sp<IMemory>& data) { - INFO("%s", __func__); - int dataSize = data->size(); - INFO("data type = %d, size = %d", msgType, dataSize); - Mutex::Autolock _l(mLock); - ssize_t i = mDataCount.indexOfKey(msgType); - if (i < 0) { - mDataCount.add(msgType, 1); - mDataSize.add(msgType, dataSize); - } else { - ++mDataCount.editValueAt(i); - mDataSize.editValueAt(i) = dataSize; - } - mCond.signal(); - - if (msgType == CAMERA_MSG_VIDEO_FRAME) { - ASSERT(mReleaser != NULL); - mReleaser->releaseRecordingFrame(data); - } -} - -void MCameraClient::dataCallbackTimestamp(nsecs_t timestamp, int32_t msgType, - const sp<IMemory>& data) { - dataCallback(msgType, data); -} - -void MCameraClient::waitNotify(int32_t msgType, OP op, int count) { - INFO("waitNotify: %d, %d, %d", msgType, op, count); - Mutex::Autolock _l(mLock); - while (true) { - int v = mNotifyCount.valueFor(msgType); - if (test(op, v, count)) { - break; - } - mCond.wait(mLock); - } -} - -void MCameraClient::waitData(int32_t msgType, OP op, int count) { - INFO("waitData: %d, %d, %d", msgType, op, count); - Mutex::Autolock _l(mLock); - while (true) { - int v = mDataCount.valueFor(msgType); - if (test(op, v, count)) { - break; - } - mCond.wait(mLock); - } -} - -// -// A mock Surface -// -class MSurface : public BnSurface { -public: - virtual status_t registerBuffers(const BufferHeap& buffers); - virtual void postBuffer(ssize_t offset); - virtual void unregisterBuffers(); - virtual sp<GraphicBuffer> requestBuffer(int bufferIdx, int usage); - virtual status_t setBufferCount(int bufferCount); - - // new functions - void clearStat(); - void waitUntil(int c0, int c1, int c2); - -private: - // check callback count - Condition mCond; - Mutex mLock; - int registerBuffersCount; - int postBufferCount; - int unregisterBuffersCount; -}; - -status_t MSurface::registerBuffers(const BufferHeap& buffers) { - INFO("%s", __func__); - Mutex::Autolock _l(mLock); - ++registerBuffersCount; - mCond.signal(); - return NO_ERROR; -} - -void MSurface::postBuffer(ssize_t offset) { - // INFO("%s", __func__); - Mutex::Autolock _l(mLock); - ++postBufferCount; - mCond.signal(); -} - -void MSurface::unregisterBuffers() { - INFO("%s", __func__); - Mutex::Autolock _l(mLock); - ++unregisterBuffersCount; - mCond.signal(); -} - -sp<GraphicBuffer> MSurface::requestBuffer(int bufferIdx, int usage) { - INFO("%s", __func__); - return NULL; -} - -status_t MSurface::setBufferCount(int bufferCount) { - INFO("%s", __func__); - return NULL; -} - -void MSurface::clearStat() { - Mutex::Autolock _l(mLock); - registerBuffersCount = 0; - postBufferCount = 0; - unregisterBuffersCount = 0; -} - -void MSurface::waitUntil(int c0, int c1, int c2) { - INFO("waitUntil: %d %d %d", c0, c1, c2); - Mutex::Autolock _l(mLock); - while (true) { - if (registerBuffersCount >= c0 && - postBufferCount >= c1 && - unregisterBuffersCount >= c2) { - break; - } - mCond.wait(mLock); - } -} - -// -// Utilities to use the Holder service -// -sp<IHolder> getHolder() { - sp<IServiceManager> sm = defaultServiceManager(); - ASSERT(sm != 0); - sp<IBinder> binder = sm->getService(String16("CameraServiceTest.Holder")); - ASSERT(binder != 0); - sp<IHolder> holder = interface_cast<IHolder>(binder); - ASSERT(holder != 0); - return holder; -} - -void putTempObject(sp<IBinder> obj) { - INFO("%s", __func__); - getHolder()->put(obj); -} - -sp<IBinder> getTempObject() { - INFO("%s", __func__); - return getHolder()->get(); -} - -void clearTempObject() { - INFO("%s", __func__); - getHolder()->clear(); -} - -// -// Get a Camera Service -// -sp<ICameraService> getCameraService() { - sp<IServiceManager> sm = defaultServiceManager(); - ASSERT(sm != 0); - sp<IBinder> binder = sm->getService(String16("media.camera")); - ASSERT(binder != 0); - sp<ICameraService> cs = interface_cast<ICameraService>(binder); - ASSERT(cs != 0); - return cs; -} - -int getNumberOfCameras() { - sp<ICameraService> cs = getCameraService(); - return cs->getNumberOfCameras(); -} - -// -// Various Connect Tests -// -void testConnect(int cameraId) { - INFO("%s", __func__); - sp<ICameraService> cs = getCameraService(); - sp<MCameraClient> cc = new MCameraClient(); - sp<ICamera> c = cs->connect(cc, cameraId); - ASSERT(c != 0); - c->disconnect(); -} - -void testAllowConnectOnceOnly(int cameraId) { - INFO("%s", __func__); - sp<ICameraService> cs = getCameraService(); - // Connect the first client. - sp<MCameraClient> cc = new MCameraClient(); - sp<ICamera> c = cs->connect(cc, cameraId); - ASSERT(c != 0); - // Same client -- ok. - ASSERT(cs->connect(cc, cameraId) != 0); - // Different client -- not ok. - sp<MCameraClient> cc2 = new MCameraClient(); - ASSERT(cs->connect(cc2, cameraId) == 0); - c->disconnect(); -} - -void testReconnectFailed() { - INFO("%s", __func__); - sp<ICamera> c = interface_cast<ICamera>(getTempObject()); - sp<MCameraClient> cc = new MCameraClient(); - ASSERT(c->connect(cc) != NO_ERROR); -} - -void testReconnectSuccess() { - INFO("%s", __func__); - sp<ICamera> c = interface_cast<ICamera>(getTempObject()); - sp<MCameraClient> cc = new MCameraClient(); - ASSERT(c->connect(cc) == NO_ERROR); - c->disconnect(); -} - -void testLockFailed() { - INFO("%s", __func__); - sp<ICamera> c = interface_cast<ICamera>(getTempObject()); - ASSERT(c->lock() != NO_ERROR); -} - -void testLockUnlockSuccess() { - INFO("%s", __func__); - sp<ICamera> c = interface_cast<ICamera>(getTempObject()); - ASSERT(c->lock() == NO_ERROR); - ASSERT(c->unlock() == NO_ERROR); -} - -void testLockSuccess() { - INFO("%s", __func__); - sp<ICamera> c = interface_cast<ICamera>(getTempObject()); - ASSERT(c->lock() == NO_ERROR); - c->disconnect(); -} - -// -// Run the connect tests in another process. -// -const char *gExecutable; - -struct FunctionTableEntry { - const char *name; - void (*func)(); -}; - -FunctionTableEntry function_table[] = { -#define ENTRY(x) {#x, &x} - ENTRY(testReconnectFailed), - ENTRY(testReconnectSuccess), - ENTRY(testLockUnlockSuccess), - ENTRY(testLockFailed), - ENTRY(testLockSuccess), -#undef ENTRY -}; - -void runFunction(const char *tag) { - INFO("runFunction: %s", tag); - int entries = sizeof(function_table) / sizeof(function_table[0]); - for (int i = 0; i < entries; i++) { - if (strcmp(function_table[i].name, tag) == 0) { - (*function_table[i].func)(); - return; - } - } - ASSERT(0); -} - -void runInAnotherProcess(const char *tag) { - pid_t pid = fork(); - if (pid == 0) { - execlp(gExecutable, gExecutable, tag, NULL); - ASSERT(0); - } else { - int status; - ASSERT_EQ(pid, wait(&status)); - ASSERT_EQ(0, status); - } -} - -void testReconnect(int cameraId) { - INFO("%s", __func__); - sp<ICameraService> cs = getCameraService(); - sp<MCameraClient> cc = new MCameraClient(); - sp<ICamera> c = cs->connect(cc, cameraId); - ASSERT(c != 0); - // Reconnect to the same client -- ok. - ASSERT(c->connect(cc) == NO_ERROR); - // Reconnect to a different client (but the same pid) -- ok. - sp<MCameraClient> cc2 = new MCameraClient(); - ASSERT(c->connect(cc2) == NO_ERROR); - c->disconnect(); - cc->assertNotify(CAMERA_MSG_ERROR, MCameraClient::EQ, 0); -} - -void testLockUnlock(int cameraId) { - sp<ICameraService> cs = getCameraService(); - sp<MCameraClient> cc = new MCameraClient(); - sp<ICamera> c = cs->connect(cc, cameraId); - ASSERT(c != 0); - // We can lock as many times as we want. - ASSERT(c->lock() == NO_ERROR); - ASSERT(c->lock() == NO_ERROR); - // Lock from a different process -- not ok. - putTempObject(c->asBinder()); - runInAnotherProcess("testLockFailed"); - // Unlock then lock from a different process -- ok. - ASSERT(c->unlock() == NO_ERROR); - runInAnotherProcess("testLockUnlockSuccess"); - // Unlock then lock from a different process -- ok. - runInAnotherProcess("testLockSuccess"); - clearTempObject(); -} - -void testReconnectFromAnotherProcess(int cameraId) { - INFO("%s", __func__); - - sp<ICameraService> cs = getCameraService(); - sp<MCameraClient> cc = new MCameraClient(); - sp<ICamera> c = cs->connect(cc, cameraId); - ASSERT(c != 0); - // Reconnect from a different process -- not ok. - putTempObject(c->asBinder()); - runInAnotherProcess("testReconnectFailed"); - // Unlock then reconnect from a different process -- ok. - ASSERT(c->unlock() == NO_ERROR); - runInAnotherProcess("testReconnectSuccess"); - clearTempObject(); -} - -// We need to flush the command buffer after the reference -// to ICamera is gone. The sleep is for the server to run -// the destructor for it. -static void flushCommands() { - IPCThreadState::self()->flushCommands(); - usleep(200000); // 200ms -} - -// Run a test case -#define RUN(class_name, cameraId) do { \ - { \ - INFO(#class_name); \ - class_name instance; \ - instance.init(cameraId); \ - instance.run(); \ - } \ - flushCommands(); \ -} while(0) - -// Base test case after the the camera is connected. -class AfterConnect { -public: - void init(int cameraId) { - cs = getCameraService(); - cc = new MCameraClient(); - c = cs->connect(cc, cameraId); - ASSERT(c != 0); - } - -protected: - sp<ICameraService> cs; - sp<MCameraClient> cc; - sp<ICamera> c; - - ~AfterConnect() { - c->disconnect(); - c.clear(); - cc.clear(); - cs.clear(); - } -}; - -class TestSetPreviewDisplay : public AfterConnect { -public: - void run() { - sp<MSurface> surface = new MSurface(); - ASSERT(c->setPreviewDisplay(surface) == NO_ERROR); - c->disconnect(); - cc->assertNotify(CAMERA_MSG_ERROR, MCameraClient::EQ, 0); - } -}; - -class TestStartPreview : public AfterConnect { -public: - void run() { - sp<MSurface> surface = new MSurface(); - ASSERT(c->setPreviewDisplay(surface) == NO_ERROR); - - ASSERT(c->startPreview() == NO_ERROR); - ASSERT(c->previewEnabled() == true); - - surface->waitUntil(1, 10, 0); // needs 1 registerBuffers and 10 postBuffer - surface->clearStat(); - - sp<MSurface> another_surface = new MSurface(); - c->setPreviewDisplay(another_surface); // just to make sure unregisterBuffers - // is called. - surface->waitUntil(0, 0, 1); // needs unregisterBuffers - - cc->assertNotify(CAMERA_MSG_ERROR, MCameraClient::EQ, 0); - } -}; - -class TestStartPreviewWithoutDisplay : public AfterConnect { -public: - void run() { - ASSERT(c->startPreview() == NO_ERROR); - ASSERT(c->previewEnabled() == true); - c->disconnect(); - cc->assertNotify(CAMERA_MSG_ERROR, MCameraClient::EQ, 0); - } -}; - -// Base test case after the the camera is connected and the preview is started. -class AfterStartPreview : public AfterConnect { -public: - void init(int cameraId) { - AfterConnect::init(cameraId); - surface = new MSurface(); - ASSERT(c->setPreviewDisplay(surface) == NO_ERROR); - ASSERT(c->startPreview() == NO_ERROR); - } - -protected: - sp<MSurface> surface; - - ~AfterStartPreview() { - surface.clear(); - } -}; - -class TestAutoFocus : public AfterStartPreview { -public: - void run() { - cc->assertNotify(CAMERA_MSG_FOCUS, MCameraClient::EQ, 0); - c->autoFocus(); - cc->waitNotify(CAMERA_MSG_FOCUS, MCameraClient::EQ, 1); - c->disconnect(); - cc->assertNotify(CAMERA_MSG_ERROR, MCameraClient::EQ, 0); - } -}; - -class TestStopPreview : public AfterStartPreview { -public: - void run() { - ASSERT(c->previewEnabled() == true); - c->stopPreview(); - ASSERT(c->previewEnabled() == false); - c->disconnect(); - cc->assertNotify(CAMERA_MSG_ERROR, MCameraClient::EQ, 0); - } -}; - -class TestTakePicture: public AfterStartPreview { -public: - void run() { - ASSERT(c->takePicture() == NO_ERROR); - cc->waitNotify(CAMERA_MSG_SHUTTER, MCameraClient::EQ, 1); - cc->waitData(CAMERA_MSG_RAW_IMAGE, MCameraClient::EQ, 1); - cc->waitData(CAMERA_MSG_COMPRESSED_IMAGE, MCameraClient::EQ, 1); - c->stopPreview(); - c->disconnect(); - cc->assertNotify(CAMERA_MSG_ERROR, MCameraClient::EQ, 0); - } -}; - -class TestTakeMultiplePictures: public AfterStartPreview { -public: - void run() { - for (int i = 0; i < 10; i++) { - cc->clearStat(); - ASSERT(c->takePicture() == NO_ERROR); - cc->waitNotify(CAMERA_MSG_SHUTTER, MCameraClient::EQ, 1); - cc->waitData(CAMERA_MSG_RAW_IMAGE, MCameraClient::EQ, 1); - cc->waitData(CAMERA_MSG_COMPRESSED_IMAGE, MCameraClient::EQ, 1); - } - c->disconnect(); - cc->assertNotify(CAMERA_MSG_ERROR, MCameraClient::EQ, 0); - } -}; - -class TestGetParameters: public AfterStartPreview { -public: - void run() { - String8 param_str = c->getParameters(); - INFO("%s", static_cast<const char*>(param_str)); - } -}; - -static bool getNextSize(const char **ptrS, int *w, int *h) { - const char *s = *ptrS; - - // skip over ',' - if (*s == ',') s++; - - // remember start position in p - const char *p = s; - while (*s != '\0' && *s != 'x') { - s++; - } - if (*s == '\0') return false; - - // get the width - *w = atoi(p); - - // skip over 'x' - ASSERT(*s == 'x'); - p = s + 1; - while (*s != '\0' && *s != ',') { - s++; - } - - // get the height - *h = atoi(p); - *ptrS = s; - return true; -} - -class TestPictureSize : public AfterStartPreview { -public: - void checkOnePicture(int w, int h) { - const float rate = 0.9; // byte per pixel limit - int pixels = w * h; - - CameraParameters param(c->getParameters()); - param.setPictureSize(w, h); - // disable thumbnail to get more accurate size. - param.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, 0); - param.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, 0); - c->setParameters(param.flatten()); - - cc->clearStat(); - ASSERT(c->takePicture() == NO_ERROR); - cc->waitData(CAMERA_MSG_RAW_IMAGE, MCameraClient::EQ, 1); - //cc->assertDataSize(CAMERA_MSG_RAW_IMAGE, MCameraClient::EQ, pixels*3/2); - cc->waitData(CAMERA_MSG_COMPRESSED_IMAGE, MCameraClient::EQ, 1); - cc->assertDataSize(CAMERA_MSG_COMPRESSED_IMAGE, MCameraClient::LT, - int(pixels * rate)); - cc->assertDataSize(CAMERA_MSG_COMPRESSED_IMAGE, MCameraClient::GT, 0); - cc->assertNotify(CAMERA_MSG_ERROR, MCameraClient::EQ, 0); - } - - void run() { - CameraParameters param(c->getParameters()); - int w, h; - const char *s = param.get(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES); - while (getNextSize(&s, &w, &h)) { - ALOGD("checking picture size %dx%d", w, h); - checkOnePicture(w, h); - } - } -}; - -class TestPreviewCallbackFlag : public AfterConnect { -public: - void run() { - sp<MSurface> surface = new MSurface(); - ASSERT(c->setPreviewDisplay(surface) == NO_ERROR); - - // Try all flag combinations. - for (int v = 0; v < 8; v++) { - ALOGD("TestPreviewCallbackFlag: flag=%d", v); - usleep(100000); // sleep a while to clear the in-flight callbacks. - cc->clearStat(); - c->setPreviewCallbackFlag(v); - ASSERT(c->previewEnabled() == false); - ASSERT(c->startPreview() == NO_ERROR); - ASSERT(c->previewEnabled() == true); - sleep(2); - c->stopPreview(); - if ((v & CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK) == 0) { - cc->assertData(CAMERA_MSG_PREVIEW_FRAME, MCameraClient::EQ, 0); - } else { - if ((v & CAMERA_FRAME_CALLBACK_FLAG_ONE_SHOT_MASK) == 0) { - cc->assertData(CAMERA_MSG_PREVIEW_FRAME, MCameraClient::GE, 10); - } else { - cc->assertData(CAMERA_MSG_PREVIEW_FRAME, MCameraClient::EQ, 1); - } - } - } - } -}; - -class TestRecording : public AfterConnect { -public: - void run() { - ASSERT(c->recordingEnabled() == false); - sp<MSurface> surface = new MSurface(); - ASSERT(c->setPreviewDisplay(surface) == NO_ERROR); - c->setPreviewCallbackFlag(CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK); - cc->setReleaser(c.get()); - c->startRecording(); - ASSERT(c->recordingEnabled() == true); - sleep(2); - c->stopRecording(); - usleep(100000); // sleep a while to clear the in-flight callbacks. - cc->setReleaser(NULL); - cc->assertData(CAMERA_MSG_VIDEO_FRAME, MCameraClient::GE, 10); - } -}; - -class TestPreviewSize : public AfterStartPreview { -public: - void checkOnePicture(int w, int h) { - int size = w*h*3/2; // should read from parameters - - c->stopPreview(); - - CameraParameters param(c->getParameters()); - param.setPreviewSize(w, h); - c->setPreviewCallbackFlag(CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK); - c->setParameters(param.flatten()); - - c->startPreview(); - - cc->clearStat(); - cc->waitData(CAMERA_MSG_PREVIEW_FRAME, MCameraClient::GE, 1); - cc->assertDataSize(CAMERA_MSG_PREVIEW_FRAME, MCameraClient::EQ, size); - } - - void run() { - CameraParameters param(c->getParameters()); - int w, h; - const char *s = param.get(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES); - while (getNextSize(&s, &w, &h)) { - ALOGD("checking preview size %dx%d", w, h); - checkOnePicture(w, h); - } - } -}; - -void runHolderService() { - defaultServiceManager()->addService( - String16("CameraServiceTest.Holder"), new HolderService()); - ProcessState::self()->startThreadPool(); -} - -int main(int argc, char **argv) -{ - if (argc != 1) { - runFunction(argv[1]); - return 0; - } - INFO("CameraServiceTest start"); - gExecutable = argv[0]; - runHolderService(); - int n = getNumberOfCameras(); - INFO("%d Cameras available", n); - - for (int id = 0; id < n; id++) { - INFO("Testing camera %d", id); - testConnect(id); flushCommands(); - testAllowConnectOnceOnly(id); flushCommands(); - testReconnect(id); flushCommands(); - testLockUnlock(id); flushCommands(); - testReconnectFromAnotherProcess(id); flushCommands(); - - RUN(TestSetPreviewDisplay, id); - RUN(TestStartPreview, id); - RUN(TestStartPreviewWithoutDisplay, id); - RUN(TestAutoFocus, id); - RUN(TestStopPreview, id); - RUN(TestTakePicture, id); - RUN(TestTakeMultiplePictures, id); - RUN(TestGetParameters, id); - RUN(TestPictureSize, id); - RUN(TestPreviewCallbackFlag, id); - RUN(TestRecording, id); - RUN(TestPreviewSize, id); - } - - INFO("CameraServiceTest finished"); -} diff --git a/services/camera/tests/CameraServiceTest/MODULE_LICENSE_APACHE2 b/services/camera/tests/CameraServiceTest/MODULE_LICENSE_APACHE2 deleted file mode 100644 index e69de29..0000000 --- a/services/camera/tests/CameraServiceTest/MODULE_LICENSE_APACHE2 +++ /dev/null diff --git a/services/camera/tests/CameraServiceTest/NOTICE b/services/camera/tests/CameraServiceTest/NOTICE deleted file mode 100644 index c5b1efa..0000000 --- a/services/camera/tests/CameraServiceTest/NOTICE +++ /dev/null @@ -1,190 +0,0 @@ - - Copyright (c) 2005-2008, The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - |