Flutter Engine Uber Docs
Docs for the entire Flutter Engine repo.
 
Loading...
Searching...
No Matches
flutter_embedder_test::FlutterEmbedderTest Class Reference
Inheritance diagram for flutter_embedder_test::FlutterEmbedderTest:

Public Member Functions

 FlutterEmbedderTest ()
 
bool HasViewConnected (const fuchsia::ui::observation::geometry::ViewTreeWatcherPtr &view_tree_watcher, std::optional< fuchsia::ui::observation::geometry::WatchResponse > &watch_response, zx_koid_t view_ref_koid)
 
void LaunchParentViewInRealm (const std::vector< std::string > &component_args={})
 
fuchsia_test_utils::Screenshot TakeScreenshot ()
 
bool TakeScreenshotUntil (fuchsia_test_utils::Pixel color, fit::function< void(std::map< fuchsia_test_utils::Pixel, uint32_t >)> callback=nullptr, zx::duration timeout=kTestTimeout)
 

Detailed Description

Definition at line 110 of file flutter-embedder-test.cc.

Constructor & Destructor Documentation

◆ FlutterEmbedderTest()

flutter_embedder_test::FlutterEmbedderTest::FlutterEmbedderTest ( )
inline

Definition at line 113 of file flutter-embedder-test.cc.

114 : realm_builder_(component_testing::RealmBuilder::Create()) {
115 FML_VLOG(1) << "Setting up base realm";
116 SetUpRealmBase();
117
118 // Post a "just in case" quit task, if the test hangs.
119 async::PostDelayedTask(
120 dispatcher(),
121 [] {
122 FML_LOG(FATAL)
123 << "\n\n>> Test did not complete in time, terminating. <<\n\n";
124 },
125 kTestTimeout);
126 }
#define FML_VLOG(verbose_level)
Definition logging.h:117
#define FML_LOG(severity)
Definition logging.h:101

References FML_LOG, and FML_VLOG.

Member Function Documentation

◆ HasViewConnected()

bool flutter_embedder_test::FlutterEmbedderTest::HasViewConnected ( const fuchsia::ui::observation::geometry::ViewTreeWatcherPtr &  view_tree_watcher,
std::optional< fuchsia::ui::observation::geometry::WatchResponse > &  watch_response,
zx_koid_t  view_ref_koid 
)

Definition at line 287 of file flutter-embedder-test.cc.

292 {
293 std::optional<fuchsia::ui::observation::geometry::WatchResponse> watch_result;
294 view_tree_watcher->Watch(
295 [&watch_result](auto response) { watch_result = std::move(response); });
296 FML_LOG(INFO) << "Waiting for view tree watch result";
297 RunLoopUntil([&watch_result] { return watch_result.has_value(); });
298 FML_LOG(INFO) << "Received for view tree watch result";
299 if (CheckViewExistsInUpdates(watch_result->updates(), view_ref_koid)) {
300 watch_response = std::move(watch_result);
301 };
302 return watch_response.has_value();
303}
bool CheckViewExistsInUpdates(const std::vector< fuchsia::ui::observation::geometry::ViewTreeSnapshot > &updates, zx_koid_t view_ref_koid)
Definition check_view.cc:27

References FML_LOG.

Referenced by LaunchParentViewInRealm().

◆ LaunchParentViewInRealm()

void flutter_embedder_test::FlutterEmbedderTest::LaunchParentViewInRealm ( const std::vector< std::string > &  component_args = {})

Definition at line 305 of file flutter-embedder-test.cc.

