1 // Copyright 2016 Samsung Electronics. 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.
5 #include "utc_blink_ewk_base.h"
10 #include "utc_blink_api_result_locked.h"
12 class utc_blink_ewk_intercept_request_response_set : public utc_blink_ewk_base {
14 utc_blink_ewk_intercept_request_response_set() {
15 body_length_ = strlen(kBody);
17 snprintf(nullptr, 0, kHeadersTemplate, body_length_) + 1; // for '\0'
18 headers_ = new char[headers_length];
19 snprintf(headers_, headers_length, kHeadersTemplate, body_length_);
21 body_ajax_length_ = strlen(kBodyAjax);
22 int headers_ajax_length =
23 snprintf(nullptr, 0, kHeadersTemplate, body_ajax_length_) +
25 headers_ajax_ = new char[headers_ajax_length];
26 snprintf(headers_ajax_, headers_ajax_length, kHeadersTemplate,
29 body_ajax_response_length_ = strlen(kBodyAjaxResponse);
30 int headers_ajax_response_length =
31 snprintf(nullptr, 0, kHeadersTemplate, body_ajax_response_length_) +
33 headers_ajax_response_ = new char[headers_ajax_response_length];
34 snprintf(headers_ajax_response_, headers_ajax_response_length,
35 kHeadersTemplate, body_ajax_response_length_);
38 ~utc_blink_ewk_intercept_request_response_set() override {
40 delete[] headers_ajax_;
41 delete[] headers_ajax_response_;
45 static const char* kInterceptURL;
46 static const char* kHeadersTemplate;
47 static const char* kBody;
48 static const char* kBodyAjax;
49 static const char* kBodyAjaxResponse;
51 void PostSetUp() override {
52 evas_object_smart_callback_add(GetEwkWebView(), "title,changed",
56 void PreTearDown() override {
57 evas_object_smart_callback_del(GetEwkWebView(), "title,changed",
61 void LoadFinished(Evas_Object* webview) override {
62 // different title for first intercepted request
63 first_title_ = ewk_view_title_get(webview);
66 static void title_changed(void* data,
70 static_cast<utc_blink_ewk_intercept_request_response_set*>(data);
71 const char* title = ewk_view_title_get(owner->GetEwkWebView());
72 if (strcmp(title, "first intercepted") != 0) {
73 owner->EventLoopStop(Success);
77 static void intercept_request_callback_response_set_ajax(
79 Ewk_Intercept_Request* intercept_request,
82 static_cast<utc_blink_ewk_intercept_request_response_set*>(user_data);
84 const char* url = ewk_intercept_request_url_get(intercept_request);
85 if (strcmp(url, "http://www.google.com/ewk-test/") == 0) {
86 // intercept ajax request
87 owner->api_result_ajax_ = ewk_intercept_request_response_set(
88 intercept_request, owner->headers_ajax_response_, kBodyAjaxResponse,
89 owner->body_ajax_response_length_);
91 // intercept first page request
92 owner->api_result_page_ = ewk_intercept_request_response_set(
93 intercept_request, owner->headers_ajax_, kBodyAjax,
94 owner->body_ajax_length_);
98 static void intercept_request_callback_response_set_null_request_intercept(
100 Ewk_Intercept_Request* /*intercept_request*/,
103 static_cast<utc_blink_ewk_intercept_request_response_set*>(user_data);
104 owner->api_result_ = ewk_intercept_request_response_set(
105 nullptr, owner->headers_, kBody, owner->body_length_);
108 static void intercept_request_callback_response_set_null_headers(
109 Ewk_Context* /*ctx*/,
110 Ewk_Intercept_Request* intercept_request,
113 static_cast<utc_blink_ewk_intercept_request_response_set*>(user_data);
114 owner->api_result_ = ewk_intercept_request_response_set(
115 intercept_request, nullptr, kBody, owner->body_length_);
118 static void intercept_request_callback_response_set_null_body(
119 Ewk_Context* /*ctx*/,
120 Ewk_Intercept_Request* intercept_request,
123 static_cast<utc_blink_ewk_intercept_request_response_set*>(user_data);
124 owner->api_result_ = ewk_intercept_request_response_set(
125 intercept_request, owner->headers_, nullptr, owner->body_length_)
128 static void intercept_request_callback_response_set_negative_length(
130 Ewk_Intercept_Request* intercept_request,
133 static_cast<utc_blink_ewk_intercept_request_response_set*>(user_data);
134 if (ewk_intercept_request_response_set(intercept_request, owner->headers_,
136 owner->EventLoopStop(Failure);
138 owner->EventLoopStop(Success);
142 int body_ajax_length_;
143 int body_ajax_response_length_;
146 char* headers_ajax_response_;
147 std::string first_title_;
148 ApiResultLocked<Eina_Bool> api_result_;
149 ApiResultLocked<Eina_Bool> api_result_ajax_;
150 ApiResultLocked<Eina_Bool> api_result_page_;
153 const char* utc_blink_ewk_intercept_request_response_set::kInterceptURL =
154 "http://www.google.com/";
156 const char* utc_blink_ewk_intercept_request_response_set::kHeadersTemplate =
157 "HTTP/1.1 200 OK\r\n"
158 "Content-Type: text/html; charset=UTF-8\r\n"
159 "Content-Length: %d\r\n"
160 "Access-Control-Allow-Origin: *\r\n"
161 "Server: TEST\r\n\r\n";
163 const char* utc_blink_ewk_intercept_request_response_set::kBody =
164 "<html><head><title>intercepted</title></head>"
165 "<body>Hello, Request Intercept!</body></html>";
167 const char* utc_blink_ewk_intercept_request_response_set::kBodyAjax =
168 "<html><head><title>first intercepted</title></head>"
170 "function ajax_listener() {"
171 "document.title = this.responseText + ' ' + this.status + ' ' + "
172 "this.statusText + ' ' + this.getResponseHeader('Server');"
174 "var ajax = new XMLHttpRequest();"
175 "ajax.onload = ajax_listener;"
176 "ajax.open('GET', 'http://www.google.com/ewk-test/', true);"
181 const char* utc_blink_ewk_intercept_request_response_set::kBodyAjaxResponse =
185 * @brief Tests if body and custom headers are set.
187 TEST_F(utc_blink_ewk_intercept_request_response_set, POS_TEST_RESPONSE_SET) {
188 ewk_context_intercept_request_callback_set(
189 ewk_view_context_get(GetEwkWebView()),
190 intercept_request_callback_response_set_ajax, this);
192 ASSERT_TRUE(ewk_view_url_set(GetEwkWebView(), kInterceptURL));
193 ASSERT_EQ(Success, EventLoopStart());
194 EXPECT_FALSE(first_title_.empty());
195 EXPECT_EQ(std::string::npos, first_title_.find("Google"))
196 << "Substring \"Google\" in "
197 << "\"" << first_title_ << "\"." << std::endl;
198 EXPECT_NE(std::string::npos, first_title_.find("first intercepted"))
199 << "Substring \"first intercepted\" not in "
200 << "\"" << first_title_ << "\"." << std::endl;
201 ASSERT_TRUE(api_result_page_.IsSet());
202 ASSERT_EQ(EINA_TRUE, api_result_page_.Get());
203 ASSERT_TRUE(api_result_ajax_.IsSet());
204 ASSERT_EQ(EINA_TRUE, api_result_ajax_.Get());
205 // title set in JS after ajax response:
206 // <response_body> <status_code> <status_text> <header('Server')>
207 EXPECT_STREQ("AJAX 200 OK TEST", ewk_view_title_get(GetEwkWebView()));
211 * @brief Tests if EINA_FALSE is returned for null intercept request.
213 TEST_F(utc_blink_ewk_intercept_request_response_set,
214 NEG_TEST_NULL_INTERCEPT_RESPONSE) {
215 ewk_context_intercept_request_callback_set(
216 ewk_view_context_get(GetEwkWebView()),
217 intercept_request_callback_response_set_null_request_intercept, this);
219 ASSERT_TRUE(ewk_view_url_set(GetEwkWebView(), kInterceptURL));
220 ASSERT_EQ(Timeout, EventLoopStart(3.0));
221 ASSERT_TRUE(api_result_.IsSet());
222 ASSERT_EQ(EINA_FALSE, api_result_.Get());
226 * @brief Tests if EINA_FALSE is returned for null headers.
228 TEST_F(utc_blink_ewk_intercept_request_response_set, NEG_TEST_NULL_HEADERS) {
229 ewk_context_intercept_request_callback_set(
230 ewk_view_context_get(GetEwkWebView()),
231 intercept_request_callback_response_set_null_headers, this);
233 ASSERT_TRUE(ewk_view_url_set(GetEwkWebView(), kInterceptURL));
234 ASSERT_EQ(Timeout, EventLoopStart(3.0));
235 ASSERT_TRUE(api_result_.IsSet());
236 ASSERT_EQ(EINA_FALSE, api_result_.Get());
240 * @brief Tests if EINA_FALSE is returned for null body.
242 TEST_F(utc_blink_ewk_intercept_request_response_set, NEG_TEST_NULL_BODY) {
243 ewk_view_intercept_request_callback_set(
244 GetEwkWebView(), intercept_request_callback_response_set_null_body, this);
246 ASSERT_TRUE(ewk_view_url_set(GetEwkWebView(), kInterceptURL));
247 ASSERT_EQ(Success, EventLoopStart());
251 * @brief Tests if EINA_FALSE is returned for negative body length.
253 TEST_F(utc_blink_ewk_intercept_request_response_set, NEG_TEST_NEGATIVE_LENGTH) {
254 ewk_context_intercept_request_callback_set(
255 ewk_view_context_get(GetEwkWebView()),
256 intercept_request_callback_response_set_negative_length, this);
258 ASSERT_TRUE(ewk_view_url_set(GetEwkWebView(), kInterceptURL));
259 ASSERT_EQ(Timeout, EventLoopStart(3.0));
260 ASSERT_TRUE(api_result_.IsSet());
261 ASSERT_EQ(EINA_FALSE, api_result_.Get());