[M120 Migration][MM] Support W3C EME
[platform/framework/web/chromium-efl.git] / tizen_src / ewk / unittest / utc_blink_ewk_intercept_request_response_set_func.cpp
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.
4
5 #include "utc_blink_ewk_base.h"
6
7 #include <cstring>
8 #include <string>
9
10 #include "utc_blink_api_result_locked.h"
11
12 class utc_blink_ewk_intercept_request_response_set : public utc_blink_ewk_base {
13  public:
14   utc_blink_ewk_intercept_request_response_set() {
15     body_length_ = strlen(kBody);
16     int headers_length =
17         snprintf(nullptr, 0, kHeadersTemplate, body_length_) + 1;  // for '\0'
18     headers_ = new char[headers_length];
19     snprintf(headers_, headers_length, kHeadersTemplate, body_length_);
20
21     body_ajax_length_ = strlen(kBodyAjax);
22     int headers_ajax_length =
23         snprintf(nullptr, 0, kHeadersTemplate, body_ajax_length_) +
24         1;  // for '\0'
25     headers_ajax_ = new char[headers_ajax_length];
26     snprintf(headers_ajax_, headers_ajax_length, kHeadersTemplate,
27              body_ajax_length_);
28
29     body_ajax_response_length_ = strlen(kBodyAjaxResponse);
30     int headers_ajax_response_length =
31         snprintf(nullptr, 0, kHeadersTemplate, body_ajax_response_length_) +
32         1;  // for '\0'
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_);
36   }
37
38   ~utc_blink_ewk_intercept_request_response_set() override {
39     delete[] headers_;
40     delete[] headers_ajax_;
41     delete[] headers_ajax_response_;
42   }
43
44  protected:
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;
50
51   void PostSetUp() override {
52     evas_object_smart_callback_add(GetEwkWebView(), "title,changed",
53                                    title_changed, this);
54   }
55
56   void PreTearDown() override {
57     evas_object_smart_callback_del(GetEwkWebView(), "title,changed",
58                                    title_changed);
59   }
60
61   void LoadFinished(Evas_Object* webview) override {
62     // different title for first intercepted request
63     first_title_ = ewk_view_title_get(webview);
64   }
65
66   static void title_changed(void* data,
67                             Evas_Object* webview,
68                             void* event_info) {
69     auto* owner =
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);
74     }
75   }
76
77   static void intercept_request_callback_response_set_ajax(
78       Ewk_Context* /*ctx*/,
79       Ewk_Intercept_Request* intercept_request,
80       void* user_data) {
81     auto* owner =
82         static_cast<utc_blink_ewk_intercept_request_response_set*>(user_data);
83
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_);
90     } else {
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_);
95     }
96   }
97
98   static void intercept_request_callback_response_set_null_request_intercept(
99       Ewk_Context* /*ctx*/,
100       Ewk_Intercept_Request* /*intercept_request*/,
101       void* user_data) {
102     auto* owner =
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_);
106   }
107
108   static void intercept_request_callback_response_set_null_headers(
109       Ewk_Context* /*ctx*/,
110       Ewk_Intercept_Request* intercept_request,
111       void* user_data) {
112     auto* owner =
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_);
116   }
117
118   static void intercept_request_callback_response_set_null_body(
119       Ewk_Context* /*ctx*/,
120       Ewk_Intercept_Request* intercept_request,
121       void* user_data) {
122     auto* owner =
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_)
126   }
127
128   static void intercept_request_callback_response_set_negative_length(
129       Evas_Object* o,
130       Ewk_Intercept_Request* intercept_request,
131       void* user_data) {
132     auto* owner =
133         static_cast<utc_blink_ewk_intercept_request_response_set*>(user_data);
134     if (ewk_intercept_request_response_set(intercept_request, owner->headers_,
135                                            kBody, -1))
136       owner->EventLoopStop(Failure);
137     else
138       owner->EventLoopStop(Success);
139   }
140
141   int body_length_;
142   int body_ajax_length_;
143   int body_ajax_response_length_;
144   char* headers_;
145   char* headers_ajax_;
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_;
151 };
152
153 const char* utc_blink_ewk_intercept_request_response_set::kInterceptURL =
154     "http://www.google.com/";
155
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";
162
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>";
166
167 const char* utc_blink_ewk_intercept_request_response_set::kBodyAjax =
168     "<html><head><title>first intercepted</title></head>"
169     "<body><script>"
170     "function ajax_listener() {"
171     "document.title = this.responseText + ' ' + this.status + ' ' + "
172     "this.statusText + ' ' + this.getResponseHeader('Server');"
173     "}"
174     "var ajax = new XMLHttpRequest();"
175     "ajax.onload = ajax_listener;"
176     "ajax.open('GET', 'http://www.google.com/ewk-test/', true);"
177     "ajax.send();"
178     "</script>"
179     "</body></html>";
180
181 const char* utc_blink_ewk_intercept_request_response_set::kBodyAjaxResponse =
182     "AJAX";
183
184 /**
185  * @brief Tests if body and custom headers are set.
186  */
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);
191
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()));
208 }
209
210 /**
211  * @brief Tests if EINA_FALSE is returned for null intercept request.
212  */
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);
218
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());
223 }
224
225 /**
226  * @brief Tests if EINA_FALSE is returned for null headers.
227  */
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);
232
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());
237 }
238
239 /**
240  * @brief Tests if EINA_FALSE is returned for null body.
241  */
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);
245
246   ASSERT_TRUE(ewk_view_url_set(GetEwkWebView(), kInterceptURL));
247   ASSERT_EQ(Success, EventLoopStart());
248 }
249
250 /**
251  * @brief Tests if EINA_FALSE is returned for negative body length.
252  */
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);
257
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());
262 }