306 {
307 FML_LOG(INFO) << "Launching parent-view";
308
309 if (!component_args.empty()) {
310 // Construct a args.csv file containing the specified comma-separated
311 // component args.
312 std::string csv;
313 for (const auto& arg : component_args) {
314 csv += arg + ',';
315 }
316 // Remove last comma.
317 csv.pop_back();
318
319 auto config_directory_contents = DirectoryContents();
320 config_directory_contents.AddFile("args.csv", csv);
321 realm_builder_.RouteReadOnlyDirectory("config-data", {kParentViewRef},
322 std::move(config_directory_contents));
323 }
324 realm_ = std::make_unique<RealmRoot>(realm_builder_.Build());
325
326 // Get the display information using the |fuchsia.ui.display.singleton.Info|.
327 std::optional<bool> display_metrics_obtained;
328 fuchsia::ui::display::singleton::InfoPtr display_info =
329 realm_->component().Connect<fuchsia::ui::display::singleton::Info>();
330 display_info->GetMetrics([this, &display_metrics_obtained](auto info) {
331 display_width_ = info.extent_in_px().width;
332 display_height_ = info.extent_in_px().height;
333 display_metrics_obtained = true;
334 });
335 RunLoopUntil([&display_metrics_obtained] {
336 return display_metrics_obtained.has_value();
337 });
338 FML_LOG(INFO) << "Got display_width " << display_width_ << " display_height "
339 << display_height_;
340
341 // Instruct Test UI Stack to present parent-view's View.
342 std::optional<zx_koid_t> view_ref_koid;
343 scene_provider_ =
344 realm_->component().Connect<fuchsia::ui::test::scene::Controller>();
345 scene_provider_.set_error_handler(
346 [](auto) { FML_LOG(ERROR) << "Error from test scene provider"; });
347 fuchsia::ui::test::scene::ControllerAttachClientViewRequest request;
348 request.set_view_provider(
349 realm_->component().Connect<fuchsia::ui::app::ViewProvider>());
350 scene_provider_->RegisterViewTreeWatcher(view_tree_watcher_.NewRequest(),
351 []() {});
352 scene_provider_->AttachClientView(
353 std::move(request), [&view_ref_koid](auto client_view_ref_koid) {
354 view_ref_koid = client_view_ref_koid;
355 });
356
357 FML_LOG(INFO) << "Waiting for client view ref koid";
358 RunLoopUntil([&view_ref_koid] { return view_ref_koid.has_value(); });
359
360 // Wait for the client view to get attached to the view tree.
361 std::optional<fuchsia::ui::observation::geometry::WatchResponse>
362 watch_response;
363 FML_LOG(INFO) << "Waiting for client view to render; koid is "
364 << (view_ref_koid.has_value() ? view_ref_koid.value() : 0);
365 RunLoopUntil([this, &watch_response, &view_ref_koid] {
366 return HasViewConnected(view_tree_watcher_, watch_response, *view_ref_koid);
367 });
368 FML_LOG(INFO) << "Client view has rendered";
369
370 screenshot_ =
371 realm_->component().Connect<fuchsia::ui::composition::Screenshot>();
372 FML_LOG(INFO) << "Launched parent-view";
373}
bool HasViewConnected(const fuchsia::ui::observation::geometry::ViewTreeWatcherPtr &view_tree_watcher, std::optional< fuchsia::ui::observation::geometry::WatchResponse > &watch_response, zx_koid_t view_ref_koid)

References FML_LOG, and HasViewConnected().

◆ TakeScreenshot()

fuchsia_test_utils::Screenshot flutter_embedder_test::FlutterEmbedderTest::TakeScreenshot ( )

Definition at line 375 of file flutter-embedder-test.cc.

375 {
376 FML_LOG(INFO) << "Taking screenshot... ";
377
378 fuchsia::ui::composition::ScreenshotTakeRequest request;
379 request.set_format(fuchsia::ui::composition::ScreenshotFormat::BGRA_RAW);
380
381 std::optional<fuchsia::ui::composition::ScreenshotTakeResponse> response;
382 screenshot_->Take(std::move(request), [this, &response](auto screenshot) {
383 response = std::move(screenshot);
384 QuitLoop();
385 });
386
387 EXPECT_FALSE(RunLoopWithTimeout(kScreenshotTimeout))
388 << "Timed out waiting for screenshot.";
389 FML_LOG(INFO) << "Screenshot captured.";
390
392 response->vmo(), display_width_, display_height_, /*display_rotation*/ 0);
393}

References FML_LOG.

Referenced by TakeScreenshotUntil().

◆ TakeScreenshotUntil()

bool flutter_embedder_test::FlutterEmbedderTest::TakeScreenshotUntil ( fuchsia_test_utils::Pixel  color,
fit::function< void(std::map< fuchsia_test_utils::Pixel, uint32_t >)>  callback = nullptr,
zx::duration  timeout = kTestTimeout 
)

Definition at line 395 of file flutter-embedder-test.cc.

398 {
399 return RunLoopWithTimeoutOrUntil(
400 [this, &callback, &color] {
401 auto screenshot = TakeScreenshot();
402 auto histogram = screenshot.Histogram();
403
404 bool color_found = histogram[color] > 0;
405 if (color_found && callback != nullptr) {
406 callback(std::move(histogram));
407 }
408 return color_found;
409 },
410 timeout);
411}
fuchsia_test_utils::Screenshot TakeScreenshot()
FlutterDesktopBinaryReply callback

References callback, and TakeScreenshot().


The documentation for this class was generated from the following file: