PuzzleSDK
HttpClientTest.cpp
浏览该文件的文档.
1/****************************************************************************
2 Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd.
3
4 http://www.cocos2d-x.org
5
6 Permission is hereby granted, free of charge, to any person obtaining a copy
7 of this software and associated documentation files (the "Software"), to deal
8 in the Software without restriction, including without limitation the rights
9 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 copies of the Software, and to permit persons to whom the Software is
11 furnished to do so, subject to the following conditions:
12
13 The above copyright notice and this permission notice shall be included in
14 all copies or substantial portions of the Software.
15
16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 THE SOFTWARE.
23 ****************************************************************************/
24
25#include "HttpClientTest.h"
26#include "../ExtensionsTest.h"
27#include <string>
28
31using namespace cocos2d::network;
32
33HttpClientTests::HttpClientTests()
34{
37}
38
40: _labelStatusCode(nullptr)
41{
42 auto winSize = Director::getInstance()->getWinSize();
43
44 const int MARGIN = 40;
45 const int SPACE = 35;
46
47 const int LEFT = winSize.width / 4;
48 const int RIGHT = winSize.width / 4 * 3;
49
50 auto menuRequest = Menu::create();
51 menuRequest->setPosition(Vec2::ZERO);
52 addChild(menuRequest);
53
54 // Get
55 auto labelGet = Label::createWithTTF("Test Get", "fonts/arial.ttf", 22);
56 auto itemGet = MenuItemLabel::create(labelGet, CC_CALLBACK_1(HttpClientTest::onMenuGetTestClicked, this, false));
57 itemGet->setPosition(LEFT, winSize.height - MARGIN - SPACE);
58 menuRequest->addChild(itemGet);
59
60 // Post
61 auto labelPost = Label::createWithTTF("Test Post", "fonts/arial.ttf", 22);
62 auto itemPost = MenuItemLabel::create(labelPost, CC_CALLBACK_1(HttpClientTest::onMenuPostTestClicked, this, false));
63 itemPost->setPosition(LEFT, winSize.height - MARGIN - 2 * SPACE);
64 menuRequest->addChild(itemPost);
65
66 // Post Binary
67 auto labelPostBinary = Label::createWithTTF("Test Post Binary", "fonts/arial.ttf", 22);
68 auto itemPostBinary = MenuItemLabel::create(labelPostBinary, CC_CALLBACK_1(HttpClientTest::onMenuPostBinaryTestClicked, this, false));
69 itemPostBinary->setPosition(LEFT, winSize.height - MARGIN - 3 * SPACE);
70 menuRequest->addChild(itemPostBinary);
71
72 // Put
73 auto labelPut = Label::createWithTTF("Test Put", "fonts/arial.ttf", 22);
74 auto itemPut = MenuItemLabel::create(labelPut, CC_CALLBACK_1(HttpClientTest::onMenuPutTestClicked, this, false));
75 itemPut->setPosition(LEFT, winSize.height - MARGIN - 4 * SPACE);
76 menuRequest->addChild(itemPut);
77
78 // Delete
79 auto labelDelete = Label::createWithTTF("Test Delete", "fonts/arial.ttf", 22);
80 auto itemDelete = MenuItemLabel::create(labelDelete, CC_CALLBACK_1(HttpClientTest::onMenuDeleteTestClicked, this, false));
81 itemDelete->setPosition(LEFT, winSize.height - MARGIN - 5 * SPACE);
82 menuRequest->addChild(itemDelete);
83
84 // Get for sendImmediate
85 labelGet = Label::createWithTTF("Test Immediate Get", "fonts/arial.ttf", 22);
86 itemGet = MenuItemLabel::create(labelGet, CC_CALLBACK_1(HttpClientTest::onMenuGetTestClicked, this, true));
87 itemGet->setPosition(RIGHT, winSize.height - MARGIN - SPACE);
88 menuRequest->addChild(itemGet);
89
90 // Post for sendImmediate
91 labelPost = Label::createWithTTF("Test Immediate Post", "fonts/arial.ttf", 22);
92 itemPost = MenuItemLabel::create(labelPost, CC_CALLBACK_1(HttpClientTest::onMenuPostTestClicked, this, true));
93 itemPost->setPosition(RIGHT, winSize.height - MARGIN - 2 * SPACE);
94 menuRequest->addChild(itemPost);
95
96 // Post Binary for sendImmediate
97 labelPostBinary = Label::createWithTTF("Test Immediate Post Binary", "fonts/arial.ttf", 22);
98 itemPostBinary = MenuItemLabel::create(labelPostBinary, CC_CALLBACK_1(HttpClientTest::onMenuPostBinaryTestClicked, this, true));
99 itemPostBinary->setPosition(RIGHT, winSize.height - MARGIN - 3 * SPACE);
100 menuRequest->addChild(itemPostBinary);
101
102 // Put for sendImmediate
103 labelPut = Label::createWithTTF("Test Immediate Put", "fonts/arial.ttf", 22);
104 itemPut = MenuItemLabel::create(labelPut, CC_CALLBACK_1(HttpClientTest::onMenuPutTestClicked, this, true));
105 itemPut->setPosition(RIGHT, winSize.height - MARGIN - 4 * SPACE);
106 menuRequest->addChild(itemPut);
107
108 // Delete for sendImmediate
109 labelDelete = Label::createWithTTF("Test Immediate Delete", "fonts/arial.ttf", 22);
110 itemDelete = MenuItemLabel::create(labelDelete, CC_CALLBACK_1(HttpClientTest::onMenuDeleteTestClicked, this, true));
111 itemDelete->setPosition(RIGHT, winSize.height - MARGIN - 5 * SPACE);
112 menuRequest->addChild(itemDelete);
113
114 // Response Code Label
115 _labelStatusCode = Label::createWithTTF("HTTP Status Code", "fonts/arial.ttf", 18);
116 _labelStatusCode->setPosition(winSize.width / 2, winSize.height - MARGIN - 6 * SPACE);
117 addChild(_labelStatusCode);
118}
119
121{
122 HttpClient::destroyInstance();
123}
124
125void HttpClientTest::onMenuGetTestClicked(cocos2d::Ref *sender, bool isImmediate)
126{
127 // test 1
128 {
129 HttpRequest* request = new (std::nothrow) HttpRequest();
130 request->setUrl("https://just-make-this-request-failed.com");
131 request->setRequestType(HttpRequest::Type::GET);
132 request->setResponseCallback(CC_CALLBACK_2(HttpClientTest::onHttpRequestCompleted, this));
133 if (isImmediate)
134 {
135 request->setTag("GET immediate test1");
136 HttpClient::getInstance()->sendImmediate(request);
137 }else
138 {
139 request->setTag("GET test1");
140 HttpClient::getInstance()->send(request);
141 }
142 request->release();
143 }
144
145 // test 2
146 {
147 HttpRequest* request = new (std::nothrow) HttpRequest();
148 // required fields
149 request->setUrl("https://httpbin.org/ip");
150 request->setRequestType(HttpRequest::Type::GET);
151 request->setResponseCallback(CC_CALLBACK_2(HttpClientTest::onHttpRequestCompleted, this));
152 if (isImmediate)
153 {
154 request->setTag("GET immediate test2");
155 HttpClient::getInstance()->sendImmediate(request);
156 }else
157 {
158 request->setTag("GET test2");
159 HttpClient::getInstance()->send(request);
160 }
161 // don't forget to release it, pair to new
162 request->release();
163 }
164
165 // test 3
166 {
167 HttpRequest* request = new (std::nothrow) HttpRequest();
168 request->setUrl("https://httpbin.org/get");
169 request->setRequestType(HttpRequest::Type::GET);
170 request->setResponseCallback(CC_CALLBACK_2(HttpClientTest::onHttpRequestCompleted, this));
171 if (isImmediate)
172 {
173 request->setTag("GET immediate test3");
174 HttpClient::getInstance()->sendImmediate(request);
175 }else
176 {
177 request->setTag("GET test3");
178 HttpClient::getInstance()->send(request);
179 }
180 request->release();
181 }
182
183 // waiting
184 _labelStatusCode->setString("waiting...");
185
186}
187
188void HttpClientTest::onMenuPostTestClicked(cocos2d::Ref *sender, bool isImmediate)
189{
190 // test 1
191 {
192 HttpRequest* request = new (std::nothrow) HttpRequest();
193 request->setUrl("https://httpbin.org/post");
194 request->setRequestType(HttpRequest::Type::POST);
195 request->setResponseCallback(CC_CALLBACK_2(HttpClientTest::onHttpRequestCompleted, this));
196
197 // write the post data
198 const char* postData = "visitor=cocos2d&TestSuite=Extensions Test/NetworkTest";
199 request->setRequestData(postData, strlen(postData));
200 if (isImmediate)
201 {
202 request->setTag("POST immediate test1");
203 HttpClient::getInstance()->sendImmediate(request);
204 }else
205 {
206 request->setTag("POST test1");
207 HttpClient::getInstance()->send(request);
208 }
209 request->release();
210 }
211
212 // test 2: set Content-Type
213 {
214 HttpRequest* request = new (std::nothrow) HttpRequest();
215 request->setUrl("https://httpbin.org/post");
216 request->setRequestType(HttpRequest::Type::POST);
217 std::vector<std::string> headers;
218 headers.push_back("Content-Type: application/json; charset=utf-8");
219 request->setHeaders(headers);
220 request->setResponseCallback(CC_CALLBACK_2(HttpClientTest::onHttpRequestCompleted, this));
221
222 // write the post data
223 const char* postData = "visitor=cocos2d&TestSuite=Extensions Test/NetworkTest";
224 request->setRequestData(postData, strlen(postData));
225 if (isImmediate)
226 {
227 request->setTag("POST immediate test2");
228 HttpClient::getInstance()->sendImmediate(request);
229 }else
230 {
231 request->setTag("POST test2");
232 HttpClient::getInstance()->send(request);
233 }
234 request->release();
235 }
236
237 // waiting
238 _labelStatusCode->setString("waiting...");
239}
240
241void HttpClientTest::onMenuPostBinaryTestClicked(cocos2d::Ref *sender, bool isImmediate)
242{
243 HttpRequest* request = new (std::nothrow) HttpRequest();
244 request->setUrl("https://httpbin.org/post");
245 request->setRequestType(HttpRequest::Type::POST);
246 request->setResponseCallback(CC_CALLBACK_2(HttpClientTest::onHttpRequestCompleted, this));
247
248 // write the post data
249 char postData[22] = "binary=hello\0\0cocos2d"; // including \0, the strings after \0 should not be cut in response
250 request->setRequestData(postData, 22);
251 if (isImmediate)
252 {
253 request->setTag("POST Binary immediate test");
254 HttpClient::getInstance()->sendImmediate(request);
255 }else
256 {
257 request->setTag("POST Binary test");
258 HttpClient::getInstance()->send(request);
259 }
260 request->release();
261
262 // waiting
263 _labelStatusCode->setString("waiting...");
264}
265
266
267
268void HttpClientTest::onMenuPutTestClicked(Ref *sender, bool isImmediate)
269{
270 // test 1
271 {
272 HttpRequest* request = new (std::nothrow) HttpRequest();
273 request->setUrl("https://httpbin.org/put");
274 request->setRequestType(HttpRequest::Type::PUT);
275 request->setResponseCallback(CC_CALLBACK_2(HttpClientTest::onHttpRequestCompleted, this));
276
277 // write the post data
278 const char* postData = "visitor=cocos2d&TestSuite=Extensions Test/NetworkTest";
279 request->setRequestData(postData, strlen(postData));
280 if (isImmediate)
281 {
282 request->setTag("PUT Binary immediate test1");
283 HttpClient::getInstance()->sendImmediate(request);
284 }else
285 {
286 request->setTag("PUT Binary test1");
287 HttpClient::getInstance()->send(request);
288 }
289 request->release();
290 }
291
292 // test 2: set Content-Type
293 {
294 HttpRequest* request = new (std::nothrow) HttpRequest();
295 request->setUrl("https://httpbin.org/put");
296 request->setRequestType(HttpRequest::Type::PUT);
297 std::vector<std::string> headers;
298 headers.push_back("Content-Type: application/json; charset=utf-8");
299 request->setHeaders(headers);
300 request->setResponseCallback(CC_CALLBACK_2(HttpClientTest::onHttpRequestCompleted, this));
301
302 // write the post data
303 const char* postData = "visitor=cocos2d&TestSuite=Extensions Test/NetworkTest";
304 request->setRequestData(postData, strlen(postData));
305 if (isImmediate)
306 {
307 request->setTag("PUT Binary immediate test2");
308 HttpClient::getInstance()->sendImmediate(request);
309 }else
310 {
311 request->setTag("PUT Binary test2");
312 HttpClient::getInstance()->send(request);
313 }
314 request->release();
315 }
316
317 // waiting
318 _labelStatusCode->setString("waiting...");
319}
320
321void HttpClientTest::onMenuDeleteTestClicked(Ref *sender, bool isImmediate)
322{
323 // test 1
324 {
325 HttpRequest* request = new (std::nothrow) HttpRequest();
326 request->setUrl("https://just-make-this-request-failed.com");
327 request->setRequestType(HttpRequest::Type::DELETE);
328 request->setResponseCallback(CC_CALLBACK_2(HttpClientTest::onHttpRequestCompleted, this));
329 if (isImmediate)
330 {
331 request->setTag("DELETE immediate test1");
332 HttpClient::getInstance()->sendImmediate(request);
333 }else
334 {
335 request->setTag("DELETE test1");
336 HttpClient::getInstance()->send(request);
337 }
338 request->release();
339 }
340
341 // test 2
342 {
343 HttpRequest* request = new (std::nothrow) HttpRequest();
344 request->setUrl("https://httpbin.org/delete");
345 request->setRequestType(HttpRequest::Type::DELETE);
346 request->setResponseCallback(CC_CALLBACK_2(HttpClientTest::onHttpRequestCompleted, this));
347 if (isImmediate)
348 {
349 request->setTag("DELETE immediate test2");
350 HttpClient::getInstance()->sendImmediate(request);
351 }else
352 {
353 request->setTag("DELETE test2");
354 HttpClient::getInstance()->send(request);
355 }
356 request->release();
357 }
358
359 // waiting
360 _labelStatusCode->setString("waiting...");
361}
362
363void HttpClientTest::onHttpRequestCompleted(HttpClient *sender, HttpResponse *response)
364{
365 if (!response)
366 {
367 return;
368 }
369
370 // You can get original request type from: response->request->reqType
371 if (0 != strlen(response->getHttpRequest()->getTag()))
372 {
373 log("%s completed", response->getHttpRequest()->getTag());
374 }
375
376 long statusCode = response->getResponseCode();
377 char statusString[64] = {};
378 sprintf(statusString, "HTTP Status Code: %ld, tag = %s", statusCode, response->getHttpRequest()->getTag());
379 _labelStatusCode->setString(statusString);
380 log("response code: %ld", statusCode);
381
382 if (!response->isSucceed())
383 {
384 log("response failed");
385 log("error buffer: %s", response->getErrorBuffer());
386 return;
387 }
388
389 // dump data
390 std::vector<char> *buffer = response->getResponseData();
391 log("Http Test, dump data: ");
392 for (unsigned int i = 0; i < buffer->size(); i++)
393 {
394 log("%c", (*buffer)[i]);
395 }
396 log("\n");
397 if (response->getHttpRequest()->getReferenceCount() != 2)
398 {
399 log("request ref count not 2, is %d", response->getHttpRequest()->getReferenceCount());
400 }
401}
402
403
404
405
407: _labelStatusCode(nullptr)
408{
409 auto winSize = Director::getInstance()->getWinSize();
410
411 const int MARGIN = 40;
412 const int SPACE = 35;
413
414 const int CENTER = winSize.width / 2;
415
416 auto menuRequest = Menu::create();
417 menuRequest->setPosition(Vec2::ZERO);
418 addChild(menuRequest);
419
420 // Get
421 auto labelGet = Label::createWithTTF("Test Clear all Get", "fonts/arial.ttf", 22);
422 auto itemGet = MenuItemLabel::create(labelGet, CC_CALLBACK_1(HttpClientClearRequestsTest::onMenuCancelAllClicked, this));
423 itemGet->setPosition(CENTER, winSize.height - MARGIN - SPACE);
424 menuRequest->addChild(itemGet);
425
426 // Post
427 auto labelPost = Label::createWithTTF("Test Clear but only with the tag DELETE", "fonts/arial.ttf", 22);
428 auto itemPost = MenuItemLabel::create(labelPost, CC_CALLBACK_1(HttpClientClearRequestsTest::onMenuCancelSomeClicked, this));
429 itemPost->setPosition(CENTER, winSize.height - MARGIN - 2 * SPACE);
430 menuRequest->addChild(itemPost);
431
432 // Response Code Label
433 _labelStatusCode = Label::createWithTTF("HTTP Status Code", "fonts/arial.ttf", 18);
434 _labelStatusCode->setPosition(winSize.width / 2, winSize.height - MARGIN - 6 * SPACE);
435 addChild(_labelStatusCode);
436
437 // Tracking Data Label
438 _labelTrakingData = Label::createWithTTF("Got 0 of 0 expected http requests", "fonts/arial.ttf", 16);
439 _labelTrakingData->setPosition(CENTER, winSize.height - MARGIN - 5 * SPACE);
440 addChild(_labelTrakingData);
441
444}
445
447{
448 HttpClient::destroyInstance();
449}
450
452{
453 for (int i=0; i < 10; i++)
454 {
455 HttpRequest* request = new (std::nothrow) HttpRequest();
456 std::stringstream url;
457 url << "https://cocos2d-x.org/images/logo.png?id=" << std::to_string(i);
458 request->setUrl(url.str());
459 request->setRequestType(HttpRequest::Type::GET);
460 request->setResponseCallback(CC_CALLBACK_2(HttpClientClearRequestsTest::onHttpRequestCompleted, this));
461
462 url.str("");
463 url << "TEST_" << std::to_string(i);
464 request->setTag(url.str());
465 HttpClient::getInstance()->send(request);
466 request->release();
467 }
468
471
472 HttpClient::getInstance()->setClearRequestPredicate(nullptr);
473 HttpClient::getInstance()->setClearResponsePredicate(nullptr);
474 HttpClient::getInstance()->clearResponseAndRequestQueue();
475
476 // waiting
477 _labelStatusCode->setString("waiting...");
478}
479
481{
482 // test 1
483 for (int i=0; i < 10; i++)
484 {
485 HttpRequest* request = new (std::nothrow) HttpRequest();
486 std::stringstream url;
487 url << "https://cocos2d-x.org/images/logo.png?id=" << std::to_string(i);
488 request->setUrl(url.str());
489 request->setRequestType(HttpRequest::Type::GET);
490 request->setResponseCallback(CC_CALLBACK_2(HttpClientClearRequestsTest::onHttpRequestCompleted, this));
491
492 url.str("");
493 if (i < 5) {
494 url << "TEST_" << std::to_string(i);
496 }
497 else {
498 url << "DELETE_" << std::to_string(i);
499 }
500 request->setTag(url.str());
501 HttpClient::getInstance()->send(request);
502 request->release();
503 }
504
505 HttpClient::getInstance()->setClearRequestPredicate([&](HttpRequest* req)
506 {
507 auto r = !!strstr(req->getTag(), "DELETE_");
508 return r;
509 });
510 HttpClient::getInstance()->setClearResponsePredicate(nullptr);
511 HttpClient::getInstance()->clearResponseAndRequestQueue();
512
513
514 // waiting
515 _labelStatusCode->setString("waiting...");
516
517}
518
519void HttpClientClearRequestsTest::onHttpRequestCompleted(HttpClient *sender, HttpResponse *response)
520{
521 if (!response)
522 {
523 return;
524 }
525
526 // You can get original request type from: response->request->reqType
527 if (0 != strlen(response->getHttpRequest()->getTag()))
528 {
529 log("%s completed", response->getHttpRequest()->getTag());
530 }
531
532 long statusCode = response->getResponseCode();
533 char statusString[64] = {};
534 sprintf(statusString, "HTTP Status Code: %ld, tag = %s", statusCode, response->getHttpRequest()->getTag());
535 _labelStatusCode->setString(statusString);
536 log("response code: %ld", statusCode);
537
539 sprintf(statusString, "Got %d of %d expected http requests", _totalProcessedRequests, _totalExpectedRequests);
540 _labelTrakingData->setString(statusString);
541
542 if (!response->isSucceed())
543 {
544 log("response failed");
545 log("error buffer: %s", response->getErrorBuffer());
546 }
547}
#define ADD_TEST_CASE(__className__)
Definition: BaseTest.h:211
USING_NS_CC_EXT
USING_NS_CC
void onMenuCancelSomeClicked(cocos2d::Ref *sender)
cocos2d::Label * _labelTrakingData
void onHttpRequestCompleted(cocos2d::network::HttpClient *sender, cocos2d::network::HttpResponse *response)
void onMenuCancelAllClicked(cocos2d::Ref *sender)
cocos2d::Label * _labelStatusCode
void onMenuGetTestClicked(cocos2d::Ref *sender, bool isImmediate)
virtual ~HttpClientTest()
void onMenuDeleteTestClicked(cocos2d::Ref *sender, bool isImmediate)
void onMenuPostBinaryTestClicked(cocos2d::Ref *sender, bool isImmediate)
void onMenuPostTestClicked(cocos2d::Ref *sender, bool isImmediate)
void onHttpRequestCompleted(cocos2d::network::HttpClient *sender, cocos2d::network::HttpResponse *response)
void onMenuPutTestClicked(cocos2d::Ref *sender, bool isImmediate)
cocos2d::Label * _labelStatusCode