blob: f83ab81871d62b897d69d21e18334732220e824c [file] [log] [blame]
Bryant Chandler32ca6382023-08-02 21:52:311// Copyright 2023 The Chromium Authors
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Bryant Chandlerd5890afb2023-09-11 19:12:135#include "components/media_effects/media_effects_service.h"
Bryant Chandler32ca6382023-08-02 21:52:316
Piotr Bialecki7a3cfb22024-07-31 04:53:247#include <memory>
Piotr Bialecki55f635a2025-01-10 20:04:228#include <optional>
Piotr Bialecki7a3cfb22024-07-31 04:53:249
10#include "base/containers/span.h"
11#include "base/files/file_path.h"
12#include "base/files/file_util.h"
13#include "base/files/scoped_temp_dir.h"
14#include "base/files/scoped_temp_file.h"
15#include "base/memory/weak_ptr.h"
16#include "base/observer_list.h"
Bryant Chandler32ca6382023-08-02 21:52:3117#include "base/run_loop.h"
18#include "base/test/test_future.h"
Piotr Bialecki7a3cfb22024-07-31 04:53:2419#include "components/media_effects/media_effects_model_provider.h"
Bryant Chandler2c84a6c2023-09-14 14:23:4320#include "components/user_prefs/test/test_browser_context_with_prefs.h"
Bryant Chandler32ca6382023-08-02 21:52:3121#include "content/public/test/browser_task_environment.h"
Piotr Bialeckic2c709d2024-03-27 21:04:0922#include "mojo/public/cpp/bindings/remote.h"
Piotr Bialecki5a6c9112024-09-20 01:51:5023#include "services/video_effects/public/cpp/video_effects_service_host.h"
Piotr Bialeckic2c709d2024-03-27 21:04:0924#include "services/video_effects/public/mojom/video_effects_processor.mojom.h"
25#include "services/video_effects/public/mojom/video_effects_service.mojom-forward.h"
26#include "services/video_effects/test/fake_video_effects_service.h"
Bryant Chandler32ca6382023-08-02 21:52:3127#include "testing/gtest/include/gtest/gtest.h"
28#include "ui/gfx/geometry/insets_f.h"
29
30namespace {
31
32constexpr char kDeviceId[] = "test_device";
ahmedmoussae5e4a4202025-01-24 01:16:3633constexpr char kDeviceId1[] = "test_device_1";
34constexpr char kDeviceId2[] = "test_device_2";
35constexpr char kDeviceId3[] = "test_device_3";
Bryant Chandler32ca6382023-08-02 21:52:3136
Bryant Chandler23896e32024-03-06 17:58:0337media::mojom::VideoEffectsConfigurationPtr GetConfigurationSync(
ahmedmoussa1d14f3c2025-01-24 01:17:3638 mojo::Remote<media::mojom::ReadonlyVideoEffectsManager>& effects_manager) {
Bryant Chandler23896e32024-03-06 17:58:0339 base::test::TestFuture<media::mojom::VideoEffectsConfigurationPtr>
Bryant Chandler32ca6382023-08-02 21:52:3140 output_configuration;
41 effects_manager->GetConfiguration(output_configuration.GetCallback());
42 return output_configuration.Take();
43}
44
ahmedmoussae5e4a4202025-01-24 01:16:3645void SetFramingSync(VideoEffectsManagerImpl& effects_manager,
46 float framing_padding_ratio) {
47 effects_manager.SetConfiguration(media::mojom::VideoEffectsConfiguration::New(
48 nullptr, nullptr,
49 media::mojom::Framing::New(gfx::InsetsF{framing_padding_ratio})));
Bryant Chandler32ca6382023-08-02 21:52:3150}
Piotr Bialecki7a3cfb22024-07-31 04:53:2451
52class FakeModelProvider : public MediaEffectsModelProvider {
53 public:
54 ~FakeModelProvider() override = default;
55
56 // MediaEffectsModelProvider:
57 void AddObserver(Observer* observer) override {
58 observers_.AddObserver(observer);
59 if (model_path_) {
Piotr Bialecki55f635a2025-01-10 20:04:2260 observer->OnBackgroundSegmentationModelUpdated(model_path_);
Piotr Bialecki7a3cfb22024-07-31 04:53:2461 }
62 }
63
64 void RemoveObserver(Observer* observer) override {
65 observers_.RemoveObserver(observer);
66 }
67
68 // Sets the model path and notifies observers about it:
Piotr Bialecki55f635a2025-01-10 20:04:2269 void SetModelPath(std::optional<base::FilePath> model_path) {
Piotr Bialecki7a3cfb22024-07-31 04:53:2470 model_path_ = std::move(model_path);
71 for (auto& observer : observers_) {
Piotr Bialecki55f635a2025-01-10 20:04:2272 observer.OnBackgroundSegmentationModelUpdated(model_path_);
Piotr Bialecki7a3cfb22024-07-31 04:53:2473 }
74 }
75
76 base::WeakPtr<FakeModelProvider> weak_ptr() {
77 return weak_ptr_factory_.GetWeakPtr();
78 }
79
80 private:
81 base::ObserverList<Observer> observers_;
82 std::optional<base::FilePath> model_path_;
83
84 // Must be last:
85 base::WeakPtrFactory<FakeModelProvider> weak_ptr_factory_{this};
86};
87
Bryant Chandler32ca6382023-08-02 21:52:3188} // namespace
89
90class MediaEffectsServiceTest : public testing::Test {
Piotr Bialecki7a3cfb22024-07-31 04:53:2491 public:
92 MediaEffectsServiceTest() {
93 auto model_provider = std::make_unique<FakeModelProvider>();
94 model_provider_ = model_provider->weak_ptr();
95
96 service_.emplace(browser_context_.prefs(), std::move(model_provider));
97 }
98
Bryant Chandler32ca6382023-08-02 21:52:3199 protected:
Bryant Chandler32ca6382023-08-02 21:52:31100 content::BrowserTaskEnvironment task_environment_;
Bryant Chandler2c84a6c2023-09-14 14:23:43101 user_prefs::TestBrowserContextWithPrefs browser_context_;
Piotr Bialecki7a3cfb22024-07-31 04:53:24102 std::optional<MediaEffectsService> service_;
103 base::WeakPtr<FakeModelProvider> model_provider_;
Bryant Chandler32ca6382023-08-02 21:52:31104};
105
ahmedmoussa1d14f3c2025-01-24 01:17:36106TEST_F(MediaEffectsServiceTest, BindReadonlyVideoEffectsManager) {
107 mojo::Remote<media::mojom::ReadonlyVideoEffectsManager> effects_manager;
108 service_->BindReadonlyVideoEffectsManager(
Bryant Chandler32ca6382023-08-02 21:52:31109 kDeviceId, effects_manager.BindNewPipeAndPassReceiver());
110
111 EXPECT_TRUE(GetConfigurationSync(effects_manager)->framing.is_null());
112
113 const float kFramingPaddingRatio = 0.2;
ahmedmoussae5e4a4202025-01-24 01:16:36114 SetFramingSync(service_->GetOrCreateVideoEffectsManager(kDeviceId),
115 kFramingPaddingRatio);
Bryant Chandler32ca6382023-08-02 21:52:31116
117 auto configuration = GetConfigurationSync(effects_manager);
118 EXPECT_EQ(gfx::InsetsF{kFramingPaddingRatio},
119 configuration->framing->padding_ratios);
120}
121
ahmedmoussa1d14f3c2025-01-24 01:17:36122TEST_F(
123 MediaEffectsServiceTest,
124 BindReadonlyVideoEffectsManager_TwoRegistrantsWithSameIdConnectToSameManager) {
125 mojo::Remote<media::mojom::ReadonlyVideoEffectsManager> effects_manager1;
126 service_->BindReadonlyVideoEffectsManager(
Bryant Chandler32ca6382023-08-02 21:52:31127 kDeviceId, effects_manager1.BindNewPipeAndPassReceiver());
128
129 const float kFramingPaddingRatio = 0.234;
ahmedmoussae5e4a4202025-01-24 01:16:36130 SetFramingSync(service_->GetOrCreateVideoEffectsManager(kDeviceId),
131 kFramingPaddingRatio);
Bryant Chandler32ca6382023-08-02 21:52:31132
133 EXPECT_EQ(gfx::InsetsF{kFramingPaddingRatio},
134 GetConfigurationSync(effects_manager1)->framing->padding_ratios);
135
ahmedmoussa1d14f3c2025-01-24 01:17:36136 mojo::Remote<media::mojom::ReadonlyVideoEffectsManager> effects_manager2;
137 service_->BindReadonlyVideoEffectsManager(
Bryant Chandler32ca6382023-08-02 21:52:31138 kDeviceId, effects_manager2.BindNewPipeAndPassReceiver());
139
140 EXPECT_EQ(gfx::InsetsF{kFramingPaddingRatio},
141 GetConfigurationSync(effects_manager2)->framing->padding_ratios);
142}
143
144TEST_F(
145 MediaEffectsServiceTest,
ahmedmoussa1d14f3c2025-01-24 01:17:36146 BindReadonlyVideoEffectsManager_TwoRegistrantsWithDifferentIdConnectToDifferentManager) {
147 mojo::Remote<media::mojom::ReadonlyVideoEffectsManager> effects_manager1;
148 service_->BindReadonlyVideoEffectsManager(
ahmedmoussae5e4a4202025-01-24 01:16:36149 kDeviceId1, effects_manager1.BindNewPipeAndPassReceiver());
Bryant Chandler32ca6382023-08-02 21:52:31150
151 const float kFramingPaddingRatio = 0.234;
ahmedmoussae5e4a4202025-01-24 01:16:36152 SetFramingSync(service_->GetOrCreateVideoEffectsManager(kDeviceId1),
153 kFramingPaddingRatio);
Bryant Chandler32ca6382023-08-02 21:52:31154
155 EXPECT_EQ(gfx::InsetsF{kFramingPaddingRatio},
156 GetConfigurationSync(effects_manager1)->framing->padding_ratios);
157
ahmedmoussa1d14f3c2025-01-24 01:17:36158 mojo::Remote<media::mojom::ReadonlyVideoEffectsManager> effects_manager2;
159 service_->BindReadonlyVideoEffectsManager(
ahmedmoussae5e4a4202025-01-24 01:16:36160 kDeviceId2, effects_manager2.BindNewPipeAndPassReceiver());
Bryant Chandler32ca6382023-08-02 21:52:31161
162 // Expect `framing` to be unset because it is a separate instance of
163 // `VideoEffectsManager`.
164 auto framing = std::move(GetConfigurationSync(effects_manager2)->framing);
165 EXPECT_TRUE(framing.is_null());
166}
167
168TEST_F(
169 MediaEffectsServiceTest,
170 OnLastReceiverDisconnected_ErasesTheManagerWhenAllReceiversAreDisconnected) {
Piotr Bialeckic2c709d2024-03-27 21:04:09171 mojo::Remote<video_effects::mojom::VideoEffectsService> service;
172 video_effects::FakeVideoEffectsService fake_effects_service(
173 service.BindNewPipeAndPassReceiver());
Piotr Bialecki5a6c9112024-09-20 01:51:50174 auto service_reset =
175 video_effects::SetVideoEffectsServiceRemoteForTesting(&service);
Piotr Bialeckic2c709d2024-03-27 21:04:09176
ahmedmoussa1d14f3c2025-01-24 01:17:36177 mojo::Remote<media::mojom::ReadonlyVideoEffectsManager> effects_manager1;
178 service_->BindReadonlyVideoEffectsManager(
Bryant Chandler32ca6382023-08-02 21:52:31179 kDeviceId, effects_manager1.BindNewPipeAndPassReceiver());
ahmedmoussa1d14f3c2025-01-24 01:17:36180 mojo::Remote<media::mojom::ReadonlyVideoEffectsManager> effects_manager2;
181 service_->BindReadonlyVideoEffectsManager(
Bryant Chandler32ca6382023-08-02 21:52:31182 kDeviceId, effects_manager2.BindNewPipeAndPassReceiver());
183
Piotr Bialeckic2c709d2024-03-27 21:04:09184 auto effects_processor_future =
185 fake_effects_service.GetEffectsProcessorCreationFuture();
186
187 mojo::Remote<video_effects::mojom::VideoEffectsProcessor> effects_processor;
Piotr Bialecki7a3cfb22024-07-31 04:53:24188 service_->BindVideoEffectsProcessor(
Piotr Bialeckic2c709d2024-03-27 21:04:09189 kDeviceId, effects_processor.BindNewPipeAndPassReceiver());
190
Bryant Chandler32ca6382023-08-02 21:52:31191 const float kFramingPaddingRatio = 0.234;
192
ahmedmoussae5e4a4202025-01-24 01:16:36193 SetFramingSync(service_->GetOrCreateVideoEffectsManager(kDeviceId),
194 kFramingPaddingRatio);
Bryant Chandler32ca6382023-08-02 21:52:31195
196 EXPECT_EQ(gfx::InsetsF{kFramingPaddingRatio},
197 GetConfigurationSync(effects_manager1)->framing->padding_ratios);
198
199 EXPECT_EQ(gfx::InsetsF{kFramingPaddingRatio},
200 GetConfigurationSync(effects_manager2)->framing->padding_ratios);
201
Piotr Bialeckic2c709d2024-03-27 21:04:09202 // Wait for the fake effects service to create the processor:
Mikel Astiz3c138fa2025-03-10 13:37:19203 EXPECT_TRUE(effects_processor_future.Wait());
Piotr Bialeckic2c709d2024-03-27 21:04:09204 ASSERT_EQ(fake_effects_service.GetProcessors().size(), 1u);
205 EXPECT_EQ(
206 gfx::InsetsF{kFramingPaddingRatio},
207 GetConfigurationSync(fake_effects_service.GetProcessors()[kDeviceId]
208 ->GetVideoEffectsManager())
209 ->framing->padding_ratios);
210
Bryant Chandler32ca6382023-08-02 21:52:31211 effects_manager1.reset();
212 effects_manager2.reset();
Piotr Bialeckic2c709d2024-03-27 21:04:09213 fake_effects_service.GetProcessors().erase(kDeviceId);
Bryant Chandler32ca6382023-08-02 21:52:31214 // Wait for the reset to complete
215 base::RunLoop().RunUntilIdle();
216
ahmedmoussa1d14f3c2025-01-24 01:17:36217 mojo::Remote<media::mojom::ReadonlyVideoEffectsManager> effects_manager3;
218 service_->BindReadonlyVideoEffectsManager(
Bryant Chandler32ca6382023-08-02 21:52:31219 kDeviceId, effects_manager3.BindNewPipeAndPassReceiver());
220
221 // Expect `framing` to be unset because it is a new instance of
222 // `VideoEffectsManager`.
223 EXPECT_TRUE(GetConfigurationSync(effects_manager3)->framing.is_null());
224}
Piotr Bialeckic2c709d2024-03-27 21:04:09225
226TEST_F(MediaEffectsServiceTest, BindVideoEffectsProcessor) {
227 // Tests that `MediaEffectsService::BindVideoEffectsProcessor()` works, i.e.
228 // causes the passed in remote to be connected.
229
230 mojo::Remote<video_effects::mojom::VideoEffectsService> service;
231 video_effects::FakeVideoEffectsService fake_effects_service(
232 service.BindNewPipeAndPassReceiver());
Piotr Bialecki5a6c9112024-09-20 01:51:50233 auto service_reset =
234 video_effects::SetVideoEffectsServiceRemoteForTesting(&service);
Piotr Bialeckic2c709d2024-03-27 21:04:09235
236 auto effects_processor_future =
237 fake_effects_service.GetEffectsProcessorCreationFuture();
238
239 mojo::Remote<video_effects::mojom::VideoEffectsProcessor> effects_processor;
Piotr Bialecki7a3cfb22024-07-31 04:53:24240 service_->BindVideoEffectsProcessor(
Piotr Bialeckic2c709d2024-03-27 21:04:09241 kDeviceId, effects_processor.BindNewPipeAndPassReceiver());
242
Mikel Astiz3c138fa2025-03-10 13:37:19243 EXPECT_TRUE(effects_processor_future.Wait());
Piotr Bialeckic2c709d2024-03-27 21:04:09244 EXPECT_TRUE(effects_processor.is_connected());
245 EXPECT_EQ(fake_effects_service.GetProcessors().size(), 1u);
246}
247
248TEST_F(
249 MediaEffectsServiceTest,
250 BindVideoEffectsProcessor_TwoProcessorsWithDifferentIdConnectToDifferentManager) {
251 // Tests that `MediaEffectsService::BindVideoEffectsProcessor()` connects to
252 // a different manager if a different ID was used. This is validated by
253 // checking that the managers return different configurations. We also set a
254 // different config directly via effects manager interface (originating from
ahmedmoussa1d14f3c2025-01-24 01:17:36255 // a call to `MediaEffectsService::BindReadonlyVideoEffectsManager()`) so this
256 // test also checks that a correct relationship is established between manager
Piotr Bialeckic2c709d2024-03-27 21:04:09257 // and processor.
258
259 mojo::Remote<video_effects::mojom::VideoEffectsService> service;
260 video_effects::FakeVideoEffectsService fake_effects_service(
261 service.BindNewPipeAndPassReceiver());
Piotr Bialecki5a6c9112024-09-20 01:51:50262 auto service_reset =
263 video_effects::SetVideoEffectsServiceRemoteForTesting(&service);
Piotr Bialeckic2c709d2024-03-27 21:04:09264
ahmedmoussa1d14f3c2025-01-24 01:17:36265 mojo::Remote<media::mojom::ReadonlyVideoEffectsManager> effects_manager;
266 service_->BindReadonlyVideoEffectsManager(
ahmedmoussae5e4a4202025-01-24 01:16:36267 kDeviceId1, effects_manager.BindNewPipeAndPassReceiver());
Piotr Bialeckic2c709d2024-03-27 21:04:09268
269 constexpr float kFramingPaddingRatio1 = 0.234;
ahmedmoussae5e4a4202025-01-24 01:16:36270 SetFramingSync(service_->GetOrCreateVideoEffectsManager(kDeviceId1),
271 kFramingPaddingRatio1);
Piotr Bialeckic2c709d2024-03-27 21:04:09272
273 EXPECT_EQ(gfx::InsetsF{kFramingPaddingRatio1},
274 GetConfigurationSync(effects_manager)->framing->padding_ratios);
275
276 auto effects_processor_future1 =
277 fake_effects_service.GetEffectsProcessorCreationFuture();
278
279 mojo::Remote<video_effects::mojom::VideoEffectsProcessor> effects_processor1;
Piotr Bialecki7a3cfb22024-07-31 04:53:24280 service_->BindVideoEffectsProcessor(
ahmedmoussae5e4a4202025-01-24 01:16:36281 kDeviceId2, effects_processor1.BindNewPipeAndPassReceiver());
Mikel Astiz3c138fa2025-03-10 13:37:19282 EXPECT_TRUE(effects_processor_future1.Wait());
Piotr Bialeckic2c709d2024-03-27 21:04:09283 ASSERT_EQ(fake_effects_service.GetProcessors().size(), 1u);
284
285 constexpr float kFramingPaddingRatio2 = 0.345;
ahmedmoussae5e4a4202025-01-24 01:16:36286 SetFramingSync(service_->GetOrCreateVideoEffectsManager(kDeviceId2),
Piotr Bialeckic2c709d2024-03-27 21:04:09287 kFramingPaddingRatio2);
288
ahmedmoussae5e4a4202025-01-24 01:16:36289 EXPECT_EQ(
290 gfx::InsetsF{kFramingPaddingRatio2},
291 GetConfigurationSync(fake_effects_service.GetProcessors()[kDeviceId2]
292 ->GetVideoEffectsManager())
293 ->framing->padding_ratios);
Piotr Bialeckic2c709d2024-03-27 21:04:09294
295 auto effects_processor_future2 =
296 fake_effects_service.GetEffectsProcessorCreationFuture();
297
298 mojo::Remote<video_effects::mojom::VideoEffectsProcessor> effects_processor2;
Piotr Bialecki7a3cfb22024-07-31 04:53:24299 service_->BindVideoEffectsProcessor(
ahmedmoussae5e4a4202025-01-24 01:16:36300 kDeviceId3, effects_processor2.BindNewPipeAndPassReceiver());
Mikel Astiz3c138fa2025-03-10 13:37:19301 EXPECT_TRUE(effects_processor_future2.Wait());
Piotr Bialeckic2c709d2024-03-27 21:04:09302 ASSERT_EQ(fake_effects_service.GetProcessors().size(), 2u);
303
304 constexpr float kFramingPaddingRatio3 = 0.456;
ahmedmoussae5e4a4202025-01-24 01:16:36305 SetFramingSync(service_->GetOrCreateVideoEffectsManager(kDeviceId3),
Piotr Bialeckic2c709d2024-03-27 21:04:09306 kFramingPaddingRatio3);
307
ahmedmoussae5e4a4202025-01-24 01:16:36308 auto padding2 = std::move(
309 GetConfigurationSync(fake_effects_service.GetProcessors()[kDeviceId2]
310 ->GetVideoEffectsManager())
311 ->framing->padding_ratios);
312 auto padding3 = std::move(
313 GetConfigurationSync(fake_effects_service.GetProcessors()[kDeviceId3]
314 ->GetVideoEffectsManager())
315 ->framing->padding_ratios);
Piotr Bialeckic2c709d2024-03-27 21:04:09316
317 EXPECT_NE(padding2, padding3);
318 EXPECT_EQ(gfx::InsetsF{kFramingPaddingRatio2}, padding2);
319 EXPECT_EQ(gfx::InsetsF{kFramingPaddingRatio3}, padding3);
320}
Piotr Bialecki7a3cfb22024-07-31 04:53:24321
322TEST_F(MediaEffectsServiceTest, ModelFileIsOpenedAndSentToVideoEffects) {
323 constexpr char kFirstModelBytes[] = "abcdefgh";
324 constexpr char kSecondModelBytes[] = "ijklmnop";
325
326 mojo::Remote<video_effects::mojom::VideoEffectsService> service;
327 video_effects::FakeVideoEffectsService fake_effects_service(
328 service.BindNewPipeAndPassReceiver());
Piotr Bialecki5a6c9112024-09-20 01:51:50329 auto service_reset =
330 video_effects::SetVideoEffectsServiceRemoteForTesting(&service);
Piotr Bialecki7a3cfb22024-07-31 04:53:24331
332 // Setting the model file path for the first time propagates the model file to
333 // Video Effects Service: Prepare model file:
334 base::ScopedTempFile temporary_model_file_path1;
335 ASSERT_TRUE(temporary_model_file_path1.Create());
336 ASSERT_TRUE(
337 base::WriteFile(temporary_model_file_path1.path(), kFirstModelBytes));
338
339 // Set it on Media Effects Service:
340 auto model_opened_future =
341 fake_effects_service.GetBackgroundSegmentationModelFuture();
342 model_provider_->SetModelPath(temporary_model_file_path1.path());
343
Mikel Astiz3c138fa2025-03-10 13:37:19344 auto model_file = model_opened_future.Take();
Piotr Bialecki7a3cfb22024-07-31 04:53:24345 EXPECT_TRUE(model_file.IsValid());
346
347 // Validate that the contents match the contents of the model file:
348 std::string contents(sizeof(kFirstModelBytes), '\0');
Peter Kastingd349e8c2024-12-02 09:49:14349 ASSERT_TRUE(model_file.Read(0, base::as_writable_byte_span(contents)));
Piotr Bialecki7a3cfb22024-07-31 04:53:24350 EXPECT_STREQ(contents.data(), kFirstModelBytes);
351
352 // Setting the model file path for the second time propagates the model file
353 // to Video Effects Service: Prepare model file:
354 base::ScopedTempFile temporary_model_file_path2;
355 ASSERT_TRUE(temporary_model_file_path2.Create());
356 ASSERT_TRUE(
357 base::WriteFile(temporary_model_file_path2.path(), kSecondModelBytes));
358
359 // Set it on Media Effects Service:
360 model_opened_future =
361 fake_effects_service.GetBackgroundSegmentationModelFuture();
362 model_provider_->SetModelPath(temporary_model_file_path2.path());
363
Mikel Astiz3c138fa2025-03-10 13:37:19364 model_file = model_opened_future.Take();
Piotr Bialecki7a3cfb22024-07-31 04:53:24365 EXPECT_TRUE(model_file.IsValid());
366
367 // Validate that the contents match the contents of the model file:
368 contents.resize(sizeof(kSecondModelBytes));
Peter Kastingd349e8c2024-12-02 09:49:14369 ASSERT_TRUE(model_file.Read(0, base::as_writable_byte_span(contents)));
Piotr Bialecki7a3cfb22024-07-31 04:53:24370 EXPECT_STREQ(contents.data(), kSecondModelBytes);
371
372 // Setting the model file to a path that doesn't exist does not propagate the
373 // model to Video Effects Service: Set invalid path to the model:
374 base::ScopedTempDir temporary_directory;
375 ASSERT_TRUE(temporary_directory.CreateUniqueTempDir());
376
377 model_opened_future =
378 fake_effects_service.GetBackgroundSegmentationModelFuture();
379 model_provider_->SetModelPath(
380 temporary_directory.GetPath().AppendASCII("should_not_exist.tmp"));
Piotr Bialecki55f635a2025-01-10 20:04:22381
Mikel Astiz3c138fa2025-03-10 13:37:19382 model_file = model_opened_future.Take();
Piotr Bialecki55f635a2025-01-10 20:04:22383 EXPECT_FALSE(model_file.IsValid());
384
385 model_opened_future =
386 fake_effects_service.GetBackgroundSegmentationModelFuture();
387 model_provider_->SetModelPath(std::nullopt);
388
Mikel Astiz3c138fa2025-03-10 13:37:19389 model_file = model_opened_future.Take();
Piotr Bialecki55f635a2025-01-10 20:04:22390 EXPECT_FALSE(model_file.IsValid());
Piotr Bialecki7a3cfb22024-07-31 04:53:24391}