Skip to content

Commit 51be974

Browse files
committed
Add Gtest support to test Camera-vhal API's
Introduce a property based on which instance id is taken for socket connection for Gtest purpose. Check for this property in camera-vhal and if this set then use the instance id that is set by property for Gtest else use the default one. Newly introduced property is ro.boot.container.testid. Add Unit TestCases for Camera-vhal in Gtest. Tracked-On: OAM-105831 Signed-off-by: Singh, Sapna1 <sapna1.singh@intel.com>
1 parent e37fbf0 commit 51be974

11 files changed

Lines changed: 433 additions & 7 deletions

Android.mk

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
LOCAL_PATH := $(call my-dir)
1919

2020
include $(CLEAR_VARS)
21-
2221
##################### Build camera-vhal #######################
2322

2423
LOCAL_MODULE := camera.$(TARGET_PRODUCT)
@@ -137,4 +136,4 @@ LOCAL_MODULE := camera.$(TARGET_PRODUCT).jpeg
137136
include $(BUILD_SHARED_LIBRARY)
138137

139138
######################################################
140-
139+
include $(LOCAL_PATH)/Gtest/Android.mk

Gtest/Android.mk

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
LOCAL_PATH:= $(call my-dir)
2+
include $(CLEAR_VARS)
3+
4+
LOCAL_LDLIBS += -landroid -llog
5+
LOCAL_CFLAGS += -fexceptions
6+
LOCAL_MODULE_TAGS:= optional
7+
8+
LOCAL_SRC_FILES := main.cpp CameraFixture.cpp streamer_simulation_camera_client.cpp
9+
LOCAL_SHARED_LIBRARIES += liblog libcutils libutils camera.cic_cloud libvhal-client
10+
LOCAL_MULTILIB := 64
11+
LOCAL_VENDOR_MODULE := true
12+
LOCAL_STATIC_LIBRARIES += libgtest_main libgtest libgmock android.hardware.camera.common@1.0-helper android.hardware.graphics.mapper@2.0
13+
14+
15+
LOCAL_CPPFLAGS := $(LOG_FLAGS) $(WARNING_LEVEL) $(DEBUG_FLAGS) $(VERSION_FLAGS)
16+
17+
LOCAL_C_INCLUDES += \
18+
$(LOCAL_PATH) \
19+
$(LOCAL_PATH)/../../libvhal-client \
20+
$(LOCAL_PATH)/../include \
21+
external/libjpeg-turbo \
22+
external/libexif \
23+
external/libyuv/files/include \
24+
frameworks/native/include/media/hardware \
25+
hardware/intel/libva \
26+
hardware/intel/onevpl/api/vpl \
27+
hardware/libhardware/modules/gralloc \
28+
$(LOCAL_PATH)/include \
29+
$(call include-path-for, camera) \
30+
external/gtest/include \
31+
external/gtest \
32+
bionic
33+
34+
LOCAL_MODULE:= CameraFixtureTest
35+
36+
include $(BUILD_EXECUTABLE)

Gtest/CameraFixture.cpp

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
#include <string>
2+
#include <list>
3+
#include <thread>
4+
#include <chrono>
5+
#include "CameraFixture.h"
6+
#include "ClientCommunicator.h"
7+
8+
using namespace std;
9+
using namespace android;
10+
using namespace std::chrono_literals;
11+
12+
13+
void CameraFixture::runStreamer(){
14+
cc.IsRunning = true;
15+
cc.startDummyStreamer();
16+
}
17+
18+
CameraFixture::CameraFixture()
19+
{
20+
SetCallback();
21+
t1 = new thread(&CameraFixture::runStreamer, this);
22+
this_thread::sleep_for(1500ms);
23+
std::vector<std::shared_ptr<ClientCommunicator>> mClientThread = gVirtualCameraFactory.getClientThread();
24+
client_thread = mClientThread[clientId];
25+
}
26+
27+
void CameraFixture::SetUp()
28+
{
29+
}
30+
31+
void CameraFixture::TearDown()
32+
{
33+
}
34+
35+
CameraFixture::~CameraFixture()
36+
{
37+
cc.IsRunning = false;
38+
t1->join();
39+
}
40+
41+
TEST_F(CameraFixture, ClientWithOneCamera)
42+
{
43+
ASSERT_EQ(NoCameraPresent, gVirtualCameraFactory.get_number_of_cameras());
44+
cc.RequestCameraCapability();
45+
cc.sendOneCameraConfig();
46+
this_thread::sleep_for(500ms);
47+
ASSERT_EQ(OneCameraClient, gVirtualCameraFactory.get_number_of_cameras());
48+
gVirtualCameraFactory.clearCameraInfo(clientId);
49+
}
50+
51+
TEST_F(CameraFixture, ClientWithTwoCamera)
52+
{
53+
cc.RequestCameraCapability();
54+
cc.sendTwoCameraConfig();
55+
this_thread::sleep_for(500ms);
56+
ASSERT_EQ(TwoCameraClient, gVirtualCameraFactory.get_number_of_cameras());
57+
gVirtualCameraFactory.clearCameraInfo(clientId);
58+
}
59+
60+
TEST_F(CameraFixture, ClientWithMultiCamera)
61+
{
62+
cc.RequestCameraCapability();
63+
cc.sendMultipleCameraConfig();
64+
this_thread::sleep_for(500ms);
65+
ASSERT_EQ(MultiCameraClient, gVirtualCameraFactory.get_number_of_cameras());
66+
gVirtualCameraFactory.clearCameraInfo(clientId);
67+
}
68+
69+
TEST_F(CameraFixture, CheckForCodecType)
70+
{
71+
ASSERT_EQ(ValidType, client_thread->IsCodecTypeValid((uint32_t)kH264));
72+
ASSERT_EQ(ValidType, client_thread->IsCodecTypeValid((uint32_t)kH265));
73+
ASSERT_EQ(InvalidType, client_thread->IsCodecTypeValid((uint32_t)WAV));
74+
}
75+
76+
TEST_F(CameraFixture, CheckForFacing)
77+
{
78+
ASSERT_EQ(ValidType, client_thread->IsCameraFacingValid((uint32_t)BACK_FACING));
79+
ASSERT_EQ(ValidType, client_thread->IsCameraFacingValid((uint32_t)FRONT_FACING));
80+
ASSERT_EQ(InvalidType, client_thread->IsCameraFacingValid((uint32_t)FRONTCORNER_FACING));
81+
}
82+
83+
TEST_F(CameraFixture, CheckForOrientation)
84+
{
85+
ASSERT_EQ(ValidType, client_thread->IsSensorOrientationValid((uint32_t)ORIENTATION_90));
86+
ASSERT_EQ(ValidType, client_thread->IsSensorOrientationValid((uint32_t)ORIENTATION_270));
87+
ASSERT_EQ(InvalidType, client_thread->IsSensorOrientationValid((uint32_t)ORIENTATION_360));
88+
}
89+
90+
TEST_F(CameraFixture, CheckForResolution)
91+
{
92+
ASSERT_EQ(ValidType, client_thread->IsResolutionValid((uint32_t)k720p));
93+
ASSERT_EQ(ValidType, client_thread->IsResolutionValid((uint32_t)k1080p));
94+
ASSERT_EQ(InvalidType, client_thread->IsResolutionValid((uint32_t)k2160p));
95+
}
96+
97+
TEST_F(CameraFixture, MultipleCameraCapReq)
98+
{
99+
cc.RequestCameraCapability();
100+
cc.RequestCameraCapability();
101+
cc.RequestCameraCapability();
102+
cc.sendMultipleCameraConfig();
103+
this_thread::sleep_for(500ms);
104+
ASSERT_EQ(TwoCameraClient, gVirtualCameraFactory.get_number_of_cameras());
105+
gVirtualCameraFactory.clearCameraInfo(clientId);
106+
}
107+

