web_engine_integration_test_base.cc 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. // Copyright 2019 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "fuchsia_web/webengine/web_engine_integration_test_base.h"
  5. #include <dirent.h>
  6. #include <lib/fdio/directory.h>
  7. #include "base/files/file_path.h"
  8. #include "base/fuchsia/file_utils.h"
  9. #include "base/fuchsia/fuchsia_logging.h"
  10. #include "base/fuchsia/process_context.h"
  11. #include "base/path_service.h"
  12. #include "base/strings/string_piece.h"
  13. #include "fuchsia_web/common/test/frame_test_util.h"
  14. #include "fuchsia_web/webengine/test/context_provider_test_connector.h"
  15. #include "net/test/embedded_test_server/default_handlers.h"
  16. namespace {
  17. fuchsia::web::ContentDirectoryProvider CreateTestDataDirectoryProvider() {
  18. fuchsia::web::ContentDirectoryProvider provider;
  19. provider.set_name("testdata");
  20. base::FilePath pkg_path;
  21. CHECK(base::PathService::Get(base::DIR_SRC_TEST_DATA_ROOT, &pkg_path));
  22. provider.set_directory(base::OpenDirectoryHandle(
  23. pkg_path.AppendASCII("fuchsia_web/webengine/test/data")));
  24. return provider;
  25. }
  26. } // namespace
  27. WebEngineIntegrationTestBase::WebEngineIntegrationTestBase()
  28. : task_environment_(base::test::TaskEnvironment::MainThreadType::IO),
  29. filtered_service_directory_(std::make_shared<sys::ServiceDirectory>(
  30. base::OpenDirectoryHandle(base::FilePath("/svc")))) {
  31. // Push all services from /svc to the filtered service directory.
  32. // TODO(fxbug.dev/100207): base::FileEnumerator would stat() each directory
  33. // entry, which can hang with some legacy directory implementations.
  34. DIR* dir = opendir("/svc");
  35. PCHECK(dir);
  36. struct dirent* dirent = nullptr;
  37. while ((dirent = readdir(dir))) {
  38. const base::StringPiece name = dirent->d_name;
  39. if (name == base::FilePath::kCurrentDirectory ||
  40. name == base::FilePath::kParentDirectory) {
  41. continue;
  42. }
  43. zx_status_t status = filtered_service_directory_.AddService(name);
  44. ZX_CHECK(status == ZX_OK, status) << "FilteredServiceDirectory::AddService";
  45. }
  46. closedir(dir);
  47. }
  48. WebEngineIntegrationTestBase::~WebEngineIntegrationTestBase() = default;
  49. void WebEngineIntegrationTestBase::SetUp() {
  50. embedded_test_server_.ServeFilesFromSourceDirectory(
  51. "fuchsia_web/webengine/test/data");
  52. net::test_server::RegisterDefaultHandlers(&embedded_test_server_);
  53. CHECK(embedded_test_server_.Start());
  54. }
  55. void WebEngineIntegrationTestBase::StartWebEngine(
  56. base::CommandLine command_line) {
  57. web_context_provider_ = ConnectContextProvider(
  58. web_engine_controller_.NewRequest(), std::move(command_line));
  59. web_context_provider_.set_error_handler(
  60. [](zx_status_t status) { ADD_FAILURE(); });
  61. }
  62. fuchsia::web::NavigationControllerPtr
  63. WebEngineIntegrationTestBase::CreateNavigationController() {
  64. CHECK(frame_);
  65. fuchsia::web::NavigationControllerPtr controller;
  66. frame_->GetNavigationController(controller.NewRequest());
  67. return controller;
  68. }
  69. fuchsia::web::CreateContextParams
  70. WebEngineIntegrationTestBase::TestContextParams() {
  71. fuchsia::web::CreateContextParams create_params;
  72. // Most integration tests require networking, to load test web content.
  73. create_params.set_features(fuchsia::web::ContextFeatureFlags::NETWORK);
  74. zx_status_t status = filtered_service_directory_.ConnectClient(
  75. create_params.mutable_service_directory()->NewRequest());
  76. ZX_CHECK(status == ZX_OK, status)
  77. << "FilteredServiceDirectory::ConnectClient";
  78. return create_params;
  79. }
  80. fuchsia::web::CreateContextParams
  81. WebEngineIntegrationTestBase::TestContextParamsWithTestData() {
  82. fuchsia::web::CreateContextParams create_params = TestContextParams();
  83. create_params.mutable_content_directories()->push_back(
  84. CreateTestDataDirectoryProvider());
  85. return create_params;
  86. }
  87. void WebEngineIntegrationTestBase::CreateContext(
  88. fuchsia::web::CreateContextParams context_params) {
  89. CHECK(!context_);
  90. web_context_provider_->Create(std::move(context_params),
  91. context_.NewRequest());
  92. context_.set_error_handler([](zx_status_t status) { ADD_FAILURE(); });
  93. }
  94. void WebEngineIntegrationTestBase::CreateContextAndFrame(
  95. fuchsia::web::CreateContextParams context_params) {
  96. CHECK(!frame_);
  97. CreateContext(std::move(context_params));
  98. context_->CreateFrame(frame_.NewRequest());
  99. frame_.set_error_handler([](zx_status_t status) { ADD_FAILURE(); });
  100. CreateNavigationListener();
  101. }
  102. void WebEngineIntegrationTestBase::CreateFrameWithParams(
  103. fuchsia::web::CreateFrameParams frame_params) {
  104. CHECK(!frame_);
  105. CHECK(context_);
  106. context_->CreateFrameWithParams(std::move(frame_params), frame_.NewRequest());
  107. frame_.set_error_handler([](zx_status_t status) { ADD_FAILURE(); });
  108. CreateNavigationListener();
  109. }
  110. void WebEngineIntegrationTestBase::CreateContextAndExpectError(
  111. fuchsia::web::CreateContextParams params,
  112. zx_status_t expected_error) {
  113. CHECK(!context_);
  114. web_context_provider_->Create(std::move(params), context_.NewRequest());
  115. base::RunLoop run_loop;
  116. context_.set_error_handler([&run_loop, expected_error](zx_status_t status) {
  117. EXPECT_EQ(status, expected_error);
  118. run_loop.Quit();
  119. });
  120. run_loop.Run();
  121. }
  122. void WebEngineIntegrationTestBase::CreateContextAndFrameAndLoadUrl(
  123. fuchsia::web::CreateContextParams params,
  124. const GURL& url) {
  125. CreateContextAndFrame(std::move(params));
  126. // Navigate the Frame to |url| and wait for it to complete loading.
  127. auto navigation_controller = CreateNavigationController();
  128. ASSERT_TRUE(::LoadUrlAndExpectResponse(
  129. navigation_controller.get(), fuchsia::web::LoadUrlParams(), url.spec()));
  130. // Wait for the URL to finish loading.
  131. navigation_listener_->RunUntilUrlEquals(url);
  132. }
  133. void WebEngineIntegrationTestBase::LoadUrlAndExpectResponse(
  134. base::StringPiece url,
  135. fuchsia::web::LoadUrlParams load_url_params) {
  136. // Connect a new NavigationController to ensure that LoadUrl() is processed
  137. // after all other messages previously sent to the frame.
  138. fuchsia::web::NavigationControllerPtr navigation_controller;
  139. frame_->GetNavigationController(navigation_controller.NewRequest());
  140. navigation_controller.set_error_handler(
  141. [](zx_status_t status) { ADD_FAILURE(); });
  142. ASSERT_TRUE(::LoadUrlAndExpectResponse(navigation_controller.get(),
  143. std::move(load_url_params), url));
  144. }
  145. void WebEngineIntegrationTestBase::GrantPermission(
  146. fuchsia::web::PermissionType type,
  147. const std::string& origin) {
  148. fuchsia::web::PermissionDescriptor permission;
  149. permission.set_type(type);
  150. frame_->SetPermissionState(std::move(permission), origin,
  151. fuchsia::web::PermissionState::GRANTED);
  152. }
  153. std::string WebEngineIntegrationTestBase::ExecuteJavaScriptWithStringResult(
  154. base::StringPiece script) {
  155. absl::optional<base::Value> value = ExecuteJavaScript(frame_.get(), script);
  156. return value ? value->GetString() : std::string();
  157. }
  158. double WebEngineIntegrationTestBase::ExecuteJavaScriptWithDoubleResult(
  159. base::StringPiece script) {
  160. absl::optional<base::Value> value = ExecuteJavaScript(frame_.get(), script);
  161. return value ? value->GetDouble() : 0.0;
  162. }
  163. bool WebEngineIntegrationTestBase::ExecuteJavaScriptWithBoolResult(
  164. base::StringPiece script) {
  165. absl::optional<base::Value> value = ExecuteJavaScript(frame_.get(), script);
  166. return value ? value->GetBool() : false;
  167. }
  168. void WebEngineIntegrationTestBase::CreateNavigationListener() {
  169. CHECK(frame_);
  170. CHECK(!navigation_listener_);
  171. navigation_listener_ = std::make_unique<TestNavigationListener>();
  172. navigation_listener_binding_ =
  173. std::make_unique<fidl::Binding<fuchsia::web::NavigationEventListener>>(
  174. navigation_listener_.get());
  175. frame_->SetNavigationEventListener2(
  176. navigation_listener_binding_->NewBinding(), /*flags=*/{});
  177. }