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,TurnOnTorchWithStrengthLevel)97 TEST(CameraDeviceTests, TurnOnTorchWithStrengthLevel) {
98 auto mock_device_hwl = MockDeviceHwl::Create();
99 ASSERT_NE(mock_device_hwl, nullptr);
100 int32_t new_torch_strength = 5;
101
102 auto device = CameraDevice::Create(std::move(mock_device_hwl));
103 ASSERT_NE(device, nullptr);
104
105 EXPECT_EQ(device->TurnOnTorchWithStrengthLevel(new_torch_strength), OK);
106 int32_t torch_strength = 0;
107 EXPECT_EQ(device->GetTorchStrengthLevel(torch_strength), OK);
108 EXPECT_EQ(torch_strength, new_torch_strength);
109 }
110
TEST(CameraDeviceTests,DumpState)111 TEST(CameraDeviceTests, DumpState) {
112 auto mock_device_hwl = MockDeviceHwl::Create();
113 ASSERT_NE(mock_device_hwl, nullptr);
114
115 std::string test_string = "CameraDeviceTests_DumpState";
116 mock_device_hwl->dump_string_ = "\n" + test_string + "\n";
117
118 auto device = CameraDevice::Create(std::move(mock_device_hwl));
119 ASSERT_NE(device, nullptr);
120
121 // Dump to an invalid file descriptor.
122 EXPECT_EQ(device->DumpState(-1), BAD_VALUE);
123
124 std::FILE* f = std::tmpfile();
125 ASSERT_NE(f, nullptr);
126
127 // Dump to a valid file descriptor.
128 EXPECT_EQ(device->DumpState(fileno(f)), OK);
129
130 // Verify test_string exist in the file.
131 std::rewind(f);
132
133 char line[512];
134 bool found_test_string = false;
135
136 while (fgets(line, sizeof(line), f) != nullptr) {
137 if (std::string(line).find(test_string) != std::string::npos) {
138 found_test_string = true;
139 }
140 }
141
142 fclose(f);
143
144 EXPECT_EQ(found_test_string, true);
145 }
146
TEST(CameraDeviceTests,CreateCameraDeviceSession)147 TEST(CameraDeviceTests, CreateCameraDeviceSession) {
148 auto mock_device_hwl = MockDeviceHwl::Create();
149 ASSERT_NE(mock_device_hwl, nullptr);
150
151 auto device = CameraDevice::Create(std::move(mock_device_hwl));
152 ASSERT_NE(device, nullptr);
153
154 std::unique_ptr<CameraDeviceSession> session[2];
155
156 EXPECT_EQ(device->CreateCameraDeviceSession(nullptr), BAD_VALUE);
157
158 EXPECT_EQ(device->CreateCameraDeviceSession(&session[0]), OK);
159 EXPECT_NE(session[0], nullptr);
160
161 // Verify the session is valid after destroying the device.
162 device = nullptr;
163 EXPECT_EQ(session[0]->Flush(), OK);
164
165 // TODO(b/121145153): Creating a second session should fail.
166
167 // TODO(b/121145153): Creating a second session should succeed after
168 // destroying the first session.
169 }
170
171 } // namespace google_camera_hal
172 } // namespace android
173