Gtest/CameraFixture.h

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
#include <stdio.h>
2+
#include <cstdlib>
3+
#include <thread>
4+
#include "gtest/gtest.h"
5+
#include "VirtualCameraFactory.h"
6+
#include "streamer_simulation_camera_client.h"
7+
8+
#define clientId 0
9+
#define OneCameraClient 1
10+
#define TwoCameraClient 2
11+
#define MultiCameraClient 2
12+
#define NoCameraPresent 0
13+
#define ValidType true
14+
#define InvalidType false
15+
#define kH264 1
16+
#define kH265 2
17+
#define WAV 5
18+
#define ORIENTATION_0 0
19+
#define ORIENTATION_90 90
20+
#define ORIENTATION_180 180
21+
#define ORIENTATION_270 270
22+
#define ORIENTATION_360 360
23+
#define k480p 1
24+
#define k720p 2
25+
#define k1080p 4
26+
#define k2160p 5
27+
#define BACK_FACING 0
28+
#define FRONT_FACING 1
29+
#define FRONTCORNER_FACING 2
30+
31+
/*! GTest for CameraHAL
32+
*
33+
* @author AEE team
34+
* @date January 04, 2023
35+
* @version 1.0.0.0
36+
* @attention
37+
*
38+
*/
39+
40+
using namespace android;
41+
class CameraFixture : public::testing::Test
42+
{
43+
public:
44+
/*! Creates an instance of CameraFixture */
45+
CameraFixture();
46+
47+
/*! Destroys an instance of CameraFixture */
48+
~CameraFixture();
49+
50+
virtual void SetUp();
51+
52+
virtual void TearDown();
53+
54+
CameraClient cc;
55+
std::thread* t1;
56+
std::shared_ptr<ClientCommunicator> client_thread;
57+
58+
private:
59+
/*! Disabled Copy Constructor */
60+
CameraFixture(const CameraFixture&);
61+
62+
/*! Disabled Assignment operator */
63+
CameraFixture& operator=(const CameraFixture&);
64+
65+
void runStreamer();
66+
67+
protected:
68+
static void test_camera_device_status_change(
69+
const struct camera_module_callbacks*, int /*camera_id*/,
70+
int /*new_status*/) {}
71+
72+
static void test_torch_mode_status_change(
73+
const struct camera_module_callbacks*, const char* /*camera_id*/,
74+
int /*new_status*/) {}
75+
76+
void SetCallback(){
77+
camera_module_callbacks_t* callbacks =
78+
(camera_module_callbacks_t*)malloc(sizeof(camera_module_callbacks_t));
79+
callbacks->camera_device_status_change = test_camera_device_status_change;
80+
callbacks->torch_mode_status_change = test_torch_mode_status_change;
81+
gVirtualCameraFactory.set_callbacks(callbacks);
82+
}
83+
84+
};
85+

Gtest/main.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
#include "CameraFixture.h"
2+
3+
using namespace std;
4+
5+
GTEST_API_ int main(int argc, char **argv)
6+
{
7+
setenv("TERM", "xterm-color", true);
8+
testing::InitGoogleTest(&argc, argv);
9+
10+
return RUN_ALL_TESTS();
11+
}
12+
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
#include "streamer_simulation_camera_client.h"
2+
3+
// Define the number of cameras that needs to supported.
4+
#define NUM_OF_CAMERAS_REQUESTED 1 // Max would be 2 for now.
5+
#define MAX_NUMBER_OF_CAMERAS 4
6+
using namespace std::chrono_literals;
7+
using namespace vhal::client;
8+
using namespace std;
9+
bool CameraClient::IsRunning = true;
10+
int CameraClient::startDummyStreamer()
11+
{
12+
string socket_path("/ipc");
13+
UnixConnectionInfo conn_info = { socket_path, instance_id };
14+
try {
15+
video_sink = make_shared<VideoSink>(conn_info,
16+
[&](const VideoSink::camera_config_cmd_t& ctrl_msg) {
17+
switch (ctrl_msg.cmd) {
18+
case VideoSink::camera_cmd_t::CMD_OPEN: {
19+
cout << "Received Open command from Camera VHal\n";
20+
break;
21+
}
22+
case VideoSink::camera_cmd_t::CMD_CLOSE:
23+
cout << "Received Close command from Camera VHal\n";
24+
exit(0);
25+
default:
26+
cout << "Unknown Command received, exiting with failure\n";
27+
exit(1);
28+
}
29+
});
30+
31+
} catch (const std::exception& ex) {
32+
cout << "VideoSink creation error :"
33+
<< ex.what() << endl;
34+
exit(1);
35+
}
36+
37+
cout << "Waiting Camera Open callback..\n";
38+
39+
while (!video_sink->IsConnected())
40+
this_thread::sleep_for(100ms);
41+
42+
// we need to be alive :)
43+
while (IsRunning) {
44+
this_thread::sleep_for(100ms);
45+
}
46+
return 0;
47+
}
48+
49+
bool CameraClient::IsConnected() {
50+
return video_sink->IsConnected();
51+
}
52+
53+
void CameraClient::RequestCameraCapability() {
54+
if(IsConnected()) {
55+
cout << "Calling GetCameraCapabilty..\n";
56+
video_sink->GetCameraCapabilty();
57+
}
58+
}
59+
60+
void CameraClient::sendOneCameraConfig() {
61+
int noOfCameras = 1;
62+
std::vector<VideoSink::camera_info_t> camera_info(noOfCameras);
63+
for (int i = 0; i < noOfCameras; i++) {
64+
camera_info[i].cameraId = i;
65+
camera_info[i].codec_type = VideoSink::VideoCodecType::kH264;
66+
camera_info[i].resolution = VideoSink::FrameResolution::k1080p;
67+
camera_info[i].sensorOrientation = VideoSink::SensorOrientation::ORIENTATION_0;
68+
camera_info[i].facing = VideoSink::CameraFacing::BACK_FACING;
69+
}
70+
71+
cout << "Calling SetCameraCapabilty..\n";
72+
video_sink->SetCameraCapabilty(camera_info);
73+
74+
cout << " Returning" << "\n";
75+
}
76+
77+
void CameraClient::sendTwoCameraConfig() {
78+
int noOfCameras = 2;
79+
std::vector<VideoSink::camera_info_t> camera_info(noOfCameras);
80+
for (int i = 0; i < noOfCameras; i++) {
81+
camera_info[i].cameraId = i;
82+
camera_info[i].codec_type = VideoSink::VideoCodecType::kH264;
83+
camera_info[i].resolution = (i==0) ? VideoSink::FrameResolution::k1080p : VideoSink::FrameResolution::k720p;
84+
camera_info[i].sensorOrientation = VideoSink::SensorOrientation::ORIENTATION_0;
85+
camera_info[i].facing = (i == 0) ? VideoSink::CameraFacing::BACK_FACING : VideoSink::CameraFacing::FRONT_FACING;
86+
}
87+
88+
cout << "Calling SetCameraCapabilty..\n";
89+
video_sink->SetCameraCapabilty(camera_info);
90+
91+
cout << " Returning" << "\n";
92+
}
93+
94+
void CameraClient::sendMultipleCameraConfig() {
95+
int noOfCameras = 4;
96+
std::vector<VideoSink::camera_info_t> camera_info(noOfCameras);
97+
for (int i = 0; i < noOfCameras; i++) {
98+
camera_info[i].cameraId = i;
99+
camera_info[i].codec_type = VideoSink::VideoCodecType::kH264;
100+
camera_info[i].resolution = (i==0) ? VideoSink::FrameResolution::k1080p : VideoSink::FrameResolution::k720p;
101+
camera_info[i].sensorOrientation = VideoSink::SensorOrientation::ORIENTATION_0;
102+
camera_info[i].facing = (i == 0) ? VideoSink::CameraFacing::BACK_FACING : VideoSink::CameraFacing::FRONT_FACING;
103+
}
104+
105+
cout << "Calling SetCameraCapabilty..\n";
106+
video_sink->SetCameraCapabilty(camera_info);
107+
108+
cout << " Returning" << "\n";
109+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
#include <iostream>
2+
#include "video_sink.h"
3+
#include <array>
4+
#include <atomic>
5+
#include <chrono>
6+
#include <fstream>
7+
#include <iostream>
8+
#include <memory>
9+
#include <string>
10+
#include <thread>
11+
#include <vector>
12+
13+
using namespace vhal::client;
14+
using namespace std;
15+
16+
class CameraClient {
17+
public :
18+
int startDummyStreamer();
19+
void RequestCameraCapability();
20+
void sendTwoCameraConfig();
21+
void sendOneCameraConfig();
22+
bool IsConnected();
23+
void sendMultipleCameraConfig();
24+
25+
static bool IsRunning;
26+
int instance_id = 10000;
27+
shared_ptr<VideoSink> video_sink;
28+
};

0 commit comments

Comments
 (0)