| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <memory> | 5 #include <memory> |
| 6 | 6 |
| 7 #include "content/public/test/browser_test.h" | 7 #include "content/public/test/browser_test.h" |
| 8 #include "headless/public/domains/network.h" | 8 #include "headless/public/domains/network.h" |
| 9 #include "headless/public/domains/page.h" | 9 #include "headless/public/domains/page.h" |
| 10 #include "headless/public/domains/runtime.h" | 10 #include "headless/public/domains/runtime.h" |
| 11 #include "headless/public/headless_browser.h" | 11 #include "headless/public/headless_browser.h" |
| 12 #include "headless/public/headless_devtools_client.h" | 12 #include "headless/public/headless_devtools_client.h" |
| 13 #include "headless/public/headless_devtools_target.h" | |
| 14 #include "headless/public/headless_web_contents.h" | |
| 15 #include "headless/test/headless_browser_test.h" | 13 #include "headless/test/headless_browser_test.h" |
| 16 #include "testing/gtest/include/gtest/gtest.h" | 14 #include "testing/gtest/include/gtest/gtest.h" |
| 17 #include "ui/gfx/geometry/size.h" | |
| 18 #include "url/gurl.h" | 15 #include "url/gurl.h" |
| 19 | 16 |
| 20 namespace headless { | 17 namespace headless { |
| 21 | 18 |
| 22 #define DEVTOOLS_CLIENT_TEST_F(TEST_FIXTURE_NAME) \ | 19 class HeadlessDevToolsClientNavigationTest |
| 23 IN_PROC_BROWSER_TEST_F(TEST_FIXTURE_NAME, RunAsyncTest) { RunTest(); } \ | 20 : public HeadlessAsyncDevTooledBrowserTest, |
| 24 class AsyncHeadlessBrowserTestNeedsSemicolon##TEST_FIXTURE_NAME {} | 21 page::ExperimentalObserver { |
| 25 | |
| 26 // A test fixture which attaches a devtools client before starting the test. | |
| 27 // TODO(eseckler): Use the reusable HeadlessAsyncDevTooledTest and macro from | |
| 28 // headless_browser_test.h instead of this class. | |
| 29 class HeadlessDevToolsClientTest : public HeadlessBrowserTest, | |
| 30 public HeadlessWebContents::Observer { | |
| 31 public: | 22 public: |
| 32 HeadlessDevToolsClientTest() | 23 void RunDevTooledTest() override { |
| 33 : devtools_client_(HeadlessDevToolsClient::Create()) {} | |
| 34 ~HeadlessDevToolsClientTest() override {} | |
| 35 | |
| 36 // HeadlessWebContentsObserver implementation: | |
| 37 void DevToolsTargetReady() override { | |
| 38 EXPECT_TRUE(web_contents_->GetDevToolsTarget()); | |
| 39 web_contents_->GetDevToolsTarget()->AttachClient(devtools_client_.get()); | |
| 40 RunDevToolsClientTest(); | |
| 41 } | |
| 42 | |
| 43 virtual void RunDevToolsClientTest() = 0; | |
| 44 | |
| 45 protected: | |
| 46 void RunTest() { | |
| 47 web_contents_ = | |
| 48 browser()->CreateWebContents(GURL("about:blank"), gfx::Size(800, 600)); | |
| 49 web_contents_->AddObserver(this); | |
| 50 | |
| 51 RunAsynchronousTest(); | |
| 52 | |
| 53 web_contents_->GetDevToolsTarget()->DetachClient(devtools_client_.get()); | |
| 54 web_contents_->RemoveObserver(this); | |
| 55 web_contents_->Close(); | |
| 56 web_contents_ = nullptr; | |
| 57 } | |
| 58 | |
| 59 HeadlessWebContents* web_contents_; | |
| 60 std::unique_ptr<HeadlessDevToolsClient> devtools_client_; | |
| 61 }; | |
| 62 | |
| 63 class HeadlessDevToolsClientNavigationTest : public HeadlessDevToolsClientTest, | |
| 64 page::ExperimentalObserver { | |
| 65 public: | |
| 66 void RunDevToolsClientTest() override { | |
| 67 EXPECT_TRUE(embedded_test_server()->Start()); | 24 EXPECT_TRUE(embedded_test_server()->Start()); |
| 68 std::unique_ptr<page::NavigateParams> params = | 25 std::unique_ptr<page::NavigateParams> params = |
| 69 page::NavigateParams::Builder() | 26 page::NavigateParams::Builder() |
| 70 .SetUrl(embedded_test_server()->GetURL("/hello.html").spec()) | 27 .SetUrl(embedded_test_server()->GetURL("/hello.html").spec()) |
| 71 .Build(); | 28 .Build(); |
| 72 devtools_client_->GetPage()->GetExperimental()->AddObserver(this); | 29 devtools_client_->GetPage()->GetExperimental()->AddObserver(this); |
| 73 devtools_client_->GetPage()->Enable(); | 30 devtools_client_->GetPage()->Enable(); |
| 74 devtools_client_->GetPage()->Navigate(std::move(params)); | 31 devtools_client_->GetPage()->Navigate(std::move(params)); |
| 75 } | 32 } |
| 76 | 33 |
| 77 void OnLoadEventFired(const page::LoadEventFiredParams& params) override { | 34 void OnLoadEventFired(const page::LoadEventFiredParams& params) override { |
| 78 devtools_client_->GetPage()->GetExperimental()->RemoveObserver(this); | 35 devtools_client_->GetPage()->GetExperimental()->RemoveObserver(this); |
| 79 FinishAsynchronousTest(); | 36 FinishAsynchronousTest(); |
| 80 } | 37 } |
| 81 | 38 |
| 82 // Check that events with no parameters still get a parameters object. | 39 // Check that events with no parameters still get a parameters object. |
| 83 void OnFrameResized(const page::FrameResizedParams& params) override {} | 40 void OnFrameResized(const page::FrameResizedParams& params) override {} |
| 84 }; | 41 }; |
| 85 | 42 |
| 86 DEVTOOLS_CLIENT_TEST_F(HeadlessDevToolsClientNavigationTest); | 43 HEADLESS_ASYNC_DEVTOOLED_TEST_F(HeadlessDevToolsClientNavigationTest); |
| 87 | 44 |
| 88 class HeadlessDevToolsClientEvalTest : public HeadlessDevToolsClientTest { | 45 class HeadlessDevToolsClientEvalTest |
| 46 : public HeadlessAsyncDevTooledBrowserTest { |
| 89 public: | 47 public: |
| 90 void RunDevToolsClientTest() override { | 48 void RunDevTooledTest() override { |
| 91 std::unique_ptr<runtime::EvaluateParams> params = | 49 std::unique_ptr<runtime::EvaluateParams> params = |
| 92 runtime::EvaluateParams::Builder().SetExpression("1 + 2").Build(); | 50 runtime::EvaluateParams::Builder().SetExpression("1 + 2").Build(); |
| 93 devtools_client_->GetRuntime()->Evaluate( | 51 devtools_client_->GetRuntime()->Evaluate( |
| 94 std::move(params), | 52 std::move(params), |
| 95 base::Bind(&HeadlessDevToolsClientEvalTest::OnFirstResult, | 53 base::Bind(&HeadlessDevToolsClientEvalTest::OnFirstResult, |
| 96 base::Unretained(this))); | 54 base::Unretained(this))); |
| 97 // Test the convenience overload which only takes the required command | 55 // Test the convenience overload which only takes the required command |
| 98 // parameters. | 56 // parameters. |
| 99 devtools_client_->GetRuntime()->Evaluate( | 57 devtools_client_->GetRuntime()->Evaluate( |
| 100 "24 * 7", base::Bind(&HeadlessDevToolsClientEvalTest::OnSecondResult, | 58 "24 * 7", base::Bind(&HeadlessDevToolsClientEvalTest::OnSecondResult, |
| 101 base::Unretained(this))); | 59 base::Unretained(this))); |
| 102 } | 60 } |
| 103 | 61 |
| 104 void OnFirstResult(std::unique_ptr<runtime::EvaluateResult> result) { | 62 void OnFirstResult(std::unique_ptr<runtime::EvaluateResult> result) { |
| 105 int value; | 63 int value; |
| 106 EXPECT_TRUE(result->GetResult()->HasValue()); | 64 EXPECT_TRUE(result->GetResult()->HasValue()); |
| 107 EXPECT_TRUE(result->GetResult()->GetValue()->GetAsInteger(&value)); | 65 EXPECT_TRUE(result->GetResult()->GetValue()->GetAsInteger(&value)); |
| 108 EXPECT_EQ(3, value); | 66 EXPECT_EQ(3, value); |
| 109 } | 67 } |
| 110 | 68 |
| 111 void OnSecondResult(std::unique_ptr<runtime::EvaluateResult> result) { | 69 void OnSecondResult(std::unique_ptr<runtime::EvaluateResult> result) { |
| 112 int value; | 70 int value; |
| 113 EXPECT_TRUE(result->GetResult()->HasValue()); | 71 EXPECT_TRUE(result->GetResult()->HasValue()); |
| 114 EXPECT_TRUE(result->GetResult()->GetValue()->GetAsInteger(&value)); | 72 EXPECT_TRUE(result->GetResult()->GetValue()->GetAsInteger(&value)); |
| 115 EXPECT_EQ(168, value); | 73 EXPECT_EQ(168, value); |
| 116 FinishAsynchronousTest(); | 74 FinishAsynchronousTest(); |
| 117 } | 75 } |
| 118 }; | 76 }; |
| 119 | 77 |
| 120 DEVTOOLS_CLIENT_TEST_F(HeadlessDevToolsClientEvalTest); | 78 HEADLESS_ASYNC_DEVTOOLED_TEST_F(HeadlessDevToolsClientEvalTest); |
| 121 | 79 |
| 122 class HeadlessDevToolsClientCallbackTest : public HeadlessDevToolsClientTest { | 80 class HeadlessDevToolsClientCallbackTest |
| 81 : public HeadlessAsyncDevTooledBrowserTest { |
| 123 public: | 82 public: |
| 124 HeadlessDevToolsClientCallbackTest() : first_result_received_(false) {} | 83 HeadlessDevToolsClientCallbackTest() : first_result_received_(false) {} |
| 125 | 84 |
| 126 void RunDevToolsClientTest() override { | 85 void RunDevTooledTest() override { |
| 127 // Null callback without parameters. | 86 // Null callback without parameters. |
| 128 devtools_client_->GetPage()->Enable(); | 87 devtools_client_->GetPage()->Enable(); |
| 129 // Null callback with parameters. | 88 // Null callback with parameters. |
| 130 devtools_client_->GetRuntime()->Evaluate("true"); | 89 devtools_client_->GetRuntime()->Evaluate("true"); |
| 131 // Non-null callback without parameters. | 90 // Non-null callback without parameters. |
| 132 devtools_client_->GetPage()->Disable( | 91 devtools_client_->GetPage()->Disable( |
| 133 base::Bind(&HeadlessDevToolsClientCallbackTest::OnFirstResult, | 92 base::Bind(&HeadlessDevToolsClientCallbackTest::OnFirstResult, |
| 134 base::Unretained(this))); | 93 base::Unretained(this))); |
| 135 // Non-null callback with parameters. | 94 // Non-null callback with parameters. |
| 136 devtools_client_->GetRuntime()->Evaluate( | 95 devtools_client_->GetRuntime()->Evaluate( |
| 137 "true", base::Bind(&HeadlessDevToolsClientCallbackTest::OnSecondResult, | 96 "true", base::Bind(&HeadlessDevToolsClientCallbackTest::OnSecondResult, |
| 138 base::Unretained(this))); | 97 base::Unretained(this))); |
| 139 } | 98 } |
| 140 | 99 |
| 141 void OnFirstResult() { | 100 void OnFirstResult() { |
| 142 EXPECT_FALSE(first_result_received_); | 101 EXPECT_FALSE(first_result_received_); |
| 143 first_result_received_ = true; | 102 first_result_received_ = true; |
| 144 } | 103 } |
| 145 | 104 |
| 146 void OnSecondResult(std::unique_ptr<runtime::EvaluateResult> result) { | 105 void OnSecondResult(std::unique_ptr<runtime::EvaluateResult> result) { |
| 147 EXPECT_TRUE(first_result_received_); | 106 EXPECT_TRUE(first_result_received_); |
| 148 FinishAsynchronousTest(); | 107 FinishAsynchronousTest(); |
| 149 } | 108 } |
| 150 | 109 |
| 151 private: | 110 private: |
| 152 bool first_result_received_; | 111 bool first_result_received_; |
| 153 }; | 112 }; |
| 154 | 113 |
| 155 DEVTOOLS_CLIENT_TEST_F(HeadlessDevToolsClientCallbackTest); | 114 HEADLESS_ASYNC_DEVTOOLED_TEST_F(HeadlessDevToolsClientCallbackTest); |
| 156 | 115 |
| 157 class HeadlessDevToolsClientObserverTest : public HeadlessDevToolsClientTest, | 116 class HeadlessDevToolsClientObserverTest |
| 158 network::Observer { | 117 : public HeadlessAsyncDevTooledBrowserTest, |
| 118 network::Observer { |
| 159 public: | 119 public: |
| 160 void RunDevToolsClientTest() override { | 120 void RunDevTooledTest() override { |
| 161 EXPECT_TRUE(embedded_test_server()->Start()); | 121 EXPECT_TRUE(embedded_test_server()->Start()); |
| 162 devtools_client_->GetNetwork()->AddObserver(this); | 122 devtools_client_->GetNetwork()->AddObserver(this); |
| 163 devtools_client_->GetNetwork()->Enable(); | 123 devtools_client_->GetNetwork()->Enable(); |
| 164 devtools_client_->GetPage()->Navigate( | 124 devtools_client_->GetPage()->Navigate( |
| 165 embedded_test_server()->GetURL("/hello.html").spec()); | 125 embedded_test_server()->GetURL("/hello.html").spec()); |
| 166 } | 126 } |
| 167 | 127 |
| 168 void OnRequestWillBeSent( | 128 void OnRequestWillBeSent( |
| 169 const network::RequestWillBeSentParams& params) override { | 129 const network::RequestWillBeSentParams& params) override { |
| 170 EXPECT_EQ("GET", params.GetRequest()->GetMethod()); | 130 EXPECT_EQ("GET", params.GetRequest()->GetMethod()); |
| 171 EXPECT_EQ(embedded_test_server()->GetURL("/hello.html").spec(), | 131 EXPECT_EQ(embedded_test_server()->GetURL("/hello.html").spec(), |
| 172 params.GetRequest()->GetUrl()); | 132 params.GetRequest()->GetUrl()); |
| 173 } | 133 } |
| 174 | 134 |
| 175 void OnResponseReceived( | 135 void OnResponseReceived( |
| 176 const network::ResponseReceivedParams& params) override { | 136 const network::ResponseReceivedParams& params) override { |
| 177 EXPECT_EQ(200, params.GetResponse()->GetStatus()); | 137 EXPECT_EQ(200, params.GetResponse()->GetStatus()); |
| 178 EXPECT_EQ("OK", params.GetResponse()->GetStatusText()); | 138 EXPECT_EQ("OK", params.GetResponse()->GetStatusText()); |
| 179 std::string content_type; | 139 std::string content_type; |
| 180 EXPECT_TRUE(params.GetResponse()->GetHeaders()->GetString("Content-Type", | 140 EXPECT_TRUE(params.GetResponse()->GetHeaders()->GetString("Content-Type", |
| 181 &content_type)); | 141 &content_type)); |
| 182 EXPECT_EQ("text/html", content_type); | 142 EXPECT_EQ("text/html", content_type); |
| 183 | 143 |
| 184 devtools_client_->GetNetwork()->RemoveObserver(this); | 144 devtools_client_->GetNetwork()->RemoveObserver(this); |
| 185 FinishAsynchronousTest(); | 145 FinishAsynchronousTest(); |
| 186 } | 146 } |
| 187 }; | 147 }; |
| 188 | 148 |
| 189 DEVTOOLS_CLIENT_TEST_F(HeadlessDevToolsClientObserverTest); | 149 HEADLESS_ASYNC_DEVTOOLED_TEST_F(HeadlessDevToolsClientObserverTest); |
| 190 | 150 |
| 191 class HeadlessDevToolsClientExperimentalTest | 151 class HeadlessDevToolsClientExperimentalTest |
| 192 : public HeadlessDevToolsClientTest, | 152 : public HeadlessAsyncDevTooledBrowserTest, |
| 193 page::ExperimentalObserver { | 153 page::ExperimentalObserver { |
| 194 public: | 154 public: |
| 195 void RunDevToolsClientTest() override { | 155 void RunDevTooledTest() override { |
| 196 EXPECT_TRUE(embedded_test_server()->Start()); | 156 EXPECT_TRUE(embedded_test_server()->Start()); |
| 197 // Check that experimental commands require parameter objects. | 157 // Check that experimental commands require parameter objects. |
| 198 devtools_client_->GetRuntime()->GetExperimental()->Run( | 158 devtools_client_->GetRuntime()->GetExperimental()->Run( |
| 199 runtime::RunParams::Builder().Build()); | 159 runtime::RunParams::Builder().Build()); |
| 200 | 160 |
| 201 devtools_client_->GetPage()->GetExperimental()->AddObserver(this); | 161 devtools_client_->GetPage()->GetExperimental()->AddObserver(this); |
| 202 devtools_client_->GetPage()->Enable(); | 162 devtools_client_->GetPage()->Enable(); |
| 203 devtools_client_->GetPage()->Navigate( | 163 devtools_client_->GetPage()->Navigate( |
| 204 embedded_test_server()->GetURL("/hello.html").spec()); | 164 embedded_test_server()->GetURL("/hello.html").spec()); |
| 205 } | 165 } |
| 206 | 166 |
| 207 void OnFrameStoppedLoading( | 167 void OnFrameStoppedLoading( |
| 208 const page::FrameStoppedLoadingParams& params) override { | 168 const page::FrameStoppedLoadingParams& params) override { |
| 209 FinishAsynchronousTest(); | 169 FinishAsynchronousTest(); |
| 210 } | 170 } |
| 211 }; | 171 }; |
| 212 | 172 |
| 213 DEVTOOLS_CLIENT_TEST_F(HeadlessDevToolsClientExperimentalTest); | 173 HEADLESS_ASYNC_DEVTOOLED_TEST_F(HeadlessDevToolsClientExperimentalTest); |
| 214 | 174 |
| 215 } // namespace headless | 175 } // namespace headless |
| OLD | NEW |