1 /*
2  * Copyright (C) 2019 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #define LOG_TAG "CameraDeviceTests"
18 #include <log/log.h>
19 
20 #include <camera_device.h>
21 #include <gtest/gtest.h>
22 #include <system/camera_metadata.h>
23 
24 #include "mock_device_hwl.h"
25 
26 namespace android {
27 namespace google_camera_hal {
28 
TEST(CameraDeviceTests,Create)29 TEST(CameraDeviceTests, Create) {
30   auto device = CameraDevice::Create(nullptr);
31   EXPECT_EQ(device, nullptr);
32 
33   auto mock_device_hwl = MockDeviceHwl::Create();
34   ASSERT_NE(mock_device_hwl, nullptr);
35 
36   device = CameraDevice::Create(std::move(mock_device_hwl));
37   EXPECT_NE(device, nullptr);
38 }
39 
TEST(CameraDeviceTests,GetPublicCameraId)40 TEST(CameraDeviceTests, GetPublicCameraId) {
41   auto mock_device_hwl = MockDeviceHwl::Create();
42   ASSERT_NE(mock_device_hwl, nullptr);
43 
44   uint32_t camera_id = 5;
45   mock_device_hwl->camera_id_ = camera_id;
46 
47   auto device = CameraDevice::Create(std::move(mock_device_hwl));
48   ASSERT_NE(device, nullptr);
49 
50   EXPECT_EQ(device->GetPublicCameraId(), camera_id);
51 }
52 
TestResourceCost(const CameraResourceCost & resource_cost)53 void TestResourceCost(const CameraResourceCost& resource_cost) {
54   auto mock_device_hwl = MockDeviceHwl::Create();
55   ASSERT_NE(mock_device_hwl, nullptr);
56 
57   mock_device_hwl->resource_cost_ = resource_cost;
58 
59   auto device = CameraDevice::Create(std::move(mock_device_hwl));
60   ASSERT_NE(device, nullptr);
61 
62   EXPECT_EQ(device->GetResourceCost(nullptr), BAD_VALUE);
63 
64   CameraResourceCost result_cost = {};
65   ASSERT_EQ(device->GetResourceCost(&result_cost), OK);
66   EXPECT_EQ(result_cost.resource_cost, resource_cost.resource_cost);
67   EXPECT_EQ(result_cost.conflicting_devices, resource_cost.conflicting_devices);
68 }
69 
TEST(CameraDeviceTests,GetResourceCost)70 TEST(CameraDeviceTests, GetResourceCost) {
71   TestResourceCost({
72       .resource_cost = 50,
73       .conflicting_devices = {1, 2, 3},
74   });
75 
76   TestResourceCost({
77       .resource_cost = 100,
78       .conflicting_devices = {},
79   });
80 }
81 
82 // TODO(b/138960498): Test GetCameraCharacteristics and
83 // GetPhysicalCameraCharacteristicsafter HalCameraMetadata supports setting and
84 // getting metadata.
85 
TEST(CameraDeviceTests,SetTorchMode)86 TEST(CameraDeviceTests, SetTorchMode) {
87   auto mock_device_hwl = MockDeviceHwl::Create();
88   ASSERT_NE(mock_device_hwl, nullptr);
89 
90   auto device = CameraDevice::Create(std::move(mock_device_hwl));
91   ASSERT_NE(device, nullptr);
92 
93   EXPECT_EQ(device->SetTorchMode(TorchMode::kOff), OK);
94   EXPECT_EQ(device->SetTorchMode(TorchMode::kOn), OK);
95 }
96 
TEST(CameraDeviceTests,DumpState)97 TEST(CameraDeviceTests, DumpState) {
98   auto mock_device_hwl = MockDeviceHwl::Create();
99   ASSERT_NE(mock_device_hwl, nullptr);
100 
101   std::string test_string = "CameraDeviceTests_DumpState";
102   mock_device_hwl->dump_string_ = "\n" + test_string + "\n";
103 
104   auto device = CameraDevice::Create(std::move(mock_device_hwl));
105   ASSERT_NE(device, nullptr);
106 
107   // Dump to an invalid file descriptor.
108   EXPECT_EQ(device->DumpState(-1), BAD_VALUE);
109 
110   std::FILE* f = std::tmpfile();
111   ASSERT_NE(f, nullptr);
112 
113   // Dump to a valid file descriptor.
114   EXPECT_EQ(device->DumpState(fileno(f)), OK);
115 
116   // Verify test_string exist in the file.
117   std::rewind(f);
118 
119   char line[512];
120   bool found_test_string = false;
121 
122   while (fgets(line, sizeof(line), f) != nullptr) {
123     if (std::string(line).find(test_string) != std::string::npos) {
124       found_test_string = true;
125     }
126   }
127 
128   fclose(f);
129 
130   EXPECT_EQ(found_test_string, true);
131 }
132 
TEST(CameraDeviceTests,CreateCameraDeviceSession)133 TEST(CameraDeviceTests, CreateCameraDeviceSession) {
134   auto mock_device_hwl = MockDeviceHwl::Create();
135   ASSERT_NE(mock_device_hwl, nullptr);
136 
137   auto device = CameraDevice::Create(std::move(mock_device_hwl));
138   ASSERT_NE(device, nullptr);
139 
140   std::unique_ptr<CameraDeviceSession> session[2];
141 
142   EXPECT_EQ(device->CreateCameraDeviceSession(nullptr), BAD_VALUE);
143 
144   EXPECT_EQ(device->CreateCameraDeviceSession(&session[0]), OK);
145   EXPECT_NE(session[0], nullptr);
146 
147   // Verify the session is valid after destroying the device.
148   device = nullptr;
149   EXPECT_EQ(session[0]->Flush(), OK);
150 
151   // TODO(b/121145153): Creating a second session should fail.
152 
153   // TODO(b/121145153): Creating a second session should succeed after
154   // destroying the first session.
155 }
156 
157 }  // namespace google_camera_hal
158 }  // namespace android
159