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 #ifndef HARDWARE_GOOGLE_CAMERA_HAL_TESTS_MOCK_DEVICE_SESSION_HWL_H_
18 #define HARDWARE_GOOGLE_CAMERA_HAL_TESTS_MOCK_DEVICE_SESSION_HWL_H_
19 
20 #include <camera_device_session.h>
21 #include <gmock/gmock.h>
22 
23 #include <vector>
24 
25 #include "profiler.h"
26 #include "session_data_defs.h"
27 
28 namespace android {
29 namespace google_camera_hal {
30 
31 // Defines a fake CameraDeviceSessionHwl to be called by MockDeviceSessionHwl.
32 class FakeCameraDeviceSessionHwl : public CameraDeviceSessionHwl {
33  public:
34   // Initialize a fake camera device session HWL for a camera ID.
35   // If physical_camera_ids is not empty, it will consist of the physical camera
36   // IDs.
37   FakeCameraDeviceSessionHwl(uint32_t camera_id,
38                              const std::vector<uint32_t>& physical_camera_ids);
39 
40   virtual ~FakeCameraDeviceSessionHwl() = default;
41 
42   status_t ConstructDefaultRequestSettings(
43       RequestTemplate type,
44       std::unique_ptr<HalCameraMetadata>* default_settings) override;
45 
46   status_t PrepareConfigureStreams(
47       const StreamConfiguration& request_config) override;
48 
49   status_t ConfigurePipeline(uint32_t camera_id,
50                              HwlPipelineCallback hwl_pipeline_callback,
51                              const StreamConfiguration& request_config,
52                              const StreamConfiguration& overall_config,
53                              uint32_t* pipeline_id) override;
54 
55   status_t BuildPipelines() override;
56 
57   // This fake method fills a few placeholder streams to streams.
58   // Currently only supports kOfflineSmoothTransitionRole.
59   status_t GetRequiredIntputStreams(const StreamConfiguration& overall_config,
60                                     HwlOfflinePipelineRole pipeline_role,
61                                     std::vector<Stream>* streams) override;
62 
PreparePipeline(uint32_t,uint32_t)63   status_t PreparePipeline(uint32_t /*pipeline_id*/, uint32_t /*frame_number*/) {
64     return OK;
65   }
66 
67   status_t GetConfiguredHalStream(
68       uint32_t pipeline_id, std::vector<HalStream>* hal_streams) const override;
69 
70   void DestroyPipelines() override;
71 
72   status_t SubmitRequests(uint32_t frame_number,
73                           std::vector<HwlPipelineRequest>& requests) override;
74 
75   status_t Flush() override;
76 
77   void RepeatingRequestEnd(int32_t frame_number,
78                            const std::vector<int32_t>& stream_ids) override;
79 
80   uint32_t GetCameraId() const override;
81 
82   std::vector<uint32_t> GetPhysicalCameraIds() const override;
83 
84   status_t GetCameraCharacteristics(
85       std::unique_ptr<HalCameraMetadata>* characteristics) const override;
86 
87   status_t GetPhysicalCameraCharacteristics(
88       uint32_t physical_camera_id,
89       std::unique_ptr<HalCameraMetadata>* characteristics) const override;
90 
91   void SetPhysicalCameraIds(const std::vector<uint32_t>& physical_camera_ids);
92 
93   status_t SetSessionData(SessionDataKey key, void* value) override;
94 
95   status_t GetSessionData(SessionDataKey key, void** value) const override;
96 
97   void SetSessionCallback(
98       const HwlSessionCallback& hwl_session_callback) override;
99 
100   status_t FilterResultMetadata(HalCameraMetadata* metadata) const override;
101 
102   std::unique_ptr<IMulticamCoordinatorHwl> CreateMulticamCoordinatorHwl();
103 
104   status_t IsReconfigurationRequired(
105       const HalCameraMetadata* old_session, const HalCameraMetadata* new_session,
106       bool* reconfiguration_required) const override;
107 
108   std::unique_ptr<ZoomRatioMapperHwl> GetZoomRatioMapperHwl() override;
109 
110   std::unique_ptr<google::camera_common::Profiler> GetProfiler(
111       uint32_t camera_id, int option) override;
112 
113  private:
114   const uint32_t kCameraId;
115   const std::vector<uint32_t> kPhysicalCameraIds;
116 
117   mutable std::mutex hwl_pipeline_lock_;
118 
119   // Maps from pipeline ID to HWL pipeline callback.
120   // Protected by hwl_pipeline_lock_.
121   std::unordered_map<uint32_t, HwlPipelineCallback> hwl_pipeline_callbacks_;
122 
123   // Maps from pipeline ID to HAL streams. Protected by hwl_pipeline_lock_.
124   std::unordered_map<uint32_t, std::vector<HalStream>> pipeline_hal_streams_map_;
125 };
126 
127 // Defines a CameraDeviceSessionHwl mock using gmock.
128 class MockDeviceSessionHwl : public CameraDeviceSessionHwl {
129  public:
130   // Initialize a mock camera device session HWL for a camera ID.
131   // If physical_camera_ids is not empty, it will consist of the physical camera
132   // IDs.
133   MockDeviceSessionHwl(uint32_t camera_id = 3,
134                        const std::vector<uint32_t>& physical_camera_ids =
135                            std::vector<uint32_t>());
136 
137   MOCK_METHOD2(ConstructDefaultRequestSettings,
138                status_t(RequestTemplate type,
139                         std::unique_ptr<HalCameraMetadata>* default_settings));
140 
141   MOCK_METHOD5(ConfigurePipeline,
142                status_t(uint32_t camera_id,
143                         HwlPipelineCallback hwl_pipeline_callback,
144                         const StreamConfiguration& request_config,
145                         const StreamConfiguration& overall_config,
146                         uint32_t* pipeline_id));
147 
148   MOCK_METHOD0(BuildPipelines, status_t());
149 
150   MOCK_METHOD2(PreparePipeline,
151                status_t(uint32_t pipeline_id, uint32_t frame_number));
152 
153   MOCK_METHOD3(GetRequiredIntputStreams,
154                status_t(const StreamConfiguration& overall_config,
155                         HwlOfflinePipelineRole pipeline_role,
156                         std::vector<Stream>* streams));
157 
158   MOCK_CONST_METHOD2(GetConfiguredHalStream,
159                      status_t(uint32_t pipeline_id,
160                               std::vector<HalStream>* hal_streams));
161 
162   MOCK_METHOD0(DestroyPipelines, void());
163 
164   MOCK_METHOD2(SubmitRequests,
165                status_t(uint32_t frame_number,
166                         std::vector<HwlPipelineRequest>& requests));
167 
168   MOCK_METHOD0(Flush, status_t());
169 
170   MOCK_METHOD(void, RepeatingRequestEnd,
171               (int32_t frame_number, const std::vector<int32_t>& stream_ids),
172               (override));
173 
174   MOCK_CONST_METHOD0(GetCameraId, uint32_t());
175 
176   MOCK_CONST_METHOD0(GetPhysicalCameraIds, std::vector<uint32_t>());
177 
178   MOCK_CONST_METHOD1(
179       GetCameraCharacteristics,
180       status_t(std::unique_ptr<HalCameraMetadata>* characteristics));
181 
182   MOCK_CONST_METHOD2(
183       GetPhysicalCameraCharacteristics,
184       status_t(uint32_t physical_camera_id,
185                std::unique_ptr<HalCameraMetadata>* characteristics));
186 
187   MOCK_METHOD2(SetSessionData, status_t(SessionDataKey key, void* value));
188 
189   MOCK_CONST_METHOD2(GetSessionData, status_t(SessionDataKey key, void** value));
190 
191   MOCK_CONST_METHOD1(FilterResultMetadata,
192                      status_t(HalCameraMetadata* metadata));
193 
194   MOCK_METHOD1(PrepareConfigureStreams, status_t(const StreamConfiguration&));
195 
196   MOCK_METHOD1(SetSessionCallback,
197                void(const HwlSessionCallback& hwl_session_callback));
198 
199   MOCK_METHOD0(CreateMulticamCoordinatorHwl,
200                std::unique_ptr<IMulticamCoordinatorHwl>());
201 
202   MOCK_CONST_METHOD3(IsReconfigurationRequired,
203                      status_t(const HalCameraMetadata* old_session,
204                               const HalCameraMetadata* new_session,
205                               bool* reconfiguration_required));
206 
207   MOCK_METHOD0(GetZoomRatioMapperHwl, std::unique_ptr<ZoomRatioMapperHwl>());
208 
209   MOCK_METHOD2(GetProfiler, std::unique_ptr<google::camera_common::Profiler>(
210                                 uint32_t camera_id, int option));
211 
212   // Delegate all calls to FakeCameraDeviceSessionHwl.
213   void DelegateCallsToFakeSession();
214 
215  private:
216   FakeCameraDeviceSessionHwl fake_session_hwl_;
217 };
218 
219 }  // namespace google_camera_hal
220 }  // namespace android
221 
222 #endif  // HARDWARE_GOOGLE_CAMERA_HAL_TESTS_MOCK_DEVICE_SESSION_HWL_H_
223