3
Implements unit test for SDK APIs
5
@section license License
7
Licensed to the Apache Software Foundation (ASF) under one
8
or more contributor license agreements. See the NOTICE file
9
distributed with this work for additional information
10
regarding copyright ownership. The ASF licenses this file
11
to you under the Apache License, Version 2.0 (the
12
"License"); you may not use this file except in compliance
13
with the License. You may obtain a copy of the License at
15
http://www.apache.org/licenses/LICENSE-2.0
17
Unless required by applicable law or agreed to in writing, software
18
distributed under the License is distributed on an "AS IS" BASIS,
19
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20
See the License for the specific language governing permissions and
21
limitations under the License.
24
#include "ink_config.h"
25
#include <sys/types.h>
35
#include "Regression.h"
36
#include "api/ts/ts.h"
37
#include "api/ts/experimental.h"
38
#include "I_RecCore.h"
41
#include "InkAPITestTool.cc"
42
#include "http2/HttpSM.h"
47
#define UTDBG_TAG "sdk_ut"
49
#define LOCAL_IP 0x7f000001 // 127.0.0.1
51
/******************************************************************************/
55
/* Use SDK_RPRINT to report failure or success for each test case */
57
SDK_RPRINT(RegressionTest * t, const char *api_name, const char *testcase_name, int status, const char *err_details_format, ...)
62
snprintf(format2, sizeof(format2), "[%s] %s : [%s] <<%s>> { %s }\n", t->name,
63
api_name, testcase_name, status == TC_PASS ? "PASS" : "FAIL", err_details_format);
65
va_start(ap, err_details_format);
66
l = ink_bvsprintf(buffer, format2, ap);
68
fputs(buffer, stderr);
74
REGRESSION_TEST(SDK_<test_name>)(RegressionTest *t, int atype, int *pstatus)
76
RegressionTest *test is a pointer on object that will run the test.
82
REGRESSION_TEST_NIGHTLY
83
REGRESSION_TEST_EXTENDED
85
int *pstatus should be set to one of:
86
REGRESSION_TEST_PASSED
87
REGRESSION_TEST_INPROGRESS
88
REGRESSION_TEST_FAILED
89
REGRESSION_TEST_NOT_RUN
90
Note: pstatus is polled and can be used for asynchroneous tests.
95
////////////////////////////////////////////////
96
// SDK_API_TSTrafficServerVersionGet
98
// Unit Test for API: TSTrafficServerVersionGet
99
////////////////////////////////////////////////
100
REGRESSION_TEST(SDK_API_TSTrafficServerVersionGet) (RegressionTest * test, int atype, int *pstatus)
102
NOWARN_UNUSED(atype);
103
*pstatus = REGRESSION_TEST_INPROGRESS;
105
/* Assume the UT runs on TS5.0 and higher */
106
const char *ts_version = TSTrafficServerVersionGet();
108
SDK_RPRINT(test, "TSTrafficServerVersionGet", "TestCase1", TC_FAIL, "can't get traffic server version");
109
*pstatus = REGRESSION_TEST_FAILED;
113
int major_ts_version = 0;
114
int minor_ts_version = 0;
115
int patch_ts_version = 0;
116
// coverity[secure_coding]
117
if (sscanf(ts_version, "%d.%d.%d", &major_ts_version, &minor_ts_version, &patch_ts_version) != 3) {
118
SDK_RPRINT(test, "TSTrafficServerVersionGet", "TestCase2", TC_FAIL, "traffic server version format is incorrect");
119
*pstatus = REGRESSION_TEST_FAILED;
123
if (major_ts_version < 2) {
124
SDK_RPRINT(test, "TSTrafficServerVersionGet", "TestCase3", TC_FAIL, "traffic server major version is incorrect");
125
*pstatus = REGRESSION_TEST_FAILED;
129
SDK_RPRINT(test, "TSTrafficServerVersionGet", "TestCase1", TC_PASS, "ok");
130
*pstatus = REGRESSION_TEST_PASSED;
135
////////////////////////////////////////////////
136
// SDK_API_TSPluginDirGet
138
// Unit Test for API: TSPluginDirGet
140
////////////////////////////////////////////////
141
REGRESSION_TEST(SDK_API_TSPluginDirGet) (RegressionTest * test, int atype, int *pstatus)
143
NOWARN_UNUSED(atype);
144
*pstatus = REGRESSION_TEST_INPROGRESS;
146
const char *plugin_dir = TSPluginDirGet();
147
const char *install_dir = TSInstallDirGet();
150
SDK_RPRINT(test, "TSPluginDirGet", "TestCase1", TC_FAIL, "can't get plugin dir");
151
*pstatus = REGRESSION_TEST_FAILED;
156
SDK_RPRINT(test, "TSInstallDirGet", "TestCase1", TC_FAIL, "can't get installation dir");
157
*pstatus = REGRESSION_TEST_FAILED;
161
// Note: This doesn't have to be true
162
// since the location can be anywhere
163
// We only pass this test, with the default layout.
164
if (strstr(plugin_dir, "libexec/trafficserver") == NULL) {
165
SDK_RPRINT(test, "TSPluginDirGet", "TestCase2", TC_FAIL, "plugin dir(%s) is incorrect, expected (%s) in path. Are you using the default layout?",plugin_dir,"libexec/trafficserver");
166
*pstatus = REGRESSION_TEST_FAILED;
170
if (strstr(plugin_dir, install_dir) == NULL) {
171
SDK_RPRINT(test, "TSInstallDirGet", "TestCase2", TC_FAIL, "install dir is incorrect");
172
*pstatus = REGRESSION_TEST_FAILED;
176
SDK_RPRINT(test, "TSPluginDirGet", "TestCase1", TC_PASS, "ok");
177
SDK_RPRINT(test, "TSInstallDirGet", "TestCase1", TC_PASS, "ok");
178
*pstatus = REGRESSION_TEST_PASSED;
184
////////////////////////////////////////////////
187
// Unit Test for API: TSConfigSet
191
////////////////////////////////////////////////
192
static int my_config_id = -1;
200
config_destroy_func(void *data)
202
ConfigData *config = (ConfigData *) data;
207
REGRESSION_TEST(SDK_API_TSConfig) (RegressionTest * test, int atype, int *pstatus)
209
NOWARN_UNUSED(atype);
210
*pstatus = REGRESSION_TEST_INPROGRESS;
211
ConfigData *config = (ConfigData *) TSmalloc(sizeof(ConfigData));
215
my_config_id = TSConfigSet(0, config, config_destroy_func);
217
TSConfig test_config = NULL;
218
test_config = TSConfigGet(my_config_id);
221
SDK_RPRINT(test, "TSConfigSet", "TestCase1", TC_FAIL, "can't correctly set global config structure");
222
SDK_RPRINT(test, "TSConfigGet", "TestCase1", TC_FAIL, "can't correctly get global config structure");
223
TSConfigRelease(my_config_id, config);
224
*pstatus = REGRESSION_TEST_FAILED;
228
if (TSConfigDataGet(test_config) != config) {
229
SDK_RPRINT(test, "TSConfigDataGet", "TestCase1", TC_FAIL, "failed to get config data");
230
TSConfigRelease(my_config_id, config);
231
*pstatus = REGRESSION_TEST_FAILED;
235
SDK_RPRINT(test, "TSConfigGet", "TestCase1", TC_PASS, "ok");
236
SDK_RPRINT(test, "TSConfigSet", "TestCase1", TC_PASS, "ok");
237
SDK_RPRINT(test, "TSConfigDataGet", "TestCase1", TC_PASS, "ok");
239
TSConfigRelease(my_config_id, config);
240
*pstatus = REGRESSION_TEST_PASSED;
245
//////////////////////////////////////////////
246
// SDK_API_TSNetVConn
248
// Unit Test for API: TSNetVConnRemoteIPGet
249
// TSNetVConnRemotePortGet
252
//////////////////////////////////////////////
253
#define IP(a,b,c,d) htonl((a) << 24 | (b) << 16 | (c) << 8 | (d))
254
const unsigned short server_port = 12345;
255
RegressionTest *SDK_NetVConn_test;
256
int *SDK_NetVConn_pstatus;
259
server_handler(TSCont contp, TSEvent event, void *data)
262
if (event == TS_EVENT_VCONN_EOS)
263
TSContDestroy(contp);
269
client_handler(TSCont contp, TSEvent event, void *data)
271
if (event == TS_EVENT_NET_CONNECT_FAILED) {
272
SDK_RPRINT(SDK_NetVConn_test, "TSNetAccept", "TestCase1", TC_FAIL, "can't connect to server");
273
SDK_RPRINT(SDK_NetVConn_test, "TSNetConnect", "TestCase1", TC_FAIL, "can't connect to server");
275
// no need to continue, return
276
TSContDestroy(contp);
277
// Fix me: how to deal with server side cont?
278
*SDK_NetVConn_pstatus = REGRESSION_TEST_FAILED;
282
SDK_RPRINT(SDK_NetVConn_test, "TSNetAccept", "TestCase1", TC_PASS, "ok");
283
SDK_RPRINT(SDK_NetVConn_test, "TSNetConnect", "TestCase1", TC_PASS, "ok");
285
unsigned int input_server_ip = 0;
286
int input_server_port = 0;
287
TSNetVConnRemoteIPGet((TSVConn) data, &input_server_ip);
288
TSNetVConnRemotePortGet((TSVConn) data, &input_server_port);
290
if (input_server_ip != htonl(LOCAL_IP)) {
291
SDK_RPRINT(SDK_NetVConn_test, "TSNetVConnRemoteIPGet", "TestCase1", TC_FAIL, "server ip is incorrect");
293
TSContDestroy(contp);
294
// Fix me: how to deal with server side cont?
295
*SDK_NetVConn_pstatus = REGRESSION_TEST_FAILED;
298
SDK_RPRINT(SDK_NetVConn_test, "TSNetVConnRemoteIPGet", "TestCase1", TC_PASS, "ok");
300
if (input_server_port != server_port) {
301
SDK_RPRINT(SDK_NetVConn_test, "TSNetVConnRemotePortGet", "TestCase1", TC_FAIL, "server port is incorrect");
303
TSContDestroy(contp);
304
// Fix me: how to deal with server side cont?
305
*SDK_NetVConn_pstatus = REGRESSION_TEST_FAILED;
308
SDK_RPRINT(SDK_NetVConn_test, "TSNetVConnRemotePortGet", "TestCase1", TC_PASS, "ok");
310
TSVConnClose((TSVConn) data);
313
TSContDestroy(contp);
315
*SDK_NetVConn_pstatus = REGRESSION_TEST_PASSED;
319
REGRESSION_TEST(SDK_API_TSNetVConn) (RegressionTest * test, int atype, int *pstatus)
321
NOWARN_UNUSED(atype);
322
*pstatus = REGRESSION_TEST_INPROGRESS;
323
SDK_NetVConn_test = test;
324
SDK_NetVConn_pstatus = pstatus;
326
TSMutex server_mutex = TSMutexCreate();
327
TSMutex client_mutex = TSMutexCreate();
329
TSCont server_cont = TSContCreate(server_handler, server_mutex);
330
TSCont client_cont = TSContCreate(client_handler, client_mutex);
332
TSNetAccept(server_cont, server_port);
334
unsigned int server_ip = IP(127, 0, 0, 1);
335
TSNetConnect(client_cont, server_ip, server_port);
338
/* TSCache, TSVConn, TSVIO */
339
//////////////////////////////////////////////
342
// Unit Test for API: TSCacheReady
346
// TSCacheKeyDigestSet
347
// TSVConnCacheObjectSizeGet
353
// TSVConnWriteVIOGet
365
//////////////////////////////////////////////
367
// TSVConnAbort can't be tested
368
// Fix me: test TSVConnShutdown, TSCacheKeyDataTypeSet,
369
// TSCacheKeyHostNameSet, TSCacheKeyPinnedSet
371
// Logic of the test:
372
// - write OBJECT_SIZE bytes in the cache in 3 shots
373
// (OBJECT_SIZE/2, then OBJECT_SIZE-100 and finally OBJECT_SIZE)
374
// - read object from the cache
375
// - remove it from the cache
376
// - try to read it (should faild)
379
#define OBJECT_SIZE 100000 // size of the object we'll write/read/remove in cache
382
RegressionTest *SDK_Cache_test;
383
int *SDK_Cache_pstatus;
384
static char content[OBJECT_SIZE];
385
static int read_counter = 0;
391
TSIOBufferReader readerp;
392
TSIOBufferReader out_readerp;
394
TSVConn write_vconnp;
403
cache_handler(TSCont contp, TSEvent event, void *data)
405
Debug("sdk_ut_cache_write", "Event %d data %p", event, data);
407
CacheVConnStruct *cache_vconn = (CacheVConnStruct *) TSContDataGet(contp);
409
TSIOBufferBlock blockp;
411
int64_t ntodo, ndone, nbytes, towrite, avail, content_length;
414
case TS_EVENT_CACHE_OPEN_WRITE:
415
Debug(UTDBG_TAG "_cache_event", "TS_EVENT_CACHE_OPEN_WRITE %d %p", event, data);
416
SDK_RPRINT(SDK_Cache_test, "TSCacheWrite", "TestCase1", TC_PASS, "ok");
419
cache_vconn->write_vconnp = (TSVConn) data;
421
// Create buffers/readers to write and read data into the cache
422
cache_vconn->bufp = TSIOBufferCreate();
423
cache_vconn->readerp = TSIOBufferReaderAlloc(cache_vconn->bufp);
424
cache_vconn->out_bufp = TSIOBufferCreate();
425
cache_vconn->out_readerp = TSIOBufferReaderAlloc(cache_vconn->out_bufp);
427
// Write content into upstream IOBuffer
431
blockp = TSIOBufferStart(cache_vconn->bufp);
432
ptr_block = TSIOBufferBlockWriteStart(blockp, &avail);
433
towrite = ((ntodo < avail) ? ntodo : avail);
434
memcpy(ptr_block, content + ndone, towrite);
435
TSIOBufferProduce(cache_vconn->bufp, towrite);
440
// first write half of the data. To test TSVIOReenable
441
cache_vconn->write_vio = TSVConnWrite((TSVConn) data, contp, cache_vconn->readerp, OBJECT_SIZE / 2);
444
case TS_EVENT_CACHE_OPEN_WRITE_FAILED:
445
Debug(UTDBG_TAG "_cache_event", "TS_EVENT_CACHE_OPEN_WRITE_FAILED %d %p", event, data);
446
SDK_RPRINT(SDK_Cache_test, "TSCacheWrite", "TestCase1", TC_FAIL, "can't open cache vc, edtata = %p", data);
447
TSReleaseAssert(!"cache");
449
// no need to continue, return
450
*SDK_Cache_pstatus = REGRESSION_TEST_FAILED;
453
case TS_EVENT_CACHE_OPEN_READ:
454
Debug(UTDBG_TAG "_cache_event", "TS_EVENT_CACHE_OPEN_READ %d %p", event, data);
455
if (read_counter == 2) {
456
SDK_RPRINT(SDK_Cache_test, "TSCacheRead", "TestCase2", TC_FAIL, "shouldn't open cache vc");
458
// no need to continue, return
459
*SDK_Cache_pstatus = REGRESSION_TEST_FAILED;
463
SDK_RPRINT(SDK_Cache_test, "TSCacheRead", "TestCase1", TC_PASS, "ok");
465
cache_vconn->read_vconnp = (TSVConn) data;
466
TSVConnCacheObjectSizeGet(cache_vconn->read_vconnp, &content_length);
467
Debug(UTDBG_TAG "_cache_read", "In cache open read [Content-Length: %d]", content_length);
468
if (content_length != OBJECT_SIZE) {
469
SDK_RPRINT(SDK_Cache_test, "TSVConnCacheObjectSizeGet", "TestCase1", TC_FAIL, "cached data size is incorrect");
471
// no need to continue, return
472
*SDK_Cache_pstatus = REGRESSION_TEST_FAILED;
475
SDK_RPRINT(SDK_Cache_test, "TSVConnCacheObjectSizeGet", "TestCase1", TC_PASS, "ok");
476
cache_vconn->read_vio = TSVConnRead((TSVConn) data, contp, cache_vconn->out_bufp, content_length);
480
case TS_EVENT_CACHE_OPEN_READ_FAILED:
481
Debug(UTDBG_TAG "_cache_event", "TS_EVENT_CACHE_OPEN_READ_FAILED %d %p", event, data);
482
if (read_counter == 1) {
483
SDK_RPRINT(SDK_Cache_test, "TSCacheRead", "TestCase1", TC_FAIL, "can't open cache vc");
485
// no need to continue, return
486
*SDK_Cache_pstatus = REGRESSION_TEST_FAILED;
489
SDK_RPRINT(SDK_Cache_test, "TSCacheRead", "TestCase2", TC_PASS, "ok");
491
// ok, all tests passed!
494
case TS_EVENT_CACHE_REMOVE:
495
Debug(UTDBG_TAG "_cache_event", "TS_EVENT_CACHE_REMOVE %d %p", event, data);
496
SDK_RPRINT(SDK_Cache_test, "TSCacheRemove", "TestCase1", TC_PASS, "ok");
498
// read the data which has been removed
500
TSCacheRead(contp, cache_vconn->key);
503
case TS_EVENT_CACHE_REMOVE_FAILED:
504
Debug(UTDBG_TAG "_cache_event", "TS_EVENT_CACHE_REMOVE_FAILED %d %p", event, data);
505
SDK_RPRINT(SDK_Cache_test, "TSCacheRemove", "TestCase1", TC_FAIL, "can't remove cached item");
507
// no need to continue, return
508
*SDK_Cache_pstatus = REGRESSION_TEST_FAILED;
511
case TS_EVENT_VCONN_WRITE_COMPLETE:
512
Debug(UTDBG_TAG "_cache_event", "TS_EVENT_VCONN_WRITE_COMPLETE %d %p", event, data);
515
nbytes = TSVIONBytesGet(cache_vconn->write_vio);
516
ndone = TSVIONDoneGet(cache_vconn->write_vio);
517
ntodo = TSVIONTodoGet(cache_vconn->write_vio);
518
Debug(UTDBG_TAG "_cache_write", "Nbytes=%d Ndone=%d Ntodo=%d", nbytes, ndone, ntodo);
520
if (ndone == (OBJECT_SIZE / 2)) {
521
TSVIONBytesSet(cache_vconn->write_vio, (OBJECT_SIZE - 100));
522
TSVIOReenable(cache_vconn->write_vio);
523
Debug(UTDBG_TAG "_cache_write", "Increment write_counter in write_complete [a]");
525
} else if (ndone == (OBJECT_SIZE - 100)) {
526
TSVIONBytesSet(cache_vconn->write_vio, OBJECT_SIZE);
527
TSVIOReenable(cache_vconn->write_vio);
528
Debug(UTDBG_TAG "_cache_write", "Increment write_counter in write_complete [b]");
530
} else if (ndone == OBJECT_SIZE) {
531
Debug(UTDBG_TAG "_cache_write", "finishing up [c]");
533
SDK_RPRINT(SDK_Cache_test, "TSVIOReenable", "TestCase2", TC_PASS, "ok");
534
SDK_RPRINT(SDK_Cache_test, "TSVIONBytesSet", "TestCase1", TC_PASS, "ok");
535
SDK_RPRINT(SDK_Cache_test, "TSVConnWrite", "TestCase1", TC_PASS, "ok");
537
SDK_RPRINT(SDK_Cache_test, "TSCacheWrite", "TestCase1", TC_FAIL, "Did not write expected # of bytes");
538
// no need to continue, return
539
*SDK_Cache_pstatus = REGRESSION_TEST_FAILED;
543
if ((TSVIO) data != cache_vconn->write_vio) {
544
SDK_RPRINT(SDK_Cache_test, "TSVConnWrite", "TestCase1", TC_FAIL, "write_vio corrupted");
545
// no need to continue, return
546
*SDK_Cache_pstatus = REGRESSION_TEST_FAILED;
549
Debug(UTDBG_TAG "_cache_write", "finishing up [d]");
552
if (TSVIOBufferGet(cache_vconn->write_vio) != cache_vconn->bufp) {
553
SDK_RPRINT(SDK_Cache_test, "TSVIOBufferGet", "TestCase1", TC_FAIL, "write_vio corrupted");
554
*SDK_Cache_pstatus = REGRESSION_TEST_FAILED;
557
SDK_RPRINT(SDK_Cache_test, "TSVIOBufferGet", "TestCase1", TC_PASS, "ok");
560
if (TSVIOContGet(cache_vconn->write_vio) != contp) {
561
SDK_RPRINT(SDK_Cache_test, "TSVIOContGet", "TestCase1", TC_FAIL, "write_vio corrupted");
562
*SDK_Cache_pstatus = REGRESSION_TEST_FAILED;
565
SDK_RPRINT(SDK_Cache_test, "TSVIOContGet", "TestCase1", TC_PASS, "ok");
568
Debug(UTDBG_TAG "_cache_write", "finishing up [f]");
570
if (TSVIOMutexGet(cache_vconn->write_vio) != TSContMutexGet(contp)) {
571
SDK_RPRINT(SDK_Cache_test, "TSVIOMutexGet", "TestCase1", TC_FAIL, "write_vio corrupted");
572
*SDK_Cache_pstatus = REGRESSION_TEST_FAILED;
575
SDK_RPRINT(SDK_Cache_test, "TSVIOMutexGet", "TestCase1", TC_PASS, "ok");
578
if (TSVIOVConnGet(cache_vconn->write_vio) != cache_vconn->write_vconnp) {
579
SDK_RPRINT(SDK_Cache_test, "TSVIOVConnGet", "TestCase1", TC_FAIL, "write_vio corrupted");
580
*SDK_Cache_pstatus = REGRESSION_TEST_FAILED;
583
SDK_RPRINT(SDK_Cache_test, "TSVIOVConnGet", "TestCase1", TC_PASS, "ok");
586
Debug(UTDBG_TAG "_cache_write", "finishing up [g]");
588
if (TSVIOReaderGet(cache_vconn->write_vio) != cache_vconn->readerp) {
589
SDK_RPRINT(SDK_Cache_test, "TSVIOReaderGet", "TestCase1", TC_FAIL, "write_vio corrupted");
590
*SDK_Cache_pstatus = REGRESSION_TEST_FAILED;
593
SDK_RPRINT(SDK_Cache_test, "TSVIOReaderGet", "TestCase1", TC_PASS, "ok");
596
// tests for write is done, close write_vconnp
597
TSVConnClose(cache_vconn->write_vconnp);
598
cache_vconn->write_vconnp = NULL;
600
Debug(UTDBG_TAG "_cache_write", "finishing up [h]");
603
// start to read data out of cache
605
TSCacheRead(contp, cache_vconn->key);
606
Debug(UTDBG_TAG "_cache_read", "starting read [i]");
610
case TS_EVENT_VCONN_WRITE_READY:
611
Debug(UTDBG_TAG "_cache_event", "TS_EVENT_VCONN_WRITE_READY %d %p", event, data);
612
if ((TSVIO) data != cache_vconn->write_vio) {
613
SDK_RPRINT(SDK_Cache_test, "TSVConnWrite", "TestCase1", TC_FAIL, "write_vio corrupted");
614
*SDK_Cache_pstatus = REGRESSION_TEST_FAILED;
618
nbytes = TSVIONBytesGet(cache_vconn->write_vio);
619
ndone = TSVIONDoneGet(cache_vconn->write_vio);
620
ntodo = TSVIONTodoGet(cache_vconn->write_vio);
621
Debug(UTDBG_TAG "_cache_write", "Nbytes=%d Ndone=%d Ntodo=%d", nbytes, ndone, ntodo);
623
TSVIOReenable(cache_vconn->write_vio);
626
case TS_EVENT_VCONN_READ_COMPLETE:
627
Debug(UTDBG_TAG "_cache_event", "TS_EVENT_VCONN_READ_COMPLETE %d %p", event, data);
628
if ((TSVIO) data != cache_vconn->read_vio) {
629
SDK_RPRINT(SDK_Cache_test, "TSVConnRead", "TestCase1", TC_FAIL, "read_vio corrupted");
631
// no need to continue, return
632
*SDK_Cache_pstatus = REGRESSION_TEST_FAILED;
636
nbytes = TSVIONBytesGet(cache_vconn->read_vio);
637
ntodo = TSVIONTodoGet(cache_vconn->read_vio);
638
ndone = TSVIONDoneGet(cache_vconn->read_vio);
639
Debug(UTDBG_TAG "_cache_read", "Nbytes=%d Ndone=%d Ntodo=%d", nbytes, ndone, ntodo);
641
if (nbytes != (ndone + ntodo)) {
642
SDK_RPRINT(SDK_Cache_test, "TSVIONBytesGet", "TestCase1", TC_FAIL, "read_vio corrupted");
643
SDK_RPRINT(SDK_Cache_test, "TSVIONTodoGet", "TestCase1", TC_FAIL, "read_vio corrupted");
644
SDK_RPRINT(SDK_Cache_test, "TSVIONDoneGet", "TestCase1", TC_FAIL, "read_vio corrupted");
646
// no need to continue, return
647
*SDK_Cache_pstatus = REGRESSION_TEST_FAILED;
650
SDK_RPRINT(SDK_Cache_test, "TSVIONBytesGet", "TestCase1", TC_PASS, "ok");
651
SDK_RPRINT(SDK_Cache_test, "TSVIONTodoGet", "TestCase1", TC_PASS, "ok");
652
SDK_RPRINT(SDK_Cache_test, "TSVIONDoneGet", "TestCase1", TC_PASS, "ok");
654
TSVIONDoneSet(cache_vconn->read_vio, 0);
655
if (TSVIONDoneGet(cache_vconn->read_vio) != 0) {
656
SDK_RPRINT(SDK_Cache_test, "TSVIONDoneSet", "TestCase1", TC_FAIL, "fail to set");
658
// no need to continue, return
659
*SDK_Cache_pstatus = REGRESSION_TEST_FAILED;
662
SDK_RPRINT(SDK_Cache_test, "TSVIONDoneSet", "TestCase1", TC_PASS, "ok");
664
Debug(UTDBG_TAG "_cache_write", "finishing up [i]");
666
// now waiting for 100ms to make sure the key is
667
// written in directory remove the content
668
TSContSchedule(contp, 100, TS_THREAD_POOL_DEFAULT);
673
case TS_EVENT_VCONN_READ_READY:
674
Debug(UTDBG_TAG "_cache_event", "TS_EVENT_VCONN_READ_READY %d %p", event, data);
675
if ((TSVIO) data != cache_vconn->read_vio) {
676
SDK_RPRINT(SDK_Cache_test, "TSVConnRead", "TestCase1", TC_FAIL, "read_vio corrupted");
678
// no need to continue, return
679
*SDK_Cache_pstatus = REGRESSION_TEST_FAILED;
683
nbytes = TSVIONBytesGet(cache_vconn->read_vio);
684
ntodo = TSVIONTodoGet(cache_vconn->read_vio);
685
ndone = TSVIONDoneGet(cache_vconn->read_vio);
686
Debug(UTDBG_TAG "_cache_read", "Nbytes=%d Ndone=%d Ntodo=%d", nbytes, ndone, ntodo);
688
if (nbytes != (ndone + ntodo)) {
689
SDK_RPRINT(SDK_Cache_test, "TSVIONBytesGet", "TestCase1", TC_FAIL, "read_vio corrupted");
690
SDK_RPRINT(SDK_Cache_test, "TSVIONTodoGet", "TestCase1", TC_FAIL, "read_vio corrupted");
691
SDK_RPRINT(SDK_Cache_test, "TSVIONDoneGet", "TestCase1", TC_FAIL, "read_vio corrupted");
693
// no need to continue, return
694
*SDK_Cache_pstatus = REGRESSION_TEST_FAILED;
697
SDK_RPRINT(SDK_Cache_test, "TSVIONBytesGet", "TestCase1", TC_PASS, "ok");
698
SDK_RPRINT(SDK_Cache_test, "TSVIONTodoGet", "TestCase1", TC_PASS, "ok");
699
SDK_RPRINT(SDK_Cache_test, "TSVIONDoneGet", "TestCase1", TC_PASS, "ok");
702
// Fix for bug INKqa12276: Must consume data from iobuffer
703
nbytes = TSIOBufferReaderAvail(cache_vconn->out_readerp);
704
TSIOBufferReaderConsume(cache_vconn->out_readerp, nbytes);
705
TSDebug(UTDBG_TAG "_cache_read", "Consuming %d bytes from cache read VC", nbytes);
707
TSVIOReenable(cache_vconn->read_vio);
708
Debug(UTDBG_TAG "_cache_read", "finishing up [j]");
711
case TS_EVENT_TIMEOUT:
712
Debug(UTDBG_TAG "_cache_event", "TS_EVENT_TIMEOUT %d %p", event, data);
713
// do remove cached doc
714
TSCacheRemove(contp, cache_vconn->key);
718
TSReleaseAssert(!"Test SDK_API_TSCache: unexpected event");
721
Debug(UTDBG_TAG "_cache_event", "DONE DONE DONE");
723
// destroy the data structure
724
Debug(UTDBG_TAG "_cache_write", "all tests passed [z]");
725
TSIOBufferDestroy(cache_vconn->bufp);
726
TSIOBufferDestroy(cache_vconn->out_bufp);
727
TSCacheKeyDestroy(cache_vconn->key);
729
*SDK_Cache_pstatus = REGRESSION_TEST_PASSED;
734
REGRESSION_TEST(SDK_API_TSCache) (RegressionTest * test, int atype, int *pstatus)
736
NOWARN_UNUSED(atype);
737
*pstatus = REGRESSION_TEST_INPROGRESS;
738
SDK_Cache_test = test;
739
SDK_Cache_pstatus = pstatus;
742
// Check if Cache is ready
743
TSCacheReady(&is_ready);
745
SDK_RPRINT(test, "TSCacheReady", "TestCase1", TC_FAIL, "cache is not ready");
747
// no need to continue, return
748
*pstatus = REGRESSION_TEST_FAILED;
751
SDK_RPRINT(test, "TSCacheReady", "TestCase1", TC_PASS, "ok");
755
char key_name[] = "key_for_regression_test";
756
TSCacheKey key, key_cmp;
757
TSCacheKeyCreate(&key);
758
TSCacheKeyCreate(&key_cmp);
760
SDK_RPRINT(test, "TSCacheKeyCreate", "TestCase1", TC_FAIL, "can't malloc memory for key");
762
// no need to continue, return
763
*pstatus = REGRESSION_TEST_FAILED;
765
TSCacheKeyDestroy(key_cmp);
768
SDK_RPRINT(test, "TSCacheKeyCreate", "TestCase1", TC_PASS, "ok");
770
TSCacheKeyDigestSet(key, key_name, strlen(key_name));
771
TSCacheKeyDigestSet(key_cmp, key_name, strlen(key_name));
773
if (memcmp(key, key_cmp, sizeof(TSCacheKey)) != 0) {
774
SDK_RPRINT(test, "TSCacheKeySetDigest", "TestCase1", TC_FAIL, "digest is wrong");
776
// no need to continue, return
777
*pstatus = REGRESSION_TEST_FAILED;
778
TSCacheKeyDestroy(key);
779
TSCacheKeyDestroy(key_cmp);
782
SDK_RPRINT(test, "TSCacheKeySetDigest", "TestCase1", TC_PASS, "ok");
783
TSCacheKeyDestroy(key_cmp);
786
// prepare caching content
787
// string, null-terminated.
788
for (int i = 0; i < (OBJECT_SIZE - 1); i++) {
791
content[OBJECT_SIZE - 1] = '\0';
793
//Write data to cache.
794
TSCont contp = TSContCreate(cache_handler, TSMutexCreate());
795
CacheVConnStruct *cache_vconn = (CacheVConnStruct *) TSmalloc(sizeof(CacheVConnStruct));
796
cache_vconn->key = key;
797
TSContDataSet(contp, cache_vconn);
799
TSCacheWrite(contp, key);
804
//////////////////////////////////////////////
807
// Unit Test for API: TSfopen
813
//////////////////////////////////////////////
815
// Used to create tmp file
816
//#define TMP_DIR "/var/tmp"
817
#define PFX "plugin.config"
819
REGRESSION_TEST(SDK_API_TSfopen) (RegressionTest * test, int atype, int *pstatus)
821
NOWARN_UNUSED(atype);
822
*pstatus = REGRESSION_TEST_INPROGRESS;
824
char write_file_name[PATH_NAME_MAX + 1];
826
TSFile source_read_file; // existing file
827
TSFile write_file; // to be created
828
TSFile cmp_read_file; // read & compare
830
char input_buffer[BUFSIZ];
831
char cmp_buffer[BUFSIZ];
832
struct stat stat_buffer_pre, stat_buffer_post, stat_buffer_input;
834
int error_counter = 0, read = 0, wrote = 0;
835
int64_t read_amount = 0;
836
char INPUT_TEXT_FILE[] = "plugin.config";
837
char input_file_full_path[BUFSIZ];
841
// Set full path to file at run time.
842
// TODO: This can never fail since we are
843
// returning the char[]
844
// Better check the dir itself.
846
if (TSInstallDirGet() == NULL) {
848
*pstatus = REGRESSION_TEST_FAILED;
851
// Add "etc/trafficserver" to point to config directory
852
ink_filepath_make(input_file_full_path, sizeof(input_file_full_path), TSConfigDirGet(), INPUT_TEXT_FILE);
854
// open existing file for reading
855
if (!(source_read_file = TSfopen(input_file_full_path, "r"))) {
856
SDK_RPRINT(test, "TSfopen", "TestCase1", TC_FAIL, "can't open file for reading");
859
// no need to continue, return
860
*pstatus = REGRESSION_TEST_FAILED;
863
SDK_RPRINT(test, "TSfopen", "TestCase1", TC_PASS, "ok");
865
// Create unique tmp _file_name_, do not use any TS file_name
866
snprintf(write_file_name, PATH_NAME_MAX, "/tmp/%sXXXXXX", PFX);
867
int write_file_fd; // this file will be reopened below
868
if ((write_file_fd = mkstemp(write_file_name)) <= 0) {
869
SDK_RPRINT(test, "mkstemp", "std func", TC_FAIL, "can't create file for writing");
872
// no need to continue, return
873
*pstatus = REGRESSION_TEST_FAILED;
874
if (source_read_file != NULL)
875
TSfclose(source_read_file);
878
close(write_file_fd);
880
// open file for writing, the file doesn't have to exist.
881
if (!(write_file = TSfopen(write_file_name, "w"))) {
882
SDK_RPRINT(test, "TSfopen", "TestCase2", TC_FAIL, "can't open file for writing");
885
// no need to continue, return
886
*pstatus = REGRESSION_TEST_FAILED;
887
if (source_read_file != NULL)
888
TSfclose(source_read_file);
891
SDK_RPRINT(test, "TSfopen", "TestCase2", TC_PASS, "ok");
893
memset(input_buffer, '\0', BUFSIZ);
895
// source_read_file and input_file_full_path are the same file
896
if (stat(input_file_full_path, &stat_buffer_input) != 0) {
897
SDK_RPRINT(test, "stat", "std func", TC_FAIL, "source file and input file messed up");
900
// no need to continue, return
901
*pstatus = REGRESSION_TEST_FAILED;
902
if (source_read_file != NULL)
903
TSfclose(source_read_file);
904
if (write_file != NULL)
905
TSfclose(write_file);
909
read_amount = (stat_buffer_input.st_size <= (off_t)sizeof(input_buffer)) ?
910
(stat_buffer_input.st_size) : (sizeof(input_buffer));
913
if ((ret_val = TSfgets(source_read_file, input_buffer, read_amount))
915
SDK_RPRINT(test, "TSfgets", "TestCase1", TC_FAIL, "can't read from file");
918
// no need to continue, return
919
*pstatus = REGRESSION_TEST_FAILED;
920
if (source_read_file != NULL)
921
TSfclose(source_read_file);
922
if (write_file != NULL)
923
TSfclose(write_file);
926
if (ret_val != input_buffer) {
927
SDK_RPRINT(test, "TSfgets", "TestCase2", TC_FAIL, "reading error");
930
// no need to continue, return
931
*pstatus = REGRESSION_TEST_FAILED;
932
if (source_read_file != NULL)
933
TSfclose(source_read_file);
934
if (write_file != NULL)
935
TSfclose(write_file);
938
SDK_RPRINT(test, "TSfgets", "TestCase1", TC_PASS, "ok");
942
wrote = TSfwrite(write_file, input_buffer, read_amount);
943
if (wrote != read_amount) {
944
SDK_RPRINT(test, "TSfwrite", "TestCase1", TC_FAIL, "writing error");
947
// no need to continue, return
948
*pstatus = REGRESSION_TEST_FAILED;
949
if (source_read_file != NULL)
950
TSfclose(source_read_file);
951
if (write_file != NULL)
952
TSfclose(write_file);
956
SDK_RPRINT(test, "TSfwrite", "TestCase1", TC_PASS, "ok");
959
if (stat(write_file_name, &stat_buffer_pre) != 0) {
960
SDK_RPRINT(test, "stat", "std func", TC_FAIL, "TSfwrite error");
963
// no need to continue, return
964
*pstatus = REGRESSION_TEST_FAILED;
965
if (source_read_file != NULL)
966
TSfclose(source_read_file);
967
if (write_file != NULL)
968
TSfclose(write_file);
972
TSfflush(write_file); // write_file should point to write_file_name
974
if (stat(write_file_name, &stat_buffer_post) != 0) {
975
SDK_RPRINT(test, "stat", "std func", TC_FAIL, "TSfflush error");
978
// no need to continue, return
979
*pstatus = REGRESSION_TEST_FAILED;
980
if (source_read_file != NULL)
981
TSfclose(source_read_file);
982
if (write_file != NULL)
983
TSfclose(write_file);
987
if ((stat_buffer_pre.st_size == 0) && (stat_buffer_post.st_size == read_amount)) {
988
SDK_RPRINT(test, "TSfflush", "TestCase1", TC_PASS, "ok");
990
SDK_RPRINT(test, "TSfflush", "TestCase1", TC_FAIL, "TSfflush error");
993
// no need to continue, return
994
*pstatus = REGRESSION_TEST_FAILED;
995
if (source_read_file != NULL)
996
TSfclose(source_read_file);
997
if (write_file != NULL)
998
TSfclose(write_file);
1003
// open again for reading
1004
cmp_read_file = TSfopen(write_file_name, "r");
1005
if (cmp_read_file == NULL) {
1006
SDK_RPRINT(test, "TSfopen", "TestCase3", TC_FAIL, "can't open file for reading");
1009
// no need to continue, return
1010
*pstatus = REGRESSION_TEST_FAILED;
1011
if (source_read_file != NULL)
1012
TSfclose(source_read_file);
1013
if (write_file != NULL)
1014
TSfclose(write_file);
1018
read_amount = (stat_buffer_input.st_size <= (off_t)sizeof(cmp_buffer)) ? (stat_buffer_input.st_size) : (sizeof(cmp_buffer));
1020
// TSfread on read file
1021
read = TSfread(cmp_read_file, cmp_buffer, read_amount);
1022
if (read != read_amount) {
1023
SDK_RPRINT(test, "TSfread", "TestCase1", TC_FAIL, "can't reading");
1026
// no need to continue, return
1027
*pstatus = REGRESSION_TEST_FAILED;
1028
if (source_read_file != NULL)
1029
TSfclose(source_read_file);
1030
if (write_file != NULL)
1031
TSfclose(write_file);
1032
if (cmp_read_file != NULL)
1033
TSfclose(cmp_read_file);
1036
SDK_RPRINT(test, "TSfread", "TestCase1", TC_PASS, "ok");
1038
// compare input_buffer and cmp_buffer buffers
1039
if (memcmp(input_buffer, cmp_buffer, read_amount) != 0) {
1040
SDK_RPRINT(test, "TSfread", "TestCase2", TC_FAIL, "reading error");
1043
// no need to continue, return
1044
*pstatus = REGRESSION_TEST_FAILED;
1045
if (source_read_file != NULL)
1046
TSfclose(source_read_file);
1047
if (write_file != NULL)
1048
TSfclose(write_file);
1049
if (cmp_read_file != NULL)
1050
TSfclose(cmp_read_file);
1053
SDK_RPRINT(test, "TSfread", "TestCase2", TC_PASS, "ok");
1055
// remove the tmp file
1056
if (unlink(write_file_name) != 0) {
1057
SDK_RPRINT(test, "unlink", "std func", TC_FAIL, "can't remove temp file");
1059
// TSfclose on read file
1060
TSfclose(source_read_file);
1061
SDK_RPRINT(test, "TSfclose", "TestCase1", TC_PASS, "ok");
1063
// TSfclose on write file
1064
TSfclose(write_file);
1065
SDK_RPRINT(test, "TSfclose", "TestCase2", TC_PASS, "ok");
1067
if (error_counter == 0) {
1068
*pstatus = REGRESSION_TEST_PASSED;
1070
*pstatus = REGRESSION_TEST_FAILED;
1072
if (cmp_read_file != NULL)
1073
TSfclose(cmp_read_file);
1078
//////////////////////////////////////////////
1081
// Unit Test for API: TSThread
1084
//////////////////////////////////////////////
1085
static int thread_err_count = 0;
1086
static RegressionTest *SDK_Thread_test;
1087
static int *SDK_Thread_pstatus;
1088
static void *thread_create_handler(void *arg);
1091
thread_create_handler(void *arg)
1095
//Fix me: do more useful work
1098
athread = TSThreadSelf();
1101
SDK_RPRINT(SDK_Thread_test, "TSThreadCreate", "TestCase2", TC_FAIL, "can't get thread");
1103
SDK_RPRINT(SDK_Thread_test, "TSThreadCreate", "TestCase2", TC_PASS, "ok");
1106
if (thread_err_count > 0)
1107
*SDK_Thread_pstatus = REGRESSION_TEST_FAILED;
1109
*SDK_Thread_pstatus = REGRESSION_TEST_PASSED;
1114
// Fix me: Solaris threads/Win2K threads tests
1116
// Argument data passed to thread init functions
1117
// cannot be allocated on the stack.
1119
REGRESSION_TEST(SDK_API_TSThread) (RegressionTest * test, int atype, int *pstatus)
1121
NOWARN_UNUSED(atype);
1122
*pstatus = REGRESSION_TEST_INPROGRESS;
1123
SDK_Thread_test = test;
1124
SDK_Thread_pstatus = pstatus;
1126
TSThread curr_thread = 0;
1127
// TSThread created_thread = 0;
1130
curr_tid = pthread_self();
1133
curr_thread = TSThreadSelf();
1134
if (curr_thread == 0) {
1135
SDK_RPRINT(test, "TSThreadSelf", "TestCase1", TC_FAIL, "can't get the current thread");
1138
SDK_RPRINT(test, "TSThreadSelf", "TestCase1", TC_PASS, "ok");
1142
TSThread created_thread = TSThreadCreate(thread_create_handler, (void *) curr_tid);
1143
if (created_thread == NULL) {
1145
SDK_RPRINT(test, "TSThreadCreate", "TestCase1", TC_FAIL, "can't create thread");
1147
SDK_RPRINT(test, "TSThreadCreate", "TestCase1", TC_PASS, "ok");
1152
//////////////////////////////////////////////
1155
// Unit Test for API: TSThreadInit
1157
//////////////////////////////////////////////
1158
static int thread_init_err_count = 0;
1159
static RegressionTest *SDK_ThreadInit_test;
1160
static int *SDK_ThreadInit_pstatus;
1161
static void *pthread_start_func(void *arg);
1164
pthread_start_func(void *arg)
1167
TSThread temp_thread = 0;
1170
temp_thread = TSThreadInit();
1173
SDK_RPRINT(SDK_ThreadInit_test, "TSThreadInit", "TestCase2", TC_FAIL, "can't init thread");
1174
thread_init_err_count++;
1176
SDK_RPRINT(SDK_ThreadInit_test, "TSThreadInit", "TestCase2", TC_PASS, "ok");
1178
// Clean up this thread
1180
TSThreadDestroy(temp_thread);
1182
if (thread_init_err_count > 0)
1183
*SDK_ThreadInit_pstatus = REGRESSION_TEST_FAILED;
1185
*SDK_ThreadInit_pstatus = REGRESSION_TEST_PASSED;
1190
REGRESSION_TEST(SDK_API_TSThreadInit) (RegressionTest * test, int atype, int *pstatus)
1192
NOWARN_UNUSED(atype);
1193
*pstatus = REGRESSION_TEST_INPROGRESS;
1194
SDK_ThreadInit_test = test;
1195
SDK_ThreadInit_pstatus = pstatus;
1197
pthread_t curr_tid, new_tid;
1199
curr_tid = pthread_self();
1203
ret = pthread_create(&new_tid, NULL, pthread_start_func, (void *) curr_tid);
1205
thread_init_err_count++;
1206
SDK_RPRINT(test, "TSThreadInit", "TestCase1", TC_FAIL, "can't create pthread");
1208
SDK_RPRINT(test, "TSThreadInit", "TestCase1", TC_PASS, "ok");
1214
//////////////////////////////////////////////
1217
// Unit Test for API: TSActionCancel
1218
//////////////////////////////////////////////
1220
static RegressionTest *SDK_ActionCancel_test;
1221
static int *SDK_ActionCancel_pstatus;
1224
action_cancel_handler(TSCont contp, TSEvent event, void *edata)
1226
NOWARN_UNUSED(edata);
1227
if (event == TS_EVENT_IMMEDIATE) // called from schedule_imm OK
1229
SDK_RPRINT(SDK_ActionCancel_test, "TSActionCancel", "TestCase1", TC_PASS, "ok");
1230
*SDK_ActionCancel_pstatus = REGRESSION_TEST_PASSED;
1231
} else if (event == TS_EVENT_TIMEOUT) //called from schedule_in Not OK.
1233
SDK_RPRINT(SDK_ActionCancel_test, "TSActionCancel", "TestCase1", TC_FAIL, "bad action");
1234
*SDK_ActionCancel_pstatus = REGRESSION_TEST_FAILED;
1235
} else // there is sth wrong
1237
SDK_RPRINT(SDK_ActionCancel_test, "TSActionCancel", "TestCase1", TC_FAIL, "bad event");
1238
*SDK_ActionCancel_pstatus = REGRESSION_TEST_FAILED;
1241
TSContDestroy(contp);
1245
REGRESSION_TEST(SDK_API_TSActionCancel) (RegressionTest * test, int atype, int *pstatus)
1247
NOWARN_UNUSED(atype);
1248
*pstatus = REGRESSION_TEST_INPROGRESS;
1250
SDK_ActionCancel_test = test;
1251
SDK_ActionCancel_pstatus = pstatus;
1253
TSMutex cont_mutex = TSMutexCreate();
1254
TSCont contp = TSContCreate(action_cancel_handler, cont_mutex);
1255
TSAction actionp = TSContSchedule(contp, 10000, TS_THREAD_POOL_DEFAULT);
1257
TSMutexLock(cont_mutex);
1258
if (TSActionDone(actionp)) {
1259
*pstatus = REGRESSION_TEST_FAILED;
1260
TSMutexUnlock(cont_mutex);
1263
TSActionCancel(actionp);
1265
TSMutexUnlock(cont_mutex);
1267
TSContSchedule(contp, 0, TS_THREAD_POOL_DEFAULT);
1270
//////////////////////////////////////////////
1273
// Unit Test for API: TSActionDone
1274
//////////////////////////////////////////////
1275
/* Currently, don't know how to test it because TSAction
1276
is at "done" status only "shortly" after finish
1277
executing action_done_handler. Another possibility is
1278
to use reentrant call. But in both cases it's not
1279
guaranteed to get ActionDone.
1284
//////////////////////////////////////////////
1287
// Unit Test for API: TSContCreate
1289
//////////////////////////////////////////////
1291
// this is needed for asynchronous APIs
1292
static RegressionTest *SDK_ContCreate_test;
1293
static int *SDK_ContCreate_pstatus;
1296
cont_handler(TSCont contp, TSEvent event, void *edata)
1298
NOWARN_UNUSED(contp);
1299
NOWARN_UNUSED(event);
1300
NOWARN_UNUSED(edata);
1301
SDK_RPRINT(SDK_ContCreate_test, "TSContCreate", "TestCase1", TC_PASS, "ok");
1302
SDK_RPRINT(SDK_ContCreate_test, "TSContCall", "TestCase1", TC_PASS, "ok");
1304
*SDK_ContCreate_pstatus = REGRESSION_TEST_PASSED;
1310
REGRESSION_TEST(SDK_API_TSContCreate) (RegressionTest * test, int atype, int *pstatus)
1312
NOWARN_UNUSED(atype);
1313
*pstatus = REGRESSION_TEST_INPROGRESS;
1315
// For asynchronous APIs, use static vars to store test and pstatus
1316
SDK_ContCreate_test = test;
1317
SDK_ContCreate_pstatus = pstatus;
1319
TSMutex mutexp = TSMutexCreate();
1320
TSCont contp = TSContCreate(cont_handler, mutexp);
1323
TSMutexLockTry(mutexp, &lock);
1324
if (lock) //mutex is grabbed
1326
TSContCall(contp, (TSEvent) 0, NULL);
1327
TSMutexUnlock(mutexp);
1328
} else //mutex has problems
1330
SDK_RPRINT(SDK_ContCreate_test, "TSContCreate", "TestCase1", TC_FAIL, "continuation creation has problems");
1331
SDK_RPRINT(SDK_ContCreate_test, "TSContCall", "TestCase1", TC_FAIL, "continuation has problems");
1333
*pstatus = REGRESSION_TEST_FAILED;
1336
TSContDestroy(contp);
1340
//////////////////////////////////////////////
1343
// Unit Test for API: TSContDataGet
1345
//////////////////////////////////////////////
1347
// this is needed for asynchronous APIs
1348
static RegressionTest *SDK_ContData_test;
1349
static int *SDK_ContData_pstatus;
1351
// this is specific for this test
1359
cont_data_handler(TSCont contp, TSEvent event, void *edata)
1361
NOWARN_UNUSED(event);
1362
NOWARN_UNUSED(edata);
1363
MyData *my_data = (MyData *) TSContDataGet(contp);
1365
if (my_data->data1 == 1 && my_data->data2 == 2) {
1366
SDK_RPRINT(SDK_ContData_test, "TSContDataSet", "TestCase1", TC_PASS, "ok");
1367
SDK_RPRINT(SDK_ContData_test, "TSContDataGet", "TestCase1", TC_PASS, "ok");
1369
*SDK_ContData_pstatus = REGRESSION_TEST_PASSED;
1371
// If we get bad data, it's a failure
1372
SDK_RPRINT(SDK_ContData_test, "TSContDataSet", "TestCase1", TC_FAIL, "bad data");
1373
SDK_RPRINT(SDK_ContData_test, "TSContDataGet", "TestCase1", TC_FAIL, "bad data");
1375
*SDK_ContData_pstatus = REGRESSION_TEST_FAILED;
1379
TSContDestroy(contp);
1384
REGRESSION_TEST(SDK_API_TSContDataGet) (RegressionTest * test, int atype, int *pstatus)
1386
NOWARN_UNUSED(atype);
1387
*pstatus = REGRESSION_TEST_INPROGRESS;
1389
// For asynchronous APIs, use static vars to store test and pstatus
1390
SDK_ContData_test = test;
1391
SDK_ContData_pstatus = pstatus;
1393
TSCont contp = TSContCreate(cont_data_handler, TSMutexCreate());
1395
MyData *my_data = (MyData *) TSmalloc(sizeof(MyData));
1399
TSContDataSet(contp, (void *) my_data);
1401
TSContSchedule(contp, 0, TS_THREAD_POOL_DEFAULT);
1406
//////////////////////////////////////////////
1409
// Unit Test for API: TSContMutexGet
1410
//////////////////////////////////////////////
1412
REGRESSION_TEST(SDK_API_TSContMutexGet) (RegressionTest * test, int atype, int *pstatus)
1414
NOWARN_UNUSED(atype);
1415
bool test_passed = false;
1416
*pstatus = REGRESSION_TEST_INPROGRESS;
1418
TSMutex mutexp_input;
1419
TSMutex mutexp_output;
1422
mutexp_input = TSMutexCreate();
1423
contp = TSContCreate(cont_handler, mutexp_input);
1425
mutexp_output = TSContMutexGet(contp);
1427
if (mutexp_input == mutexp_output) {
1428
SDK_RPRINT(test, "TSContMutexGet", "TestCase1", TC_PASS, "ok");
1431
SDK_RPRINT(test, "TSContMutexGet", "TestCase1", TC_FAIL, "Continutation's mutex corrupted");
1433
// Status of the whole test
1434
*pstatus = ((test_passed == true) ? REGRESSION_TEST_PASSED : REGRESSION_TEST_FAILED);
1436
TSContDestroy(contp);
1440
//////////////////////////////////////////////
1443
// Unit Test for API: TSContSchedule
1444
//////////////////////////////////////////////
1446
// this is needed for asynchronous APIs
1447
static RegressionTest *SDK_ContSchedule_test;
1448
static int *SDK_ContSchedule_pstatus;
1450
// this is specific for this test
1451
static int tc1_count = 0;
1452
static int tc2_count = 0;
1455
cont_schedule_handler(TSCont contp, TSEvent event, void *edata)
1457
NOWARN_UNUSED(edata);
1458
if (event == TS_EVENT_IMMEDIATE) {
1460
SDK_RPRINT(SDK_ContSchedule_test, "TSContSchedule", "TestCase1", TC_PASS, "ok");
1462
} else if (event == TS_EVENT_TIMEOUT) {
1464
SDK_RPRINT(SDK_ContSchedule_test, "TSContSchedule", "TestCase2", TC_PASS, "ok");
1467
// If we receive a bad event, it's a failure
1468
SDK_RPRINT(SDK_ContSchedule_test, "TSContSchedule", "TestCase1|2",
1469
TC_FAIL, "received unexpected event number %d", event);
1470
*SDK_ContSchedule_pstatus = REGRESSION_TEST_FAILED;
1474
// We expect to be called once for TC1 and once for TC2
1475
if ((tc1_count == 1) && (tc2_count == 1)) {
1476
*SDK_ContSchedule_pstatus = REGRESSION_TEST_PASSED;
1478
// If TC1 or TC2 executed more than once, something is fishy..
1479
else if (tc1_count + tc2_count >= 2) {
1480
*SDK_ContSchedule_pstatus = REGRESSION_TEST_FAILED;
1483
TSContDestroy(contp);
1490
Fix me: test for grabbing the mutex from two
1494
//////////////////////////////////////////////
1497
// Unit Test for API: TSMutexCreate
1500
//////////////////////////////////////////////
1502
REGRESSION_TEST(SDK_API_TSMutexCreate) (RegressionTest * test, int atype, int *pstatus)
1504
NOWARN_UNUSED(atype);
1505
bool test_passed = false;
1506
*pstatus = REGRESSION_TEST_INPROGRESS;
1508
TSMutex mutexp = TSMutexCreate();
1510
TSMutexLock(mutexp);
1512
/* This is normal because all locking is from the same thread */
1515
TSMutexLockTry(mutexp, &lock);
1516
TSMutexLockTry(mutexp, &lock);
1519
SDK_RPRINT(test, "TSMutexCreate", "TestCase1", TC_PASS, "ok");
1520
SDK_RPRINT(test, "TSMutexLock", "TestCase1", TC_PASS, "ok");
1521
SDK_RPRINT(test, "TSMutexLockTry", "TestCase1", TC_PASS, "ok");
1524
SDK_RPRINT(test, "TSMutexCreate", "TestCase1", TC_FAIL, "mutex can't be grabbed twice from the same thread");
1525
SDK_RPRINT(test, "TSMutexLock", "TestCase1", TC_FAIL, "mutex can't be grabbed twice from the same thread");
1526
SDK_RPRINT(test, "TSMutexLockTry", "TestCase1", TC_FAIL, "mutex can't be grabbed twice from the same thread");
1530
TSMutexUnlock(mutexp);
1531
SDK_RPRINT(test, "TSMutexUnLock", "TestCase1", TC_PASS, "ok");
1534
*pstatus = REGRESSION_TEST_PASSED;
1536
*pstatus = REGRESSION_TEST_FAILED;
1543
//////////////////////////////////////////////
1544
// SDK_API_TSIOBuffer
1546
// Unit Test for API: TSIOBufferCreate
1547
// TSIOBufferWaterMarkGet
1548
// TSIOBufferWaterMarkSet
1549
//////////////////////////////////////////////
1551
REGRESSION_TEST(SDK_API_TSIOBufferCreate) (RegressionTest * test, int atype, int *pstatus)
1553
NOWARN_UNUSED(atype);
1554
bool test_passed = false;
1555
*pstatus = REGRESSION_TEST_INPROGRESS;
1557
int64_t watermark = 1000;
1559
TSIOBuffer bufp = TSIOBufferCreate();
1561
TSIOBufferWaterMarkSet(bufp, watermark);
1564
TSIOBufferWaterMarkGet(bufp, &watermark);
1566
if (watermark == 1000) {
1567
SDK_RPRINT(test, "TSIOBufferCreate", "TestCase1", TC_PASS, "ok");
1568
SDK_RPRINT(test, "TSIOBufferWaterMarkGet", "TestCase1", TC_PASS, "ok");
1569
SDK_RPRINT(test, "TSIOBufferWaterMarkSet", "TestCase1", TC_PASS, "ok");
1572
SDK_RPRINT(test, "TSIOBufferCreate", "TestCase1", TC_FAIL, "watermark failed");
1573
SDK_RPRINT(test, "TSIOBufferWaterMarkGet", "TestCase1", TC_FAIL, "watermark failed");
1574
SDK_RPRINT(test, "TSIOBufferWaterMarkSet", "TestCase1", TC_FAIL, "watermark failed");
1577
TSIOBufferDestroy(bufp);
1579
// Status of the whole test
1580
*pstatus = ((test_passed == true) ? REGRESSION_TEST_PASSED : REGRESSION_TEST_FAILED);
1586
//////////////////////////////////////////////
1587
// SDK_API_TSIOBuffer
1589
// Unit Test for API: TSIOBufferSizedCreate
1590
// TSIOBufferProduce
1591
// TSIOBufferReaderAlloc
1592
// TSIOBufferReaderAvail
1593
//////////////////////////////////////////////
1595
REGRESSION_TEST(SDK_API_TSIOBufferProduce) (RegressionTest * test, int atype, int *pstatus)
1597
NOWARN_UNUSED(atype);
1598
bool test_passed = false;
1599
*pstatus = REGRESSION_TEST_INPROGRESS;
1601
TSIOBuffer bufp = TSIOBufferSizedCreate(TS_IOBUFFER_SIZE_INDEX_4K); //size is 4096
1603
TSIOBufferReader readerp = TSIOBufferReaderAlloc(bufp);
1605
TSIOBufferProduce(bufp, 10);
1607
int64_t reader_avail = TSIOBufferReaderAvail(readerp);
1608
if (reader_avail == 10) {
1609
SDK_RPRINT(test, "TSIOBufferProduce", "TestCase1", TC_PASS, "ok");
1610
SDK_RPRINT(test, "TSIOBufferReaderAlloc", "TestCase1", TC_PASS, "ok");
1611
SDK_RPRINT(test, "TSIOBufferReaderAvail", "TestCase1", TC_PASS, "ok");
1614
SDK_RPRINT(test, "TSIOBufferProduce", "TestCase1", TC_FAIL, "failed");
1615
SDK_RPRINT(test, "TSIOBufferReaderAlloc", "TestCase1", TC_FAIL, "failed");
1616
SDK_RPRINT(test, "TSIOBufferReaderAvail", "TestCase1", TC_FAIL, "failed");
1619
// Status of the whole test
1620
*pstatus = ((test_passed == true) ? REGRESSION_TEST_PASSED : REGRESSION_TEST_FAILED);
1625
//////////////////////////////////////////////
1626
// SDK_API_TSIOBuffer
1628
// Unit Test for API: TSIOBufferReaderConsume
1629
//////////////////////////////////////////////
1631
REGRESSION_TEST(SDK_API_TSIOBufferReaderConsume) (RegressionTest * test, int atype, int *pstatus)
1633
NOWARN_UNUSED(atype);
1634
bool test_passed = false;
1635
*pstatus = REGRESSION_TEST_INPROGRESS;
1637
TSIOBuffer bufp = TSIOBufferSizedCreate(TS_IOBUFFER_SIZE_INDEX_4K);
1639
TSIOBufferReader readerp = TSIOBufferReaderAlloc(bufp);
1641
TSIOBufferProduce(bufp, 10);
1642
TSIOBufferReaderConsume(readerp, 10);
1644
int64_t reader_avail = TSIOBufferReaderAvail(readerp);
1645
if (reader_avail == 0) {
1646
SDK_RPRINT(test, "TSIOBufferReaderConsume", "TestCase1", TC_PASS, "ok");
1649
SDK_RPRINT(test, "TSIOBufferReaderConsume", "TestCase1", TC_FAIL, "failed");
1652
// Status of the whole test
1653
*pstatus = ((test_passed == true) ? REGRESSION_TEST_PASSED : REGRESSION_TEST_FAILED);
1657
//////////////////////////////////////////////
1658
// SDK_API_TSIOBuffer
1660
// Unit Test for API: TSIOBufferReaderClone
1661
//////////////////////////////////////////////
1663
REGRESSION_TEST(SDK_API_TSIOBufferReaderClone) (RegressionTest * test, int atype, int *pstatus)
1665
NOWARN_UNUSED(atype);
1666
bool test_passed = false;
1667
*pstatus = REGRESSION_TEST_INPROGRESS;
1669
TSIOBuffer bufp = TSIOBufferSizedCreate(TS_IOBUFFER_SIZE_INDEX_4K);
1671
TSIOBufferReader readerp = TSIOBufferReaderAlloc(bufp);
1673
TSIOBufferProduce(bufp, 10);
1674
TSIOBufferReaderConsume(readerp, 5);
1676
TSIOBufferReader readerp2 = TSIOBufferReaderClone(readerp);
1678
int64_t reader_avail = TSIOBufferReaderAvail(readerp2);
1679
if (reader_avail == 5) {
1680
SDK_RPRINT(test, "TSIOBufferReaderClone", "TestCase1", TC_PASS, "ok");
1683
SDK_RPRINT(test, "TSIOBufferReaderClone", "TestCase1", TC_FAIL, "failed");
1686
// Status of the whole test
1687
*pstatus = ((test_passed == true) ? REGRESSION_TEST_PASSED : REGRESSION_TEST_FAILED);
1691
//////////////////////////////////////////////
1692
// SDK_API_TSIOBuffer
1694
// Unit Test for API: TSIOBufferStart
1695
// TSIOBufferReaderStart
1696
//////////////////////////////////////////////
1698
REGRESSION_TEST(SDK_API_TSIOBufferStart) (RegressionTest * test, int atype, int *pstatus)
1700
NOWARN_UNUSED(atype);
1701
bool test_passed = false;
1702
*pstatus = REGRESSION_TEST_INPROGRESS;
1704
TSIOBuffer bufp = TSIOBufferSizedCreate(TS_IOBUFFER_SIZE_INDEX_4K);
1706
TSIOBufferReader readerp = TSIOBufferReaderAlloc(bufp);
1708
if (TSIOBufferStart(bufp) == TSIOBufferReaderStart(readerp)) {
1709
SDK_RPRINT(test, "TSIOBufferStart", "TestCase1", TC_PASS, "ok");
1710
SDK_RPRINT(test, "TSIOBufferReaderStart", "TestCase1", TC_PASS, "ok");
1713
SDK_RPRINT(test, "TSIOBufferStart", "TestCase1", TC_FAIL, "failed");
1714
SDK_RPRINT(test, "TSIOBufferReaderStart", "TestCase1", TC_FAIL, "failed");
1717
// Status of the whole test
1718
*pstatus = ((test_passed == true) ? REGRESSION_TEST_PASSED : REGRESSION_TEST_FAILED);
1723
//////////////////////////////////////////////
1724
// SDK_API_TSIOBuffer
1726
// Unit Test for API: TSIOBufferCopy
1728
// TSIOBufferReaderCopy
1729
//////////////////////////////////////////////
1731
REGRESSION_TEST(SDK_API_TSIOBufferCopy) (RegressionTest * test, int atype, int *pstatus)
1733
NOWARN_UNUSED(atype);
1734
bool test_passed = false;
1735
*pstatus = REGRESSION_TEST_INPROGRESS;
1737
char input_buf[] = "This is the test for TSIOBufferCopy, TSIOBufferWrite, TSIOBufferReaderCopy";
1738
char output_buf[1024];
1739
TSIOBuffer bufp = TSIOBufferSizedCreate(TS_IOBUFFER_SIZE_INDEX_4K);
1740
TSIOBuffer bufp2 = TSIOBufferSizedCreate(TS_IOBUFFER_SIZE_INDEX_4K);
1742
TSIOBufferReader readerp = TSIOBufferReaderAlloc(bufp);
1743
TSIOBufferWrite(bufp, input_buf, (strlen(input_buf) + 1));
1744
TSIOBufferCopy(bufp2, readerp, (strlen(input_buf) + 1), 0);
1745
TSIOBufferReaderCopy(readerp, output_buf, (strlen(input_buf) + 1));
1747
if (strcmp(input_buf, output_buf) == 0) {
1748
SDK_RPRINT(test, "TSIOBufferWrite", "TestCase1", TC_PASS, "ok");
1749
SDK_RPRINT(test, "TSIOBufferCopy", "TestCase1", TC_PASS, "ok");
1750
SDK_RPRINT(test, "TSIOBufferReaderCopy", "TestCase1", TC_PASS, "ok");
1753
SDK_RPRINT(test, "TSIOBufferWrite", "TestCase1", TC_FAIL, "failed");
1754
SDK_RPRINT(test, "TSIOBufferCopy", "TestCase1", TC_FAIL, "failed");
1755
SDK_RPRINT(test, "TSIOBufferReaderCopy", "TestCase1", TC_FAIL, "failed");
1758
// Status of the whole test
1759
*pstatus = ((test_passed == true) ? REGRESSION_TEST_PASSED : REGRESSION_TEST_FAILED);
1763
//////////////////////////////////////////////
1764
// SDK_API_TSIOBuffer
1766
// Unit Test for API: TSIOBuffer
1768
// TSIOBufferReaderCopy
1769
//////////////////////////////////////////////
1771
REGRESSION_TEST(SDK_API_TSIOBufferBlockReadAvail) (RegressionTest * test, int atype, int *pstatus)
1773
NOWARN_UNUSED(atype);
1774
bool test_passed_1 = false;
1775
bool test_passed_2 = false;
1776
*pstatus = REGRESSION_TEST_INPROGRESS;
1779
TSIOBuffer bufp = TSIOBufferCreate();
1780
TSIOBufferWrite(bufp, (char*)&i, sizeof(int));
1781
TSIOBufferReader readerp = TSIOBufferReaderAlloc(bufp);
1783
int64_t avail_write, avail_read;
1785
// TODO: This is probably not correct any more.
1786
TSIOBufferBlock blockp = TSIOBufferStart(bufp);
1788
if ((TSIOBufferBlockWriteStart(blockp, &avail_write) - TSIOBufferBlockReadStart(blockp, readerp, &avail_read)) ==
1790
SDK_RPRINT(test, "TSIOBufferBlockReadStart", "TestCase1", TC_PASS, "ok");
1791
SDK_RPRINT(test, "TSIOBufferBlockWriteStart", "TestCase1", TC_PASS, "ok");
1792
test_passed_1 = true;
1794
SDK_RPRINT(test, "TSIOBufferBlockReadStart", "TestCase1", TC_FAIL, "failed");
1795
SDK_RPRINT(test, "TSIOBufferBlockWriteStart", "TestCase1", TC_FAIL, "failed");
1798
if ((TSIOBufferBlockReadAvail(blockp, readerp) + TSIOBufferBlockWriteAvail(blockp)) == 4096) {
1799
SDK_RPRINT(test, "TSIOBufferBlockReadAvail", "TestCase1", TC_PASS, "ok");
1800
SDK_RPRINT(test, "TSIOBufferBlockWriteAvail", "TestCase1", TC_PASS, "ok");
1801
test_passed_2 = true;
1803
SDK_RPRINT(test, "TSIOBufferBlockReadAvail", "TestCase1", TC_FAIL, "failed");
1804
SDK_RPRINT(test, "TSIOBufferBlockWriteAvail", "TestCase1", TC_FAIL, "failed");
1807
if (test_passed_1 && test_passed_2) {
1808
*pstatus = REGRESSION_TEST_PASSED;
1810
*pstatus = REGRESSION_TEST_FAILED;
1816
//////////////////////////////////////////////////
1817
// SDK_API_TSIOBuffer
1819
// Unit Test for API: TSIOBufferBlockNext
1820
//////////////////////////////////////////////////
1822
REGRESSION_TEST(SDK_API_TSIOBufferBlockNext) (RegressionTest * test, int atype, int *pstatus)
1824
NOWARN_UNUSED(atype);
1825
bool test_passed = false;
1826
*pstatus = REGRESSION_TEST_INPROGRESS;
1829
TSIOBuffer bufp = TSIOBufferCreate();
1830
TSIOBufferWrite(bufp, (char*)&i, sizeof(int));
1832
TSIOBufferReader readerp = TSIOBufferReaderAlloc(bufp);
1833
TSIOBufferBlock blockp = TSIOBufferReaderStart(readerp);
1835
// TODO: This is probaby not the best of regression tests right now ...
1836
// Note that this assumes block size is > sizeof(int) bytes.
1837
if (TSIOBufferBlockNext(blockp) == NULL) {
1838
SDK_RPRINT(test, "TSIOBufferBlockNext", "TestCase1", TC_PASS, "ok");
1841
SDK_RPRINT(test, "TSIOBufferBlockNext", "TestCase1", TC_FAIL, "fail");
1845
*pstatus = REGRESSION_TEST_PASSED;
1847
*pstatus = REGRESSION_TEST_FAILED;
1857
//////////////////////////////////////////////
1860
// Unit Test for API: INKStatCreate
1862
//////////////////////////////////////////////
1864
REGRESSION_TEST(SDK_API_INKStatIntSet) (RegressionTest * test, int atype, int *pstatus)
1866
NOWARN_UNUSED(atype);
1867
bool test_passed = false;
1868
*pstatus = REGRESSION_TEST_INPROGRESS;
1870
INKStat stat = INKStatCreate("stat_is", INKSTAT_TYPE_INT64);
1872
INKStatIntSet(stat, 100);
1875
INKStatIntGet(stat, &stat_val);
1877
if (stat_val == 100) {
1878
SDK_RPRINT(test, "INKStatIntSet", "TestCase1", TC_PASS, "ok");
1881
SDK_RPRINT(test, "INKStatIntSet", "TestCase1", TC_FAIL, "can't set to correct integer value");
1884
// Status of the whole test
1885
*pstatus = ((test_passed == true) ? REGRESSION_TEST_PASSED : REGRESSION_TEST_FAILED);
1889
//////////////////////////////////////////////
1892
// Unit Test for API: INKStatIntAddTo
1893
//////////////////////////////////////////////
1895
REGRESSION_TEST(SDK_API_INKStatIntAddTo) (RegressionTest * test, int atype, int *pstatus)
1897
NOWARN_UNUSED(atype);
1898
bool test_passed = false;
1899
*pstatus = REGRESSION_TEST_INPROGRESS;
1901
INKStat stat = INKStatCreate("stat_ia", INKSTAT_TYPE_INT64);
1903
INKStatIntAddTo(stat, 100);
1906
INKStatIntGet(stat, &stat_val);
1908
if (stat_val == 100) {
1909
SDK_RPRINT(test, "INKStatIntAddTo", "TestCase1", TC_PASS, "ok");
1912
SDK_RPRINT(test, "INKStatIntAddTo", "TestCase1", TC_FAIL, "can't add to correct integer value");
1915
// Status of the whole test
1916
*pstatus = ((test_passed == true) ? REGRESSION_TEST_PASSED : REGRESSION_TEST_FAILED);
1920
//////////////////////////////////////////////
1923
// Unit Test for API: INKStatFloatAddTo
1925
//////////////////////////////////////////////
1927
REGRESSION_TEST(SDK_API_INKStatFloatAddTo) (RegressionTest * test, int atype, int *pstatus)
1929
NOWARN_UNUSED(atype);
1930
bool test_passed = false;
1931
*pstatus = REGRESSION_TEST_INPROGRESS;
1933
INKStat stat = INKStatCreate("stat_fa", INKSTAT_TYPE_FLOAT);
1935
INKStatFloatAddTo(stat, 100.0);
1937
INKStatFloatGet(stat, &stat_val);
1939
if (stat_val == 100.0) {
1940
SDK_RPRINT(test, "INKStatFloatAddTo", "TestCase1", TC_PASS, "ok");
1943
SDK_RPRINT(test, "INKStatFloatAddTo", "TestCase1", TC_FAIL, "can't add to correct float value");
1946
// Status of the whole test
1947
*pstatus = ((test_passed == true) ? REGRESSION_TEST_PASSED : REGRESSION_TEST_FAILED);
1951
//////////////////////////////////////////////
1954
// Unit Test for API: INKStatFloatSet
1955
//////////////////////////////////////////////
1957
REGRESSION_TEST(SDK_API_INKStatFloatSet) (RegressionTest * test, int atype, int *pstatus)
1959
NOWARN_UNUSED(atype);
1960
bool test_passed = false;
1961
*pstatus = REGRESSION_TEST_INPROGRESS;
1963
INKStat stat = INKStatCreate("stat_fs", INKSTAT_TYPE_FLOAT);
1965
INKStatFloatSet(stat, 100.0);
1967
INKStatFloatGet(stat, &stat_val);
1969
if (stat_val == 100.0) {
1970
SDK_RPRINT(test, "INKStatFloatSet", "TestCase1", TC_PASS, "ok");
1973
SDK_RPRINT(test, "INKStatFloatSet", "TestCase1", TC_FAIL, "can't set to correct float value");
1976
// Status of the whole test
1977
*pstatus = ((test_passed == true) ? REGRESSION_TEST_PASSED : REGRESSION_TEST_FAILED);
1981
//////////////////////////////////////////////
1984
// Unit Test for API: INKStatIncrement
1986
//////////////////////////////////////////////
1988
REGRESSION_TEST(SDK_API_INKStatIncrement) (RegressionTest * test, int atype, int *pstatus)
1990
NOWARN_UNUSED(atype);
1991
bool test_passed_int_increase = false;
1992
bool test_passed_int_decrease = false;
1993
bool test_passed_float_increase = false;
1994
bool test_passed_float_decrease = false;
1995
*pstatus = REGRESSION_TEST_INPROGRESS;
1997
INKStat stat_1 = INKStatCreate("stat_1", INKSTAT_TYPE_INT64);
1998
INKStat stat_2 = INKStatCreate("stat_2", INKSTAT_TYPE_FLOAT);
2000
INKStatIncrement(stat_1);
2002
INKStatIntGet(stat_1, &stat1_val);
2004
if (stat1_val == 1) {
2005
SDK_RPRINT(test, "INKStatIncrement", "TestCase1", TC_PASS, "ok for int stat");
2006
test_passed_int_increase = true;
2008
SDK_RPRINT(test, "INKStatIncrement", "TestCase1", TC_FAIL, "can't increase to correct integer value");
2011
INKStatDecrement(stat_1);
2012
INKStatIntGet(stat_1, &stat1_val);
2014
if (stat1_val == 0) {
2015
SDK_RPRINT(test, "INKStatDecrement", "TestCase1", TC_PASS, "ok for int stat");
2016
test_passed_int_decrease = true;
2018
SDK_RPRINT(test, "INKStatDecrement", "TestCase1", TC_FAIL, "can't decrease to correct integer value");
2021
INKStatIncrement(stat_2);
2023
INKStatFloatGet(stat_2, &stat2_val);
2025
if (stat2_val == 1.0) {
2026
SDK_RPRINT(test, "INKStatIncrement", "TestCase2", TC_PASS, "ok for float stat");
2027
test_passed_float_increase = true;
2030
snprintf(message, sizeof(message), "can't increase to correct float value (1.0 != %.3f)", stat2_val);
2031
SDK_RPRINT(test, "INKStatIncrement", "TestCase2", TC_FAIL, &message[0]);
2034
INKStatDecrement(stat_2);
2035
INKStatFloatGet(stat_2, &stat2_val);
2037
if (stat2_val == 0.0) {
2038
SDK_RPRINT(test, "INKStatDecrement", "TestCase2", TC_PASS, "ok for float stat");
2039
test_passed_float_decrease = true;
2041
SDK_RPRINT(test, "INKStatDecrement", "TestCase2", TC_FAIL, "can't decrease to correct float value");
2044
// Status of the whole test
2045
if (test_passed_int_increase && test_passed_int_decrease && test_passed_float_increase && test_passed_float_decrease)
2046
*pstatus = REGRESSION_TEST_PASSED;
2048
*pstatus = REGRESSION_TEST_FAILED;
2052
////////////////////////////////////////////////////
2053
// SDK_API_INKCoupledStat
2055
// Unit Test for API: INKStatCoupledGlobalCategoryCreate
2056
// INKStatCoupledLoacalCopyCreate
2057
// INKStatCoupledLoacalCopyDestroy
2058
// INKStatCoupledGlobalAdd
2059
// INKStatCoupledLocalAdd
2060
// INKStatsCoupledUpdate
2061
////////////////////////////////////////////////////
2063
REGRESSION_TEST(SDK_API_INKStatCoupled) (RegressionTest * test, int atype, int *pstatus)
2065
NOWARN_UNUSED(atype);
2066
*pstatus = REGRESSION_TEST_INPROGRESS;
2068
/* Create global category and its stats */
2069
INKCoupledStat stat_global_category = INKStatCoupledGlobalCategoryCreate("global.category");
2071
INKStat global_stat_sum = INKStatCoupledGlobalAdd(stat_global_category,
2073
INKSTAT_TYPE_FLOAT);
2075
INKStat global_stat_1 = INKStatCoupledGlobalAdd(stat_global_category,
2077
INKSTAT_TYPE_INT64);
2079
INKStat global_stat_2 = INKStatCoupledGlobalAdd(stat_global_category,
2081
INKSTAT_TYPE_INT64);
2083
/* Create local category and its stats */
2084
INKCoupledStat stat_local_copy = INKStatCoupledLocalCopyCreate("local.copy",
2085
stat_global_category);
2087
INKStat local_stat_sum = INKStatCoupledLocalAdd(stat_local_copy,
2089
INKSTAT_TYPE_FLOAT);
2091
INKStat local_stat_1 = INKStatCoupledLocalAdd(stat_local_copy,
2093
INKSTAT_TYPE_INT64);
2095
INKStat local_stat_2 = INKStatCoupledLocalAdd(stat_local_copy,
2097
INKSTAT_TYPE_INT64);
2099
/* stat operation */
2100
INKStatIntSet(local_stat_1, 100);
2101
INKStatIntSet(local_stat_2, 100);
2103
INKStatFloatGet(local_stat_1, &local_val_1);
2105
INKStatFloatGet(local_stat_2, &local_val_2);
2107
INKStatFloatAddTo(local_stat_sum, local_val_1);
2108
INKStatFloatAddTo(local_stat_sum, local_val_2);
2109
float local_val_sum;
2110
INKStatFloatGet(local_stat_sum, &local_val_sum);
2112
INKStatsCoupledUpdate(stat_local_copy);
2113
INKStatCoupledLocalCopyDestroy(stat_local_copy);
2115
float global_val_sum;
2116
INKStatFloatGet(global_stat_sum, &global_val_sum);
2117
int64_t global_val_1;
2118
INKStatIntGet(global_stat_1, &global_val_1);
2119
int64_t global_val_2;
2120
INKStatIntGet(global_stat_2, &global_val_2);
2122
if (local_val_1 == global_val_1 && local_val_2 == global_val_2 && local_val_sum == global_val_sum) {
2123
SDK_RPRINT(test, "INKStatCoupledGlobalCategoryCreate", "TestCase1", TC_PASS, "ok");
2124
SDK_RPRINT(test, "INKStatCoupledGlobalAdd", "TestCase1", TC_PASS, "ok");
2125
SDK_RPRINT(test, "INKStatCoupledLocalCopyCreate", "TestCase1", TC_PASS, "ok");
2126
SDK_RPRINT(test, "INKStatCoupledLocalAdd", "TestCase1", TC_PASS, "ok");
2127
SDK_RPRINT(test, "INKStatCoupledLocalCopyDestroy", "TestCase1", TC_PASS, "ok");
2128
SDK_RPRINT(test, "INKStatCoupledUpdate", "TestCase1", TC_PASS, "ok");
2129
*pstatus = REGRESSION_TEST_PASSED;
2131
SDK_RPRINT(test, "INKStatCoupledGlobalCategoryCreate", "TestCase1", TC_FAIL,
2132
"global stats' value is not equal to local one");
2133
SDK_RPRINT(test, "INKStatCoupledGlobalAdd", "TestCase1", TC_FAIL, "global stats' value is not equal to local one");
2134
SDK_RPRINT(test, "INKStatCoupledLocalCopyCreate", "TestCase1", TC_FAIL,
2135
"global stats' value is not equal to local one");
2136
SDK_RPRINT(test, "INKStatCoupledLocalAdd", "TestCase1", TC_FAIL, "global stats' value is not equal to local one");
2137
SDK_RPRINT(test, "INKStatCoupledLocalCopyDestroy", "TestCase1", TC_FAIL,
2138
"global stats' value is not equal to local one");
2139
SDK_RPRINT(test, "INKStatCoupledUpdate", "TestCase1", TC_FAIL, "global stats' value is not equal to local one");
2141
*pstatus = REGRESSION_TEST_FAILED;
2146
REGRESSION_TEST(SDK_API_TSContSchedule) (RegressionTest * test, int atype, int *pstatus)
2148
NOWARN_UNUSED(atype);
2149
*pstatus = REGRESSION_TEST_INPROGRESS;
2151
// For asynchronous APIs, use static vars to store test and pstatus
2152
SDK_ContSchedule_test = test;
2153
SDK_ContSchedule_pstatus = pstatus;
2155
TSCont contp = TSContCreate(cont_schedule_handler, TSMutexCreate());
2156
TSCont contp2 = TSContCreate(cont_schedule_handler, TSMutexCreate());
2158
// Test Case 1: schedule immediate
2159
TSContSchedule(contp, 0, TS_THREAD_POOL_DEFAULT);
2161
// Test Case 2: schedule in 10ms
2162
TSContSchedule(contp2, 10, TS_THREAD_POOL_DEFAULT);
2165
//////////////////////////////////////////////////////////////////////////////
2166
// SDK_API_HttpHookAdd
2168
// Unit Test for API: TSHttpHookAdd
2169
// TSHttpTxnReenable
2170
// TSHttpTxnClientIPGet
2171
// TSHttpTxnServerIPGet
2172
// TSHttpTxnClientIncomingPortGet
2173
// TSHttpTxnClientRemotePortGet
2174
// TSHttpTxnClientReqGet
2175
// TSHttpTxnClientRespGet
2176
// TSHttpTxnServerReqGet
2177
// TSHttpTxnServerRespGet
2178
//////////////////////////////////////////////////////////////////////////////
2180
#define HTTP_HOOK_TEST_REQUEST_ID 1
2184
RegressionTest *regtest;
2190
bool test_client_ip_get;
2191
bool test_client_incoming_port_get;
2192
bool test_client_remote_port_get;
2193
bool test_client_req_get;
2194
bool test_client_resp_get;
2195
bool test_server_ip_get;
2196
bool test_server_req_get;
2197
bool test_server_resp_get;
2198
bool test_next_hop_ip_get;
2204
//This func is called by us from mytest_handler to test TSHttpTxnClientIPGet
2206
checkHttpTxnClientIPGet(SocketTest * test, void *data)
2210
TSHttpTxn txnp = (TSHttpTxn) data;
2211
int actual_ip = LOCAL_IP; /* 127.0.0.1 is expected because the client is on the same machine */
2213
ip = TSHttpTxnClientIPGet(txnp);
2215
test->test_client_ip_get = false;
2216
SDK_RPRINT(test->regtest, "TSHttpTxnClientIPGet", "TestCase1", TC_FAIL, "TSHttpTxnClientIPGet returns 0");
2217
return TS_EVENT_CONTINUE;
2220
if (ntohl(ip) == (uint32_t) actual_ip) {
2221
test->test_client_ip_get = true;
2222
SDK_RPRINT(test->regtest, "TSHttpTxnClientIPGet", "TestCase1", TC_PASS, "ok");
2224
test->test_client_ip_get = false;
2225
SDK_RPRINT(test->regtest, "TSHttpTxnClientIPGet", "TestCase1", TC_FAIL, "Value's Mismatch");
2227
return TS_EVENT_CONTINUE;
2231
//This func is called by us from mytest_handler to check for TSHttpTxnNextHopIPGet
2233
checkHttpTxnNextHopIPGet(SocketTest * test, void *data)
2235
TSHttpTxn txnp = (TSHttpTxn) data;
2236
int actual_ip = LOCAL_IP; /* 127.0.0.1 is expected because the client is on the same machine */
2239
nexthopip = TSHttpTxnNextHopIPGet(txnp);
2240
if (nexthopip == 0) {
2241
test->test_next_hop_ip_get = false;
2242
SDK_RPRINT(test->regtest, "TSHttpTxnNextHopIPGet", "TestCase1", TC_FAIL, "TSHttpTxnNextHopIPGet returns 0");
2243
return TS_EVENT_CONTINUE;
2246
if (ntohl(nexthopip) == (uint32_t) actual_ip) {
2247
test->test_next_hop_ip_get = true;
2248
SDK_RPRINT(test->regtest, "TSHttpTxnNextHopIPGet", "TestCase1", TC_PASS, "ok");
2250
test->test_next_hop_ip_get = false;
2251
SDK_RPRINT(test->regtest, "TSHttpTxnNextHopIPGet", "TestCase1", TC_FAIL, "Value's Mismatch");
2254
return TS_EVENT_CONTINUE;
2259
//This func is called by us from mytest_handler to test TSHttpTxnServerIPGet
2261
checkHttpTxnServerIPGet(SocketTest * test, void *data)
2265
TSHttpTxn txnp = (TSHttpTxn) data;
2266
int actual_ip = ntohl(LOCAL_IP); /* 127.0.0.1 is expected because the client is on the same machine */
2268
ip = TSHttpTxnServerIPGet(txnp);
2270
test->test_server_ip_get = false;
2271
SDK_RPRINT(test->regtest, "TSHttpTxnServerIPGet", "TestCase1", TC_FAIL, "TSHttpTxnServerIPGet returns 0");
2272
return TS_EVENT_CONTINUE;
2275
if (ip == actual_ip) {
2276
test->test_server_ip_get = true;
2277
SDK_RPRINT(test->regtest, "TSHttpTxnServerIPGet", "TestCase1", TC_PASS, "ok");
2279
test->test_server_ip_get = false;
2280
SDK_RPRINT(test->regtest, "TSHttpTxnServerIPGet", "TestCase1", TC_FAIL, "Value's Mismatch");
2284
return TS_EVENT_CONTINUE;
2288
//This func is called by us from mytest_handler to test TSHttpTxnClientIncomingPortGet
2290
checkHttpTxnClientIncomingPortGet(SocketTest * test, void *data)
2294
TSMgmtInt port_from_config_file = -1;
2295
TSHttpTxn txnp = (TSHttpTxn) data;
2297
if ((port = TSHttpTxnClientIncomingPortGet(txnp)) < 0) {
2298
SDK_RPRINT(test->regtest, "TSHttpTxnClientIncomingPortGet", "TestCase1", TC_FAIL,
2299
"TSHttpTxnClientIncomingPortGet returns TS_ERROR");
2300
test->test_client_incoming_port_get = false;
2301
return TS_EVENT_CONTINUE;
2304
if (TSMgmtIntGet("proxy.config.http.server_port", &port_from_config_file) == 0) {
2305
port_from_config_file = 8080;
2308
TSDebug(UTDBG_TAG, "TS HTTP port = %x, Txn incoming client port %x", (int) port_from_config_file, port);
2310
if (port == (int) port_from_config_file) {
2311
SDK_RPRINT(test->regtest, "TSHttpTxnClientIncomingPortGet", "TestCase1", TC_PASS, "ok");
2312
test->test_client_incoming_port_get = true;
2314
SDK_RPRINT(test->regtest, "TSHttpTxnClientIncomingPortGet", "TestCase1", TC_FAIL,
2315
"Value's Mismatch. From Funtion: %d Expected value: %d", port, port_from_config_file);
2316
test->test_client_incoming_port_get = false;
2318
return TS_EVENT_CONTINUE;
2321
//This func is called by us from mytest_handler to test TSHttpTxnClientRemotePortGet
2323
checkHttpTxnClientRemotePortGet(SocketTest * test, void *data)
2327
int browser_port = -1;
2328
TSHttpTxn txnp = (TSHttpTxn) data;
2330
browser_port = test->browser->local_port;
2332
if (TSHttpTxnClientRemotePortGet(txnp, &port) != TS_SUCCESS) {
2333
SDK_RPRINT(test->regtest, "TSHttpTxnClientRemotePortGet", "TestCase1", TC_FAIL,
2334
"TSHttpTxnClientRemotePortGet doesn't return TS_SUCCESS");
2335
test->test_client_remote_port_get = false;
2336
return TS_EVENT_CONTINUE;
2339
TSDebug(UTDBG_TAG, "Browser port = %x, Txn remote port = %x", browser_port, port);
2341
if ((int)ntohs(port) == browser_port) {
2342
SDK_RPRINT(test->regtest, "TSHttpTxnClientRemotePortGet", "TestCase1", TC_PASS, "ok");
2343
test->test_client_remote_port_get = true;
2345
SDK_RPRINT(test->regtest, "TSHttpTxnClientRemotePortGet", "TestCase1", TC_FAIL,
2346
"Value's Mismatch. From Function: %d Expected Value: %d", ntohs(port), browser_port);
2347
test->test_client_remote_port_get = false;
2349
return TS_EVENT_CONTINUE;
2352
// This func is called by us from mytest_handler to test TSHttpTxnClientReqGet
2354
checkHttpTxnClientReqGet(SocketTest * test, void *data)
2359
TSHttpTxn txnp = (TSHttpTxn) data;
2361
if (!TSHttpTxnClientReqGet(txnp, &bufp, &mloc)) {
2362
test->test_client_req_get = false;
2363
SDK_RPRINT(test->regtest, "TSHttpTxnClientReqGet", "TestCase1", TC_FAIL, "Unable to get handle to client request");
2364
return TS_EVENT_CONTINUE;
2368
if ((bufp == (&((HttpSM *) txnp)->t_state.hdr_info.client_request)) &&
2369
(mloc == (((HttpSM *) txnp)->t_state.hdr_info.client_request.m_http))
2371
test->test_client_req_get = true;
2372
SDK_RPRINT(test->regtest, "TSHttpTxnClientReqGet", "TestCase1", TC_PASS, "ok");
2374
test->test_client_req_get = false;
2375
SDK_RPRINT(test->regtest, "TSHttpTxnClientReqGet", "TestCase1", TC_FAIL, "Value's Mismatch");
2378
return TS_EVENT_CONTINUE;
2381
// This func is called by us from mytest_handler to test TSHttpTxnClientRespGet
2383
checkHttpTxnClientRespGet(SocketTest * test, void *data)
2388
TSHttpTxn txnp = (TSHttpTxn) data;
2390
if (!TSHttpTxnClientRespGet(txnp, &bufp, &mloc)) {
2391
test->test_client_resp_get = false;
2392
SDK_RPRINT(test->regtest, "TSHttpTxnClientRespGet", "TestCase1", TC_FAIL,
2393
"Unable to get handle to client response");
2394
return TS_EVENT_CONTINUE;
2397
if ((bufp == (&((HttpSM *) txnp)->t_state.hdr_info.client_response)) &&
2398
(mloc == (((HttpSM *) txnp)->t_state.hdr_info.client_response.m_http))
2400
test->test_client_resp_get = true;
2401
SDK_RPRINT(test->regtest, "TSHttpTxnClientRespGet", "TestCase1", TC_PASS, "ok");
2403
test->test_client_resp_get = false;
2404
SDK_RPRINT(test->regtest, "TSHttpTxnClientRespGet", "TestCase1", TC_FAIL, "Value's Mismatch");
2407
return TS_EVENT_CONTINUE;
2410
// This func is called by us from mytest_handler to test TSHttpTxnServerReqGet
2412
checkHttpTxnServerReqGet(SocketTest * test, void *data)
2417
TSHttpTxn txnp = (TSHttpTxn) data;
2419
if (!TSHttpTxnServerReqGet(txnp, &bufp, &mloc)) {
2420
test->test_server_req_get = false;
2421
SDK_RPRINT(test->regtest, "TSHttpTxnServerReqGet", "TestCase1", TC_FAIL, "Unable to get handle to server request");
2422
return TS_EVENT_CONTINUE;
2425
if ((bufp == (&((HttpSM *) txnp)->t_state.hdr_info.server_request)) &&
2426
(mloc == (((HttpSM *) txnp)->t_state.hdr_info.server_request.m_http))
2428
test->test_server_req_get = true;
2429
SDK_RPRINT(test->regtest, "TSHttpTxnServerReqGet", "TestCase1", TC_PASS, "ok");
2431
test->test_server_req_get = false;
2432
SDK_RPRINT(test->regtest, "TSHttpTxnServerReqGet", "TestCase1", TC_FAIL, "Value's Mismatch");
2435
return TS_EVENT_CONTINUE;
2438
// This func is called by us from mytest_handler to test TSHttpTxnServerRespGet
2440
checkHttpTxnServerRespGet(SocketTest * test, void *data)
2445
TSHttpTxn txnp = (TSHttpTxn) data;
2447
if (!TSHttpTxnServerRespGet(txnp, &bufp, &mloc)) {
2448
test->test_server_resp_get = false;
2449
SDK_RPRINT(test->regtest, "TSHttpTxnServerRespGet", "TestCase1", TC_FAIL,
2450
"Unable to get handle to server response");
2451
return TS_EVENT_CONTINUE;
2454
if ((bufp == (&((HttpSM *) txnp)->t_state.hdr_info.server_response)) &&
2455
(mloc == (((HttpSM *) txnp)->t_state.hdr_info.server_response.m_http))
2457
test->test_server_resp_get = true;
2458
SDK_RPRINT(test->regtest, "TSHttpTxnServerRespGet", "TestCase1", TC_PASS, "ok");
2460
test->test_server_resp_get = false;
2461
SDK_RPRINT(test->regtest, "TSHttpTxnServerRespGet", "TestCase1", TC_FAIL, "Value's Mismatch");
2464
return TS_EVENT_CONTINUE;
2468
// This func is called both by us when scheduling EVENT_IMMEDIATE
2469
// And by HTTP SM for registered hooks
2471
mytest_handler(TSCont contp, TSEvent event, void *data)
2473
SocketTest *test = (SocketTest *) TSContDataGet(contp);
2475
if ((event == TS_EVENT_IMMEDIATE) || (event == TS_EVENT_TIMEOUT)) {
2478
TSHttpTxnReenable((TSHttpTxn) data, TS_EVENT_HTTP_CONTINUE);
2481
TSAssert(test->magic == MAGIC_ALIVE);
2482
TSAssert(test->browser->magic == MAGIC_ALIVE);
2485
case TS_EVENT_HTTP_TXN_START:
2486
if (test->hook_mask == 0) {
2487
test->hook_mask |= 1;
2490
if (TSHttpTxnReenable((TSHttpTxn) data, TS_EVENT_HTTP_CONTINUE) != TS_SUCCESS) {
2491
SDK_RPRINT(test->regtest, "TSHttpTxnReenable", "TestCase1", TC_FAIL,
2492
"TSHttpTxnReenable doesn't return TS_SUCCESS");
2494
test->reenable_mask |= 1;
2498
case TS_EVENT_HTTP_READ_REQUEST_HDR:
2499
if (test->hook_mask == 1) {
2500
test->hook_mask |= 2;
2502
TSSkipRemappingSet((TSHttpTxn) data,1);
2503
checkHttpTxnClientReqGet(test, data);
2505
if (TSHttpTxnReenable((TSHttpTxn) data, TS_EVENT_HTTP_CONTINUE) != TS_SUCCESS) {
2506
SDK_RPRINT(test->regtest, "TSHttpTxnReenable", "TestCase1", TC_FAIL,
2507
"TSHttpTxnReenable doesn't return TS_SUCCESS");
2509
test->reenable_mask |= 2;
2514
case TS_EVENT_HTTP_OS_DNS:
2515
if (test->hook_mask == 7) {
2516
test->hook_mask |= 8;
2519
checkHttpTxnClientIncomingPortGet(test, data);
2520
checkHttpTxnClientRemotePortGet(test, data);
2522
checkHttpTxnClientIPGet(test, data);
2523
checkHttpTxnServerIPGet(test, data);
2525
if (TSHttpTxnReenable((TSHttpTxn) data, TS_EVENT_HTTP_CONTINUE) != TS_SUCCESS) {
2526
SDK_RPRINT(test->regtest, "TSHttpTxnReenable", "TestCase1", TC_FAIL,
2527
"TSHttpTxnReenable doesn't return TS_SUCCESS");
2529
test->reenable_mask |= 8;
2533
case TS_EVENT_HTTP_CACHE_LOOKUP_COMPLETE:
2534
if (test->hook_mask == 3) {
2535
test->hook_mask |= 4;
2537
if (TSHttpTxnReenable((TSHttpTxn) data, TS_EVENT_HTTP_CONTINUE) != TS_SUCCESS) {
2538
SDK_RPRINT(test->regtest, "TSHttpTxnReenable", "TestCase1", TC_FAIL,
2539
"TSHttpTxnReenable doesn't return TS_SUCCESS");
2541
test->reenable_mask |= 4;
2545
case TS_EVENT_HTTP_SEND_REQUEST_HDR:
2546
if (test->hook_mask == 15) {
2547
test->hook_mask |= 16;
2550
checkHttpTxnServerReqGet(test, data);
2551
checkHttpTxnNextHopIPGet(test, data);
2553
if (TSHttpTxnReenable((TSHttpTxn) data, TS_EVENT_HTTP_CONTINUE) != TS_SUCCESS) {
2554
SDK_RPRINT(test->regtest, "TSHttpTxnReenable", "TestCase1", TC_FAIL,
2555
"TSHttpTxnReenable doesn't return TS_SUCCESS");
2557
test->reenable_mask |= 16;
2563
case TS_EVENT_HTTP_READ_RESPONSE_HDR:
2564
if (test->hook_mask == 31) {
2565
test->hook_mask |= 32;
2567
checkHttpTxnServerRespGet(test, data);
2569
if (TSHttpTxnReenable((TSHttpTxn) data, TS_EVENT_HTTP_CONTINUE) != TS_SUCCESS) {
2570
SDK_RPRINT(test->regtest, "TSHttpTxnReenable", "TestCase1", TC_FAIL,
2571
"TSHttpTxnReenable doesn't return TS_SUCCESS");
2573
test->reenable_mask |= 32;
2578
case TS_EVENT_HTTP_SEND_RESPONSE_HDR:
2579
if (test->hook_mask == 63) {
2580
test->hook_mask |= 64;
2583
checkHttpTxnClientRespGet(test, data);
2585
if (TSHttpTxnReenable((TSHttpTxn) data, TS_EVENT_HTTP_CONTINUE) != TS_SUCCESS) {
2586
SDK_RPRINT(test->regtest, "TSHttpTxnReenable", "TestCase1", TC_FAIL,
2587
"TSHttpTxnReenable doesn't return TS_SUCCESS");
2589
test->reenable_mask |= 64;
2594
case TS_EVENT_HTTP_TXN_CLOSE:
2595
if (test->hook_mask == 127) {
2596
test->hook_mask |= 128;
2599
if (TSHttpTxnReenable((TSHttpTxn) data, TS_EVENT_HTTP_CONTINUE) != TS_SUCCESS) {
2600
SDK_RPRINT(test->regtest, "TSHttpTxnReenable", "TestCase1", TC_FAIL,
2601
"TSHttpTxnReenable doesn't return TS_SUCCESS");
2603
test->reenable_mask |= 128;
2607
case TS_EVENT_IMMEDIATE:
2608
case TS_EVENT_TIMEOUT:
2609
/* Browser still waiting the response ? */
2610
if (test->browser->status == REQUEST_INPROGRESS) {
2611
TSContSchedule(contp, 25, TS_THREAD_POOL_DEFAULT);
2613
/* Browser got the response. test is over. clean up */
2615
/* Note: response is available using test->browser->response pointer */
2616
if ((test->browser->status == REQUEST_SUCCESS) && (test->hook_mask == 255)) {
2617
*(test->pstatus) = REGRESSION_TEST_PASSED;
2618
SDK_RPRINT(test->regtest, "TSHttpHookAdd", "TestCase1", TC_PASS, "ok");
2621
*(test->pstatus) = REGRESSION_TEST_FAILED;
2622
SDK_RPRINT(test->regtest, "TSHttpHookAdd", "TestCase1", TC_FAIL,
2623
"Hooks not called or request failure. Hook mask = %d\n %s", test->hook_mask,test->browser->response);
2626
if (test->reenable_mask == 255) {
2627
SDK_RPRINT(test->regtest, "TSHttpTxnReenable", "TestCase1", TC_PASS, "ok");
2630
*(test->pstatus) = REGRESSION_TEST_FAILED;
2631
SDK_RPRINT(test->regtest, "TSHttpTxnReenable", "TestCase1", TC_FAIL, "Txn not reenabled properly");
2635
if ((test->test_client_ip_get != true) ||
2636
(test->test_client_incoming_port_get != true) ||
2637
(test->test_client_remote_port_get != true) ||
2638
(test->test_client_req_get != true) ||
2639
(test->test_client_resp_get != true) ||
2640
(test->test_server_ip_get != true) ||
2641
(test->test_server_req_get != true) ||
2642
(test->test_server_resp_get != true) || (test->test_next_hop_ip_get != true)
2644
*(test->pstatus) = REGRESSION_TEST_FAILED;
2646
// transaction is over. clean up.
2647
synclient_txn_delete(test->browser);
2648
synserver_delete(test->os);
2650
test->magic = MAGIC_DEAD;
2652
TSContDataSet(contp, NULL);
2657
*(test->pstatus) = REGRESSION_TEST_FAILED;
2658
SDK_RPRINT(test->regtest, "TSHttpHookAdd", "TestCase1", TC_FAIL, "Unexpected event %d", event);
2662
return TS_EVENT_IMMEDIATE;
2667
EXCLUSIVE_REGRESSION_TEST(SDK_API_HttpHookAdd) (RegressionTest * test, int atype, int *pstatus)
2669
NOWARN_UNUSED(atype);
2670
*pstatus = REGRESSION_TEST_INPROGRESS;
2672
TSCont cont = TSContCreate(mytest_handler, TSMutexCreate());
2673
SocketTest *socktest = (SocketTest *) TSmalloc(sizeof(SocketTest));
2675
socktest->regtest = test;
2676
socktest->pstatus = pstatus;
2677
socktest->hook_mask = 0;
2678
socktest->reenable_mask = 0;
2679
socktest->test_client_ip_get = false;
2680
socktest->test_client_incoming_port_get = false;
2681
socktest->test_client_req_get = false;
2682
socktest->test_client_resp_get = false;
2683
socktest->test_server_ip_get = false;
2684
socktest->test_server_req_get = false;
2685
socktest->test_server_resp_get = false;
2686
socktest->test_next_hop_ip_get = false;
2687
socktest->magic = MAGIC_ALIVE;
2688
TSContDataSet(cont, socktest);
2690
/* Register to HTTP hooks that are called in case of a cache MISS */
2691
TSHttpHookAdd(TS_HTTP_TXN_START_HOOK, cont);
2692
TSHttpHookAdd(TS_HTTP_READ_REQUEST_HDR_HOOK, cont);
2693
TSHttpHookAdd(TS_HTTP_OS_DNS_HOOK, cont);
2694
TSHttpHookAdd(TS_HTTP_CACHE_LOOKUP_COMPLETE_HOOK, cont);
2695
TSHttpHookAdd(TS_HTTP_SEND_REQUEST_HDR_HOOK, cont);
2696
TSHttpHookAdd(TS_HTTP_READ_RESPONSE_HDR_HOOK, cont);
2697
TSHttpHookAdd(TS_HTTP_SEND_RESPONSE_HDR_HOOK, cont);
2698
TSHttpHookAdd(TS_HTTP_TXN_CLOSE_HOOK, cont);
2700
/* Create a new synthetic server */
2701
socktest->os = synserver_create(SYNSERVER_LISTEN_PORT);
2702
synserver_start(socktest->os);
2704
/* Create a client transaction */
2705
socktest->browser = synclient_txn_create();
2706
char *request = generate_request(HTTP_HOOK_TEST_REQUEST_ID); // this request has a no-cache that prevents caching
2707
synclient_txn_send_request(socktest->browser, request);
2710
/* Wait until transaction is done */
2711
if (socktest->browser->status == REQUEST_INPROGRESS) {
2712
TSContSchedule(cont, 25, TS_THREAD_POOL_DEFAULT);
2719
//////////////////////////////////////////////
2722
// Unit Test for API: TSUrlCreate
2736
// TSUrlHttpParamsGet
2737
// TSUrlHttpParamsSet
2738
// TSUrlHttpQueryGet
2739
// TSUrlHttpQuerySet
2740
// TSUrlHttpFragmentGet
2741
// TSUrlHttpFragmentSet
2749
//////////////////////////////////////////////
2752
test_url_print(TSMBuffer bufp, TSMLoc hdr_loc)
2754
TSIOBuffer output_buffer;
2755
TSIOBufferReader reader;
2756
int64_t total_avail;
2758
TSIOBufferBlock block;
2759
const char *block_start;
2760
int64_t block_avail;
2762
char *output_string;
2765
output_buffer = TSIOBufferCreate();
2767
if (!output_buffer) {
2768
TSError("couldn't allocate IOBuffer\n");
2771
reader = TSIOBufferReaderAlloc(output_buffer);
2773
/* This will print just MIMEFields and not
2774
the http request line */
2775
if (TSUrlPrint(bufp, hdr_loc, output_buffer) != TS_SUCCESS) {
2779
/* Find out how the big the complete header is by
2780
seeing the total bytes in the buffer. We need to
2781
look at the buffer rather than the first block to
2782
see the size of the entire header */
2783
total_avail = TSIOBufferReaderAvail(reader);
2785
/* Allocate the string with an extra byte for the string
2787
output_string = (char *) TSmalloc(total_avail + 1);
2790
/* We need to loop over all the buffer blocks to make
2791
sure we get the complete header since the header can
2792
be in multiple blocks */
2793
block = TSIOBufferReaderStart(reader);
2796
block_start = TSIOBufferBlockReadStart(block, reader, &block_avail);
2798
/* We'll get a block pointer back even if there is no data
2799
left to read so check for this condition and break out of
2800
the loop. A block with no data to read means we've exhausted
2801
buffer of data since if there was more data on a later
2802
block in the chain, this block would have been skipped over */
2803
if (block_avail == 0) {
2807
memcpy(output_string + output_len, block_start, block_avail);
2808
output_len += block_avail;
2810
/* Consume the data so that we get to the next block */
2811
TSIOBufferReaderConsume(reader, block_avail);
2813
/* Get the next block now that we've consumed the
2814
data off the last block */
2815
block = TSIOBufferReaderStart(reader);
2818
/* Terminate the string */
2819
output_string[output_len] = '\0';
2822
/* Free up the TSIOBuffer that we used to print out the header */
2823
TSIOBufferReaderFree(reader);
2824
TSIOBufferDestroy(output_buffer);
2826
return output_string;
2829
REGRESSION_TEST(SDK_API_TSUrl) (RegressionTest * test, int atype, int *pstatus)
2831
NOWARN_UNUSED(atype);
2832
TSMBuffer bufp1 = (TSMBuffer) TS_ERROR_PTR;
2833
TSMBuffer bufp2 = (TSMBuffer) TS_ERROR_PTR;
2834
TSMBuffer bufp3 = (TSMBuffer) TS_ERROR_PTR;
2838
const char *scheme = TS_URL_SCHEME_HTTP;
2839
const char *scheme_get;
2840
const char *user = "yyy";
2841
const char *user_get;
2842
const char *password = "xxx";
2843
const char *password_get;
2844
const char *host = "www.example.com";
2845
const char *host_get;
2849
const char *path = "about/overview.html";
2850
const char *path_get;
2851
const char *params = "abcdef";
2852
const char *params_get;
2853
const char *query = "name=xxx";
2854
const char *query_get;
2855
const char *fragment = "yyy";
2856
const char *fragment_get;
2857
char *url_expected_string;
2858
char *url_string_from_1 = (char *) TS_ERROR_PTR;
2859
char *url_string_from_2 = (char *) TS_ERROR_PTR;
2860
char *url_string_from_3 = (char *) TS_ERROR_PTR;
2861
char *url_string_from_print = (char *) TS_ERROR_PTR;
2862
int url_expected_length;
2863
int url_length_from_1;
2864
int url_length_from_2;
2868
bool test_passed_create = false;
2869
bool test_passed_destroy = false;
2870
bool test_passed_scheme = false;
2871
bool test_passed_user = false;
2872
bool test_passed_password = false;
2873
bool test_passed_host = false;
2874
bool test_passed_port = false;
2875
bool test_passed_path = false;
2876
bool test_passed_params = false;
2877
bool test_passed_query = false;
2878
bool test_passed_fragment = false;
2879
bool test_passed_copy = false;
2880
bool test_passed_clone = false;
2881
bool test_passed_string1 = false;
2882
bool test_passed_string2 = false;
2883
bool test_passed_print = false;
2884
bool test_passed_length1 = false;
2885
bool test_passed_length2 = false;
2886
bool test_passed_type = false;
2890
*pstatus = REGRESSION_TEST_INPROGRESS;
2893
memset(port_char, 0, 10);
2894
snprintf(port_char, sizeof(port_char), "%d", port);
2898
url_expected_length = strlen(scheme) + strlen("://") +
2899
((user == NULL) ? 0 : strlen(user)) +
2900
((password == NULL) ? ((user == NULL) ? 0 : strlen("@")) : strlen(":") + strlen(password) + strlen("@")) +
2902
((port == 80) ? 0 : strlen(port_char) + strlen(":")) +
2903
strlen("/") + strlen(path) +
2904
((params == NULL) ? 0 : strlen(";") + strlen(params)) +
2905
((query == NULL) ? 0 : strlen("?") + strlen(query)) + ((fragment == NULL) ? 0 : strlen("#") + strlen(fragment));
2907
size_t len = url_expected_length + 1;
2908
url_expected_string = (char *) TSmalloc(len * sizeof(char));
2909
memset(url_expected_string, 0, url_expected_length + 1);
2910
snprintf(url_expected_string, len, "%s://%s%s%s%s%s%s%s/%s%s%s%s%s%s%s",
2912
((user == NULL) ? "" : user),
2913
((password == NULL) ? "" : ":"),
2914
((password == NULL) ? "" : password),
2915
(((user == NULL) && (password == NULL)) ? "" : "@"),
2917
((port == 80) ? "" : ":"),
2918
((port == 80) ? "" : port_char),
2919
((path == NULL) ? "" : path),
2920
((params == NULL) ? "" : ";"),
2921
((params == NULL) ? "" : params),
2922
((query == NULL) ? "" : "?"),
2923
((query == NULL) ? "" : query), ((fragment == NULL) ? "" : "#"), ((fragment == NULL) ? "" : fragment)
2929
if ((bufp1 = TSMBufferCreate()) == TS_ERROR_PTR) {
2930
// Cannot proceed with tests.
2931
SDK_RPRINT(test, "TSMBufferCreate", "TestCase1", TC_FAIL, "unable to allocate MBuffer.");
2934
if ((url_loc1 = TSUrlCreate(bufp1)) == TS_ERROR_PTR) {
2935
// Cannot proceed with tests.
2936
SDK_RPRINT(test, "TSUrlCreate", "TestCase1", TC_FAIL, "unable to create URL within buffer.");
2940
if (TSUrlSchemeSet(bufp1, url_loc1, scheme, -1) != TS_SUCCESS) {
2941
SDK_RPRINT(test, "TSUrlSchemeSet", "TestCase1", TC_FAIL, "TSUrlSchemeSet Returned TS_ERROR");
2943
if ((scheme_get = TSUrlSchemeGet(bufp1, url_loc1, &length)) == TS_ERROR_PTR) {
2944
SDK_RPRINT(test, "TSUrlSchemeSet|Get", "TestCase1", TC_FAIL, "TSUrlSchemeGet Returned TS_ERROR_PTR");
2946
if (strncmp(scheme_get, scheme, length) == 0) {
2947
SDK_RPRINT(test, "TSUrlSchemeSet&Get", "TestCase1", TC_PASS, "ok");
2948
test_passed_scheme = true;
2950
SDK_RPRINT(test, "TSUrlSchemeSet&Get", "TestCase1", TC_FAIL, "Values don't match");
2956
if (TSUrlUserSet(bufp1, url_loc1, user, -1) != TS_SUCCESS) {
2957
SDK_RPRINT(test, "TSUrlUserSet", "TestCase1", TC_FAIL, "Returned TS_ERROR");
2959
if ((user_get = TSUrlUserGet(bufp1, url_loc1, &length)) == TS_ERROR_PTR) {
2960
SDK_RPRINT(test, "TSUrlUserSet|Get", "TestCase1", TC_FAIL, "TSUrlUserGet Returned TS_ERROR_PTR");
2962
if (((user_get == NULL) && (user == NULL)) || (strncmp(user_get, user, length) == 0)) {
2963
SDK_RPRINT(test, "TSUrlUserSet&Get", "TestCase1", TC_PASS, "ok");
2964
test_passed_user = true;
2966
SDK_RPRINT(test, "TSUrlUserSet&Get", "TestCase1", TC_FAIL, "Values don't match");
2972
if (TSUrlPasswordSet(bufp1, url_loc1, password, -1) != TS_SUCCESS) {
2973
SDK_RPRINT(test, "TSUrlPasswordSet", "TestCase1", TC_FAIL, "Returned TS_ERROR");
2975
if ((password_get = TSUrlPasswordGet(bufp1, url_loc1, &length)) == TS_ERROR_PTR) {
2976
SDK_RPRINT(test, "TSUrlPasswordSet|Get", "TestCase1", TC_FAIL, "TSUrlPasswordGet Returned TS_ERROR_PTR");
2978
if (((password_get == NULL) && (password == NULL)) || (strncmp(password_get, password, length) == 0)) {
2979
SDK_RPRINT(test, "TSUrlPasswordSet&Get", "TestCase1", TC_PASS, "ok");
2980
test_passed_password = true;
2982
SDK_RPRINT(test, "TSUrlPasswordSet&Get", "TestCase1", TC_FAIL, "Values don't match");
2988
if (TSUrlHostSet(bufp1, url_loc1, host, -1) != TS_SUCCESS) {
2989
SDK_RPRINT(test, "TSUrlHostSet", "TestCase1", TC_FAIL, "Returned TS_ERROR");
2991
if ((host_get = TSUrlHostGet(bufp1, url_loc1, &length)) == TS_ERROR_PTR) {
2992
SDK_RPRINT(test, "TSUrlHostSet|Get", "TestCase1", TC_FAIL, "TSUrlHostGet Returned TS_ERROR_PTR");
2994
if (strncmp(host_get, host, length) == 0) {
2995
SDK_RPRINT(test, "TSUrlHostSet&Get", "TestCase1", TC_PASS, "ok");
2996
test_passed_host = true;
2998
SDK_RPRINT(test, "TSUrlHostSet&Get", "TestCase1", TC_FAIL, "Values don't match");
3004
if (TSUrlPortSet(bufp1, url_loc1, port) != TS_SUCCESS) {
3005
SDK_RPRINT(test, "TSUrlPortSet", "TestCase1", TC_FAIL, "Returned TS_ERROR");
3008
if ((port_get = TSUrlPortGet(bufp1, url_loc1)) == TS_ERROR) {
3009
SDK_RPRINT(test, "TSUrlPortSet|Get", "TestCase1", TC_FAIL, "TSUrlPortGet Returned TS_ERROR");
3011
if (port_get == port) {
3012
SDK_RPRINT(test, "TSUrlPortSet&Get", "TestCase1", TC_PASS, "ok");
3013
test_passed_port = true;
3015
SDK_RPRINT(test, "TSUrlPortSet&Get", "TestCase1", TC_FAIL, "Values don't match");
3021
if (TSUrlPathSet(bufp1, url_loc1, path, -1) != TS_SUCCESS) {
3022
SDK_RPRINT(test, "TSUrlPathSet", "TestCase1", TC_FAIL, "Returned TS_ERROR");
3024
if ((path_get = TSUrlPathGet(bufp1, url_loc1, &length)) == TS_ERROR_PTR) {
3025
SDK_RPRINT(test, "TSUrlPathSet|Get", "TestCase1", TC_FAIL, "TSUrlPathGet Returned TS_ERROR_PTR");
3027
if (((path == NULL) && (path_get == NULL)) || (strncmp(path, path_get, length) == 0)) {
3028
SDK_RPRINT(test, "TSUrlPathSet&Get", "TestCase1", TC_PASS, "ok");
3029
test_passed_path = true;
3031
SDK_RPRINT(test, "TSUrlPathSet&Get", "TestCase1", TC_FAIL, "Values don't match");
3037
if (TSUrlHttpParamsSet(bufp1, url_loc1, params, -1) != TS_SUCCESS) {
3038
SDK_RPRINT(test, "TSUrlHttpParamsSet", "TestCase1", TC_FAIL, "Returned TS_ERROR");
3040
if ((params_get = TSUrlHttpParamsGet(bufp1, url_loc1, &length)) == TS_ERROR_PTR) {
3041
SDK_RPRINT(test, "TSUrlHttpParamsSet|Get", "TestCase1", TC_FAIL, "TSUrlHttpParamsGet Returned TS_ERROR_PTR");
3043
if (((params == NULL) && (params_get == NULL)) || (strncmp(params, params_get, length) == 0)) {
3044
SDK_RPRINT(test, "TSUrlHttpParamsSet&Get", "TestCase1", TC_PASS, "ok");
3045
test_passed_params = true;
3047
SDK_RPRINT(test, "TSUrlHttpParamsSet&Get", "TestCase1", TC_FAIL, "Values don't match");
3053
if (TSUrlHttpQuerySet(bufp1, url_loc1, query, -1) != TS_SUCCESS) {
3054
SDK_RPRINT(test, "TSUrlHttpQuerySet", "TestCase1", TC_FAIL, "Returned TS_ERROR");
3056
if ((query_get = TSUrlHttpQueryGet(bufp1, url_loc1, &length)) == TS_ERROR_PTR) {
3057
SDK_RPRINT(test, "TSUrlHttpQuerySet|Get", "TestCase1", TC_FAIL, "TSUrlHttpQueryGet Returned TS_ERROR_PTR");
3059
if (((query == NULL) && (query_get == NULL)) || (strncmp(query, query_get, length) == 0)) {
3060
SDK_RPRINT(test, "TSUrlHttpQuerySet&Get", "TestCase1", TC_PASS, "ok");
3061
test_passed_query = true;
3063
SDK_RPRINT(test, "TSUrlHttpQuerySet&Get", "TestCase1", TC_FAIL, "Values don't match");
3069
if (TSUrlHttpFragmentSet(bufp1, url_loc1, fragment, -1) != TS_SUCCESS) {
3070
SDK_RPRINT(test, "TSUrlHttpFragmentSet", "TestCase1", TC_FAIL, "Returned TS_ERROR");
3072
if ((fragment_get = TSUrlHttpFragmentGet(bufp1, url_loc1, &length)) == TS_ERROR_PTR) {
3073
SDK_RPRINT(test, "TSUrlHttpFragmentSet|Get", "TestCase1", TC_FAIL,
3074
"TSUrlHttpFragmentGet Returned TS_ERROR_PTR");
3076
if (((fragment == NULL) && (fragment_get == NULL)) || (strncmp(fragment, fragment_get, length) == 0)) {
3077
SDK_RPRINT(test, "TSUrlHttpFragmentSet&Get", "TestCase1", TC_PASS, "ok");
3078
test_passed_fragment = true;
3080
SDK_RPRINT(test, "TSUrlHttpFragmentSet&Get", "TestCase1", TC_FAIL, "Values don't match");
3086
if ((url_length_from_1 = TSUrlLengthGet(bufp1, url_loc1)) == TS_ERROR) {
3087
SDK_RPRINT(test, "TSUrlLengthGet", "TestCase1", TC_FAIL, "Returns TS_ERROR");
3089
if (url_length_from_1 == url_expected_length) {
3090
SDK_RPRINT(test, "TSUrlLengthGet", "TestCase1", TC_PASS, "ok");
3091
test_passed_length1 = true;
3093
SDK_RPRINT(test, "TSUrlLengthGet", "TestCase1", TC_FAIL, "Values don't match");
3099
if ((url_string_from_1 = TSUrlStringGet(bufp1, url_loc1, NULL)) == TS_ERROR_PTR) {
3100
SDK_RPRINT(test, "TSUrlStringGet", "TestCase1", TC_FAIL, "Returns TS_ERROR_PTR");
3102
if (strcmp(url_string_from_1, url_expected_string) == 0) {
3103
SDK_RPRINT(test, "TSUrlStringGet", "TestCase1", TC_PASS, "ok");
3104
test_passed_string1 = true;
3106
SDK_RPRINT(test, "TSUrlStringGet", "TestCase1", TC_FAIL, "Values don't match");
3112
if ((bufp2 = TSMBufferCreate()) == TS_ERROR_PTR) {
3113
// Cannot proceed with tests.
3114
SDK_RPRINT(test, "TSMBufferCreate", "TestCase2", TC_FAIL, "unable to allocate MBuffer for TSUrlCopy.");
3117
if ((url_loc2 = TSUrlCreate(bufp2)) == TS_ERROR_PTR) {
3118
// Cannot proceed with tests.
3119
SDK_RPRINT(test, "TSUrlCreate", "TestCase2", TC_FAIL, "unable to create URL within buffer for TSUrlCopy.");
3122
if (TSUrlCopy(bufp2, url_loc2, bufp1, url_loc1) == TS_ERROR) {
3123
SDK_RPRINT(test, "TSUrlCopy", "TestCase1", TC_FAIL, "Returned TS_ERROR");
3125
//Length Test Case 2
3126
if ((url_length_from_2 = TSUrlLengthGet(bufp2, url_loc2)) == TS_ERROR) {
3127
SDK_RPRINT(test, "TSUrlLengthGet", "TestCase2", TC_FAIL, "Returns TS_ERROR");
3129
if (url_length_from_2 == url_expected_length) {
3130
SDK_RPRINT(test, "TSUrlLengthGet", "TestCase2", TC_PASS, "ok");
3131
test_passed_length2 = true;
3133
SDK_RPRINT(test, "TSUrlCopy", "TestCase1", TC_FAIL, "Values don't match");
3138
//String Test Case 2
3139
if ((url_string_from_2 = TSUrlStringGet(bufp2, url_loc2, NULL)) == TS_ERROR_PTR) {
3140
SDK_RPRINT(test, "TSUrlStringGet", "TestCase2", TC_FAIL, "Returns TS_ERROR_PTR");
3142
if (strcmp(url_string_from_2, url_expected_string) == 0) {
3143
SDK_RPRINT(test, "TSUrlStringGet", "TestCase2", TC_PASS, "ok");
3144
test_passed_string2 = true;
3146
SDK_RPRINT(test, "TSUrlStringGet", "TestCase2", TC_FAIL, "Values don't match");
3151
if (strcmp(url_string_from_1, url_string_from_2) == 0) {
3152
SDK_RPRINT(test, "TSUrlCopy", "TestCase1", TC_PASS, "ok");
3153
test_passed_copy = true;
3155
SDK_RPRINT(test, "TSUrlCopy", "TestCase1", TC_FAIL, "Values Don't Match");
3160
if ((bufp3 = TSMBufferCreate()) == TS_ERROR_PTR) {
3161
// Cannot proceed with tests.
3162
SDK_RPRINT(test, "TSMBufferCreate", "TestCase2", TC_FAIL, "unable to allocate MBuffer for TSUrlClone.");
3165
if ((url_loc3 = TSUrlClone(bufp3, bufp1, url_loc1)) == TS_ERROR_PTR) {
3166
SDK_RPRINT(test, "TSUrlClone", "TestCase1", TC_FAIL, "Returned TS_ERROR_PTR");
3168
//String Test Case 2
3169
if ((url_string_from_3 = TSUrlStringGet(bufp3, url_loc3, NULL)) == TS_ERROR_PTR) {
3170
SDK_RPRINT(test, "TSUrlClone", "TestCase2", TC_FAIL, "TSUrlStringGet Returns TS_ERROR_PTR");
3173
if (strcmp(url_string_from_1, url_string_from_3) == 0) {
3174
SDK_RPRINT(test, "TSUrlClone", "TestCase1", TC_PASS, "ok");
3175
test_passed_clone = true;
3177
SDK_RPRINT(test, "TSUrlClone", "TestCase1", TC_FAIL, "Values Don't Match");
3183
url_string_from_print = test_url_print(bufp1, url_loc1);
3184
if (url_string_from_print == NULL) {
3185
SDK_RPRINT(test, "TSUrlPrint", "TestCase1", TC_FAIL, "TSUrlPrint doesn't return TS_SUCCESS");
3187
if (strcmp(url_string_from_print, url_expected_string) == 0) {
3188
SDK_RPRINT(test, "TSUrlPrint", "TestCase1", TC_PASS, "ok");
3189
test_passed_print = true;
3191
SDK_RPRINT(test, "TSUrlPrint", "TestCase1", TC_FAIL, "TSUrlPrint doesn't return TS_SUCCESS");
3193
TSfree(url_string_from_print);
3196
if (TSUrlFtpTypeSet(bufp1, url_loc1, type) != TS_SUCCESS) {
3197
SDK_RPRINT(test, "TSUrlFtpTypeSet", "TestCase1", TC_FAIL, "TSUrlFtpTypeSet Returned TS_ERROR");
3199
if ((type_get = TSUrlFtpTypeGet(bufp1, url_loc1)) == TS_ERROR) {
3200
SDK_RPRINT(test, "TSUrlFtpTypeSet|Get", "TestCase1", TC_FAIL, "TSUrlFtpTypeGet Returned TS_ERROR");
3202
if (type_get == type) {
3203
SDK_RPRINT(test, "TSUrlFtpTypeSet&Get", "TestCase1", TC_PASS, "ok");
3204
test_passed_type = true;
3206
SDK_RPRINT(test, "TSUrlFtpTypeSet&Get", "TestCase1", TC_FAIL, "Values don't match");
3212
if ((TSUrlDestroy(bufp1, url_loc1) == TS_ERROR) &&
3213
(TSUrlDestroy(bufp2, url_loc2) == TS_ERROR) && (TSUrlDestroy(bufp3, url_loc3) == TS_ERROR)
3215
SDK_RPRINT(test, "TSUrlCreate", "TestCase1&2", TC_PASS, "ok");
3216
SDK_RPRINT(test, "TSUrlDestroy", "TestCase1|2|3", TC_FAIL, "Returns TS_ERROR");
3218
SDK_RPRINT(test, "TSUrlCreate", "TestCase1&2", TC_PASS, "ok");
3219
SDK_RPRINT(test, "TSUrlDestroy", "TestCase1&2&3", TC_PASS, "ok");
3220
TSHandleMLocRelease(bufp1, TS_NULL_MLOC, url_loc1);
3221
TSHandleMLocRelease(bufp2, TS_NULL_MLOC, url_loc2);
3222
TSHandleMLocRelease(bufp3, TS_NULL_MLOC, url_loc3);
3223
test_passed_create = true;
3224
test_passed_destroy = true;
3228
TSfree(url_expected_string);
3229
if (url_string_from_1 != TS_ERROR_PTR) {
3230
TSfree(url_string_from_1);
3232
if (url_string_from_2 != TS_ERROR_PTR) {
3233
TSfree(url_string_from_2);
3235
if (url_string_from_3 != TS_ERROR_PTR) {
3236
TSfree(url_string_from_3);
3238
if (bufp1 != TS_ERROR_PTR) {
3239
TSMBufferDestroy(bufp1);
3241
if (bufp2 != TS_ERROR_PTR) {
3242
TSMBufferDestroy(bufp2);
3244
if (bufp3 != TS_ERROR_PTR) {
3245
TSMBufferDestroy(bufp3);
3247
if ((test_passed_create == false) ||
3248
(test_passed_destroy == false) ||
3249
(test_passed_scheme == false) ||
3250
(test_passed_user == false) ||
3251
(test_passed_password == false) ||
3252
(test_passed_host == false) ||
3253
(test_passed_port == false) ||
3254
(test_passed_path == false) ||
3255
(test_passed_params == false) ||
3256
(test_passed_query == false) ||
3257
(test_passed_fragment == false) ||
3258
(test_passed_copy == false) ||
3259
(test_passed_clone == false) ||
3260
(test_passed_string1 == false) ||
3261
(test_passed_string2 == false) ||
3262
(test_passed_print == false) ||
3263
(test_passed_length1 == false) || (test_passed_length2 == false) || (test_passed_type == false)
3265
/*** Debugging the test itself....
3266
(test_passed_create == false)?printf("test_passed_create is false\n"):printf("");
3267
(test_passed_destroy == false)?printf("test_passed_destroy is false\n"):printf("");
3268
(test_passed_scheme == false)?printf("test_passed_scheme is false\n"):printf("");
3269
(test_passed_user == false)?printf("test_passed_user is false\n"):printf("");
3270
(test_passed_password == false)?printf("test_passed_password is false\n"):printf("");
3271
(test_passed_host == false)?printf("test_passed_host is false\n"):printf("");
3272
(test_passed_port == false)?printf("test_passed_port is false\n"):printf("");
3273
(test_passed_path == false)?printf("test_passed_path is false\n"):printf("");
3274
(test_passed_params == false)?printf("test_passed_params is false\n"):printf("");
3275
(test_passed_query == false)?printf("test_passed_query is false\n"):printf("");
3276
(test_passed_fragment == false)?printf("test_passed_fragment is false\n"):printf("");
3277
(test_passed_copy == false)?printf("test_passed_copy is false\n"):printf("");
3278
(test_passed_string1 == false)?printf("test_passed_string1 is false\n"):printf("");
3279
(test_passed_string2 == false)?printf("test_passed_string2 is false\n"):printf("");
3280
(test_passed_length1 == false)?printf("test_passed_length1 is false\n"):printf("");
3281
(test_passed_length2 == false)?printf("test_passed_length2 is false\n"):printf("");
3282
(test_passed_type == false)?printf("test_passed_type is false\n"):printf("");
3284
*pstatus = REGRESSION_TEST_FAILED;
3286
*pstatus = REGRESSION_TEST_PASSED;
3290
//////////////////////////////////////////////
3291
// SDK_API_TSHttpHdr
3293
// Unit Test for API: TSHttpHdrCreate
3297
// TSHttpHdrLengthGet
3298
// TSHttpHdrMethodGet
3299
// TSHttpHdrMethodSet
3301
// TSHttpHdrReasonGet
3302
// TSHttpHdrReasonLookup
3303
// TSHttpHdrReasonSet
3304
// TSHttpHdrStatusGet
3305
// TSHttpHdrStatusSet
3309
//////////////////////////////////////////////
3312
* If you change value of any constant in this function then reflect that change in variable expected_iobuf.
3314
REGRESSION_TEST(SDK_API_TSHttpHdr) (RegressionTest * test, int atype, int *pstatus)
3316
NOWARN_UNUSED(atype);
3317
TSMBuffer bufp1 = (TSMBuffer) TS_ERROR_PTR;
3318
TSMBuffer bufp2 = (TSMBuffer) TS_ERROR_PTR;
3319
TSMBuffer bufp3 = (TSMBuffer) TS_ERROR_PTR;
3320
TSMBuffer bufp4 = (TSMBuffer) TS_ERROR_PTR;
3322
TSMLoc hdr_loc1 = (TSMLoc) TS_ERROR_PTR;
3323
TSMLoc hdr_loc2 = (TSMLoc) TS_ERROR_PTR;
3324
TSMLoc hdr_loc3 = (TSMLoc) TS_ERROR_PTR;
3325
TSMLoc hdr_loc4 = (TSMLoc) TS_ERROR_PTR;
3327
TSHttpType hdr1type;
3328
TSHttpType hdr2type;
3330
const char *methodGet;
3334
const char *url_host = "www.example.com";
3335
int url_port = 2345;
3336
const char *url_path = "abcd/efg/hij.htm";
3338
const char *response_reason = "aefa";
3339
const char *response_reason_get;
3341
TSHttpStatus status_get;
3343
int version_major = 2;
3344
int version_minor = 1;
3347
/* TSHttpType type1; unused: lv */
3348
/* TSHttpType type2; unused: lv */
3349
const char *method1;
3350
const char *method2;
3355
/* int version1; unused: lv */
3356
/* int version2; unused: lv */
3359
const char *expected_iobuf = "GET http://www.example.com:2345/abcd/efg/hij.htm HTTP/2.1\r\n\r\n";
3361
int expected_length;
3362
bool test_passed_Http_Hdr_Create = false;
3363
bool test_passed_Http_Hdr_Type = false;
3364
bool test_passed_Http_Hdr_Method = false;
3365
bool test_passed_Http_Hdr_Url = false;
3366
bool test_passed_Http_Hdr_Status = false;
3367
bool test_passed_Http_Hdr_Reason = false;
3368
bool test_passed_Http_Hdr_Reason_Lookup = false;
3369
bool test_passed_Http_Hdr_Version = false;
3370
bool test_passed_Http_Hdr_Copy = false;
3371
bool test_passed_Http_Hdr_Clone = false;
3372
bool test_passed_Http_Hdr_Length = false;
3373
bool test_passed_Http_Hdr_Print = false;
3374
bool test_passed_Http_Hdr_Destroy = false;
3375
bool try_print_function = true;
3376
bool test_buffer_created = true;
3379
*pstatus = REGRESSION_TEST_INPROGRESS;
3381
if (((bufp1 = TSMBufferCreate()) == TS_ERROR_PTR) ||
3382
((bufp2 = TSMBufferCreate()) == TS_ERROR_PTR) ||
3383
((bufp3 = TSMBufferCreate()) == TS_ERROR_PTR) || ((bufp4 = TSMBufferCreate()) == TS_ERROR_PTR)
3385
SDK_RPRINT(test, "TSHttpHdr", "All Test Cases", TC_FAIL,
3386
"TSMBufferCreate returns TS_ERROR_PTR. Cannot test the functions");
3387
test_buffer_created = true;
3390
if (test_buffer_created == true) {
3391
if (((hdr_loc1 = TSHttpHdrCreate(bufp1)) == TS_ERROR_PTR) ||
3392
((hdr_loc2 = TSHttpHdrCreate(bufp2)) == TS_ERROR_PTR) ||
3393
((hdr_loc3 = TSHttpHdrCreate(bufp3)) == TS_ERROR_PTR)
3395
SDK_RPRINT(test, "TSHttpHdrCreate", "TestCase1|2|3", TC_FAIL, "TSHttpHdrCreate returns TS_ERROR_PTR.");
3397
SDK_RPRINT(test, "TSHttpHdrCreate", "TestCase1&2&3", TC_PASS, "ok");
3398
test_passed_Http_Hdr_Create = true;
3401
SDK_RPRINT(test, "TSHttpHdrCreate", "All Test Cases", TC_FAIL, "Cannot run test as unable to allocate MBuffers");
3406
if (test_passed_Http_Hdr_Create == true) {
3407
if ((TSHttpHdrTypeSet(bufp1, hdr_loc1, TS_HTTP_TYPE_REQUEST) == TS_ERROR) ||
3408
(TSHttpHdrTypeSet(bufp2, hdr_loc2, TS_HTTP_TYPE_RESPONSE) == TS_ERROR)
3410
SDK_RPRINT(test, "TSHttpHdrTypeSet", "TestCase1|2", TC_FAIL, "TSHttpHdrTypeSet returns TS_ERROR");
3412
if (((hdr1type = TSHttpHdrTypeGet(bufp1, hdr_loc1)) == (TSHttpType) TS_ERROR) ||
3413
((hdr2type = TSHttpHdrTypeGet(bufp2, hdr_loc2)) == (TSHttpType) TS_ERROR)
3415
SDK_RPRINT(test, "TSHttpHdrTypeSet&Get", "TestCase1|2", TC_FAIL, "TSHttpHdrTypeGet returns TS_ERROR");
3417
if ((hdr1type == TS_HTTP_TYPE_REQUEST) && (hdr2type == TS_HTTP_TYPE_RESPONSE)) {
3418
SDK_RPRINT(test, "TSHttpHdrTypeSet&Get", "TestCase1&2", TC_PASS, "ok");
3419
test_passed_Http_Hdr_Type = true;
3421
SDK_RPRINT(test, "TSHttpHdrTypeSet&Get", "TestCase1&2", TC_FAIL, "Values mismatch");
3426
SDK_RPRINT(test, "TSHttpHdrTypeSet&Get", "All Test Case", TC_FAIL,
3427
"Cannot run test as Header Creation Test failed");
3431
if (test_passed_Http_Hdr_Type == true) {
3432
if (TSHttpHdrMethodSet(bufp1, hdr_loc1, TS_HTTP_METHOD_GET, -1) == TS_ERROR) {
3433
SDK_RPRINT(test, "TSHttpHdrMethodSet&Get", "TestCase1", TC_FAIL, "TSHttpHdrMethodSet returns TS_ERROR");
3435
if ((methodGet = TSHttpHdrMethodGet(bufp1, hdr_loc1, &length)) == TS_ERROR_PTR) {
3436
SDK_RPRINT(test, "TSHttpHdrMethodSet&Get", "TestCase1", TC_FAIL, "TSHttpHdrMethodGet retuns TS_ERROR_PTR");
3438
if ((strncmp(methodGet, TS_HTTP_METHOD_GET, length) == 0) && (length == (int) strlen(TS_HTTP_METHOD_GET))) {
3439
SDK_RPRINT(test, "TSHttpHdrMethodSet&Get", "TestCase1", TC_PASS, "ok");
3440
test_passed_Http_Hdr_Method = true;
3442
SDK_RPRINT(test, "TSHttpHdrMethodSet&Get", "TestCase1", TC_FAIL, "Value's mismatch");
3447
SDK_RPRINT(test, "TSHttpHdrMethodSet&Get", "All Test Case", TC_FAIL,
3448
"Cannot run test as Header's Type cannot be set");
3452
if (test_passed_Http_Hdr_Type == true) {
3453
if ((url_loc = TSUrlCreate(bufp1)) == TS_ERROR_PTR) {
3454
SDK_RPRINT(test, "TSHttpHdrUrlSet&Get", "TestCase1", TC_FAIL,
3455
"Cannot run test as TSUrlCreate returns TS_ERROR_PTR");
3457
if (TSHttpHdrUrlSet(bufp1, hdr_loc1, url_loc) == TS_ERROR) {
3458
SDK_RPRINT(test, "TSHttpHdrUrlSet&Get", "TestCase1", TC_FAIL, "TSHttpHdrUrlSet returns TS_ERROR");
3460
if ((url_loc_Get = TSHttpHdrUrlGet(bufp1, hdr_loc1)) == TS_ERROR_PTR) {
3461
SDK_RPRINT(test, "TSHttpHdrUrlSet&Get", "TestCase1", TC_FAIL, "TSHttpHdrUrlGet retuns TS_ERROR_PTR");
3463
if (url_loc == url_loc_Get) {
3464
SDK_RPRINT(test, "TSHttpHdrUrlSet&Get", "TestCase1", TC_PASS, "ok");
3465
test_passed_Http_Hdr_Url = true;
3467
SDK_RPRINT(test, "TSHttpHdrUrlSet&Get", "TestCase1", TC_FAIL, "Value's mismatch");
3469
if (TSHandleMLocRelease(bufp1, hdr_loc1, url_loc_Get) == TS_ERROR) {
3470
SDK_RPRINT(test, "TSHandleMLocRelease", "", TC_FAIL, "Unable to release handle to URL");
3475
// Fill up the URL for Copy Test Case.
3476
if (TSUrlSchemeSet(bufp1, url_loc, TS_URL_SCHEME_HTTP, -1) == TS_ERROR) {
3477
SDK_RPRINT(test, "TSUrlSchemeSet", "", TC_FAIL, "Unable to set scheme in URL in the HTTP Header");
3478
try_print_function = false;
3480
if (TSUrlHostSet(bufp1, url_loc, url_host, -1) == TS_ERROR) {
3481
SDK_RPRINT(test, "TSUrlHostSet", "", TC_FAIL, "Unable to set host in URL in the HTTP Header");
3482
try_print_function = false;
3484
if (TSUrlPortSet(bufp1, url_loc, url_port) == TS_ERROR) {
3485
SDK_RPRINT(test, "TSUrlPortSet", "", TC_FAIL, "Unable to set port in URL in the HTTP Header");
3486
try_print_function = false;
3488
if (TSUrlPathSet(bufp1, url_loc, url_path, -1) == TS_ERROR) {
3489
SDK_RPRINT(test, "TSUrlPathSet", "", TC_FAIL, "Unable to set path in URL in the HTTP Header");
3490
try_print_function = false;
3492
if (TSHandleMLocRelease(bufp1, hdr_loc1, url_loc) == TS_ERROR) {
3493
SDK_RPRINT(test, "TSHandleMLocRelease", "", TC_FAIL, "Unable to release handle to URL");
3497
SDK_RPRINT(test, "TSHttpHdrUrlSet&Get", "All Test Case", TC_FAIL,
3498
"Cannot run test as Header's Type cannot be set");
3502
if (test_passed_Http_Hdr_Type == true) {
3503
if (TSHttpHdrReasonSet(bufp2, hdr_loc2, response_reason, -1) == TS_ERROR) {
3504
SDK_RPRINT(test, "TSHttpHdrReasonSet&Get", "TestCase1", TC_FAIL, "TSHttpHdrReasonSet returns TS_ERROR");
3506
if ((response_reason_get = TSHttpHdrReasonGet(bufp2, hdr_loc2, &length)) == TS_ERROR_PTR) {
3507
SDK_RPRINT(test, "TSHttpHdrReasonSet&Get", "TestCase1", TC_FAIL, "TSHttpHdrReasonGet returns TS_ERROR_PTR");
3509
if ((strncmp(response_reason_get, response_reason, length) == 0) && (length == (int) strlen(response_reason))) {
3510
SDK_RPRINT(test, "TSHttpHdrReasonSet&Get", "TestCase1", TC_PASS, "ok");
3511
test_passed_Http_Hdr_Reason = true;
3513
SDK_RPRINT(test, "TSHttpHdrReasonSet&Get", "TestCase1", TC_FAIL, "Value's mismatch");
3518
SDK_RPRINT(test, "TSHttpHdrReasonSet&Get", "All Test Case", TC_FAIL,
3519
"Cannot run test as Header's Type cannot be set");
3523
if (test_passed_Http_Hdr_Type == true) {
3524
if (TSHttpHdrStatusSet(bufp2, hdr_loc2, TS_HTTP_STATUS_OK) == TS_ERROR) {
3525
SDK_RPRINT(test, "TSHttpHdrStatusSet&Get", "TestCase1", TC_FAIL, "TSHttpHdrStatusSet returns TS_ERROR");
3527
if ((status_get = TSHttpHdrStatusGet(bufp2, hdr_loc2)) == (TSHttpStatus) TS_ERROR) {
3528
SDK_RPRINT(test, "TSHttpHdrStatusSet&Get", "TestCase1", TC_FAIL, "TSHttpHdrStatusGet returns TS_ERROR");
3530
if (status_get == TS_HTTP_STATUS_OK) {
3531
SDK_RPRINT(test, "TSHttpHdrStatusSet&Get", "TestCase1", TC_PASS, "ok");
3532
test_passed_Http_Hdr_Status = true;
3534
SDK_RPRINT(test, "TSHttpHdrStatusSet&Get", "TestCase1", TC_FAIL, "Value's mismatch");
3539
SDK_RPRINT(test, "TSHttpHdrStatusSet&Get", "All Test Case", TC_FAIL,
3540
"Cannot run test as Header's Type cannot be set");
3544
if (test_passed_Http_Hdr_Type == true) {
3545
if (TSHttpHdrVersionSet(bufp1, hdr_loc1, TS_HTTP_VERSION(version_major, version_minor)) == TS_ERROR) {
3546
SDK_RPRINT(test, "TSHttpHdrVersionSet&Get", "TestCase1", TC_FAIL, "TSHttpHdrVersionSet returns TS_ERROR");
3548
if ((version_get = TSHttpHdrVersionGet(bufp1, hdr_loc1)) == TS_ERROR) {
3549
SDK_RPRINT(test, "TSHttpHdrVersionSet&Get", "TestCase1", TC_FAIL, "TSHttpHdrVersionGet returns TS_ERROR");
3551
if ((version_major == TS_HTTP_MAJOR(version_get)) && (version_minor == TS_HTTP_MINOR(version_get))) {
3552
SDK_RPRINT(test, "TSHttpHdrVersionSet&Get", "TestCase1", TC_PASS, "ok");
3553
test_passed_Http_Hdr_Version = true;
3555
SDK_RPRINT(test, "TSHttpHdrVersionSet&Get", "TestCase1", TC_FAIL, "Value's mismatch");
3560
SDK_RPRINT(test, "TSHttpHdrVersionSet&Get", "All Test Case", TC_FAIL,
3561
"Cannot run test as Header's Type cannot be set");
3564
if (test_passed_Http_Hdr_Version == true) {
3565
if (TSHttpHdrVersionSet(bufp2, hdr_loc2, TS_HTTP_VERSION(version_major, version_minor)) == TS_ERROR) {
3566
SDK_RPRINT(test, "TSHttpHdrVersionSet&Get", "TestCase2", TC_FAIL, "TSHttpHdrVersionSet returns TS_ERROR");
3567
test_passed_Http_Hdr_Version = false;
3569
if ((version_get = TSHttpHdrVersionGet(bufp2, hdr_loc2)) == TS_ERROR) {
3570
SDK_RPRINT(test, "TSHttpHdrVersionSet&Get", "TestCase2", TC_FAIL, "TSHttpHdrVersionGet returns TS_ERROR");
3571
test_passed_Http_Hdr_Version = false;
3573
if ((version_major == TS_HTTP_MAJOR(version_get)) && (version_minor == TS_HTTP_MINOR(version_get))) {
3574
SDK_RPRINT(test, "TSHttpHdrVersionSet&Get", "TestCase2", TC_PASS, "ok");
3576
SDK_RPRINT(test, "TSHttpHdrVersionSet&Get", "TestCase2", TC_FAIL, "Value's mismatch");
3577
test_passed_Http_Hdr_Version = false;
3583
if (strcmp("None", TSHttpHdrReasonLookup(TS_HTTP_STATUS_NONE)) != 0) {
3584
SDK_RPRINT(test, "TSHttpHdrReasonLookup", "TestCase1", TC_FAIL,
3585
"TSHttpHdrReasonLookup returns TS_ERROR_PTR or Value's mismatch");
3587
SDK_RPRINT(test, "TSHttpHdrReasonLookup", "TestCase1", TC_PASS, "ok");
3588
test_passed_Http_Hdr_Reason_Lookup = true;
3591
if (strcmp("Ok", TSHttpHdrReasonLookup(TS_HTTP_STATUS_OK)) != 0) {
3592
SDK_RPRINT(test, "TSHttpHdrReasonLookup", "TestCase2", TC_FAIL,
3593
"TSHttpHdrReasonLookup returns TS_ERROR_PTR or Value's mismatch");
3594
if (test_passed_Http_Hdr_Reason_Lookup == true) {
3595
test_passed_Http_Hdr_Reason_Lookup = false;
3598
SDK_RPRINT(test, "TSHttpHdrReasonLookup", "TestCase2", TC_PASS, "ok");
3601
if (strcmp("Continue", TSHttpHdrReasonLookup(TS_HTTP_STATUS_CONTINUE)) != 0) {
3602
SDK_RPRINT(test, "TSHttpHdrReasonLookup", "TestCase3", TC_FAIL,
3603
"TSHttpHdrReasonLookup returns TS_ERROR_PTR or Value's mismatch");
3604
if (test_passed_Http_Hdr_Reason_Lookup == true) {
3605
test_passed_Http_Hdr_Reason_Lookup = false;
3608
SDK_RPRINT(test, "TSHttpHdrReasonLookup", "TestCase3", TC_PASS, "ok");
3611
if (strcmp("Not Modified", TSHttpHdrReasonLookup(TS_HTTP_STATUS_NOT_MODIFIED)) != 0) {
3612
SDK_RPRINT(test, "TSHttpHdrReasonLookup", "TestCase2", TC_FAIL,
3613
"TSHttpHdrReasonLookup returns TS_ERROR_PTR or Value's mismatch");
3614
if (test_passed_Http_Hdr_Reason_Lookup == true) {
3615
test_passed_Http_Hdr_Reason_Lookup = false;
3618
SDK_RPRINT(test, "TSHttpHdrReasonLookup", "TestCase4", TC_PASS, "ok");
3622
if (test_passed_Http_Hdr_Create == true) {
3623
if (TSHttpHdrCopy(bufp3, hdr_loc3, bufp1, hdr_loc1) == TS_ERROR) {
3624
SDK_RPRINT(test, "TSHttpHdrCopy", "TestCase1", TC_FAIL, "TSHttpHdrCopy returns TS_ERROR");
3633
if (((type1 = TSHttpHdrTypeGet(bufp1, hdr_loc1)) == (TSHttpType) TS_ERROR) ||
3634
((type2 = TSHttpHdrTypeGet(bufp3, hdr_loc3)) == (TSHttpType) TS_ERROR)
3636
SDK_RPRINT(test, "TSHttpHdrCopy", "TestCase1", TC_FAIL, "TSHttpTypeGet returns TS_ERROR.");
3639
if (type1 != type2) {
3640
SDK_RPRINT(test, "TSHttpHdrCopy", "TestCase1", TC_FAIL, "Type mismatch in both headers");
3645
// Check the Version
3650
if (((version1 = TSHttpHdrVersionGet(bufp1, hdr_loc1)) == TS_ERROR) ||
3651
((version2 = TSHttpHdrVersionGet(bufp3, hdr_loc3)) == TS_ERROR)
3653
SDK_RPRINT(test, "TSHttpHdrCopy", "TestCase1", TC_FAIL, "TSHttpVersionGet returns TS_ERROR");
3656
if (version1 != version2) {
3657
SDK_RPRINT(test, "TSHttpHdrCopy", "TestCase1", TC_FAIL, "Version mismatch in both headers");
3665
if (((method1 = TSHttpHdrMethodGet(bufp1, hdr_loc1, &length1)) == TS_ERROR_PTR) ||
3666
((method2 = TSHttpHdrMethodGet(bufp3, hdr_loc3, &length2)) == TS_ERROR_PTR)
3668
SDK_RPRINT(test, "TSHttpHdrCopy", "TestCase1", TC_FAIL, "TSHttpVersionGet returns TS_ERROR");
3671
if ((length1 != length2) || (strncmp(method1, method2, length1) != 0)) {
3672
SDK_RPRINT(test, "TSHttpHdrCopy", "TestCase1", TC_FAIL, "Method mismatch in both headers");
3680
if (((url_loc1 = TSHttpHdrUrlGet(bufp1, hdr_loc1)) == TS_ERROR_PTR) ||
3681
((url_loc2 = TSHttpHdrUrlGet(bufp3, hdr_loc3)) == TS_ERROR_PTR)
3683
SDK_RPRINT(test, "TSHttpHdrCopy", "TestCase1", TC_FAIL, "TSHttpVersionGet returns TS_ERROR");
3686
const char *scheme1;
3687
const char *scheme2;
3699
if (((scheme1 = TSUrlSchemeGet(bufp1, url_loc1, &length1)) == TS_ERROR_PTR) ||
3700
((scheme2 = TSUrlSchemeGet(bufp3, url_loc2, &length2)) == TS_ERROR_PTR)
3702
SDK_RPRINT(test, "TSHttpHdrCopy", "TestCase1", TC_FAIL, "TSUrlSchemeGet returns TS_ERROR_PTR");
3705
if ((length1 != length2) || (strncmp(scheme1, scheme2, length1) != 0)) {
3706
SDK_RPRINT(test, "TSHttpHdrCopy", "TestCase1", TC_FAIL,
3707
"Url Scheme has different values in both headers");
3714
if (((host1 = TSUrlHostGet(bufp1, url_loc1, &length1)) == TS_ERROR_PTR) ||
3715
((host2 = TSUrlHostGet(bufp3, url_loc2, &length2)) == TS_ERROR_PTR)
3717
SDK_RPRINT(test, "TSHttpHdrCopy", "TestCase1", TC_FAIL, "TSUrlHostGet returns TS_ERROR_PTR");
3720
if ((length1 != length2) || (strncmp(host1, host2, length1) != 0)) {
3721
SDK_RPRINT(test, "TSHttpHdrCopy", "TestCase1", TC_FAIL,
3722
"Url Host has different values in both headers");
3729
if (((port1 = TSUrlPortGet(bufp1, url_loc1)) == TS_ERROR) ||
3730
((port2 = TSUrlPortGet(bufp3, url_loc2)) == TS_ERROR)
3732
SDK_RPRINT(test, "TSHttpHdrCopy", "TestCase1", TC_FAIL, "TSUrlPortGet returns TS_ERROR");
3735
if (port1 != port2) {
3736
SDK_RPRINT(test, "TSHttpHdrCopy", "TestCase1", TC_FAIL,
3737
"Url Port has different values in both headers");
3744
if (((path1 = TSUrlPathGet(bufp1, url_loc1, &length1)) == TS_ERROR_PTR) ||
3745
((path2 = TSUrlPathGet(bufp3, url_loc2, &length2)) == TS_ERROR_PTR)
3747
SDK_RPRINT(test, "TSHttpHdrCopy", "TestCase1", TC_FAIL, "TSUrlPathGet returns TS_ERROR_PTR");
3750
if ((path1 != NULL) && (path2 != NULL)) {
3751
if ((length1 != length2) || (strncmp(path1, path2, length1) != 0)) {
3752
SDK_RPRINT(test, "TSHttpHdrCopy", "TestCase1", TC_FAIL,
3753
"Url Path has different values in both headers");
3757
if (path1 != path2) {
3758
SDK_RPRINT(test, "TSHttpHdrCopy", "TestCase1", TC_FAIL,
3759
"Url Host has different values in both headers");
3764
if ((TSHandleMLocRelease(bufp1, hdr_loc1, url_loc1) == TS_ERROR) ||
3765
(TSHandleMLocRelease(bufp3, hdr_loc3, url_loc2) == TS_ERROR)
3767
SDK_RPRINT(test, "TSHandleMLocRelease", "", TC_FAIL,
3768
"Unable to release Handle acquired by TSHttpHdrUrlGet");
3773
SDK_RPRINT(test, "TSHttpHdrCopy", "TestCase1", TC_PASS, "ok");
3774
test_passed_Http_Hdr_Copy = true;
3780
SDK_RPRINT(test, "TSHttpHdrCopy", "All Test Cases", TC_PASS, "Cannot run test as TSHttpHdrCreate has failed");
3784
if (test_passed_Http_Hdr_Create == true) {
3785
if ((hdr_loc4 = TSHttpHdrClone(bufp4, bufp1, hdr_loc1)) == TS_ERROR_PTR) {
3786
SDK_RPRINT(test, "TSHttpHdrClone", "TestCase1", TC_FAIL, "TSHttpHdrClone returns TS_ERROR_PTR");
3795
if (((type1 = TSHttpHdrTypeGet(bufp1, hdr_loc1)) == (TSHttpType) TS_ERROR) ||
3796
((type2 = TSHttpHdrTypeGet(bufp4, hdr_loc4)) == (TSHttpType) TS_ERROR)
3798
SDK_RPRINT(test, "TSHttpHdrClone", "TestCase1", TC_FAIL, "TSHttpTypeGet returns TS_ERROR.");
3801
if (type1 != type2) {
3802
SDK_RPRINT(test, "TSHttpHdrClone", "TestCase1", TC_FAIL, "Type mismatch in both headers");
3807
// Check the Version
3812
if (((version1 = TSHttpHdrVersionGet(bufp1, hdr_loc1)) == TS_ERROR) ||
3813
((version2 = TSHttpHdrVersionGet(bufp4, hdr_loc4)) == TS_ERROR)
3815
SDK_RPRINT(test, "TSHttpHdrClone", "TestCase1", TC_FAIL, "TSHttpVersionGet returns TS_ERROR");
3818
if (version1 != version2) {
3819
SDK_RPRINT(test, "TSHttpHdrClone", "TestCase1", TC_FAIL, "Version mismatch in both headers");
3827
if (((method1 = TSHttpHdrMethodGet(bufp1, hdr_loc1, &length1)) == TS_ERROR_PTR) ||
3828
((method2 = TSHttpHdrMethodGet(bufp4, hdr_loc4, &length2)) == TS_ERROR_PTR)
3830
SDK_RPRINT(test, "TSHttpHdrClone", "TestCase1", TC_FAIL, "TSHttpVersionGet returns TS_ERROR");
3833
if ((length1 != length2) || (strncmp(method1, method2, length1) != 0)) {
3834
SDK_RPRINT(test, "TSHttpHdrClone", "TestCase1", TC_FAIL, "Method mismatch in both headers");
3842
if (((url_loc1 = TSHttpHdrUrlGet(bufp1, hdr_loc1)) == TS_ERROR_PTR) ||
3843
((url_loc2 = TSHttpHdrUrlGet(bufp4, hdr_loc4)) == TS_ERROR_PTR)
3845
SDK_RPRINT(test, "TSHttpHdrClone", "TestCase1", TC_FAIL, "TSHttpVersionGet returns TS_ERROR");
3848
const char *scheme1;
3849
const char *scheme2;
3861
if (((scheme1 = TSUrlSchemeGet(bufp1, url_loc1, &length1)) == TS_ERROR_PTR) ||
3862
((scheme2 = TSUrlSchemeGet(bufp4, url_loc2, &length2)) == TS_ERROR_PTR)
3864
SDK_RPRINT(test, "TSHttpHdrClone", "TestCase1", TC_FAIL, "TSUrlSchemeGet returns TS_ERROR_PTR");
3867
if ((length1 != length2) || (strncmp(scheme1, scheme2, length1) != 0)) {
3868
SDK_RPRINT(test, "TSHttpHdrClone", "TestCase1", TC_FAIL,
3869
"Url Scheme has different values in both headers");
3877
if (((host1 = TSUrlHostGet(bufp1, url_loc1, &length1)) == TS_ERROR_PTR) ||
3878
((host2 = TSUrlHostGet(bufp4, url_loc2, &length2)) == TS_ERROR_PTR)
3880
SDK_RPRINT(test, "TSHttpHdrClone", "TestCase1", TC_FAIL, "TSUrlHostGet returns TS_ERROR_PTR");
3883
if ((length1 != length2) || (strncmp(host1, host2, length1) != 0)) {
3884
SDK_RPRINT(test, "TSHttpHdrClone", "TestCase1", TC_FAIL,
3885
"Url Host has different values in both headers");
3892
if (((port1 = TSUrlPortGet(bufp1, url_loc1)) == TS_ERROR) ||
3893
((port2 = TSUrlPortGet(bufp4, url_loc2)) == TS_ERROR)
3895
SDK_RPRINT(test, "TSHttpHdrClone", "TestCase1", TC_FAIL, "TSUrlPortGet returns TS_ERROR");
3898
if (port1 != port2) {
3899
SDK_RPRINT(test, "TSHttpHdrClone", "TestCase1", TC_FAIL,
3900
"Url Port has different values in both headers");
3907
if (((path1 = TSUrlPathGet(bufp1, url_loc1, &length1)) == TS_ERROR_PTR) ||
3908
((path2 = TSUrlPathGet(bufp4, url_loc2, &length2)) == TS_ERROR_PTR)
3910
SDK_RPRINT(test, "TSHttpHdrClone", "TestCase1", TC_FAIL, "TSUrlPathGet returns TS_ERROR_PTR");
3913
if ((path1 != NULL) && (path2 != NULL)) {
3914
if ((length1 != length2) || (strncmp(path1, path2, length1) != 0)) {
3915
SDK_RPRINT(test, "TSHttpHdrCopy", "TestCase1", TC_FAIL,
3916
"Url Path has different values in both headers");
3920
if (path1 != path2) {
3921
SDK_RPRINT(test, "TSHttpHdrCopy", "TestCase1", TC_FAIL,
3922
"Url Host has different values in both headers");
3927
if ((TSHandleMLocRelease(bufp1, hdr_loc1, url_loc1) == TS_ERROR) ||
3928
(TSHandleMLocRelease(bufp4, hdr_loc4, url_loc2) == TS_ERROR)
3930
SDK_RPRINT(test, "TSHandleMLocRelease", "", TC_FAIL,
3931
"Unable to release Handle acquired by TSHttpHdrUrlGet");
3936
SDK_RPRINT(test, "TSHttpHdrClone", "TestCase1", TC_PASS, "ok");
3937
test_passed_Http_Hdr_Clone = true;
3943
SDK_RPRINT(test, "TSHttpHdrClone", "All Test Cases", TC_PASS, "Cannot run test as TSHttpHdrCreate has failed");
3948
if (test_passed_Http_Hdr_Create == true) {
3949
if ((actual_length = TSHttpHdrLengthGet(bufp1, hdr_loc1)) == TS_ERROR) {
3950
SDK_RPRINT(test, "TSHttpHdrLengthGet", "TestCase1", TC_FAIL, "TSHttpHdrLengthGet returns TS_ERROR");
3954
if ((iobuf = TSIOBufferCreate()) == TS_ERROR_PTR) {
3955
SDK_RPRINT(test, "TSHttpHdrLengthGet", "TestCase1", TC_FAIL,
3956
"Cannot create iobuffer. Cannot continue with test");
3958
if (TSHttpHdrPrint(bufp1, hdr_loc1, iobuf) == TS_ERROR) {
3959
SDK_RPRINT(test, "TSHttpHdrLengthGet", "TestCase1", TC_FAIL, "TSHttpHdrPrint returned TS_ERROR");
3961
TSIOBufferReader iobufreader;
3962
if ((iobufreader = TSIOBufferReaderAlloc(iobuf)) == TS_ERROR_PTR) {
3963
SDK_RPRINT(test, "TSHttpHdrLengthGet", "TestCase1", TC_FAIL, "Cannot allocate a reader to io buffer");
3965
if ((expected_length = TSIOBufferReaderAvail(iobufreader)) == TS_ERROR) {
3966
SDK_RPRINT(test, "TSHttpHdrLengthGet", "TestCase1", TC_FAIL,
3967
"Cannot calculate the length to be expected.");
3969
if (actual_length == expected_length) {
3970
SDK_RPRINT(test, "TSHttpHdrLengthGet", "TestCase1", TC_PASS, "ok");
3971
test_passed_Http_Hdr_Length = true;
3973
SDK_RPRINT(test, "TSHttpHdrLengthGet", "TestCase1", TC_FAIL, "Incorrect value returned.");
3979
if ((test_passed_Http_Hdr_Method == true) && (test_passed_Http_Hdr_Url == true) &&
3980
(test_passed_Http_Hdr_Version == true) && (test_passed_Http_Hdr_Length == true) &&
3981
(try_print_function == true)
3983
char *actual_iobuf = NULL;
3985
actual_iobuf = (char *) TSmalloc((actual_length + 1) * sizeof(char));
3987
if (actual_iobuf == NULL) {
3988
SDK_RPRINT(test, "TSHttpHdrPrint", "TestCase1", TC_FAIL, "Unable to allocate memory");
3991
TSIOBufferBlock iobufblock;
3994
memset(actual_iobuf, 0, (actual_length + 1) * sizeof(char));
3997
iobufblock = TSIOBufferReaderStart(iobufreader);
3999
while ((iobufblock != NULL) && (iobufblock != TS_ERROR_PTR)) {
4000
const char *block_start;
4002
block_start = TSIOBufferBlockReadStart(iobufblock, iobufreader, &block_size);
4004
if ((block_start == TS_ERROR_PTR) || (block_size == 0) || (block_size == TS_ERROR)) {
4008
memcpy(actual_iobuf + bytes_read, block_start, block_size);
4009
bytes_read += block_size;
4012
if (TSIOBufferReaderConsume(iobufreader,block_size)==TS_ERROR) {
4016
TSIOBufferReaderConsume(iobufreader, block_size);
4017
iobufblock = TSIOBufferReaderStart(iobufreader);
4019
if (strcmp(actual_iobuf, expected_iobuf) == 0) {
4020
SDK_RPRINT(test, "TSHttpHdrPrint", "TestCase1", TC_PASS, "ok");
4021
test_passed_Http_Hdr_Print = true;
4023
SDK_RPRINT(test, "TSHttpHdrPrint", "TestCase1", TC_FAIL, "Value's mismatch");
4026
TSfree(actual_iobuf);
4028
if ((TSIOBufferReaderFree(iobufreader)==TS_ERROR) ||
4029
(TSIOBufferDestroy(iobuf)==TS_ERROR)
4031
SDK_RPRINT(test,"TSIOBuffer","",TC_FAIL,"Unable to free memory");
4034
TSIOBufferReaderFree(iobufreader);
4035
TSIOBufferDestroy(iobuf);
4038
SDK_RPRINT(test, "TSHttpHdrPrint", "TestCase1", TC_FAIL, "Unable to run test for TSHttpHdrPrint");
4045
SDK_RPRINT(test, "TSHttpHdrLengthGet", "All Test Cases", TC_PASS,
4046
"Cannot run test as TSHttpHdrCreate has failed");
4050
if (test_passed_Http_Hdr_Create == true) {
4051
if ((TSHttpHdrDestroy(bufp1, hdr_loc1) == TS_ERROR) ||
4052
(TSHttpHdrDestroy(bufp2, hdr_loc2) == TS_ERROR) ||
4053
(TSHttpHdrDestroy(bufp3, hdr_loc3) == TS_ERROR) || (TSHttpHdrDestroy(bufp4, hdr_loc4) == TS_ERROR)
4055
SDK_RPRINT(test, "TSHttpHdrDestroy", "TestCase1|2|3|4", TC_FAIL, "TSHttpHdrDestroy returns TS_ERROR.");
4057
if ((TSHandleMLocRelease(bufp1, TS_NULL_MLOC, hdr_loc1) == TS_ERROR) ||
4058
(TSHandleMLocRelease(bufp2, TS_NULL_MLOC, hdr_loc2) == TS_ERROR) ||
4059
(TSHandleMLocRelease(bufp3, TS_NULL_MLOC, hdr_loc3) == TS_ERROR) ||
4060
(TSHandleMLocRelease(bufp4, TS_NULL_MLOC, hdr_loc4) == TS_ERROR)
4062
SDK_RPRINT(test, "TSHandleMLocRelease", "TestCase1|2|3|4", TC_FAIL, "Unable to release the handle to headers");
4064
SDK_RPRINT(test, "TSHttpHdrDestroy", "TestCase1&2&3&4", TC_PASS, "ok");
4065
test_passed_Http_Hdr_Destroy = true;
4068
SDK_RPRINT(test, "TSHttpHdrDestroy", "All Test Cases", TC_FAIL, "Cannot run test as header was not created");
4071
if (bufp1 != TS_ERROR_PTR) {
4072
if (TSMBufferDestroy(bufp1) == TS_ERROR) {
4073
SDK_RPRINT(test, "TSMBufferDestroy", "TestCase1", TC_FAIL, "Unable to destroy MBuffer");
4077
if (bufp2 != TS_ERROR_PTR) {
4078
if (TSMBufferDestroy(bufp2) == TS_ERROR) {
4079
SDK_RPRINT(test, "TSMBufferDestroy", "TestCase2", TC_FAIL, "Unable to destroy MBuffer");
4083
if (bufp3 != TS_ERROR_PTR) {
4084
if (TSMBufferDestroy(bufp3) == TS_ERROR) {
4085
SDK_RPRINT(test, "TSMBufferDestroy", "TestCase3", TC_FAIL, "Unable to destroy MBuffer");
4089
if (bufp4 != TS_ERROR_PTR) {
4090
if (TSMBufferDestroy(bufp4) == TS_ERROR) {
4091
SDK_RPRINT(test, "TSMBufferDestroy", "TestCase4", TC_FAIL, "Unable to destroy MBuffer");
4095
if ((test_passed_Http_Hdr_Create == true) &&
4096
(test_passed_Http_Hdr_Type == true) &&
4097
(test_passed_Http_Hdr_Method == true) &&
4098
(test_passed_Http_Hdr_Url == true) &&
4099
(test_passed_Http_Hdr_Status == true) &&
4100
(test_passed_Http_Hdr_Reason == true) &&
4101
(test_passed_Http_Hdr_Reason_Lookup == true) &&
4102
(test_passed_Http_Hdr_Version == true) &&
4103
(test_passed_Http_Hdr_Copy == true) &&
4104
(test_passed_Http_Hdr_Clone == true) &&
4105
(test_passed_Http_Hdr_Length == true) &&
4106
(test_passed_Http_Hdr_Print == true) && (test_passed_Http_Hdr_Destroy == true)
4108
*pstatus = REGRESSION_TEST_PASSED;
4110
*pstatus = REGRESSION_TEST_FAILED;
4118
//////////////////////////////////////////////
4119
// SDK_API_TSMimeHdrField
4121
// Unit Test for API: TSMBufferCreate
4125
// TSMimeHdrFieldCreate
4126
// TSMimeHdrFieldDestroy
4127
// TSMimeHdrFieldFind
4128
// TSMimeHdrFieldGet
4129
// TSMimeHdrFieldAppend
4130
// TSMimeHdrFieldNameGet
4131
// TSMimeHdrFieldNameSet
4132
// TSMimeHdrFieldNext
4133
// TSMimeHdrFieldsClear
4134
// TSMimeHdrFieldsCount
4135
// TSMimeHdrFieldValueAppend
4136
// TSMimeHdrFieldValueDelete
4137
// TSMimeHdrFieldValueStringGet
4138
// TSMimeHdrFieldValueDateGet
4139
// TSMimeHdrFieldValueIntGet
4140
// TSMimeHdrFieldValueUintGet
4141
// TSMimeHdrFieldValueStringInsert
4142
// TSMimeHdrFieldValueDateInsert
4143
// TSMimeHdrFieldValueIntInsert
4144
// TSMimeHdrFieldValueUintInsert
4145
// TSMimeHdrFieldValuesClear
4146
// TSMimeHdrFieldValuesCount
4147
// TSMimeHdrFieldValueStringSet
4148
// TSMimeHdrFieldValueDateSet
4149
// TSMimeHdrFieldValueIntSet
4150
// TSMimeHdrFieldValueUintSet
4151
// TSMimeHdrLengthGet
4153
//////////////////////////////////////////////
4156
compare_field_names(RegressionTest * test, TSMBuffer bufp1, TSMLoc mime_loc1, TSMLoc field_loc1, TSMBuffer bufp2,
4157
TSMLoc mime_loc2, TSMLoc field_loc2)
4159
NOWARN_UNUSED(test);
4165
if ((name1 = TSMimeHdrFieldNameGet(bufp1, mime_loc1, field_loc1, &length1)) == TS_ERROR_PTR) {
4169
if ((name2 = TSMimeHdrFieldNameGet(bufp2, mime_loc2, field_loc2, &length2)) == TS_ERROR_PTR) {
4173
if ((length1 == length2) && (strncmp(name1, name2, length1) == 0) ) {
4180
REGRESSION_TEST(SDK_API_TSMimeHdrField) (RegressionTest * test, int atype, int *pstatus)
4182
NOWARN_UNUSED(atype);
4183
TSMBuffer bufp1 = (TSMBuffer) TS_ERROR_PTR;
4185
TSMLoc mime_loc1 = (TSMLoc) TS_ERROR_PTR;
4187
TSMLoc field_loc11 = (TSMLoc) TS_ERROR_PTR;
4188
TSMLoc field_loc12 = (TSMLoc) TS_ERROR_PTR;
4189
TSMLoc field_loc13 = (TSMLoc) TS_ERROR_PTR;
4190
TSMLoc field_loc14 = (TSMLoc) TS_ERROR_PTR;
4191
TSMLoc field_loc15 = (TSMLoc) TS_ERROR_PTR;
4194
const char *field1Name = "field1";
4195
const char *field2Name = "field2";
4196
const char *field3Name = "field3";
4197
const char *field4Name = "field4";
4198
const char *field5Name = "field5";
4200
const char *field1NameGet;
4201
const char *field2NameGet;
4202
const char *field3NameGet;
4203
const char *field4NameGet;
4204
const char *field5NameGet;
4206
int field1NameGetLength;
4207
int field2NameGetLength;
4208
int field3NameGetLength;
4209
int field4NameGetLength;
4210
int field5NameGetLength;
4216
/* int field5_length; unused: lv */
4218
TSMLoc test_field_loc11 = (TSMLoc) TS_ERROR_PTR;
4219
TSMLoc test_field_loc12 = (TSMLoc) TS_ERROR_PTR;
4220
TSMLoc test_field_loc13 = (TSMLoc) TS_ERROR_PTR;
4221
TSMLoc test_field_loc14 = (TSMLoc) TS_ERROR_PTR;
4222
TSMLoc test_field_loc15 = (TSMLoc) TS_ERROR_PTR;
4224
int actualNumberOfFields;
4227
const char *field1Value1 = "field1Value1";
4228
const char *field1Value2 = "field1Value2";
4229
const char *field1Value3 = "field1Value3";
4230
const char *field1Value4 = "field1Value4";
4231
const char *field1Value5 = "field1Value5";
4232
const char *field1ValueNew = "newfieldValue";
4234
const char *field1Value1Get;
4235
const char *field1Value2Get;
4236
const char *field1Value3Get;
4237
const char *field1Value4Get;
4238
const char *field1Value5Get;
4239
const char *field1ValueNewGet;
4241
int lengthField1Value1;
4242
int lengthField1Value2;
4243
int lengthField1Value3;
4244
int lengthField1Value4;
4245
int lengthField1Value5;
4246
int lengthField1ValueNew;
4248
time_t field2Value1 = time(NULL);
4249
time_t field2Value1Get;
4250
time_t field2ValueNew;
4251
time_t field2ValueNewGet;
4253
int field3Value1 = 31;
4254
int field3Value2 = 32;
4255
int field3Value3 = 33;
4256
int field3Value4 = 34;
4257
int field3Value5 = 35;
4258
int field3ValueNew = 30;
4260
int field3Value1Get;
4261
int field3Value2Get;
4262
int field3Value3Get;
4263
int field3Value4Get;
4264
int field3Value5Get;
4265
int field3ValueNewGet;
4267
unsigned int field4Value1 = 41;
4268
unsigned int field4Value2 = 42;
4269
unsigned int field4Value3 = 43;
4270
unsigned int field4Value4 = 44;
4271
unsigned int field4Value5 = 45;
4272
unsigned int field4ValueNew = 40;
4274
unsigned int field4Value1Get;
4275
unsigned int field4Value2Get;
4276
unsigned int field4Value3Get;
4277
unsigned int field4Value4Get;
4278
unsigned int field4Value5Get;
4279
unsigned int field4ValueNewGet;
4281
const char *field5Value1 = "field5Value1";
4282
const char *field5Value1Append = "AppendedValue";
4283
const char *fieldValueAppendGet;
4284
int lengthFieldValueAppended;
4285
int field5Value2 = 52;
4286
const char *field5Value3 = "DeleteValue";
4287
const char *fieldValueDeleteGet;
4288
int lengthFieldValueDeleteGet;
4289
unsigned int field5Value4 = 54;
4290
int numberOfValueInField;
4294
bool test_passed_MBuffer_Create = false;
4295
bool test_passed_Mime_Hdr_Create = false;
4296
bool test_passed_Mime_Hdr_Field_Create = false;
4297
bool test_passed_Mime_Hdr_Field_Name = false;
4298
bool test_passed_Mime_Hdr_Field_Append = false;
4299
bool test_passed_Mime_Hdr_Field_Get = false;
4300
bool test_passed_Mime_Hdr_Field_Next = false;
4301
bool test_passed_Mime_Hdr_Fields_Count = false;
4302
bool test_passed_Mime_Hdr_Field_Value_String_Insert = false;
4303
bool test_passed_Mime_Hdr_Field_Value_String_Get = false;
4304
bool test_passed_Mime_Hdr_Field_Value_String_Set = false;
4305
bool test_passed_Mime_Hdr_Field_Value_Date_Insert = false;
4306
bool test_passed_Mime_Hdr_Field_Value_Date_Get = false;
4307
bool test_passed_Mime_Hdr_Field_Value_Date_Set = false;
4308
bool test_passed_Mime_Hdr_Field_Value_Int_Insert = false;
4309
bool test_passed_Mime_Hdr_Field_Value_Int_Get = false;
4310
bool test_passed_Mime_Hdr_Field_Value_Int_Set = false;
4311
bool test_passed_Mime_Hdr_Field_Value_Uint_Insert = false;
4312
bool test_passed_Mime_Hdr_Field_Value_Uint_Get = false;
4313
bool test_passed_Mime_Hdr_Field_Value_Uint_Set = false;
4314
bool test_passed_Mime_Hdr_Field_Value_Append = false;
4315
bool test_passed_Mime_Hdr_Field_Value_Delete = false;
4316
bool test_passed_Mime_Hdr_Field_Values_Clear = false;
4317
bool test_passed_Mime_Hdr_Field_Values_Count = false;
4318
bool test_passed_Mime_Hdr_Field_Destroy = false;
4319
bool test_passed_Mime_Hdr_Fields_Clear = false;
4320
bool test_passed_Mime_Hdr_Destroy = false;
4321
bool test_passed_MBuffer_Destroy = false;
4322
bool test_passed_Mime_Hdr_Field_Length_Get = false;
4324
*pstatus = REGRESSION_TEST_INPROGRESS;
4327
if ((bufp1 = TSMBufferCreate()) == TS_ERROR_PTR) {
4328
// Cannot proceed with tests.
4329
SDK_RPRINT(test, "TSMBufferCreate", "TestCase1", TC_FAIL, "TSMBufferCreate Returns TS_ERROR_PTR");
4331
SDK_RPRINT(test, "TSMBufferCreate", "TestCase1", TC_PASS, "ok");
4332
test_passed_MBuffer_Create = true;
4336
if (test_passed_MBuffer_Create == true) {
4337
if ((mime_loc1 = TSMimeHdrCreate(bufp1)) == TS_ERROR_PTR) {
4338
SDK_RPRINT(test, "TSMimeHdrCreate", "TestCase1", TC_FAIL, "TSMimeHdrCreate Returns TS_ERROR_PTR");
4340
SDK_RPRINT(test, "TSMimeHdrCreate", "TestCase1", TC_PASS, "ok");
4341
test_passed_Mime_Hdr_Create = true;
4344
SDK_RPRINT(test, "TSMimeHdrCreate", "TestCase1", TC_FAIL, "Cannot run test as Test for TSMBufferCreate Failed");
4347
// TSMimeHdrFieldCreate
4348
if (test_passed_Mime_Hdr_Create == true) {
4349
if (((field_loc11 = TSMimeHdrFieldCreate(bufp1, mime_loc1)) == TS_ERROR_PTR) ||
4350
((field_loc12 = TSMimeHdrFieldCreate(bufp1, mime_loc1)) == TS_ERROR_PTR) ||
4351
((field_loc13 = TSMimeHdrFieldCreate(bufp1, mime_loc1)) == TS_ERROR_PTR) ||
4352
((field_loc14 = TSMimeHdrFieldCreate(bufp1, mime_loc1)) == TS_ERROR_PTR) ||
4353
((field_loc15 = TSMimeHdrFieldCreate(bufp1, mime_loc1)) == TS_ERROR_PTR)
4355
SDK_RPRINT(test, "TSMimeHdrFieldCreate", "TestCase1|2|3|4|5", TC_FAIL,
4356
"TSMimeHdrFieldCreate Returns TS_ERROR_PTR");
4358
SDK_RPRINT(test, "TSMimeHdrFieldCreate", "TestCase1|2|3|4|5", TC_PASS, "ok");
4359
test_passed_Mime_Hdr_Field_Create = true;
4362
SDK_RPRINT(test, "TSMimeHdrFieldCreate", "All Test Case", TC_FAIL,
4363
"Cannot run test as Test for TSMimeHdrCreate Failed");
4367
//TSMimeHdrFieldNameGet&Set
4368
if (test_passed_Mime_Hdr_Field_Create == true) {
4369
if ((TSMimeHdrFieldNameSet(bufp1, mime_loc1, field_loc11, field1Name, -1) == TS_ERROR) ||
4370
(TSMimeHdrFieldNameSet(bufp1, mime_loc1, field_loc12, field2Name, -1) == TS_ERROR) ||
4371
(TSMimeHdrFieldNameSet(bufp1, mime_loc1, field_loc13, field3Name, -1) == TS_ERROR) ||
4372
(TSMimeHdrFieldNameSet(bufp1, mime_loc1, field_loc14, field4Name, -1) == TS_ERROR) ||
4373
(TSMimeHdrFieldNameSet(bufp1, mime_loc1, field_loc15, field5Name, -1) == TS_ERROR)
4375
SDK_RPRINT(test, "TSMimeHdrFieldNameSet", "TestCase1|2|3|4|5", TC_FAIL,
4376
"TSMimeHdrFieldNameSet Returns TS_ERROR_PTR");
4378
if (((field1NameGet =
4379
TSMimeHdrFieldNameGet(bufp1, mime_loc1, field_loc11, &field1NameGetLength)) == TS_ERROR_PTR) ||
4381
TSMimeHdrFieldNameGet(bufp1, mime_loc1, field_loc12, &field2NameGetLength)) == TS_ERROR_PTR) ||
4383
TSMimeHdrFieldNameGet(bufp1, mime_loc1, field_loc13, &field3NameGetLength)) == TS_ERROR_PTR) ||
4385
TSMimeHdrFieldNameGet(bufp1, mime_loc1, field_loc14, &field4NameGetLength)) == TS_ERROR_PTR) ||
4387
TSMimeHdrFieldNameGet(bufp1, mime_loc1, field_loc15, &field5NameGetLength)) == TS_ERROR_PTR)
4389
SDK_RPRINT(test, "TSMimeHdrFieldNameGet", "TestCase1|2|3|4|5", TC_FAIL,
4390
"TSMimeHdrFieldNameGet Returns TS_ERROR_PTR");
4391
SDK_RPRINT(test, "TSMimeHdrFieldNameGet|Set", "TestCase1|2|3|4|5", TC_FAIL,
4392
"TSMimeHdrFieldNameGet Returns TS_ERROR_PTR");
4394
if (((strncmp(field1NameGet, field1Name, field1NameGetLength) == 0) &&
4395
(field1NameGetLength == (int) strlen(field1Name))) &&
4396
((strncmp(field2NameGet, field2Name, field2NameGetLength) == 0) &&
4397
(field2NameGetLength == (int) strlen(field2Name))) &&
4398
((strncmp(field3NameGet, field3Name, field3NameGetLength) == 0) &&
4399
(field3NameGetLength == (int) strlen(field3Name))) &&
4400
((strncmp(field4NameGet, field4Name, field4NameGetLength) == 0) &&
4401
(field4NameGetLength == (int) strlen(field4Name))) &&
4402
((strncmp(field5NameGet, field5Name, field5NameGetLength) == 0) &&
4403
field5NameGetLength == (int) strlen(field5Name))
4405
SDK_RPRINT(test, "TSMimeHdrFieldNameGet&Set", "TestCase1&2&3&4&5", TC_PASS, "ok");
4406
test_passed_Mime_Hdr_Field_Name = true;
4408
SDK_RPRINT(test, "TSMimeHdrFieldNameGet&Set", "TestCase1|2|3|4|5", TC_FAIL, "Values Don't Match");
4413
SDK_RPRINT(test, "TSMimeHdrFieldNameGet&Set", "All Test Case", TC_FAIL,
4414
"Cannot run test as Test for TSMBufferFieldCreate Failed");
4420
// TSMimeHdrFieldAppend, TSMimeHdrFieldGet, TSMimeHdrFieldNext
4421
if (test_passed_Mime_Hdr_Field_Name == true) {
4422
if ((TSMimeHdrFieldAppend(bufp1, mime_loc1, field_loc11) == TS_ERROR) ||
4423
(TSMimeHdrFieldAppend(bufp1, mime_loc1, field_loc12) == TS_ERROR) ||
4424
(TSMimeHdrFieldAppend(bufp1, mime_loc1, field_loc13) == TS_ERROR) ||
4425
(TSMimeHdrFieldAppend(bufp1, mime_loc1, field_loc14) == TS_ERROR) ||
4426
(TSMimeHdrFieldAppend(bufp1, mime_loc1, field_loc15) == TS_ERROR)
4428
SDK_RPRINT(test, "TSMimeHdrFieldAppend", "TestCase1|2|3|4|5", TC_FAIL,
4429
"TSMimeHdrFieldAppend Returns TS_ERROR");
4431
if ((test_field_loc11 = TSMimeHdrFieldGet(bufp1, mime_loc1, 0)) == TS_ERROR_PTR) {
4432
SDK_RPRINT(test, "TSMimeHdrFieldAppend", "TestCase1|2|3|4|5", TC_FAIL,
4433
"TSMimeHdrFieldGet Returns TS_ERROR_PTR");
4434
SDK_RPRINT(test, "TSMimeHdrFieldNext", "TestCase1", TC_FAIL,
4435
"Cannot Test TSMimeHdrFieldNext as TSMimeHdrFieldGet Returns TS_ERROR_PTR");
4436
SDK_RPRINT(test, "TSMimeHdrFieldGet", "TestCase1", TC_FAIL, "TSMimeHdrFieldGet Returns TS_ERROR_PTR");
4438
if (compare_field_names(test, bufp1, mime_loc1, field_loc11, bufp1, mime_loc1, test_field_loc11) == TS_ERROR) {
4439
SDK_RPRINT(test, "TSMimeHdrFieldAppend", "TestCase1", TC_FAIL, "Values Don't match");
4440
SDK_RPRINT(test, "TSMimeHdrFieldNext", "TestCase1", TC_FAIL,
4441
"Cannot Test TSMimeHdrFieldNext as Values don't match");
4442
SDK_RPRINT(test, "TSMimeHdrFieldGet", "TestCase1", TC_FAIL, "Values Don't match");
4444
SDK_RPRINT(test, "TSMimeHdrFieldAppend", "TestCase1", TC_PASS, "ok");
4445
SDK_RPRINT(test, "TSMimeHdrFieldGet", "TestCase1", TC_PASS, "ok");
4446
test_passed_Mime_Hdr_Field_Append = true;
4447
test_passed_Mime_Hdr_Field_Get = true;
4451
if (test_passed_Mime_Hdr_Field_Append == true) {
4452
if ((test_field_loc12 = TSMimeHdrFieldNext(bufp1, mime_loc1, test_field_loc11)) == TS_ERROR_PTR) {
4453
SDK_RPRINT(test, "TSMimeHdrFieldAppend", "TestCase2", TC_FAIL,
4454
"TSMimeHdrFieldAppend failed as TSMimeHdrFieldNext Returns TS_ERROR_PTR");
4455
SDK_RPRINT(test, "TSMimeHdrFieldNext", "TestCase2", TC_FAIL, "TSMimeHdrFieldNext Returns TS_ERROR_PTR");
4456
SDK_RPRINT(test, "TSMimeHdrFieldGet", "TestCase2", TC_FAIL,
4457
"Cannot be sure that TSMimeHdrFieldGet passed as TSMimeHdrFieldNext Returns TS_ERROR_PTR");
4458
test_passed_Mime_Hdr_Field_Append = false;
4459
test_passed_Mime_Hdr_Field_Next = false;
4460
test_passed_Mime_Hdr_Field_Get = false;
4462
if (compare_field_names(test, bufp1, mime_loc1, field_loc12, bufp1, mime_loc1, test_field_loc12) == TS_ERROR) {
4463
SDK_RPRINT(test, "TSMimeHdrFieldAppend", "TestCase2", TC_PASS, "Values Don't match");
4464
SDK_RPRINT(test, "TSMimeHdrFieldNext", "TestCase2", TC_PASS, "Values Don't match");
4465
SDK_RPRINT(test, "TSMimeHdrFieldGet", "TestCase2", TC_PASS, "Values Don't match");
4466
test_passed_Mime_Hdr_Field_Append = false;
4467
test_passed_Mime_Hdr_Field_Next = false;
4468
test_passed_Mime_Hdr_Field_Get = false;
4470
SDK_RPRINT(test, "TSMimeHdrFieldAppend", "TestCase2", TC_PASS, "ok");
4471
SDK_RPRINT(test, "TSMimeHdrFieldNext", "TestCase2", TC_PASS, "ok");
4472
SDK_RPRINT(test, "TSMimeHdrFieldGet", "TestCase2", TC_PASS, "ok");
4473
test_passed_Mime_Hdr_Field_Next = true;
4478
if (test_passed_Mime_Hdr_Field_Append == true) {
4479
if ((test_field_loc13 = TSMimeHdrFieldNext(bufp1, mime_loc1, test_field_loc12)) == TS_ERROR_PTR) {
4480
SDK_RPRINT(test, "TSMimeHdrFieldAppend", "TestCase3", TC_FAIL,
4481
"TSMimeHdrFieldNext Returns TS_ERROR. Cannot check.");
4482
SDK_RPRINT(test, "TSMimeHdrFieldNext", "TestCase3", TC_FAIL, "TSMimeHdrFieldNext Returns TS_ERROR_PTR");
4483
SDK_RPRINT(test, "TSMimeHdrFieldGet", "TestCase3", TC_FAIL,
4484
"Cannot be sure that TSMimeHdrFieldGet passed as TSMimeHdrFieldNext Returns TS_ERROR_PTR");
4485
test_passed_Mime_Hdr_Field_Append = false;
4486
test_passed_Mime_Hdr_Field_Next = false;
4487
test_passed_Mime_Hdr_Field_Get = false;
4489
if (compare_field_names(test, bufp1, mime_loc1, field_loc13, bufp1, mime_loc1, test_field_loc13) == TS_ERROR) {
4490
SDK_RPRINT(test, "TSMimeHdrFieldAppend", "TestCase3", TC_FAIL, "Values Don't match");
4491
SDK_RPRINT(test, "TSMimeHdrFieldNext", "TestCase3", TC_FAIL, "Values Don't match");
4492
SDK_RPRINT(test, "TSMimeHdrFieldGet", "TestCase3", TC_FAIL, "Values Don't match");
4493
test_passed_Mime_Hdr_Field_Append = false;
4494
test_passed_Mime_Hdr_Field_Next = false;
4495
test_passed_Mime_Hdr_Field_Get = false;
4497
SDK_RPRINT(test, "TSMimeHdrFieldAppend", "TestCase3", TC_PASS, "ok");
4498
SDK_RPRINT(test, "TSMimeHdrFieldNext", "TestCase3", TC_PASS, "ok");
4499
SDK_RPRINT(test, "TSMimeHdrFieldGet", "TestCase3", TC_PASS, "ok");
4504
if (test_passed_Mime_Hdr_Field_Append == true) {
4505
if ((test_field_loc14 = TSMimeHdrFieldNext(bufp1, mime_loc1, test_field_loc13)) == TS_ERROR_PTR) {
4506
SDK_RPRINT(test, "TSMimeHdrFieldAppend", "TestCase4", TC_FAIL,
4507
"TSMimeHdrFieldNext Returns TS_ERROR. Cannot check.");
4508
SDK_RPRINT(test, "TSMimeHdrFieldNext", "TestCase4", TC_FAIL, "TSMimeHdrFieldNext Returns TS_ERROR_PTR");
4509
SDK_RPRINT(test, "TSMimeHdrFieldAppend", "TestCase4", TC_FAIL,
4510
"Cannot be sure that TSMimeHdrFieldGet passed as TSMimeHdrFieldNext Returns TS_ERROR.");
4511
test_passed_Mime_Hdr_Field_Append = false;
4512
test_passed_Mime_Hdr_Field_Next = false;
4513
test_passed_Mime_Hdr_Field_Get = false;
4515
if (compare_field_names(test, bufp1, mime_loc1, field_loc14, bufp1, mime_loc1, test_field_loc14) == TS_ERROR) {
4516
SDK_RPRINT(test, "TSMimeHdrFieldAppend", "TestCase4", TC_FAIL, "Values Don't match");
4517
SDK_RPRINT(test, "TSMimeHdrFieldNext", "TestCase4", TC_FAIL, "Values Don't match");
4518
SDK_RPRINT(test, "TSMimeHdrFieldGet", "TestCase4", TC_FAIL, "Values Don't match");
4519
test_passed_Mime_Hdr_Field_Append = false;
4520
test_passed_Mime_Hdr_Field_Next = false;
4521
test_passed_Mime_Hdr_Field_Get = false;
4523
SDK_RPRINT(test, "TSMimeHdrFieldAppend", "TestCase4", TC_PASS, "ok");
4524
SDK_RPRINT(test, "TSMimeHdrFieldNext", "TestCase4", TC_PASS, "ok");
4525
SDK_RPRINT(test, "TSMimeHdrFieldGet", "TestCase4", TC_PASS, "ok");
4530
if (test_passed_Mime_Hdr_Field_Append == true) {
4531
if ((test_field_loc15 = TSMimeHdrFieldNext(bufp1, mime_loc1, test_field_loc14)) == TS_ERROR_PTR) {
4532
SDK_RPRINT(test, "TSMimeHdrFieldNext", "TestCase5", TC_FAIL, "TSMimeHdrFieldNext Returns TS_ERROR_PTR");
4533
SDK_RPRINT(test, "TSMimeHdrFieldAppend", "TestCase5", TC_FAIL,
4534
"TSMimeHdrFieldNext Returns TS_ERROR. Cannot check.");
4535
test_passed_Mime_Hdr_Field_Append = false;
4536
test_passed_Mime_Hdr_Field_Next = false;
4537
test_passed_Mime_Hdr_Field_Get = false;
4539
if (compare_field_names(test, bufp1, mime_loc1, field_loc15, bufp1, mime_loc1, test_field_loc15) == TS_ERROR) {
4540
SDK_RPRINT(test, "TSMimeHdrFieldAppend", "TestCase5", TC_FAIL, "Values Don't match");
4541
SDK_RPRINT(test, "TSMimeHdrFieldNext", "TestCase5", TC_FAIL, "Values Don't match");
4542
test_passed_Mime_Hdr_Field_Append = false;
4543
test_passed_Mime_Hdr_Field_Next = false;
4544
test_passed_Mime_Hdr_Field_Get = false;
4546
SDK_RPRINT(test, "TSMimeHdrFieldAppend", "TestCase5", TC_PASS, "ok");
4547
SDK_RPRINT(test, "TSMimeHdrFieldNext", "TestCase5", TC_PASS, "ok");
4552
if ((TSHandleMLocRelease(bufp1, mime_loc1, test_field_loc11) == TS_ERROR) ||
4553
(TSHandleMLocRelease(bufp1, mime_loc1, test_field_loc12) == TS_ERROR) ||
4554
(TSHandleMLocRelease(bufp1, mime_loc1, test_field_loc13) == TS_ERROR) ||
4555
(TSHandleMLocRelease(bufp1, mime_loc1, test_field_loc14) == TS_ERROR) ||
4556
(TSHandleMLocRelease(bufp1, mime_loc1, test_field_loc15) == TS_ERROR)
4558
SDK_RPRINT(test, "TSMimeHdrFieldAppend/Next/Get", "", TC_FAIL,
4559
"Unable to release handle using TSHandleMLocRelease. Can be bad handle.");
4563
SDK_RPRINT(test, "TSMimeHdrFieldAppend & TSMimeHdrFieldNext", "All Test Case", TC_FAIL,
4564
"Cannot run test as Test for TSMimeHdrFieldNameGet&Set Failed");
4568
//TSMimeHdrFieldsCount
4569
if (test_passed_Mime_Hdr_Field_Create == true) {
4570
if ((numberOfFields = TSMimeHdrFieldsCount(bufp1, mime_loc1)) == TS_ERROR) {
4571
SDK_RPRINT(test, "TSMimeHdrFieldsCount", "TestCase1", TC_FAIL, "TSMimeHdrFieldsCount Returns TS_ERROR");
4573
actualNumberOfFields = 0;
4574
if ((field_loc = TSMimeHdrFieldGet(bufp1, mime_loc1, actualNumberOfFields)) == TS_ERROR_PTR) {
4575
SDK_RPRINT(test, "TSMimeHdrFieldsCount", "TestCase1", TC_FAIL, "TSMimeHdrFieldGet Returns TS_ERROR_PTR");
4577
while (field_loc != NULL) {
4578
TSMLoc next_field_loc;
4580
actualNumberOfFields++;
4581
if ((next_field_loc = TSMimeHdrFieldNext(bufp1, mime_loc1, field_loc)) == TS_ERROR_PTR) {
4582
SDK_RPRINT(test, "TSMimeHdrFieldsCount", "TestCase1", TC_FAIL,
4583
"TSMimeHdrFieldNext Returns TS_ERROR_PTR");
4585
if (TSHandleMLocRelease(bufp1, mime_loc1, field_loc) == TS_ERROR) {
4586
SDK_RPRINT(test, "TSMimeHdrFieldsCount", "TestCase1", TC_FAIL,
4587
"Unable to release handle using TSHandleMLocRelease");
4589
field_loc = next_field_loc;
4590
next_field_loc = NULL;
4592
if (actualNumberOfFields == numberOfFields) {
4593
SDK_RPRINT(test, "TSMimeHdrFieldsCount", "TestCase1", TC_PASS, "ok");
4594
test_passed_Mime_Hdr_Fields_Count = true;
4596
SDK_RPRINT(test, "TSMimeHdrFieldsCount", "TestCase1", TC_FAIL, "Value's Dont match");
4601
SDK_RPRINT(test, "TSMimeHdrFieldsCount", "TestCase1", TC_FAIL, "Cannot run Test as TSMimeHdrFieldCreate failed");
4604
// TSMimeHdrFieldValueStringInsert, TSMimeHdrFieldValueStringGet, TSMimeHdrFieldValueStringSet
4605
if (test_passed_Mime_Hdr_Field_Create == true) {
4606
if ((TSMimeHdrFieldValueStringInsert(bufp1, mime_loc1, field_loc11, -1, field1Value2, -1) == TS_ERROR) ||
4607
(TSMimeHdrFieldValueStringInsert(bufp1, mime_loc1, field_loc11, 0, field1Value1, -1) == TS_ERROR) ||
4608
(TSMimeHdrFieldValueStringInsert(bufp1, mime_loc1, field_loc11, -1, field1Value5, -1) == TS_ERROR) ||
4609
(TSMimeHdrFieldValueStringInsert(bufp1, mime_loc1, field_loc11, 2, field1Value4, -1) == TS_ERROR) ||
4610
(TSMimeHdrFieldValueStringInsert(bufp1, mime_loc1, field_loc11, 2, field1Value3, -1) == TS_ERROR)
4612
SDK_RPRINT(test, "TSMimeHdrFieldValueStringInsert", "TestCase1|2|3|4|5", TC_FAIL,
4613
"TSMimeHdrFieldValueStringInsert Returns TS_ERROR");
4614
SDK_RPRINT(test, "TSMimeHdrFieldValueStringGet", "TestCase1&2&3&4&5", TC_FAIL,
4615
"Cannot run Test as TSMimeHdrFieldValueStringInsert returns TS_ERROR");
4616
SDK_RPRINT(test, "TSMimeHdrFieldValueStringSet", "TestCase1", TC_FAIL,
4617
"Cannot run Test as TSMimeHdrFieldValueStringInsert returns TS_ERROR");
4619
if ((TSMimeHdrFieldValueStringGet(bufp1, mime_loc1, field_loc11, 0, &field1Value1Get, &lengthField1Value1) ==
4621
(TSMimeHdrFieldValueStringGet(bufp1, mime_loc1, field_loc11, 1, &field1Value2Get, &lengthField1Value2) ==
4623
(TSMimeHdrFieldValueStringGet(bufp1, mime_loc1, field_loc11, 2, &field1Value3Get, &lengthField1Value3) ==
4625
(TSMimeHdrFieldValueStringGet(bufp1, mime_loc1, field_loc11, 3, &field1Value4Get, &lengthField1Value4) ==
4627
(TSMimeHdrFieldValueStringGet(bufp1, mime_loc1, field_loc11, 4, &field1Value5Get, &lengthField1Value5) ==
4630
SDK_RPRINT(test, "TSMimeHdrFieldValueStringInsert|Get", "TestCase1|2|3|4|5", TC_FAIL,
4631
"TSMimeHdrFieldValueStringGet Returns TS_ERROR");
4632
SDK_RPRINT(test, "TSMimeHdrFieldValueStringSet", "TestCase1", TC_FAIL,
4633
"TSMimeHdrFieldValueStringSet cannot be tested as TSMimeHdrFieldValueStringInsert|Get failed");
4635
if (((strncmp(field1Value1Get, field1Value1, lengthField1Value1) == 0) &&
4636
lengthField1Value1 == (int) strlen(field1Value1)) &&
4637
((strncmp(field1Value2Get, field1Value2, lengthField1Value2) == 0) &&
4638
lengthField1Value2 == (int) strlen(field1Value2)) &&
4639
((strncmp(field1Value3Get, field1Value3, lengthField1Value3) == 0) &&
4640
lengthField1Value3 == (int) strlen(field1Value3)) &&
4641
((strncmp(field1Value4Get, field1Value4, lengthField1Value4) == 0) &&
4642
lengthField1Value4 == (int) strlen(field1Value4)) &&
4643
((strncmp(field1Value5Get, field1Value5, lengthField1Value5) == 0) &&
4644
lengthField1Value5 == (int) strlen(field1Value5))
4646
SDK_RPRINT(test, "TSMimeHdrFieldValueStringInsert", "TestCase1&2&3&4&5", TC_PASS, "ok");
4647
SDK_RPRINT(test, "TSMimeHdrFieldValueStringGet", "TestCase1&2&3&4&5", TC_PASS, "ok");
4648
test_passed_Mime_Hdr_Field_Value_String_Insert = true;
4649
test_passed_Mime_Hdr_Field_Value_String_Get = true;
4651
if ((TSMimeHdrFieldValueStringSet(bufp1, mime_loc1, field_loc11, 3, field1ValueNew, -1)) == TS_ERROR) {
4652
SDK_RPRINT(test, "TSMimeHdrFieldValueStringSet", "TestCase1", TC_FAIL,
4653
"TSMimeHdrFieldValueStringSet returns TS_ERROR");
4655
if (TSMimeHdrFieldValueStringGet
4656
(bufp1, mime_loc1, field_loc11, 3, &field1ValueNewGet, &lengthField1ValueNew) == TS_ERROR) {
4657
SDK_RPRINT(test, "TSMimeHdrFieldValueStringSet", "TestCase1", TC_FAIL,
4658
"TSMimeHdrFieldValueStringGet returns TS_ERROR");
4660
if ((strncmp(field1ValueNewGet, field1ValueNew, lengthField1ValueNew) == 0) &&
4661
(lengthField1ValueNew == (int) strlen(field1ValueNew))) {
4662
SDK_RPRINT(test, "TSMimeHdrFieldValueStringSet", "TestCase1", TC_PASS, "ok");
4663
test_passed_Mime_Hdr_Field_Value_String_Set = true;
4665
SDK_RPRINT(test, "TSMimeHdrFieldValueStringSet", "TestCase1", TC_FAIL, "Value's Don't match");
4670
SDK_RPRINT(test, "TSMimeHdrFieldValueStringInsert", "TestCase1|2|3|4|5", TC_PASS, "Value's Don't Match");
4671
SDK_RPRINT(test, "TSMimeHdrFieldValueStringGet", "TestCase1|2|3|4|5", TC_PASS, "Value's Don't Match");
4672
SDK_RPRINT(test, "TSMimeHdrFieldValueStringSet", "TestCase1", TC_FAIL,
4673
"TSMimeHdrFieldValueStringSet cannot be tested as TSMimeHdrFieldValueStringInsert|Get failed");
4678
SDK_RPRINT(test, "TSMimeHdrFieldValueStringInsert&Set&Get", "All", TC_FAIL,
4679
"Cannot run Test as TSMimeHdrFieldCreate failed");
4683
// TSMimeHdrFieldValueDateInsert, TSMimeHdrFieldValueDateGet, TSMimeHdrFieldValueDateSet
4684
if (test_passed_Mime_Hdr_Field_Create == true) {
4685
if (TSMimeHdrFieldValueDateInsert(bufp1, mime_loc1, field_loc12, field2Value1) == TS_ERROR) {
4686
SDK_RPRINT(test, "TSMimeHdrFieldValueDateInsert", "TestCase1", TC_FAIL,
4687
"TSMimeHdrFieldValueDateInsert Returns TS_ERROR");
4688
SDK_RPRINT(test, "TSMimeHdrFieldValueDateGet", "TestCase1", TC_FAIL,
4689
"Cannot run Test as TSMimeHdrFieldValueDateInsert returns TS_ERROR");
4690
SDK_RPRINT(test, "TSMimeHdrFieldValueDateSet", "TestCase1", TC_FAIL,
4691
"Cannot run Test as TSMimeHdrFieldValueDateInsert returns TS_ERROR");
4693
if (TSMimeHdrFieldValueDateGet(bufp1, mime_loc1, field_loc12, &field2Value1Get) == TS_ERROR) {
4694
SDK_RPRINT(test, "TSMimeHdrFieldValueDateInsert|Get", "TestCase1", TC_FAIL,
4695
"TSMimeHdrFieldValueDateGet Returns TS_ERROR");
4696
SDK_RPRINT(test, "TSMimeHdrFieldValueDateSet", "TestCase1", TC_FAIL,
4697
"TSMimeHdrFieldValueDateSet cannot be tested as TSMimeHdrFieldValueDateInsert|Get failed");
4699
if (field2Value1Get == field2Value1) {
4700
SDK_RPRINT(test, "TSMimeHdrFieldValueDateInsert", "TestCase1", TC_PASS, "ok");
4701
SDK_RPRINT(test, "TSMimeHdrFieldValueDateGet", "TestCase1", TC_PASS, "ok");
4702
test_passed_Mime_Hdr_Field_Value_Date_Insert = true;
4703
test_passed_Mime_Hdr_Field_Value_Date_Get = true;
4704
field2ValueNew = time(NULL);
4705
if ((TSMimeHdrFieldValueDateSet(bufp1, mime_loc1, field_loc12, field2ValueNew)) == TS_ERROR) {
4706
SDK_RPRINT(test, "TSMimeHdrFieldValueDateSet", "TestCase1", TC_FAIL,
4707
"TSMimeHdrFieldValueDateSet returns TS_ERROR");
4709
if (TSMimeHdrFieldValueDateGet(bufp1, mime_loc1, field_loc12, &field2ValueNewGet) == TS_ERROR) {
4710
SDK_RPRINT(test, "TSMimeHdrFieldValueDateSet", "TestCase1", TC_FAIL,
4711
"TSMimeHdrFieldValueDateGet returns TS_ERROR");
4713
if (field2ValueNewGet == field2ValueNew) {
4714
SDK_RPRINT(test, "TSMimeHdrFieldValueDateSet", "TestCase1", TC_PASS, "ok");
4715
test_passed_Mime_Hdr_Field_Value_Date_Set = true;
4717
SDK_RPRINT(test, "TSMimeHdrFieldValueDateSet", "TestCase1", TC_FAIL, "Value's Don't match");
4722
SDK_RPRINT(test, "TSMimeHdrFieldValueDateInsert", "TestCase1", TC_PASS, "Value's Don't Match");
4723
SDK_RPRINT(test, "TSMimeHdrFieldValueDateGet", "TestCase1", TC_PASS, "Value's Don't Match");
4724
SDK_RPRINT(test, "TSMimeHdrFieldValueDateSet", "TestCase1", TC_FAIL,
4725
"TSMimeHdrFieldValueDateSet cannot be tested as TSMimeHdrFieldValueDateInsert|Get failed");
4730
SDK_RPRINT(test, "TSMimeHdrFieldValueDateInsert&Set&Get", "TestCase1", TC_FAIL,
4731
"Cannot run Test as TSMimeHdrFieldCreate failed");
4735
// TSMimeHdrFieldValueIntInsert, TSMimeHdrFieldValueIntGet, TSMimeHdrFieldValueIntSet
4736
if (test_passed_Mime_Hdr_Field_Create == true) {
4737
if ((TSMimeHdrFieldValueIntInsert(bufp1, mime_loc1, field_loc13, -1, field3Value2) == TS_ERROR) ||
4738
(TSMimeHdrFieldValueIntInsert(bufp1, mime_loc1, field_loc13, 0, field3Value1) == TS_ERROR) ||
4739
(TSMimeHdrFieldValueIntInsert(bufp1, mime_loc1, field_loc13, -1, field3Value5) == TS_ERROR) ||
4740
(TSMimeHdrFieldValueIntInsert(bufp1, mime_loc1, field_loc13, 2, field3Value4) == TS_ERROR) ||
4741
(TSMimeHdrFieldValueIntInsert(bufp1, mime_loc1, field_loc13, 2, field3Value3) == TS_ERROR)
4743
SDK_RPRINT(test, "TSMimeHdrFieldValueIntInsert", "TestCase1|2|3|4|5", TC_FAIL,
4744
"TSMimeHdrFieldValueIntInsert Returns TS_ERROR");
4745
SDK_RPRINT(test, "TSMimeHdrFieldValueIntGet", "TestCase1&2&3&4&5", TC_FAIL,
4746
"Cannot run Test as TSMimeHdrFieldValueIntInsert returns TS_ERROR");
4747
SDK_RPRINT(test, "TSMimeHdrFieldValueIntSet", "TestCase1", TC_FAIL,
4748
"Cannot run Test as TSMimeHdrFieldValueIntInsert returns TS_ERROR");
4750
if ((TSMimeHdrFieldValueIntGet(bufp1, mime_loc1, field_loc13, 0, &field3Value1Get) == TS_ERROR) ||
4751
(TSMimeHdrFieldValueIntGet(bufp1, mime_loc1, field_loc13, 1, &field3Value2Get) == TS_ERROR) ||
4752
(TSMimeHdrFieldValueIntGet(bufp1, mime_loc1, field_loc13, 2, &field3Value3Get) == TS_ERROR) ||
4753
(TSMimeHdrFieldValueIntGet(bufp1, mime_loc1, field_loc13, 3, &field3Value4Get) == TS_ERROR) ||
4754
(TSMimeHdrFieldValueIntGet(bufp1, mime_loc1, field_loc13, 4, &field3Value5Get) == TS_ERROR)
4756
SDK_RPRINT(test, "TSMimeHdrFieldValueIntInsert|Get", "TestCase1|2|3|4|5", TC_FAIL,
4757
"TSMimeHdrFieldValueIntGet Returns TS_ERROR");
4758
SDK_RPRINT(test, "TSMimeHdrFieldValueIntSet", "TestCase1", TC_FAIL,
4759
"TSMimeHdrFieldValueIntSet cannot be tested as TSMimeHdrFieldValueIntInsert|Get failed");
4761
if ((field3Value1Get == field3Value1) &&
4762
(field3Value2Get == field3Value2) &&
4763
(field3Value3Get == field3Value3) && (field3Value4Get == field3Value4) && (field3Value5Get == field3Value5)
4765
SDK_RPRINT(test, "TSMimeHdrFieldValueIntInsert", "TestCase1&2&3&4&5", TC_PASS, "ok");
4766
SDK_RPRINT(test, "TSMimeHdrFieldValueIntGet", "TestCase1&2&3&4&5", TC_PASS, "ok");
4767
test_passed_Mime_Hdr_Field_Value_Int_Insert = true;
4768
test_passed_Mime_Hdr_Field_Value_Int_Get = true;
4769
if ((TSMimeHdrFieldValueIntSet(bufp1, mime_loc1, field_loc13, 3, field3ValueNew)) == TS_ERROR) {
4770
SDK_RPRINT(test, "TSMimeHdrFieldValueIntSet", "TestCase1", TC_FAIL,
4771
"TSMimeHdrFieldValueIntSet returns TS_ERROR");
4773
if (TSMimeHdrFieldValueIntGet(bufp1, mime_loc1, field_loc13, 3, &field3ValueNewGet) == TS_ERROR) {
4774
SDK_RPRINT(test, "TSMimeHdrFieldValueIntSet", "TestCase1", TC_FAIL,
4775
"TSMimeHdrFieldValueIntGet returns TS_ERROR");
4777
if (field3ValueNewGet == field3ValueNew) {
4778
SDK_RPRINT(test, "TSMimeHdrFieldValueIntSet", "TestCase1", TC_PASS, "ok");
4779
test_passed_Mime_Hdr_Field_Value_Int_Set = true;
4781
SDK_RPRINT(test, "TSMimeHdrFieldValueIntSet", "TestCase1", TC_FAIL, "Value's Don't match");
4786
SDK_RPRINT(test, "TSMimeHdrFieldValueIntInsert", "TestCase1|2|3|4|5", TC_PASS, "Value's Don't Match");
4787
SDK_RPRINT(test, "TSMimeHdrFieldValueIntGet", "TestCase1|2|3|4|5", TC_PASS, "Value's Don't Match");
4788
SDK_RPRINT(test, "TSMimeHdrFieldValueIntSet", "TestCase1", TC_FAIL,
4789
"TSMimeHdrFieldValueIntSet cannot be tested as TSMimeHdrFieldValueIntInsert|Get failed");
4794
SDK_RPRINT(test, "TSMimeHdrFieldValueIntInsert&Set&Get", "All", TC_FAIL,
4795
"Cannot run Test as TSMimeHdrFieldCreate failed");
4798
// TSMimeHdrFieldValueUintInsert, TSMimeHdrFieldValueUintGet, TSMimeHdrFieldValueUintSet
4799
if (test_passed_Mime_Hdr_Field_Create == true) {
4800
if ((TSMimeHdrFieldValueUintInsert(bufp1, mime_loc1, field_loc14, -1, field4Value2) == TS_ERROR) ||
4801
(TSMimeHdrFieldValueUintInsert(bufp1, mime_loc1, field_loc14, 0, field4Value1) == TS_ERROR) ||
4802
(TSMimeHdrFieldValueUintInsert(bufp1, mime_loc1, field_loc14, -1, field4Value5) == TS_ERROR) ||
4803
(TSMimeHdrFieldValueUintInsert(bufp1, mime_loc1, field_loc14, 2, field4Value4) == TS_ERROR) ||
4804
(TSMimeHdrFieldValueUintInsert(bufp1, mime_loc1, field_loc14, 2, field4Value3) == TS_ERROR)
4806
SDK_RPRINT(test, "TSMimeHdrFieldValueUintInsert", "TestCase1|2|3|4|5", TC_FAIL,
4807
"TSMimeHdrFieldValueUintInsert Returns TS_ERROR");
4808
SDK_RPRINT(test, "TSMimeHdrFieldValueUintGet", "TestCase1&2&3&4&5", TC_FAIL,
4809
"Cannot run Test as TSMimeHdrFieldValueUintInsert returns TS_ERROR");
4810
SDK_RPRINT(test, "TSMimeHdrFieldValueUintSet", "TestCase1", TC_FAIL,
4811
"Cannot run Test as TSMimeHdrFieldValueUintInsert returns TS_ERROR");
4813
if ((TSMimeHdrFieldValueUintGet(bufp1, mime_loc1, field_loc14, 0, &field4Value1Get) == TS_ERROR) ||
4814
(TSMimeHdrFieldValueUintGet(bufp1, mime_loc1, field_loc14, 1, &field4Value2Get) == TS_ERROR) ||
4815
(TSMimeHdrFieldValueUintGet(bufp1, mime_loc1, field_loc14, 2, &field4Value3Get) == TS_ERROR) ||
4816
(TSMimeHdrFieldValueUintGet(bufp1, mime_loc1, field_loc14, 3, &field4Value4Get) == TS_ERROR) ||
4817
(TSMimeHdrFieldValueUintGet(bufp1, mime_loc1, field_loc14, 4, &field4Value5Get) == TS_ERROR)
4819
SDK_RPRINT(test, "TSMimeHdrFieldValueUintInsert|Get", "TestCase1|2|3|4|5", TC_FAIL,
4820
"TSMimeHdrFieldValueUintGet Returns TS_ERROR");
4821
SDK_RPRINT(test, "TSMimeHdrFieldValueUintSet", "TestCase1", TC_FAIL,
4822
"TSMimeHdrFieldValueUintSet cannot be tested as TSMimeHdrFieldValueUintInsert|Get failed");
4824
if ((field4Value1Get == field4Value1) &&
4825
(field4Value2Get == field4Value2) &&
4826
(field4Value3Get == field4Value3) && (field4Value4Get == field4Value4) && (field4Value5Get == field4Value5)
4828
SDK_RPRINT(test, "TSMimeHdrFieldValueUintInsert", "TestCase1&2&3&4&5", TC_PASS, "ok");
4829
SDK_RPRINT(test, "TSMimeHdrFieldValueUintGet", "TestCase1&2&3&4&5", TC_PASS, "ok");
4830
test_passed_Mime_Hdr_Field_Value_Uint_Insert = true;
4831
test_passed_Mime_Hdr_Field_Value_Uint_Get = true;
4832
if ((TSMimeHdrFieldValueUintSet(bufp1, mime_loc1, field_loc14, 3, field4ValueNew)) == TS_ERROR) {
4833
SDK_RPRINT(test, "TSMimeHdrFieldValueUintSet", "TestCase1", TC_FAIL,
4834
"TSMimeHdrFieldValueUintSet returns TS_ERROR");
4836
if (TSMimeHdrFieldValueUintGet(bufp1, mime_loc1, field_loc14, 3, &field4ValueNewGet) == TS_ERROR) {
4837
SDK_RPRINT(test, "TSMimeHdrFieldValueUintSet", "TestCase1", TC_FAIL,
4838
"TSMimeHdrFieldValueUintGet returns TS_ERROR");
4840
if (field4ValueNewGet == field4ValueNew) {
4841
SDK_RPRINT(test, "TSMimeHdrFieldValueUintSet", "TestCase1", TC_PASS, "ok");
4842
test_passed_Mime_Hdr_Field_Value_Uint_Set = true;
4844
SDK_RPRINT(test, "TSMimeHdrFieldValueUintSet", "TestCase1", TC_FAIL, "Value's Don't match");
4849
SDK_RPRINT(test, "TSMimeHdrFieldValueUintInsert", "TestCase1|2|3|4|5", TC_PASS, "Value's Don't Match");
4850
SDK_RPRINT(test, "TSMimeHdrFieldValueUintGet", "TestCase1|2|3|4|5", TC_PASS, "Value's Don't Match");
4851
SDK_RPRINT(test, "TSMimeHdrFieldValueUintSet", "TestCase1", TC_FAIL,
4852
"TSMimeHdrFieldValueUintSet cannot be tested as TSMimeHdrFieldValueUintInsert|Get failed");
4857
SDK_RPRINT(test, "TSMimeHdrFieldValueUintInsert&Set&Get", "All", TC_FAIL,
4858
"Cannot run Test as TSMimeHdrFieldCreate failed");
4861
// TSMimeHdrFieldLengthGet
4862
field1_length = TSMimeHdrFieldLengthGet(bufp1, mime_loc1, field_loc11);
4863
field2_length = TSMimeHdrFieldLengthGet(bufp1, mime_loc1, field_loc12);
4864
field3_length = TSMimeHdrFieldLengthGet(bufp1, mime_loc1, field_loc13);
4865
field4_length = TSMimeHdrFieldLengthGet(bufp1, mime_loc1, field_loc14);
4866
if ((field1_length == TS_ERROR || field1_length == 0) ||
4867
(field2_length == TS_ERROR || field2_length == 0) ||
4868
(field3_length == TS_ERROR || field3_length == 0) || (field4_length == TS_ERROR || field4_length == 0)) {
4869
SDK_RPRINT(test, "TSMimeHdrFieldLengthGet", "TestCase1", TC_FAIL, "Returned bad length");
4870
test_passed_Mime_Hdr_Field_Length_Get = false;
4872
SDK_RPRINT(test, "TSMimeHdrFieldLengthGet", "TestCase1", TC_PASS, "ok");
4873
test_passed_Mime_Hdr_Field_Length_Get = true;
4878
// TSMimeHdrFieldValueAppend, TSMimeHdrFieldValueDelete, TSMimeHdrFieldValuesCount, TSMimeHdrFieldValuesClear
4880
if (test_passed_Mime_Hdr_Field_Create == true) {
4881
if ((TSMimeHdrFieldValueStringInsert(bufp1, mime_loc1, field_loc15, -1, field5Value1, -1) == TS_ERROR) ||
4882
(TSMimeHdrFieldValueIntInsert(bufp1, mime_loc1, field_loc15, -1, field5Value2) == TS_ERROR) ||
4883
(TSMimeHdrFieldValueStringInsert(bufp1, mime_loc1, field_loc15, -1, field5Value3, -1) == TS_ERROR) ||
4884
(TSMimeHdrFieldValueUintInsert(bufp1, mime_loc1, field_loc15, -1, field5Value4) == TS_ERROR)
4886
SDK_RPRINT(test, "TSMimeHdrFieldValueAppend", "TestCase1", TC_FAIL,
4887
"TSMimeHdrFieldValueString|Int|UintInsert returns TS_ERROR. Cannot create field for testing.");
4888
SDK_RPRINT(test, "TSMimeHdrFieldValueDelete", "TestCase1", TC_FAIL,
4889
"TSMimeHdrFieldValueString|Int|UintInsert returns TS_ERROR. Cannot create field for testing.");
4890
SDK_RPRINT(test, "TSMimeHdrFieldValuesCount", "TestCase1", TC_FAIL,
4891
"TSMimeHdrFieldValueString|Int|UintInsert returns TS_ERROR. Cannot create field for testing.");
4892
SDK_RPRINT(test, "TSMimeHdrFieldValuesClear", "TestCase1", TC_FAIL,
4893
"TSMimeHdrFieldValueString|Int|UintInsert returns TS_ERROR. Cannot create field for testing.");
4895
if (TSMimeHdrFieldValueAppend(bufp1, mime_loc1, field_loc15, 0, field5Value1Append, -1) == TS_ERROR) {
4896
SDK_RPRINT(test, "TSMimeHdrFieldValueAppend", "TestCase1", TC_FAIL,
4897
"TSMimeHdrFieldValueAppend returns TS_ERROR");
4899
if ((TSMimeHdrFieldValueStringGet
4900
(bufp1, mime_loc1, field_loc15, 0, &fieldValueAppendGet, &lengthFieldValueAppended)) != TS_SUCCESS) {
4901
SDK_RPRINT(test, "TSMimeHdrFieldValueAppend", "TestCase1", TC_FAIL,
4902
"TSMimeHdrFieldValueStringGet doesn't return TS_SUCCESS");
4904
char *expected_value;
4905
size_t len = strlen(field5Value1) + strlen(field5Value1Append) + 1;
4906
expected_value = (char *) TSmalloc(len);
4907
memset(expected_value, 0, strlen(field5Value1) + strlen(field5Value1Append) + 1);
4908
ink_strncpy(expected_value, field5Value1, len);
4909
strncat(expected_value, field5Value1Append, len - strlen(expected_value) - 1);
4910
if ((strncmp(fieldValueAppendGet, expected_value, lengthFieldValueAppended) == 0) &&
4911
(lengthFieldValueAppended = strlen(expected_value))
4913
SDK_RPRINT(test, "TSMimeHdrFieldValueAppend", "TestCase1", TC_PASS, "ok");
4914
test_passed_Mime_Hdr_Field_Value_Append = true;
4916
SDK_RPRINT(test, "TSMimeHdrFieldValueAppend", "TestCase1", TC_FAIL, "Values mismatch");
4918
TSfree(expected_value);
4922
if ((numberOfValueInField = TSMimeHdrFieldValuesCount(bufp1, mime_loc1, field_loc15)) == TS_ERROR) {
4923
SDK_RPRINT(test, "TSMimeHdrFieldValuesCount", "TestCase1", TC_FAIL,
4924
"TSMimeHdrFieldValuesCount returns TS_ERROR");
4926
if (numberOfValueInField == 4) {
4927
SDK_RPRINT(test, "TSMimeHdrFieldValuesCount", "TestCase1", TC_PASS, "ok");
4928
test_passed_Mime_Hdr_Field_Values_Count = true;
4930
SDK_RPRINT(test, "TSMimeHdrFieldValuesCount", "TestCase1", TC_FAIL, "Values don't match");
4935
if (TSMimeHdrFieldValueDelete(bufp1, mime_loc1, field_loc15, 2) == TS_ERROR) {
4936
SDK_RPRINT(test, "TSMimeHdrFieldValueDelete", "TestCase1", TC_FAIL,
4937
"TSMimeHdrFieldValueDelete Returns TS_ERROR");
4939
if ((TSMimeHdrFieldValueStringGet
4940
(bufp1, mime_loc1, field_loc15, 2, &fieldValueDeleteGet, &lengthFieldValueDeleteGet)) != TS_SUCCESS) {
4941
SDK_RPRINT(test, "TSMimeHdrFieldValueDelete", "TestCase1", TC_FAIL,
4942
"TSMimeHdrFieldValueStringGet doesn't return TS_SUCCESS. Cannot test for TSMimeHdrFieldValueDelete");
4944
if ((strncmp(fieldValueDeleteGet, field5Value3, lengthFieldValueDeleteGet) == 0) &&
4945
(lengthFieldValueDeleteGet == (int) strlen(field5Value3))) {
4946
SDK_RPRINT(test, "TSMimeHdrFieldValueDelete", "TestCase1", TC_FAIL,
4947
"Value not deleted from field or incorrect index deleted from field.");
4949
SDK_RPRINT(test, "TSMimeHdrFieldValueDelete", "TestCase1", TC_PASS, "ok");
4950
test_passed_Mime_Hdr_Field_Value_Delete = true;
4955
if (TSMimeHdrFieldValuesClear(bufp1, mime_loc1, field_loc15) == TS_ERROR) {
4956
SDK_RPRINT(test, "TSMimeHdrFieldValuesClear", "TestCase1", TC_FAIL,
4957
"TSMimeHdrFieldValuesClear returns TS_ERROR");
4959
if ((numberOfValueInField = TSMimeHdrFieldValuesCount(bufp1, mime_loc1, field_loc15)) == TS_ERROR) {
4960
SDK_RPRINT(test, "TSMimeHdrFieldValuesClear", "TestCase1", TC_FAIL,
4961
"TSMimeHdrFieldValuesCount returns TS_ERROR. Cannot test TSMimeHdrFieldValuesClear");
4963
if (numberOfValueInField == 0) {
4964
SDK_RPRINT(test, "TSMimeHdrFieldValuesClear", "TestCase1", TC_PASS, "ok");
4965
test_passed_Mime_Hdr_Field_Values_Clear = true;
4967
SDK_RPRINT(test, "TSMimeHdrFieldValuesClear", "TestCase1", TC_FAIL, "Values don't match");
4973
// TSMimeHdrFieldDestroy
4974
if (TSMimeHdrFieldDestroy(bufp1, mime_loc1, field_loc15) == TS_ERROR) {
4975
SDK_RPRINT(test, "TSMimeHdrFieldDestroy", "TestCase1", TC_FAIL, "TSMimeHdrFieldDestroy returns TS_ERROR");
4977
if ((test_field_loc15 = TSMimeHdrFieldFind(bufp1, mime_loc1, field5Name, -1)) == TS_ERROR_PTR) {
4978
SDK_RPRINT(test, "TSMimeHdrFieldDestroy", "TestCase1", TC_FAIL, "TSMimeHdrFieldFind returns TS_ERROR_PTR");
4980
if (test_field_loc15 == NULL) {
4981
SDK_RPRINT(test, "TSMimeHdrFieldDestroy", "TestCase1", TC_PASS, "ok");
4982
test_passed_Mime_Hdr_Field_Destroy = true;
4984
SDK_RPRINT(test, "TSMimeHdrFieldDestroy", "TestCase1", TC_FAIL, "Field not destroyed");
4985
if (TSHandleMLocRelease(bufp1, mime_loc1, test_field_loc15) == TS_ERROR) {
4986
SDK_RPRINT(test, "TSMimeHdrFieldDestroy", "TestCase1", TC_FAIL,
4987
"Unable to release handle using TSHandleMLocRelease");
4991
if (TSHandleMLocRelease(bufp1, mime_loc1, field_loc15) == TS_ERROR) {
4992
SDK_RPRINT(test, "TSMimeHdrFieldDestroy", "TestCase2", TC_FAIL,
4993
"Unable to release handle using TSHandleMLocRelease");
4997
SDK_RPRINT(test, "TSMimeHdrFieldValueAppend", "TestCase1", TC_FAIL,
4998
"Cannot run test as TSMimeHdrFieldCreate has failed");
4999
SDK_RPRINT(test, "TSMimeHdrFieldValueDelete", "TestCase1", TC_FAIL,
5000
"Cannot run test as TSMimeHdrFieldCreate has failed");
5001
SDK_RPRINT(test, "TSMimeHdrFieldValuesCount", "TestCase1", TC_FAIL,
5002
"Cannot run test as TSMimeHdrFieldCreate has failed");
5003
SDK_RPRINT(test, "TSMimeHdrFieldValuesClear", "TestCase1", TC_FAIL,
5004
"Cannot run test as TSMimeHdrFieldCreate has failed");
5005
SDK_RPRINT(test, "TSMimeHdrFieldDestroy", "TestCase1", TC_FAIL,
5006
"Cannot run test as TSMimeHdrFieldCreate has failed");
5009
// Mime Hdr Fields Clear
5010
if (test_passed_Mime_Hdr_Field_Append == true) {
5011
if (TSMimeHdrFieldsClear(bufp1, mime_loc1) != TS_SUCCESS) {
5012
SDK_RPRINT(test, "TSMimeHdrFieldsClear", "TestCase1", TC_FAIL, "TSMimeHdrFieldsClear returns TS_ERROR");
5014
if ((numberOfFields = TSMimeHdrFieldsCount(bufp1, mime_loc1)) == TS_ERROR) {
5015
SDK_RPRINT(test, "TSMimeHdrFieldsClear", "TestCase1", TC_FAIL, "TSMimeHdrFieldsCount returns TS_ERROR");
5017
if (numberOfFields == 0) {
5018
SDK_RPRINT(test, "TSMimeHdrFieldsClear", "TestCase1", TC_PASS, "ok");
5019
test_passed_Mime_Hdr_Fields_Clear = true;
5021
SDK_RPRINT(test, "TSMimeHdrFieldsClear", "TestCase1", TC_FAIL, "Fields still exist");
5024
if ((TSHandleMLocRelease(bufp1, mime_loc1, field_loc11) == TS_ERROR) ||
5025
(TSHandleMLocRelease(bufp1, mime_loc1, field_loc12) == TS_ERROR) ||
5026
(TSHandleMLocRelease(bufp1, mime_loc1, field_loc13) == TS_ERROR) ||
5027
(TSHandleMLocRelease(bufp1, mime_loc1, field_loc14) == TS_ERROR)
5029
SDK_RPRINT(test, "TSMimeHdrFieldsDestroy", "", TC_FAIL, "Unable to release handle using TSHandleMLocRelease");
5033
SDK_RPRINT(test, "TSMimeHdrFieldsClear", "TestCase1", TC_FAIL,
5034
"Cannot run test as Fields have not been inserted in the mime header");
5038
if (test_passed_Mime_Hdr_Create == true) {
5039
if (TSMimeHdrDestroy(bufp1, mime_loc1) == TS_ERROR) {
5040
SDK_RPRINT(test, "TSMimeHdrDestroy", "TestCase1", TC_FAIL, "TSMimeHdrDestroy return TS_ERROR");
5041
SDK_RPRINT(test, "TSMimeHdrDestroy", "TestCase1", TC_FAIL, "Probably TSMimeHdrCreate failed.");
5043
SDK_RPRINT(test, "TSMimeHdrDestroy", "TestCase1", TC_PASS, "ok");
5044
test_passed_Mime_Hdr_Destroy = true;
5046
/** Commented out as Traffic Server was crashing. Will have to look into it. */
5048
if (TSHandleMLocRelease(bufp1,TS_NULL_MLOC,mime_loc1)==TS_ERROR) {
5049
SDK_RPRINT(test,"TSHandleMLocRelease","TSMimeHdrDestroy",TC_FAIL,"unable to release handle using TSHandleMLocRelease");
5053
SDK_RPRINT(test, "TSMimeHdrDestroy", "TestCase1", TC_FAIL, "Cannot run test as TSMimeHdrCreate failed");
5057
if (test_passed_MBuffer_Create == true) {
5058
if (TSMBufferDestroy(bufp1) == TS_ERROR) {
5059
SDK_RPRINT(test, "TSMBufferDestroy", "TestCase1", TC_FAIL, "TSMBufferDestroy return TS_ERROR");
5060
SDK_RPRINT(test, "TSMBufferDestroy", "TestCase1", TC_FAIL, "Probably TSMBufferCreate failed.");
5062
SDK_RPRINT(test, "TSMBufferDestroy", "TestCase1", TC_PASS, "ok");
5063
test_passed_MBuffer_Destroy = true;
5066
SDK_RPRINT(test, "TSMimeHdrDestroy", "TestCase1", TC_FAIL, "Cannot run test as TSMimeHdrCreate failed");
5070
if ((test_passed_MBuffer_Create == true) &&
5071
(test_passed_Mime_Hdr_Create == true) &&
5072
(test_passed_Mime_Hdr_Field_Create == true) &&
5073
(test_passed_Mime_Hdr_Field_Name == true) &&
5074
(test_passed_Mime_Hdr_Field_Append == true) &&
5075
(test_passed_Mime_Hdr_Field_Get == true) &&
5076
(test_passed_Mime_Hdr_Field_Next == true) &&
5077
(test_passed_Mime_Hdr_Fields_Count == true) &&
5078
(test_passed_Mime_Hdr_Field_Value_String_Insert == true) &&
5079
(test_passed_Mime_Hdr_Field_Value_String_Get == true) &&
5080
(test_passed_Mime_Hdr_Field_Value_String_Set == true) &&
5081
(test_passed_Mime_Hdr_Field_Value_Date_Insert == true) &&
5082
(test_passed_Mime_Hdr_Field_Value_Date_Get == true) &&
5083
(test_passed_Mime_Hdr_Field_Value_Date_Set == true) &&
5084
(test_passed_Mime_Hdr_Field_Value_Int_Insert == true) &&
5085
(test_passed_Mime_Hdr_Field_Value_Int_Get == true) &&
5086
(test_passed_Mime_Hdr_Field_Value_Int_Set == true) &&
5087
(test_passed_Mime_Hdr_Field_Value_Uint_Insert == true) &&
5088
(test_passed_Mime_Hdr_Field_Value_Uint_Get == true) &&
5089
(test_passed_Mime_Hdr_Field_Value_Uint_Set == true) &&
5090
(test_passed_Mime_Hdr_Field_Value_Append == true) &&
5091
(test_passed_Mime_Hdr_Field_Value_Delete == true) &&
5092
(test_passed_Mime_Hdr_Field_Values_Clear == true) &&
5093
(test_passed_Mime_Hdr_Field_Values_Count == true) &&
5094
(test_passed_Mime_Hdr_Field_Destroy == true) &&
5095
(test_passed_Mime_Hdr_Fields_Clear == true) &&
5096
(test_passed_Mime_Hdr_Destroy == true) &&
5097
(test_passed_MBuffer_Destroy == true) && (test_passed_Mime_Hdr_Field_Length_Get == true)
5099
*pstatus = REGRESSION_TEST_PASSED;
5101
*pstatus = REGRESSION_TEST_FAILED;
5108
//////////////////////////////////////////////
5109
// SDK_API_TSHttpHdrParse
5111
// Unit Test for API: TSHttpParserCreate
5112
// TSHttpParserDestroy
5113
// TSHttpParserClear
5114
// TSHttpHdrParseReq
5115
// TSHttpHdrParseResp
5116
//////////////////////////////////////////////
5119
convert_http_hdr_to_string(TSMBuffer bufp, TSMLoc hdr_loc)
5121
TSIOBuffer output_buffer;
5122
TSIOBufferReader reader;
5123
int64_t total_avail;
5125
TSIOBufferBlock block;
5126
const char *block_start;
5127
int64_t block_avail;
5129
char *output_string;
5132
output_buffer = TSIOBufferCreate();
5134
if (!output_buffer) {
5135
TSError("couldn't allocate IOBuffer\n");
5138
reader = TSIOBufferReaderAlloc(output_buffer);
5140
/* This will print just MIMEFields and not
5141
the http request line */
5142
TSHttpHdrPrint(bufp, hdr_loc, output_buffer);
5144
/* Find out how the big the complete header is by
5145
seeing the total bytes in the buffer. We need to
5146
look at the buffer rather than the first block to
5147
see the size of the entire header */
5148
total_avail = TSIOBufferReaderAvail(reader);
5150
/* Allocate the string with an extra byte for the string
5152
output_string = (char *) TSmalloc(total_avail + 1);
5155
/* We need to loop over all the buffer blocks to make
5156
sure we get the complete header since the header can
5157
be in multiple blocks */
5158
block = TSIOBufferReaderStart(reader);
5161
block_start = TSIOBufferBlockReadStart(block, reader, &block_avail);
5163
/* We'll get a block pointer back even if there is no data
5164
left to read so check for this condition and break out of
5165
the loop. A block with no data to read means we've exhausted
5166
buffer of data since if there was more data on a later
5167
block in the chain, this block would have been skipped over */
5168
if (block_avail == 0) {
5172
memcpy(output_string + output_len, block_start, block_avail);
5173
output_len += block_avail;
5175
/* Consume the data so that we get to the next block */
5176
TSIOBufferReaderConsume(reader, block_avail);
5178
/* Get the next block now that we've consumed the
5179
data off the last block */
5180
block = TSIOBufferReaderStart(reader);
5183
/* Terminate the string */
5184
output_string[output_len] = '\0';
5187
/* Free up the TSIOBuffer that we used to print out the header */
5188
TSIOBufferReaderFree(reader);
5189
TSIOBufferDestroy(output_buffer);
5191
return output_string;
5194
REGRESSION_TEST(SDK_API_TSHttpHdrParse) (RegressionTest * test, int atype, int *pstatus)
5196
NOWARN_UNUSED(atype);
5198
"GET http://www.example.com/ HTTP/1.1\r\nmimefield1:field1value1,field1value2\r\nmimefield2:field2value1,field2value2\r\n\r\n";
5200
"HTTP/1.1 200 OK\r\n1mimefield:1field1value,1field2value\r\n2mimefield:2field1value,2field2value\r\n\r\n";
5208
TSMBuffer respbufp = (TSMBuffer) TS_ERROR_PTR;
5210
TSMLoc req_hdr_loc = (TSMLoc) TS_ERROR_PTR;
5211
TSMLoc resp_hdr_loc = (TSMLoc) TS_ERROR_PTR;
5213
TSHttpParser parser;
5215
bool test_passed_parse_req = false;
5216
bool test_passed_parse_resp = false;
5217
bool test_passed_parser_clear = false;
5218
bool test_passed_parser_destroy = false;
5219
bool resp_run = true;
5223
parser = TSHttpParserCreate();
5224
if (parser == TS_ERROR_PTR) {
5225
SDK_RPRINT(test, "TSHttpParserCreate", "TestCase1", TC_FAIL, "TSHttpParserCreate returns TS_ERROR_PTR");
5226
SDK_RPRINT(test, "TSHttpParserDestroy", "TestCase1", TC_FAIL, "Unable to run test as TSHttpParserCreate failed");
5227
SDK_RPRINT(test, "TSHttpParserClear", "TestCase1", TC_FAIL, "Unable to run test as TSHttpParserCreate failed");
5228
SDK_RPRINT(test, "TSHttpHdrParseReq", "TestCase1", TC_FAIL, "Unable to run test as TSHttpParserCreate failed");
5229
SDK_RPRINT(test, "TSHttpHdrParseResp", "TestCase1", TC_FAIL, "Unable to run test as TSHttpParserCreate failed");
5231
*pstatus = REGRESSION_TEST_FAILED;
5234
SDK_RPRINT(test, "TSHttpParserCreate", "TestCase1", TC_PASS, "ok");
5238
reqbufp = TSMBufferCreate();
5239
if (reqbufp == TS_ERROR_PTR) {
5240
SDK_RPRINT(test, "TSHttpHdrParseReq", "TestCase1", TC_FAIL, "Cannot create buffer for parsing request");
5242
req_hdr_loc = TSHttpHdrCreate(reqbufp);
5243
if (req_hdr_loc == TS_ERROR_PTR) {
5244
SDK_RPRINT(test, "TSHttpHdrParseReq", "TestCase1", TC_FAIL, "Cannot create Http hdr for parsing request");
5245
if (TSMBufferDestroy(reqbufp) == TS_ERROR) {
5246
SDK_RPRINT(test, "TSHttpHdrParseReq", "TestCase1", TC_FAIL, "Error in Destroying MBuffer");
5250
end = req + strlen(req) + 1;
5251
if ((retval = TSHttpHdrParseReq(parser, reqbufp, req_hdr_loc, &start, end)) == TS_PARSE_ERROR) {
5252
SDK_RPRINT(test, "TSHttpHdrParseReq", "TestCase1", TC_FAIL, "TSHttpHdrParseReq returns TS_PARSE_ERROR");
5254
if (retval == TS_PARSE_DONE) {
5255
test_passed_parse_req = true;
5257
SDK_RPRINT(test, "TSHttpHdrParseReq", "TestCase1", TC_FAIL, "Parsing Error");
5263
if (TSHttpParserClear(parser) == TS_ERROR) {
5264
SDK_RPRINT(test, "TSHttpParserClear", "TestCase1", TC_FAIL, "TSHttpParserClear returns TS_ERROR");
5265
SDK_RPRINT(test, "TSHttpHdrParseResp", "TestCase1", TC_FAIL, "Cannot run test as TSHttpParserClear Failed");
5267
SDK_RPRINT(test, "TSHttpParserClear", "TestCase1", TC_PASS, "ok");
5268
test_passed_parser_clear = true;
5272
if (test_passed_parser_clear == true) {
5273
respbufp = TSMBufferCreate();
5274
if (respbufp == TS_ERROR_PTR) {
5275
SDK_RPRINT(test, "TSHttpHdrParseResp", "TestCase1", TC_FAIL, "Cannot create buffer for parsing response");
5277
resp_hdr_loc = TSHttpHdrCreate(respbufp);
5278
if (resp_hdr_loc == TS_ERROR_PTR) {
5279
SDK_RPRINT(test, "TSHttpHdrParseResp", "TestCase1", TC_FAIL, "Cannot create Http hdr for parsing response");
5280
if (TSMBufferDestroy(respbufp) == TS_ERROR) {
5281
SDK_RPRINT(test, "TSHttpHdrParseResp", "TestCase1", TC_FAIL, "Error in Destroying MBuffer");
5285
end = resp + strlen(resp) + 1;
5286
if ((retval = TSHttpHdrParseResp(parser, respbufp, resp_hdr_loc, &start, end)) == TS_PARSE_ERROR) {
5287
SDK_RPRINT(test, "TSHttpHdrParseReq", "TestCase1", TC_FAIL,
5288
"TSHttpHdrParseReq returns TS_PARSE_ERROR. Maybe an error with TSHttpParserClear.");
5290
if (retval == TS_PARSE_DONE) {
5291
test_passed_parse_resp = true;
5293
SDK_RPRINT(test, "TSHttpHdrParseResp", "TestCase1", TC_FAIL, "Parsing Error");
5302
if (test_passed_parse_req == true) {
5303
temp = convert_http_hdr_to_string(reqbufp, req_hdr_loc);
5304
if (strcmp(req, temp) == 0) {
5305
SDK_RPRINT(test, "TSHttpHdrParseReq", "TestCase1", TC_PASS, "ok");
5307
SDK_RPRINT(test, "TSHttpHdrParseReq", "TestCase1", TC_FAIL, "Incorrect parsing");
5308
test_passed_parse_req = false;
5313
if (test_passed_parse_resp == true) {
5314
temp = convert_http_hdr_to_string(respbufp, resp_hdr_loc);
5315
if (strcmp(resp, temp) == 0) {
5316
SDK_RPRINT(test, "TSHttpHdrParseResp", "TestCase1", TC_PASS, "ok");
5318
SDK_RPRINT(test, "TSHttpHdrParseResp", "TestCase1", TC_FAIL, "Incorrect parsing");
5319
test_passed_parse_resp = false;
5324
if (TSHttpParserDestroy(parser) != TS_SUCCESS) {
5325
SDK_RPRINT(test, "TSHttpParserDestroy", "TestCase1", TC_FAIL, "TSHttpParserDestroy doesn't return TS_SUCCESS");
5327
SDK_RPRINT(test, "TSHttpParserDestroy", "TestCase1", TC_PASS, "ok");
5328
test_passed_parser_destroy = true;
5331
if ((test_passed_parse_req != true) ||
5332
(test_passed_parse_resp != true) || (test_passed_parser_clear != true) || (test_passed_parser_destroy != true)
5334
*pstatus = REGRESSION_TEST_FAILED;
5336
*pstatus = REGRESSION_TEST_PASSED;
5339
TSMimeHdrDestroy(reqbufp, req_hdr_loc);
5340
if (resp_run == true)
5341
TSMimeHdrDestroy(respbufp, resp_hdr_loc);
5343
TSHandleMLocRelease(reqbufp, TS_NULL_MLOC, req_hdr_loc);
5344
if (resp_run == true)
5345
TSHandleMLocRelease(respbufp, TS_NULL_MLOC, resp_hdr_loc);
5347
TSMBufferDestroy(reqbufp);
5348
if (resp_run == true)
5349
TSMBufferDestroy(respbufp);
5357
//////////////////////////////////////////////
5358
// SDK_API_TSMimeHdrParse
5360
// Unit Test for API: TSMimeHdrCopy
5362
// TSMimeHdrFieldCopy
5363
// TSMimeHdrFieldClone
5364
// TSMimeHdrFieldCopyValues
5365
// TSMimeHdrFieldNextDup
5366
// TSMimeHdrFieldRemove
5367
// TSMimeHdrLengthGet
5370
// TSMimeParserClear
5371
// TSMimeParserCreate
5372
// TSMimeParserDestroy
5373
// TSHandleMLocRelease
5374
//////////////////////////////////////////////
5377
convert_mime_hdr_to_string(TSMBuffer bufp, TSMLoc hdr_loc)
5379
TSIOBuffer output_buffer;
5380
TSIOBufferReader reader;
5381
int64_t total_avail;
5383
TSIOBufferBlock block;
5384
const char *block_start;
5385
int64_t block_avail;
5387
char *output_string;
5390
output_buffer = TSIOBufferCreate();
5392
if (!output_buffer) {
5393
TSError("couldn't allocate IOBuffer\n");
5396
reader = TSIOBufferReaderAlloc(output_buffer);
5398
/* This will print just MIMEFields and not
5399
the http request line */
5400
TSMimeHdrPrint(bufp, hdr_loc, output_buffer);
5402
/* Find out how the big the complete header is by
5403
seeing the total bytes in the buffer. We need to
5404
look at the buffer rather than the first block to
5405
see the size of the entire header */
5406
total_avail = TSIOBufferReaderAvail(reader);
5408
/* Allocate the string with an extra byte for the string
5410
output_string = (char *) TSmalloc(total_avail + 1);
5413
/* We need to loop over all the buffer blocks to make
5414
sure we get the complete header since the header can
5415
be in multiple blocks */
5416
block = TSIOBufferReaderStart(reader);
5419
block_start = TSIOBufferBlockReadStart(block, reader, &block_avail);
5421
/* We'll get a block pointer back even if there is no data
5422
left to read so check for this condition and break out of
5423
the loop. A block with no data to read means we've exhausted
5424
buffer of data since if there was more data on a later
5425
block in the chain, this block would have been skipped over */
5426
if (block_avail == 0) {
5430
memcpy(output_string + output_len, block_start, block_avail);
5431
output_len += block_avail;
5433
/* Consume the data so that we get to the next block */
5434
TSIOBufferReaderConsume(reader, block_avail);
5436
/* Get the next block now that we've consumed the
5437
data off the last block */
5438
block = TSIOBufferReaderStart(reader);
5441
/* Terminate the string */
5442
output_string[output_len] = '\0';
5445
/* Free up the TSIOBuffer that we used to print out the header */
5446
TSIOBufferReaderFree(reader);
5447
TSIOBufferDestroy(output_buffer);
5449
return output_string;
5453
compare_field_values(RegressionTest * test, TSMBuffer bufp1, TSMLoc hdr_loc1, TSMLoc field_loc1, TSMBuffer bufp2,
5454
TSMBuffer hdr_loc2, TSMLoc field_loc2, bool first_time)
5461
const char *str1 = NULL;
5462
const char *str2 = NULL;
5467
no_of_values1 = TSMimeHdrFieldValuesCount(bufp1, hdr_loc1, field_loc1);
5468
no_of_values2 = TSMimeHdrFieldValuesCount(bufp2, hdr_loc2, field_loc2);
5469
if ((no_of_values1 == TS_ERROR) || (no_of_values2 == TS_ERROR)) {
5470
SDK_RPRINT(test, "compare_field_values", "TestCase", TC_FAIL, "TSMimeHdrFieldValuesCount returns TS_ERROR");
5474
if (no_of_values1 != no_of_values2) {
5475
SDK_RPRINT(test, "compare_field_values", "TestCase", TC_FAIL, "Field Values not equal");
5479
for (i = 0; i < no_of_values1; i++) {
5480
if ((TSMimeHdrFieldValueStringGet(bufp1, hdr_loc1, field_loc1, i, &str1, &length1) != TS_SUCCESS) ||
5481
(TSMimeHdrFieldValueStringGet(bufp2, hdr_loc2, field_loc2, i, &str2, &length2) != TS_SUCCESS)) {
5482
SDK_RPRINT(test, "compare_field_values", "TestCase", TC_FAIL,
5483
"TSMimeHdrFieldValueStringGet doesn't return TS_SUCCESS");
5486
if (!((length1 == length2) && (strncmp(str1, str2, length1) == 0))) {
5487
SDK_RPRINT(test, "compare_field_values", "TestCase", TC_FAIL, "Field Value %d differ from each other", i);
5496
REGRESSION_TEST(SDK_API_TSMimeHdrParse) (RegressionTest * test, int atype, int *pstatus)
5498
NOWARN_UNUSED(atype);
5499
const char *parse_string =
5500
"field1:field1Value1,field1Value2\r\nfield2:10,-34,45\r\nfield3:field3Value1,23\r\nfield2: 2345, field2Value2\r\n\r\n";
5501
const char *DUPLICATE_FIELD_NAME = "field2";
5502
const char *REMOVE_FIELD_NAME = "field3";
5504
TSMimeParser parser;
5506
TSMBuffer bufp1 = (TSMBuffer) TS_ERROR_PTR;
5507
TSMBuffer bufp2 = (TSMBuffer) TS_ERROR_PTR;
5508
TSMBuffer bufp3 = (TSMBuffer) TS_ERROR_PTR;
5510
TSMLoc mime_hdr_loc1 = (TSMLoc) TS_ERROR_PTR;
5511
TSMLoc mime_hdr_loc2 = (TSMLoc) TS_ERROR_PTR;
5512
TSMLoc mime_hdr_loc3 = (TSMLoc) TS_ERROR_PTR;
5514
TSMLoc field_loc1 = (TSMLoc) TS_ERROR_PTR;
5515
TSMLoc field_loc2 = (TSMLoc) TS_ERROR_PTR;
5524
bool test_passed_parser_create = false;
5525
bool test_passed_parse = false;
5526
bool test_passed_parser_clear = false;
5527
bool test_passed_parser_destroy = false;
5528
bool test_passed_mime_hdr_print = false;
5529
bool test_passed_mime_hdr_length_get = false;
5530
bool test_passed_mime_hdr_field_next_dup = false;
5531
bool test_passed_mime_hdr_copy = false;
5532
bool test_passed_mime_hdr_clone = false;
5533
bool test_passed_mime_hdr_field_remove = false;
5534
bool test_passed_mime_hdr_field_copy = false;
5535
bool test_passed_mime_hdr_field_copy_values = false;
5536
bool test_passed_handle_mloc_release = false;
5537
bool test_passed_mime_hdr_field_find = false;
5540
parser = TSMimeParserCreate();
5541
if (parser == TS_ERROR_PTR) {
5542
SDK_RPRINT(test, "TSMimeParserCreate", "TestCase1", TC_FAIL, "TSMimeParserCreate returns TS_ERROR_PTR");
5544
SDK_RPRINT(test, "TSMimeParserCreate", "TestCase1", TC_PASS, "ok");
5545
test_passed_parser_create = true;
5548
if (test_passed_parser_create == true) {
5550
bufp1 = TSMBufferCreate();
5551
if (bufp1 == TS_ERROR_PTR) {
5552
SDK_RPRINT(test, "TSMimeHdrParse", "TestCase1", TC_FAIL, "Cannot create buffer for parsing");
5553
SDK_RPRINT(test, "TSMimeHdrPrint", "TestCase1", TC_FAIL,
5554
"Cannot run test as unable to create a buffer for parsing");
5555
SDK_RPRINT(test, "TSMimeHdrLengthGet", "TestCase1", TC_FAIL,
5556
"Cannot run test as unable to create a buffer for parsing");
5558
mime_hdr_loc1 = TSMimeHdrCreate(bufp1);
5559
if (mime_hdr_loc1 == TS_ERROR_PTR) {
5560
SDK_RPRINT(test, "TSMimeHdrParse", "TestCase1", TC_FAIL, "Cannot create Mime hdr for parsing");
5561
SDK_RPRINT(test, "TSMimeHdrPrint", "TestCase1", TC_FAIL,
5562
"Cannot run test as unable to create Mime Header for parsing");
5563
SDK_RPRINT(test, "TSMimeHdrLengthGet", "TestCase1", TC_FAIL,
5564
"Cannot run test as unable to create Mime Header for parsing");
5566
if (TSMBufferDestroy(bufp1) == TS_ERROR) {
5567
SDK_RPRINT(test, "TSMimeHdrParse", "TestCase1", TC_FAIL, "Error in Destroying MBuffer");
5570
start = parse_string;
5571
end = parse_string + strlen(parse_string) + 1;
5572
if ((retval = TSMimeHdrParse(parser, bufp1, mime_hdr_loc1, &start, end)) == TS_PARSE_ERROR) {
5573
SDK_RPRINT(test, "TSMimeHdrParse", "TestCase1", TC_FAIL, "TSMimeHdrParse returns TS_PARSE_ERROR");
5574
SDK_RPRINT(test, "TSMimeHdrPrint", "TestCase1", TC_FAIL,
5575
"Cannot run test as TSMimeHdrParse returned Error.");
5576
SDK_RPRINT(test, "TSMimeHdrLengthGet", "TestCase1", TC_FAIL,
5577
"Cannot run test as TSMimeHdrParse returned Error.");
5579
if (retval == TS_PARSE_DONE) {
5580
temp = convert_mime_hdr_to_string(bufp1, mime_hdr_loc1); // Implements TSMimeHdrPrint.
5581
if (strcmp(parse_string, temp) == 0) {
5582
SDK_RPRINT(test, "TSMimeHdrParse", "TestCase1", TC_PASS, "ok");
5583
SDK_RPRINT(test, "TSMimeHdrPrint", "TestCase1", TC_PASS, "ok");
5585
// TSMimeHdrLengthGet
5586
if ((hdrLength = TSMimeHdrLengthGet(bufp1, mime_hdr_loc1)) == TS_ERROR) {
5587
SDK_RPRINT(test, "TSMimeHdrLengthGet", "TestCase1", TC_FAIL, "TSMimeHdrLengthGet returns TS_ERROR");
5589
if (hdrLength == (int) strlen(temp)) {
5590
SDK_RPRINT(test, "TSMimeHdrLengthGet", "TestCase1", TC_PASS, "ok");
5591
test_passed_mime_hdr_length_get = true;
5593
SDK_RPRINT(test, "TSMimeHdrLengthGet", "TestCase1", TC_FAIL, "Value's Mismatch");
5597
test_passed_parse = true;
5598
test_passed_mime_hdr_print = true;
5600
SDK_RPRINT(test, "TSMimeHdrParse|TSMimeHdrPrint", "TestCase1", TC_FAIL,
5601
"Incorrect parsing or incorrect Printing");
5602
SDK_RPRINT(test, "TSMimeHdrLengthGet", "TestCase1", TC_FAIL,
5603
"Cannot run test as TSMimeHdrParse|TSMimeHdrPrint failed.");
5608
SDK_RPRINT(test, "TSMimeHdrParse", "TestCase1", TC_FAIL, "Parsing Error");
5609
SDK_RPRINT(test, "TSMimeHdrPrint", "TestCase1", TC_FAIL,
5610
"Cannot run test as TSMimeHdrParse returned error.");
5611
SDK_RPRINT(test, "TSMimeHdrLengthGet", "TestCase1", TC_FAIL,
5612
"Cannot run test as TSMimeHdrParse returned error.");
5618
SDK_RPRINT(test, "TSMimeHdrParse", "TestCase1", TC_FAIL, "Cannot run test as unable to create a parser");
5619
SDK_RPRINT(test, "TSMimeHdrPrint", "TestCase1", TC_FAIL, "Cannot run test as unable to create a parser");
5620
SDK_RPRINT(test, "TSMimeHdrLengthGet", "TestCase1", TC_FAIL, "Cannot run test as unable to create a parser");
5624
// HOW DO I CHECK FOR PARSER CLEAR????
5625
if (test_passed_parser_create == true) {
5626
if (TSMimeParserClear(parser) == TS_ERROR) {
5627
SDK_RPRINT(test, "TSMimeParserClear", "TestCase1", TC_FAIL, "TSMimeParserClear returns TS_ERROR");
5629
SDK_RPRINT(test, "TSMimeParserClear", "TestCase1", TC_PASS, "ok");
5630
test_passed_parser_clear = true;
5633
SDK_RPRINT(test, "TSMimeParserClear", "TestCase1", TC_FAIL, "Cannot run test as unable to create a parser");
5637
if (test_passed_parser_create == true) {
5638
if (TSMimeParserDestroy(parser) != TS_SUCCESS) {
5639
SDK_RPRINT(test, "TSMimeParserDestroy", "TestCase1", TC_FAIL, "TSMimeParserDestroy doesn't return TS_SUCCESS");
5641
SDK_RPRINT(test, "TSMimeParserDestroy", "TestCase1", TC_PASS, "ok");
5642
test_passed_parser_destroy = true;
5645
SDK_RPRINT(test, "TSMimeParserDestroy", "TestCase1", TC_FAIL, "Cannot run test as unable to create a parser");
5648
//TSMimeHdrFieldNextDup
5649
if (test_passed_parse == true) {
5650
if ((field_loc1 = TSMimeHdrFieldFind(bufp1, mime_hdr_loc1, DUPLICATE_FIELD_NAME, -1)) == TS_ERROR_PTR) {
5651
SDK_RPRINT(test, "TSMimeHdrFieldNextDup", "TestCase1", TC_FAIL, "TSMimeHdrFieldFind returns TS_ERROR_PTR");
5652
SDK_RPRINT(test, "TSMimeHdrFieldFind", "TestCase1", TC_PASS, "TSMimeHdrFieldFind returns TS_ERROR_PTR");
5654
const char *fieldName;
5656
if ((fieldName = TSMimeHdrFieldNameGet(bufp1, mime_hdr_loc1, field_loc1, &length)) != TS_ERROR_PTR) {
5657
if (strncmp(fieldName, DUPLICATE_FIELD_NAME, length) == 0) {
5658
SDK_RPRINT(test, "TSMimeHdrFieldFind", "TestCase1", TC_PASS, "ok");
5659
test_passed_mime_hdr_field_find = true;
5661
SDK_RPRINT(test, "TSMimeHdrFieldFind", "TestCase1", TC_PASS,
5662
"TSMimeHdrFieldFind returns incorrect field pointer");
5665
SDK_RPRINT(test, "TSMimeHdrFieldFind", "TestCase1", TC_PASS, "TSMimeHdrFieldNameGet returns TS_ERROR_PTR");
5668
if ((field_loc2 = TSMimeHdrFieldNextDup(bufp1, mime_hdr_loc1, field_loc1)) == TS_ERROR_PTR) {
5669
SDK_RPRINT(test, "TSMimeHdrFieldNextDup", "TestCase1", TC_FAIL,
5670
"TSMimeHdrFieldNextDup returns TS_ERROR_PTR");
5672
if (compare_field_names(test, bufp1, mime_hdr_loc1, field_loc1, bufp1, mime_hdr_loc1, field_loc2) == TS_ERROR) {
5673
SDK_RPRINT(test, "TSMimeHdrFieldNextDup", "TestCase1", TC_FAIL, "Incorrect Pointer");
5675
SDK_RPRINT(test, "TSMimeHdrFieldNextDup", "TestCase1", TC_PASS, "ok");
5676
test_passed_mime_hdr_field_next_dup = true;
5680
// TSHandleMLocRelease
5681
if (TSHandleMLocRelease(bufp1, mime_hdr_loc1, field_loc1) == TS_ERROR) {
5682
SDK_RPRINT(test, "TSHandleMLocRelease", "TestCase1", TC_FAIL, "TSHandleMLocRelease returns TS_ERROR");
5684
SDK_RPRINT(test, "TSHandleMLocRelease", "TestCase1", TC_PASS, "ok");
5685
test_passed_handle_mloc_release = true;
5688
if ((field_loc2 != NULL) && (field_loc2 != TS_ERROR_PTR)) {
5689
if (TSHandleMLocRelease(bufp1, mime_hdr_loc1, field_loc2) == TS_ERROR) {
5690
SDK_RPRINT(test, "TSHandleMLocRelease", "TestCase2", TC_FAIL, "TSHandleMLocRelease returns TS_ERROR");
5691
test_passed_handle_mloc_release = false;
5693
SDK_RPRINT(test, "TSHandleMLocRelease", "TestCase2", TC_PASS, "ok");
5698
SDK_RPRINT(test, "TSMimeHdrFieldNext", "TestCase1", TC_FAIL, "Unable to run test as parsing failed.");
5702
if (test_passed_parse == true) {
5704
bufp2 = TSMBufferCreate();
5705
if (bufp2 == TS_ERROR_PTR) {
5706
SDK_RPRINT(test, "TSMimeHdrCopy", "TestCase1", TC_FAIL, "Cannot create buffer for copying.");
5708
mime_hdr_loc2 = TSMimeHdrCreate(bufp2);
5709
if (mime_hdr_loc2 == TS_ERROR_PTR) {
5710
SDK_RPRINT(test, "TSMimeHdrCopy", "TestCase1", TC_FAIL, "Cannot create Mime hdr for copying");
5711
if (TSMBufferDestroy(bufp2) == TS_ERROR) {
5712
SDK_RPRINT(test, "TSMimeHdrCopy", "TestCase1", TC_FAIL, "Error in Destroying MBuffer");
5715
if (TSMimeHdrCopy(bufp2, mime_hdr_loc2, bufp1, mime_hdr_loc1) == TS_ERROR) {
5716
SDK_RPRINT(test, "TSMimeHdrCopy", "TestCase1", TC_FAIL, "TSMimeHdrCopy returns TS_ERROR");
5718
temp = convert_mime_hdr_to_string(bufp2, mime_hdr_loc2); // Implements TSMimeHdrPrint.
5719
if (strcmp(parse_string, temp) == 0) {
5720
SDK_RPRINT(test, "TSMimeHdrCopy", "TestCase1", TC_PASS, "ok");
5721
test_passed_mime_hdr_copy = true;
5723
SDK_RPRINT(test, "TSMimeHdrCopy", "TestCase1", TC_FAIL, "Value's Mismatch");
5730
SDK_RPRINT(test, "TSMimeHdrCopy", "TestCase1", TC_FAIL, "Unable to run test as parsing failed.");
5733
bufp3 = TSMBufferCreate();
5734
mime_hdr_loc3 = TSMimeHdrCreate(bufp3);
5735
test_passed_mime_hdr_clone = true;
5737
// TSMimeHdrFieldRemove
5738
if (test_passed_mime_hdr_copy == true) {
5739
if ((field_loc1 = TSMimeHdrFieldFind(bufp2, mime_hdr_loc2, REMOVE_FIELD_NAME, -1)) == TS_ERROR_PTR) {
5740
SDK_RPRINT(test, "TSMimeHdrFieldRemove", "TestCase1", TC_FAIL, "TSMimeHdrFieldFind returns TS_ERROR_PTR");
5742
if (TSMimeHdrFieldRemove(bufp2, mime_hdr_loc2, field_loc1) == TS_ERROR) {
5743
SDK_RPRINT(test, "TSMimeHdrFieldRemove", "TestCase1", TC_FAIL, "TSMimeHdrFieldRemove returns TS_ERROR_PTR");
5745
if ((field_loc2 = TSMimeHdrFieldFind(bufp2, mime_hdr_loc2, REMOVE_FIELD_NAME, -1)) == TS_ERROR_PTR) {
5746
SDK_RPRINT(test, "TSMimeHdrFieldRemove", "TestCase1", TC_FAIL, "TSMimeHdrFieldFind returns TS_ERROR_PTR");
5748
if ((field_loc2 == NULL) || (field_loc1 != field_loc2)) {
5749
test_passed_mime_hdr_field_remove = true;
5751
SDK_RPRINT(test, "TSMimeHdrFieldRemove", "TestCase1", TC_FAIL, "Field Not Removed");
5754
if ((test_passed_mime_hdr_field_remove == true)) {
5755
if (TSMimeHdrFieldAppend(bufp2, mime_hdr_loc2, field_loc1) == TS_ERROR) {
5756
SDK_RPRINT(test, "TSMimeHdrFieldRemove", "TestCase1", TC_FAIL,
5757
"Unable to readd the field to mime header. Probably destroyed");
5758
test_passed_mime_hdr_field_remove = false;
5760
SDK_RPRINT(test, "TSMimeHdrFieldRemove", "TestCase1", TC_PASS, "ok");
5766
// TSHandleMLocRelease
5767
if (TSHandleMLocRelease(bufp2, mime_hdr_loc2, field_loc1) == TS_ERROR) {
5768
SDK_RPRINT(test, "TSHandleMLocRelease", "TestCase3", TC_FAIL, "TSHandleMLocRelease returns TS_ERROR");
5769
test_passed_handle_mloc_release = false;
5771
SDK_RPRINT(test, "TSHandleMLocRelease", "TestCase3", TC_PASS, "ok");
5774
if ((field_loc2 != NULL) && (field_loc2 != TS_ERROR_PTR)) {
5775
if (TSHandleMLocRelease(bufp2, mime_hdr_loc2, field_loc2) == TS_ERROR) {
5776
SDK_RPRINT(test, "TSHandleMLocRelease", "TestCase4", TC_FAIL, "TSHandleMLocRelease returns TS_ERROR");
5777
test_passed_handle_mloc_release = false;
5779
SDK_RPRINT(test, "TSHandleMLocRelease", "TestCase4", TC_PASS, "ok");
5784
SDK_RPRINT(test, "TSMimeHdrFieldNext", "TestCase1", TC_FAIL, "Unable to run test as parsing failed.");
5787
// TSMimeHdrFieldCopy
5788
if (test_passed_mime_hdr_copy == true) {
5789
if ((field_loc1 = TSMimeHdrFieldCreate(bufp2, mime_hdr_loc2)) == TS_ERROR_PTR) {
5790
SDK_RPRINT(test, "TSMimeHdrFieldCopy", "TestCase1", TC_FAIL, "Unable to create field for Copying");
5792
if ((field_loc2 = TSMimeHdrFieldGet(bufp1, mime_hdr_loc1, 0)) == TS_ERROR_PTR) {
5793
SDK_RPRINT(test, "TSMimeHdrFieldCopy", "TestCase1", TC_FAIL, "Unable to get source field for copying");
5795
if (TSMimeHdrFieldCopy(bufp2, mime_hdr_loc2, field_loc1, bufp1, mime_hdr_loc1, field_loc2) == TS_ERROR) {
5796
SDK_RPRINT(test, "TSMimeHdrFieldCopy", "TestCase1", TC_FAIL, "TSMimeHdrFieldCopy returns TS_ERROR");
5798
if ((compare_field_names(test, bufp2, mime_hdr_loc2, field_loc1, bufp1, mime_hdr_loc1, field_loc2) == TS_ERROR) ||
5799
(compare_field_values(test, bufp2, mime_hdr_loc2, field_loc1, bufp1, mime_hdr_loc1, field_loc2, true) == TS_ERROR)) {
5800
SDK_RPRINT(test, "TSMimeHdrFieldCopy", "TestCase1", TC_FAIL, "Value's Mismatch");
5802
SDK_RPRINT(test, "TSMimeHdrFieldCopy", "TestCase1", TC_PASS, "ok");
5803
test_passed_mime_hdr_field_copy = true;
5807
if (TSHandleMLocRelease(bufp2, mime_hdr_loc2, field_loc1) == TS_ERROR) {
5808
SDK_RPRINT(test, "TSHandleMLocRelease", "TestCase5", TC_FAIL, "TSHandleMLocRelease returns TS_ERROR");
5809
test_passed_handle_mloc_release = false;
5811
SDK_RPRINT(test, "TSHandleMLocRelease", "TestCase5", TC_PASS, "ok");
5814
if ((field_loc2 != NULL) && (field_loc2 != TS_ERROR_PTR)) {
5815
if (TSHandleMLocRelease(bufp1, mime_hdr_loc1, field_loc2) == TS_ERROR) {
5816
SDK_RPRINT(test, "TSHandleMLocRelease", "TestCase6", TC_FAIL, "TSHandleMLocRelease returns TS_ERROR");
5817
test_passed_handle_mloc_release = false;
5819
SDK_RPRINT(test, "TSHandleMLocRelease", "TestCase6", TC_PASS, "ok");
5824
SDK_RPRINT(test, "TSMimeHdrFieldCopy", "TestCase1", TC_FAIL,
5825
"Unable to run test as bufp2 might not have been created");
5828
// TSMimeHdrFieldClone
5829
if (test_passed_mime_hdr_clone == true) {
5832
if ((field_loc2 = TSMimeHdrFieldGet(bufp1, mime_hdr_loc1, 0)) == TS_ERROR_PTR) {
5833
SDK_RPRINT(test, "TSMimeHdrFieldClone", "TestCase1", TC_FAIL, "Unable to get source field for copying");
5835
if ((field_loc1 = TSMimeHdrFieldClone(bufp3, mime_hdr_loc3, bufp1, mime_hdr_loc1, field_loc2)) == TS_ERROR_PTR) {
5836
SDK_RPRINT(test, "TSMimeHdrFieldClone", "TestCase1", TC_FAIL, "TSMimeHdrFieldClone returns TS_ERROR_PTR");
5838
if ((compare_field_names(test, bufp3, mime_hdr_loc3, field_loc1, bufp1, mime_hdr_loc1, field_loc2) == TS_ERROR) ||
5839
(compare_field_values(test, bufp3, mime_hdr_loc3, field_loc1, bufp1, mime_hdr_loc1, field_loc2, true) == TS_ERROR)) {
5840
SDK_RPRINT(test, "TSMimeHdrFieldClone", "TestCase1", TC_FAIL, "Value's Mismatch");
5842
SDK_RPRINT(test, "TSMimeHdrFieldClone", "TestCase1", TC_PASS, "ok");
5846
if ((field_loc1 != NULL) && (field_loc1 != TS_ERROR_PTR)) {
5847
if (TSHandleMLocRelease(bufp3, mime_hdr_loc3, field_loc1) == TS_ERROR) {
5848
SDK_RPRINT(test, "TSHandleMLocRelease", "TestCase7", TC_FAIL, "TSHandleMLocRelease returns TS_ERROR");
5849
test_passed_handle_mloc_release = false;
5851
SDK_RPRINT(test, "TSHandleMLocRelease", "TestCase7", TC_PASS, "ok");
5855
if ((field_loc2 != NULL) && (field_loc2 != TS_ERROR_PTR)) {
5856
if (TSHandleMLocRelease(bufp1, mime_hdr_loc1, field_loc2) == TS_ERROR) {
5857
SDK_RPRINT(test, "TSHandleMLocRelease", "TestCase8", TC_FAIL, "TSHandleMLocRelease returns TS_ERROR");
5858
test_passed_handle_mloc_release = false;
5860
SDK_RPRINT(test, "TSHandleMLocRelease", "TestCase8", TC_PASS, "ok");
5864
SDK_RPRINT(test, "TSMimeHdrFieldClone", "TestCase1", TC_FAIL,
5865
"Unable to run test as bufp3 might not have been created");
5868
// TSMimeHdrFieldCopyValues
5869
if (test_passed_mime_hdr_copy == true) {
5870
if ((field_loc1 = TSMimeHdrFieldCreate(bufp2, mime_hdr_loc2)) == TS_ERROR_PTR) {
5871
SDK_RPRINT(test, "TSMimeHdrFieldCopyValues", "TestCase1", TC_FAIL, "Unable to create field for Copying");
5873
if ((field_loc2 = TSMimeHdrFieldGet(bufp1, mime_hdr_loc1, 0)) == TS_ERROR_PTR) {
5874
SDK_RPRINT(test, "TSMimeHdrFieldCopyValues", "TestCase1", TC_FAIL, "Unable to get source field for copying");
5876
if (TSMimeHdrFieldCopyValues(bufp2, mime_hdr_loc2, field_loc1, bufp1, mime_hdr_loc1, field_loc2) == TS_ERROR) {
5877
SDK_RPRINT(test, "TSMimeHdrFieldCopyValues", "TestCase1", TC_FAIL, "TSMimeHdrFieldCopy returns TS_ERROR");
5879
if (compare_field_values(test, bufp2, mime_hdr_loc2, field_loc1, bufp1, mime_hdr_loc1, field_loc2, false) == TS_ERROR) {
5880
SDK_RPRINT(test, "TSMimeHdrFieldCopyValues", "TestCase1", TC_FAIL, "Value's Mismatch");
5882
SDK_RPRINT(test, "TSMimeHdrFieldCopyValues", "TestCase1", TC_PASS, "ok");
5883
test_passed_mime_hdr_field_copy_values = true;
5887
if (TSHandleMLocRelease(bufp2, mime_hdr_loc2, field_loc1) == TS_ERROR) {
5888
SDK_RPRINT(test, "TSHandleMLocRelease", "TestCase9", TC_FAIL, "TSHandleMLocRelease returns TS_ERROR");
5889
test_passed_handle_mloc_release = false;
5891
SDK_RPRINT(test, "TSHandleMLocRelease", "TestCase9", TC_PASS, "ok");
5894
if ((field_loc2 != NULL) && (field_loc2 != TS_ERROR_PTR)) {
5895
if (TSHandleMLocRelease(bufp1, mime_hdr_loc1, field_loc2) == TS_ERROR) {
5896
SDK_RPRINT(test, "TSHandleMLocRelease", "TestCase10", TC_FAIL, "TSHandleMLocRelease returns TS_ERROR");
5897
test_passed_handle_mloc_release = false;
5899
SDK_RPRINT(test, "TSHandleMLocRelease", "TestCase10", TC_PASS, "ok");
5904
SDK_RPRINT(test, "TSMimeHdrFieldCopy", "TestCase1", TC_FAIL,
5905
"Unable to run test as bufp2 might not have been created");
5908
if ((TSMimeHdrDestroy(bufp1, mime_hdr_loc1) == TS_ERROR) ||
5909
(TSMimeHdrDestroy(bufp2, mime_hdr_loc2) == TS_ERROR) || (TSMimeHdrDestroy(bufp3, mime_hdr_loc3) == TS_ERROR)
5911
SDK_RPRINT(test, "", "TestCase", TC_FAIL, "TSMimeHdrDestroy returns TS_ERROR");
5914
if ((TSHandleMLocRelease(bufp1, TS_NULL_MLOC, mime_hdr_loc1) == TS_ERROR) ||
5915
(TSHandleMLocRelease(bufp2, TS_NULL_MLOC, mime_hdr_loc2) == TS_ERROR) ||
5916
(TSHandleMLocRelease(bufp3, TS_NULL_MLOC, mime_hdr_loc3) == TS_ERROR)
5918
SDK_RPRINT(test, "TSHandleMLocRelease", "TestCase11|12|13", TC_FAIL, "Unable to release handle to Mime Hdrs");
5919
test_passed_handle_mloc_release = false;
5922
if ((TSMBufferDestroy(bufp1) == TS_ERROR) ||
5923
(TSMBufferDestroy(bufp2) == TS_ERROR) || (TSMBufferDestroy(bufp3) == TS_ERROR)
5925
SDK_RPRINT(test, "", "TestCase", TC_FAIL, "TSMBufferDestroy returns TS_ERROR");
5928
if ((test_passed_parser_create != true) ||
5929
(test_passed_parse != true) ||
5930
(test_passed_parser_clear != true) ||
5931
(test_passed_parser_destroy != true) ||
5932
(test_passed_mime_hdr_print != true) ||
5933
(test_passed_mime_hdr_length_get != true) ||
5934
(test_passed_mime_hdr_field_next_dup != true) ||
5935
(test_passed_mime_hdr_copy != true) ||
5936
(test_passed_mime_hdr_clone != true) ||
5937
(test_passed_mime_hdr_field_remove != true) ||
5938
(test_passed_mime_hdr_field_copy != true) ||
5939
(test_passed_mime_hdr_field_copy_values != true) ||
5940
(test_passed_handle_mloc_release != true) ||
5941
(test_passed_mime_hdr_field_find != true)
5943
*pstatus = REGRESSION_TEST_FAILED;
5945
*pstatus = REGRESSION_TEST_PASSED;
5950
//////////////////////////////////////////////
5951
// SDK_API_TSUrlParse
5953
// Unit Test for API: TSUrlParse
5954
//////////////////////////////////////////////
5956
REGRESSION_TEST(SDK_API_TSUrlParse) (RegressionTest * test, int atype, int *pstatus)
5958
NOWARN_UNUSED(atype);
5959
const char *url = "http://abc:def@www.example.com:3426/homepage.cgi;ab?abc=def#abc";
5967
TSMLoc url_loc = (TSMLoc) TS_ERROR_PTR;
5968
bool test_passed_parse_url = false;
5971
*pstatus = REGRESSION_TEST_INPROGRESS;
5974
bufp = TSMBufferCreate();
5975
if (bufp == TS_ERROR_PTR) {
5976
SDK_RPRINT(test, "TSUrlParse", "TestCase1", TC_FAIL, "Cannot create buffer for parsing url");
5978
url_loc = TSUrlCreate(bufp);
5979
if (url_loc == TS_ERROR_PTR) {
5980
SDK_RPRINT(test, "TSUrlParse", "TestCase1", TC_FAIL, "Cannot create Url for parsing the url");
5981
if (TSMBufferDestroy(bufp) == TS_ERROR) {
5982
SDK_RPRINT(test, "TSUrlParse", "TestCase1", TC_FAIL, "Error in Destroying MBuffer");
5986
end = url + strlen(url) + 1;
5987
if ((retval = TSUrlParse(bufp, url_loc, &start, end)) == TS_PARSE_ERROR) {
5988
SDK_RPRINT(test, "TSUrlParse", "TestCase1", TC_FAIL, "TSUrlParse returns TS_PARSE_ERROR");
5990
if (retval == TS_PARSE_DONE) {
5991
temp = TSUrlStringGet(bufp, url_loc, &length);
5992
if (temp == TS_ERROR_PTR) {
5993
SDK_RPRINT(test, "TSUrlParse", "TestCase1", TC_FAIL, "TSUrlStringGet returns TS_ERROR_PTR");
5995
if (strncmp(url, temp, length) == 0) {
5996
SDK_RPRINT(test, "TSUrlParse", "TestCase1", TC_PASS, "ok");
5997
test_passed_parse_url = true;
5999
SDK_RPRINT(test, "TSUrlParse", "TestCase1", TC_FAIL, "Value's Mismatch");
6004
SDK_RPRINT(test, "TSHttpHdrParseReq", "TestCase1", TC_FAIL, "Parsing Error");
6010
if (test_passed_parse_url != true) {
6011
*pstatus = REGRESSION_TEST_FAILED;
6013
*pstatus = REGRESSION_TEST_PASSED;
6016
TSUrlDestroy(bufp, url_loc);
6018
TSHandleMLocRelease(bufp, TS_NULL_MLOC, url_loc);
6020
TSMBufferDestroy(bufp);
6025
//////////////////////////////////////////////
6026
// SDK_API_TSTextLog
6028
// Unit Test for APIs: TSTextLogObjectCreate
6029
// TSTextLogObjectWrite
6030
// TSTextLogObjectDestroy
6031
// TSTextLogObjectFlush
6032
//////////////////////////////////////////////
6033
#define LOG_TEST_PATTERN "SDK team rocks"
6037
RegressionTest *test;
6039
char *fullpath_logname;
6040
unsigned long magic;
6045
log_test_handler(TSCont contp, TSEvent event, void *edata)
6047
NOWARN_UNUSED(edata);
6052
TSAssert(event == TS_EVENT_TIMEOUT);
6054
LogTestData *data = (LogTestData *) TSContDataGet(contp);
6055
TSAssert(data->magic == MAGIC_ALIVE);
6057
// Verify content was correctly written into log file
6059
if ((filep = TSfopen(data->fullpath_logname, "r")) == NULL) {
6060
SDK_RPRINT(data->test, "TSTextLogObject", "TestCase1", TC_FAIL, "can not open log file %s", data->fullpath_logname);
6061
*(data->pstatus) = REGRESSION_TEST_FAILED;
6066
while (TSfgets(filep, buf, 1024) != NULL) {
6067
if (strstr(buf, LOG_TEST_PATTERN) != NULL) {
6073
if (str_found == false) {
6074
SDK_RPRINT(data->test, "TSTextLogObject", "TestCase1", TC_FAIL, "can not find pattern %s in log file", LOG_TEST_PATTERN);
6075
*(data->pstatus) = REGRESSION_TEST_FAILED;
6079
*(data->pstatus) = REGRESSION_TEST_PASSED;
6081
data->magic = MAGIC_DEAD;
6082
TSfree(data->fullpath_logname);
6089
REGRESSION_TEST(SDK_API_TSTextLog) (RegressionTest * test, int atype, int *pstatus)
6091
NOWARN_UNUSED(atype);
6092
*pstatus = REGRESSION_TEST_INPROGRESS;
6094
TSTextLogObject log;
6095
TSReturnCode retVal;
6098
char fullpath_logname[128];
6100
/* Generate a random log file name, so if we run the test several times, we won't use the
6101
same log file name. */
6102
char *tmp = REC_ConfigReadString("proxy.config.log.logfile_dir");
6103
snprintf(logname, sizeof(logname), "RegressionTestLog%d.log", (int) getpid());
6104
snprintf(fullpath_logname, sizeof(fullpath_logname), "%s/%s", tmp, logname);
6107
retVal = TSTextLogObjectCreate(logname, TS_LOG_MODE_ADD_TIMESTAMP, &log);
6108
if (retVal != TS_SUCCESS) {
6109
SDK_RPRINT(test, "TSTextLogObjectCreate", "TestCase1", TC_FAIL, "can not create log object");
6110
*pstatus = REGRESSION_TEST_FAILED;
6113
SDK_RPRINT(test, "TSTextLogObjectCreate", "TestCase1", TC_PASS, "ok");
6116
retVal = TSTextLogObjectWrite(log, (char*)LOG_TEST_PATTERN);
6117
if (retVal != TS_SUCCESS) {
6118
SDK_RPRINT(test, "TSTextLogObjectWrite", "TestCase1", TC_FAIL, "can not write to log object");
6119
*pstatus = REGRESSION_TEST_FAILED;
6122
SDK_RPRINT(test, "TSTextLogObjectWrite", "TestCase1", TC_PASS, "ok");
6125
retVal = TSTextLogObjectFlush(log);
6126
if (retVal != TS_SUCCESS) {
6127
SDK_RPRINT(test, "TSTextLogObjectFlush", "TestCase1", TC_FAIL, "can not flush log object");
6128
*pstatus = REGRESSION_TEST_FAILED;
6131
SDK_RPRINT(test, "TSTextLogObjectFlush", "TestCase1", TC_PASS, "ok");
6134
retVal = TSTextLogObjectDestroy(log);
6135
if (retVal != TS_SUCCESS) {
6136
SDK_RPRINT(test, "TSTextLogObjectDestroy", "TestCase1", TC_FAIL, "can not destroy log object");
6137
*pstatus = REGRESSION_TEST_FAILED;
6140
SDK_RPRINT(test, "TSTextLogObjectDestroy", "TestCase1", TC_PASS, "ok");
6144
TSCont log_test_cont = TSContCreate(log_test_handler, TSMutexCreate());
6145
LogTestData *data = (LogTestData *) TSmalloc(sizeof(LogTestData));
6147
data->pstatus = pstatus;
6148
data->fullpath_logname = TSstrdup(fullpath_logname);
6149
data->magic = MAGIC_ALIVE;
6150
TSContDataSet(log_test_cont, data);
6152
TSContSchedule(log_test_cont, 5000, TS_THREAD_POOL_DEFAULT);
6157
//////////////////////////////////////////////
6158
// SDK_API_TSMgmtGet
6160
// Unit Test for APIs: TSMgmtCounterGet
6164
//////////////////////////////////////////////
6166
REGRESSION_TEST(SDK_API_TSMgmtGet) (RegressionTest * test, int atype, int *pstatus)
6168
NOWARN_UNUSED(atype);
6169
const char *CONFIG_PARAM_COUNTER_NAME = "proxy.process.http.total_parent_proxy_connections";
6170
int CONFIG_PARAM_COUNTER_VALUE = 0;
6172
const char *CONFIG_PARAM_FLOAT_NAME = "proxy.config.http.background_fill_completed_threshold";
6173
float CONFIG_PARAM_FLOAT_VALUE = 0.5;
6175
const char *CONFIG_PARAM_INT_NAME = "proxy.config.http.cache.http";
6176
int CONFIG_PARAM_INT_VALUE = 1;
6178
const char *CONFIG_PARAM_STRING_NAME = "proxy.config.product_name";
6179
const char *CONFIG_PARAM_STRING_VALUE = "Traffic Server";
6181
*pstatus = REGRESSION_TEST_INPROGRESS;
6185
TSMgmtCounter cvalue = 0;
6186
TSMgmtFloat fvalue = 0.0;
6187
TSMgmtInt ivalue = -1;
6188
TSMgmtString svalue = NULL;
6190
retVal = TSMgmtCounterGet(CONFIG_PARAM_COUNTER_NAME, &cvalue);
6192
SDK_RPRINT(test, "TSMgmtCounterGet", "TestCase1.1", TC_FAIL, "can not get value of param %s",
6193
CONFIG_PARAM_COUNTER_NAME);
6195
} else if (cvalue != CONFIG_PARAM_COUNTER_VALUE) {
6196
SDK_RPRINT(test, "TSMgmtCounterGet", "TestCase1.1", TC_FAIL,
6197
"got incorrect value of param %s, should have been %d, found %d", CONFIG_PARAM_COUNTER_NAME,
6198
CONFIG_PARAM_COUNTER_VALUE, cvalue);
6201
SDK_RPRINT(test, "TSMgmtCounterGet", "TestCase1.1", TC_PASS, "ok");
6204
retVal = TSMgmtFloatGet(CONFIG_PARAM_FLOAT_NAME, &fvalue);
6205
if ((retVal == 0) || (fvalue != CONFIG_PARAM_FLOAT_VALUE)) {
6206
SDK_RPRINT(test, "TSMgmtFloatGet", "TestCase2", TC_FAIL, "can not get value of param %s", CONFIG_PARAM_FLOAT_NAME);
6209
SDK_RPRINT(test, "TSMgmtFloatGet", "TestCase1.2", TC_PASS, "ok");
6212
retVal = TSMgmtIntGet(CONFIG_PARAM_INT_NAME, &ivalue);
6213
if ((retVal == 0) || (ivalue != CONFIG_PARAM_INT_VALUE)) {
6214
SDK_RPRINT(test, "TSMgmtIntGet", "TestCase1.3", TC_FAIL, "can not get value of param %s", CONFIG_PARAM_INT_NAME);
6217
SDK_RPRINT(test, "TSMgmtIntGet", "TestCase1.3", TC_PASS, "ok");
6220
retVal = TSMgmtStringGet(CONFIG_PARAM_STRING_NAME, &svalue);
6222
SDK_RPRINT(test, "TSMgmtStringGet", "TestCase1.4", TC_FAIL, "can not get value of param %s",
6223
CONFIG_PARAM_STRING_NAME);
6225
} else if (strcmp(svalue, CONFIG_PARAM_STRING_VALUE) != 0) {
6226
SDK_RPRINT(test, "TSMgmtStringGet", "TestCase1.4", TC_FAIL,
6227
"got incorrect value of param %s, should have been \"%s\", found \"%s\"", CONFIG_PARAM_STRING_NAME,
6228
CONFIG_PARAM_STRING_VALUE, svalue);
6231
SDK_RPRINT(test, "TSMgmtStringGet", "TestCase1.4", TC_PASS, "ok");
6235
*pstatus = REGRESSION_TEST_FAILED;
6239
*pstatus = REGRESSION_TEST_PASSED;
6240
SDK_RPRINT(test, "TSMgmtGet", "TestCase1", TC_PASS, "ok");
6245
//////////////////////////////////////////////
6246
// SDK_API_TSMgmtUpdateRegister
6248
// Unit Test for APIs: TSMgmtUpdateRegister
6250
// FIX ME: How to test this API automatically
6251
// as it requires a GUI action ??
6252
//////////////////////////////////////////////
6254
// dummy handler. Should never get called.
6256
gui_update_handler(TSCont contp, TSEvent event, void *edata)
6258
NOWARN_UNUSED(contp);
6259
NOWARN_UNUSED(event);
6260
NOWARN_UNUSED(edata);
6261
TSReleaseAssert(!"gui_update_handler should not be called");
6265
REGRESSION_TEST(SDK_API_TSMgmtUpdateRegister) (RegressionTest * test, int atype, int *pstatus)
6267
NOWARN_UNUSED(atype);
6268
*pstatus = REGRESSION_TEST_INPROGRESS;
6270
TSCont mycont = TSContCreate(gui_update_handler, TSMutexCreate());
6272
if (TSMgmtUpdateRegister(mycont, "myPlugin", "myPluginPath/myGui.cgi") != TS_SUCCESS) {
6273
SDK_RPRINT(test, "TSMgmtUpdateRegister", "TestCase1", TC_FAIL, "can not register plugin interface");
6274
*pstatus = REGRESSION_TEST_FAILED;
6276
*pstatus = REGRESSION_TEST_PASSED;
6282
//////////////////////////////////////////////
6283
// SDK_API_TSConstant
6285
// Unit Test for APIs: All TS_XXX constants
6287
//////////////////////////////////////////////
6289
#define PRINT_DIFF( _x ) \
6291
if ( _x - ORIG_##_x != 0) { \
6292
test_passed = false; \
6293
SDK_RPRINT (test, "##_x", "TestCase1", TC_FAIL, \
6294
"%s:Original Value = %d; New Value = %d \n", #_x,_x, ORIG_##_x); \
6301
ORIG_TS_PARSE_ERROR = -1,
6302
ORIG_TS_PARSE_DONE = 0,
6303
ORIG_TS_PARSE_OK = 1,
6304
ORIG_TS_PARSE_CONT = 2
6305
} ORIG_TSParseResult;
6309
ORIG_TS_HTTP_TYPE_UNKNOWN,
6310
ORIG_TS_HTTP_TYPE_REQUEST,
6311
ORIG_TS_HTTP_TYPE_RESPONSE
6316
ORIG_TS_HTTP_STATUS_NONE = 0,
6318
ORIG_TS_HTTP_STATUS_CONTINUE = 100,
6319
ORIG_TS_HTTP_STATUS_SWITCHING_PROTOCOL = 101,
6321
ORIG_TS_HTTP_STATUS_OK = 200,
6322
ORIG_TS_HTTP_STATUS_CREATED = 201,
6323
ORIG_TS_HTTP_STATUS_ACCEPTED = 202,
6324
ORIG_TS_HTTP_STATUS_NON_AUTHORITATIVE_INFORMATION = 203,
6325
ORIG_TS_HTTP_STATUS_NO_CONTENT = 204,
6326
ORIG_TS_HTTP_STATUS_RESET_CONTENT = 205,
6327
ORIG_TS_HTTP_STATUS_PARTIAL_CONTENT = 206,
6329
ORIG_TS_HTTP_STATUS_MULTIPLE_CHOICES = 300,
6330
ORIG_TS_HTTP_STATUS_MOVED_PERMANENTLY = 301,
6331
ORIG_TS_HTTP_STATUS_MOVED_TEMPORARILY = 302,
6332
ORIG_TS_HTTP_STATUS_SEE_OTHER = 303,
6333
ORIG_TS_HTTP_STATUS_NOT_MODIFIED = 304,
6334
ORIG_TS_HTTP_STATUS_USE_PROXY = 305,
6336
ORIG_TS_HTTP_STATUS_BAD_REQUEST = 400,
6337
ORIG_TS_HTTP_STATUS_UNAUTHORIZED = 401,
6338
ORIG_TS_HTTP_STATUS_PAYMENT_REQUIRED = 402,
6339
ORIG_TS_HTTP_STATUS_FORBIDDEN = 403,
6340
ORIG_TS_HTTP_STATUS_NOT_FOUND = 404,
6341
ORIG_TS_HTTP_STATUS_METHOD_NOT_ALLOWED = 405,
6342
ORIG_TS_HTTP_STATUS_NOT_ACCEPTABLE = 406,
6343
ORIG_TS_HTTP_STATUS_PROXY_AUTHENTICATION_REQUIRED = 407,
6344
ORIG_TS_HTTP_STATUS_REQUEST_TIMEOUT = 408,
6345
ORIG_TS_HTTP_STATUS_CONFLICT = 409,
6346
ORIG_TS_HTTP_STATUS_GONE = 410,
6347
ORIG_TS_HTTP_STATUS_LENGTH_REQUIRED = 411,
6348
ORIG_TS_HTTP_STATUS_PRECONDITION_FAILED = 412,
6349
ORIG_TS_HTTP_STATUS_REQUEST_ENTITY_TOO_LARGE = 413,
6350
ORIG_TS_HTTP_STATUS_REQUEST_URI_TOO_LONG = 414,
6351
ORIG_TS_HTTP_STATUS_UNSUPPORTED_MEDIA_TYPE = 415,
6353
ORIG_TS_HTTP_STATUS_INTERNAL_SERVER_ERROR = 500,
6354
ORIG_TS_HTTP_STATUS_NOT_IMPLEMENTED = 501,
6355
ORIG_TS_HTTP_STATUS_BAD_GATEWAY = 502,
6356
ORIG_TS_HTTP_STATUS_SERVICE_UNAVAILABLE = 503,
6357
ORIG_TS_HTTP_STATUS_GATEWAY_TIMEOUT = 504,
6358
ORIG_TS_HTTP_STATUS_HTTPVER_NOT_SUPPORTED = 505
6359
} ORIG_TSHttpStatus;
6363
ORIG_TS_HTTP_READ_REQUEST_HDR_HOOK,
6364
ORIG_TS_HTTP_OS_DNS_HOOK,
6365
ORIG_TS_HTTP_SEND_REQUEST_HDR_HOOK,
6366
ORIG_TS_HTTP_READ_CACHE_HDR_HOOK,
6367
ORIG_TS_HTTP_READ_RESPONSE_HDR_HOOK,
6368
ORIG_TS_HTTP_SEND_RESPONSE_HDR_HOOK,
6369
ORIG_TS_HTTP_REQUEST_TRANSFORM_HOOK,
6370
ORIG_TS_HTTP_RESPONSE_TRANSFORM_HOOK,
6371
ORIG_TS_HTTP_SELECT_ALT_HOOK,
6372
ORIG_TS_HTTP_TXN_START_HOOK,
6373
ORIG_TS_HTTP_TXN_CLOSE_HOOK,
6374
ORIG_TS_HTTP_SSN_START_HOOK,
6375
ORIG_TS_HTTP_SSN_CLOSE_HOOK,
6376
ORIG_TS_HTTP_CACHE_LOOKUP_COMPLETE_HOOK,
6377
ORIG_TS_HTTP_PRE_REMAP_HOOK,
6378
ORIG_TS_HTTP_POST_REMAP_HOOK,
6379
ORIG_TS_HTTP_LAST_HOOK
6380
} ORIG_TSHttpHookID;
6384
ORIG_TS_EVENT_NONE = 0,
6385
ORIG_TS_EVENT_IMMEDIATE = 1,
6386
ORIG_TS_EVENT_TIMEOUT = 2,
6387
ORIG_TS_EVENT_ERROR = 3,
6388
ORIG_TS_EVENT_CONTINUE = 4,
6390
ORIG_TS_EVENT_VCONN_READ_READY = 100,
6391
ORIG_TS_EVENT_VCONN_WRITE_READY = 101,
6392
ORIG_TS_EVENT_VCONN_READ_COMPLETE = 102,
6393
ORIG_TS_EVENT_VCONN_WRITE_COMPLETE = 103,
6394
ORIG_TS_EVENT_VCONN_EOS = 104,
6396
ORIG_TS_EVENT_NET_CONNECT = 200,
6397
ORIG_TS_EVENT_NET_CONNECT_FAILED = 201,
6398
ORIG_TS_EVENT_NET_ACCEPT = 202,
6399
ORIG_TS_EVENT_NET_ACCEPT_FAILED = 204,
6401
ORIG_TS_EVENT_HOST_LOOKUP = 500,
6403
ORIG_TS_EVENT_CACHE_OPEN_READ = 1102,
6404
ORIG_TS_EVENT_CACHE_OPEN_READ_FAILED = 1103,
6405
ORIG_TS_EVENT_CACHE_OPEN_WRITE = 1108,
6406
ORIG_TS_EVENT_CACHE_OPEN_WRITE_FAILED = 1109,
6407
ORIG_TS_EVENT_CACHE_REMOVE = 1112,
6408
ORIG_TS_EVENT_CACHE_REMOVE_FAILED = 1113,
6409
ORIG_TS_EVENT_CACHE_SCAN = 1120,
6410
ORIG_TS_EVENT_CACHE_SCAN_FAILED = 1121,
6411
ORIG_TS_EVENT_CACHE_SCAN_OBJECT = 1122,
6412
ORIG_TS_EVENT_CACHE_SCAN_OPERATION_BLOCKED = 1123,
6413
ORIG_TS_EVENT_CACHE_SCAN_OPERATION_FAILED = 1124,
6414
ORIG_TS_EVENT_CACHE_SCAN_DONE = 1125,
6416
ORIG_TS_EVENT_HTTP_CONTINUE = 60000,
6417
ORIG_TS_EVENT_HTTP_ERROR = 60001,
6418
ORIG_TS_EVENT_HTTP_READ_REQUEST_HDR = 60002,
6419
ORIG_TS_EVENT_HTTP_OS_DNS = 60003,
6420
ORIG_TS_EVENT_HTTP_SEND_REQUEST_HDR = 60004,
6421
ORIG_TS_EVENT_HTTP_READ_CACHE_HDR = 60005,
6422
ORIG_TS_EVENT_HTTP_READ_RESPONSE_HDR = 60006,
6423
ORIG_TS_EVENT_HTTP_SEND_RESPONSE_HDR = 60007,
6424
ORIG_TS_EVENT_HTTP_REQUEST_TRANSFORM = 60008,
6425
ORIG_TS_EVENT_HTTP_RESPONSE_TRANSFORM = 60009,
6426
ORIG_TS_EVENT_HTTP_SELECT_ALT = 60010,
6427
ORIG_TS_EVENT_HTTP_TXN_START = 60011,
6428
ORIG_TS_EVENT_HTTP_TXN_CLOSE = 60012,
6429
ORIG_TS_EVENT_HTTP_SSN_START = 60013,
6430
ORIG_TS_EVENT_HTTP_SSN_CLOSE = 60014,
6431
ORIG_TS_EVENT_HTTP_CACHE_LOOKUP_COMPLETE = 60015,
6433
ORIG_TS_EVENT_MGMT_UPDATE = 60100
6438
ORIG_TS_CACHE_LOOKUP_MISS,
6439
ORIG_TS_CACHE_LOOKUP_HIT_STALE,
6440
ORIG_TS_CACHE_LOOKUP_HIT_FRESH
6441
} ORIG_TSCacheLookupResult;
6445
ORIG_TS_CACHE_DATA_TYPE_NONE,
6446
ORIG_TS_CACHE_DATA_TYPE_HTTP,
6447
ORIG_TS_CACHE_DATA_TYPE_OTHER
6448
} ORIG_TSCacheDataType;
6452
ORIG_TS_CACHE_ERROR_NO_DOC = -20400,
6453
ORIG_TS_CACHE_ERROR_DOC_BUSY = -20401,
6454
ORIG_TS_CACHE_ERROR_NOT_READY = -20407
6455
} ORIG_TSCacheError;
6459
ORIG_TS_CACHE_SCAN_RESULT_DONE = 0,
6460
ORIG_TS_CACHE_SCAN_RESULT_CONTINUE = 1,
6461
ORIG_TS_CACHE_SCAN_RESULT_DELETE = 10,
6462
ORIG_TS_CACHE_SCAN_RESULT_DELETE_ALL_ALTERNATES,
6463
ORIG_TS_CACHE_SCAN_RESULT_UPDATE,
6464
ORIG_TS_CACHE_SCAN_RESULT_RETRY
6465
} ORIG_TSCacheScanResult;
6469
ORIG_TS_DATA_ALLOCATE,
6470
ORIG_TS_DATA_MALLOCED,
6471
ORIG_TS_DATA_CONSTANT
6472
} ORIG_TSIOBufferDataFlags;
6476
ORIG_TS_VC_CLOSE_ABORT = -1,
6477
ORIG_TS_VC_CLOSE_NORMAL = 1
6478
} ORIG_TSVConnCloseFlags;
6482
ORIG_TS_SDK_VERSION_2_0 = 0,
6483
ORIG_TS_SDK_VERSION_3_0
6484
} ORIG_TSSDKVersion;
6490
} ORIG_TSReturnCode;
6493
REGRESSION_TEST(SDK_API_TSConstant) (RegressionTest * test, int atype, int *pstatus)
6495
NOWARN_UNUSED(atype);
6496
*pstatus = REGRESSION_TEST_INPROGRESS;
6497
bool test_passed = true;
6499
PRINT_DIFF(TS_PARSE_ERROR);
6500
PRINT_DIFF(TS_PARSE_DONE);
6501
PRINT_DIFF(TS_PARSE_OK);
6502
PRINT_DIFF(TS_PARSE_CONT);
6504
PRINT_DIFF(TS_HTTP_STATUS_NONE);
6505
PRINT_DIFF(TS_HTTP_STATUS_CONTINUE);
6506
PRINT_DIFF(TS_HTTP_STATUS_SWITCHING_PROTOCOL);
6507
PRINT_DIFF(TS_HTTP_STATUS_OK);
6508
PRINT_DIFF(TS_HTTP_STATUS_CREATED);
6511
PRINT_DIFF(TS_HTTP_STATUS_ACCEPTED);
6512
PRINT_DIFF(TS_HTTP_STATUS_NON_AUTHORITATIVE_INFORMATION);
6513
PRINT_DIFF(TS_HTTP_STATUS_NO_CONTENT);
6514
PRINT_DIFF(TS_HTTP_STATUS_RESET_CONTENT);
6515
PRINT_DIFF(TS_HTTP_STATUS_PARTIAL_CONTENT);
6517
PRINT_DIFF(TS_HTTP_STATUS_MULTIPLE_CHOICES);
6518
PRINT_DIFF(TS_HTTP_STATUS_MOVED_PERMANENTLY);
6519
PRINT_DIFF(TS_HTTP_STATUS_MOVED_TEMPORARILY);
6520
PRINT_DIFF(TS_HTTP_STATUS_SEE_OTHER);
6521
PRINT_DIFF(TS_HTTP_STATUS_NOT_MODIFIED);
6522
PRINT_DIFF(TS_HTTP_STATUS_USE_PROXY);
6523
PRINT_DIFF(TS_HTTP_STATUS_BAD_REQUEST);
6524
PRINT_DIFF(TS_HTTP_STATUS_UNAUTHORIZED);
6525
PRINT_DIFF(TS_HTTP_STATUS_FORBIDDEN);
6526
PRINT_DIFF(TS_HTTP_STATUS_NOT_FOUND);
6527
PRINT_DIFF(TS_HTTP_STATUS_METHOD_NOT_ALLOWED);
6528
PRINT_DIFF(TS_HTTP_STATUS_NOT_ACCEPTABLE);
6529
PRINT_DIFF(TS_HTTP_STATUS_PROXY_AUTHENTICATION_REQUIRED);
6530
PRINT_DIFF(TS_HTTP_STATUS_REQUEST_TIMEOUT);
6531
PRINT_DIFF(TS_HTTP_STATUS_CONFLICT);
6532
PRINT_DIFF(TS_HTTP_STATUS_GONE);
6533
PRINT_DIFF(TS_HTTP_STATUS_PRECONDITION_FAILED);
6534
PRINT_DIFF(TS_HTTP_STATUS_REQUEST_ENTITY_TOO_LARGE);
6535
PRINT_DIFF(TS_HTTP_STATUS_REQUEST_URI_TOO_LONG);
6536
PRINT_DIFF(TS_HTTP_STATUS_UNSUPPORTED_MEDIA_TYPE);
6537
PRINT_DIFF(TS_HTTP_STATUS_INTERNAL_SERVER_ERROR);
6538
PRINT_DIFF(TS_HTTP_STATUS_NOT_IMPLEMENTED);
6539
PRINT_DIFF(TS_HTTP_STATUS_BAD_GATEWAY);
6540
PRINT_DIFF(TS_HTTP_STATUS_GATEWAY_TIMEOUT);
6541
PRINT_DIFF(TS_HTTP_STATUS_HTTPVER_NOT_SUPPORTED);
6543
PRINT_DIFF(TS_HTTP_READ_REQUEST_HDR_HOOK);
6544
PRINT_DIFF(TS_HTTP_OS_DNS_HOOK);
6545
PRINT_DIFF(TS_HTTP_SEND_REQUEST_HDR_HOOK);
6546
PRINT_DIFF(TS_HTTP_READ_RESPONSE_HDR_HOOK);
6547
PRINT_DIFF(TS_HTTP_SEND_RESPONSE_HDR_HOOK);
6548
PRINT_DIFF(TS_HTTP_REQUEST_TRANSFORM_HOOK);
6549
PRINT_DIFF(TS_HTTP_RESPONSE_TRANSFORM_HOOK);
6550
PRINT_DIFF(TS_HTTP_SELECT_ALT_HOOK);
6551
PRINT_DIFF(TS_HTTP_TXN_START_HOOK);
6552
PRINT_DIFF(TS_HTTP_TXN_CLOSE_HOOK);
6553
PRINT_DIFF(TS_HTTP_SSN_START_HOOK);
6554
PRINT_DIFF(TS_HTTP_SSN_CLOSE_HOOK);
6555
PRINT_DIFF(TS_HTTP_CACHE_LOOKUP_COMPLETE_HOOK);
6556
PRINT_DIFF(TS_HTTP_LAST_HOOK);
6558
PRINT_DIFF(TS_EVENT_NONE);
6559
PRINT_DIFF(TS_EVENT_IMMEDIATE);
6560
PRINT_DIFF(TS_EVENT_TIMEOUT);
6561
PRINT_DIFF(TS_EVENT_ERROR);
6563
PRINT_DIFF(TS_EVENT_CONTINUE);
6564
PRINT_DIFF(TS_EVENT_VCONN_READ_READY);
6565
PRINT_DIFF(TS_EVENT_VCONN_WRITE_READY);
6566
PRINT_DIFF(TS_EVENT_VCONN_READ_COMPLETE);
6567
PRINT_DIFF(TS_EVENT_VCONN_WRITE_COMPLETE);
6568
PRINT_DIFF(TS_EVENT_VCONN_EOS);
6570
PRINT_DIFF(TS_EVENT_NET_CONNECT);
6571
PRINT_DIFF(TS_EVENT_NET_CONNECT_FAILED);
6572
PRINT_DIFF(TS_EVENT_NET_ACCEPT);
6573
PRINT_DIFF(TS_EVENT_NET_ACCEPT_FAILED);
6575
PRINT_DIFF(TS_EVENT_HOST_LOOKUP);
6577
PRINT_DIFF(TS_EVENT_CACHE_OPEN_READ);
6578
PRINT_DIFF(TS_EVENT_CACHE_OPEN_READ_FAILED);
6579
PRINT_DIFF(TS_EVENT_CACHE_OPEN_WRITE);
6580
PRINT_DIFF(TS_EVENT_CACHE_OPEN_WRITE_FAILED);
6581
PRINT_DIFF(TS_EVENT_CACHE_REMOVE);
6582
PRINT_DIFF(TS_EVENT_CACHE_REMOVE_FAILED);
6583
PRINT_DIFF(TS_EVENT_CACHE_SCAN);
6584
PRINT_DIFF(TS_EVENT_CACHE_SCAN_FAILED);
6585
PRINT_DIFF(TS_EVENT_CACHE_SCAN_OBJECT);
6586
PRINT_DIFF(TS_EVENT_CACHE_SCAN_OPERATION_BLOCKED);
6587
PRINT_DIFF(TS_EVENT_CACHE_SCAN_OPERATION_FAILED);
6588
PRINT_DIFF(TS_EVENT_CACHE_SCAN_DONE);
6590
PRINT_DIFF(TS_EVENT_HTTP_CONTINUE);
6591
PRINT_DIFF(TS_EVENT_HTTP_ERROR);
6592
PRINT_DIFF(TS_EVENT_HTTP_READ_REQUEST_HDR);
6593
PRINT_DIFF(TS_EVENT_HTTP_OS_DNS);
6594
PRINT_DIFF(TS_EVENT_HTTP_SEND_REQUEST_HDR);
6595
PRINT_DIFF(TS_EVENT_HTTP_READ_CACHE_HDR);
6596
PRINT_DIFF(TS_EVENT_HTTP_READ_RESPONSE_HDR);
6597
PRINT_DIFF(TS_EVENT_HTTP_SEND_RESPONSE_HDR);
6598
PRINT_DIFF(TS_EVENT_HTTP_REQUEST_TRANSFORM);
6599
PRINT_DIFF(TS_EVENT_HTTP_RESPONSE_TRANSFORM);
6600
PRINT_DIFF(TS_EVENT_HTTP_SELECT_ALT);
6601
PRINT_DIFF(TS_EVENT_HTTP_TXN_START);
6602
PRINT_DIFF(TS_EVENT_HTTP_TXN_CLOSE);
6603
PRINT_DIFF(TS_EVENT_HTTP_SSN_START);
6604
PRINT_DIFF(TS_EVENT_HTTP_SSN_CLOSE);
6605
PRINT_DIFF(TS_EVENT_HTTP_CACHE_LOOKUP_COMPLETE);
6607
PRINT_DIFF(TS_EVENT_MGMT_UPDATE);
6609
PRINT_DIFF(TS_CACHE_LOOKUP_MISS);
6610
PRINT_DIFF(TS_CACHE_LOOKUP_HIT_STALE);
6611
PRINT_DIFF(TS_CACHE_LOOKUP_HIT_FRESH);
6613
PRINT_DIFF(TS_CACHE_DATA_TYPE_NONE);
6614
PRINT_DIFF(TS_CACHE_DATA_TYPE_HTTP);
6615
PRINT_DIFF(TS_CACHE_DATA_TYPE_OTHER);
6617
PRINT_DIFF(TS_CACHE_ERROR_NO_DOC);
6618
PRINT_DIFF(TS_CACHE_ERROR_DOC_BUSY);
6619
PRINT_DIFF(TS_CACHE_ERROR_NOT_READY);
6621
PRINT_DIFF(TS_CACHE_SCAN_RESULT_DONE);
6622
PRINT_DIFF(TS_CACHE_SCAN_RESULT_CONTINUE);
6623
PRINT_DIFF(TS_CACHE_SCAN_RESULT_DELETE);
6624
PRINT_DIFF(TS_CACHE_SCAN_RESULT_DELETE_ALL_ALTERNATES);
6625
PRINT_DIFF(TS_CACHE_SCAN_RESULT_UPDATE);
6626
PRINT_DIFF(TS_CACHE_SCAN_RESULT_RETRY);
6628
PRINT_DIFF(TS_DATA_ALLOCATE);
6629
PRINT_DIFF(TS_DATA_MALLOCED);
6630
PRINT_DIFF(TS_DATA_CONSTANT);
6632
PRINT_DIFF(TS_VC_CLOSE_ABORT);
6633
PRINT_DIFF(TS_VC_CLOSE_NORMAL);
6635
PRINT_DIFF(TS_SDK_VERSION_2_0);
6636
PRINT_DIFF(TS_SDK_VERSION_3_0);
6638
PRINT_DIFF(TS_ERROR);
6639
PRINT_DIFF(TS_SUCCESS);
6643
*pstatus = REGRESSION_TEST_PASSED;
6645
*pstatus = REGRESSION_TEST_FAILED;
6650
//////////////////////////////////////////////
6651
// SDK_API_TSHttpSsn
6653
// Unit Test for API: TSHttpSsnHookAdd
6654
// TSHttpSsnReenable
6656
// TSHttpTxnErrorBodySet
6657
// TSHttpTxnParentProxyGet
6658
// TSHttpTxnParentProxySet
6659
//////////////////////////////////////////////
6664
RegressionTest *test;
6669
int test_passed_ssn_hook_add;
6670
int test_passed_ssn_reenable;
6671
int test_passed_txn_ssn_get;
6672
int test_passed_txn_hook_add;
6673
int test_passed_txn_error_body_set;
6674
bool test_passed_Parent_Proxy;
6679
checkHttpTxnParentProxy(ContData * data, TSHttpTxn txnp)
6682
const char *hostname = "txnpp.example.com";
6684
char *hostnameget = NULL;
6687
if (TSHttpTxnParentProxySet(txnp, (char*)hostname, port) != TS_SUCCESS) {
6688
SDK_RPRINT(data->test, "TSHttpTxnParentProxySet", "TestCase1", TC_FAIL,
6689
"TSHttpTxnParentProxySet doesn't return TS_SUCCESS");
6690
SDK_RPRINT(data->test, "TSHttpTxnParentProxyGet", "TestCase1", TC_FAIL,
6691
"TSHttpTxnParentProxySet doesn't return TS_SUCCESS");
6692
return TS_EVENT_CONTINUE;
6695
if (TSHttpTxnParentProxyGet(txnp, &hostnameget, &portget) != TS_SUCCESS) {
6696
SDK_RPRINT(data->test, "TSHttpTxnParentProxySet", "TestCase1", TC_FAIL,
6697
"TSHttpTxnParentProxyGet doesn't return TS_SUCCESS");
6698
SDK_RPRINT(data->test, "TSHttpTxnParentProxyGet", "TestCase1", TC_FAIL,
6699
"TSHttpTxnParentProxyGet doesn't return TS_SUCCESS");
6700
return TS_EVENT_CONTINUE;
6703
if ((strcmp(hostname, hostnameget) == 0) && (port == portget)) {
6704
SDK_RPRINT(data->test, "TSHttpTxnParentProxySet", "TestCase1", TC_PASS, "ok");
6705
SDK_RPRINT(data->test, "TSHttpTxnParentProxyGet", "TestCase1", TC_PASS, "ok");
6706
data->test_passed_Parent_Proxy = true;
6708
SDK_RPRINT(data->test, "TSHttpTxnParentProxySet", "TestCase1", TC_FAIL, "Value's Mismatch");
6709
SDK_RPRINT(data->test, "TSHttpTxnParentProxyGet", "TestCase1", TC_FAIL, "Value's Mismatch");
6712
return TS_EVENT_CONTINUE;
6717
ssn_handler(TSCont contp, TSEvent event, void *edata)
6720
TSHttpTxn txnp = NULL;
6721
ContData *data = NULL;
6722
data = (ContData *) TSContDataGet(contp);
6723
if ((data == TS_ERROR_PTR) || (data == NULL)) {
6725
case TS_EVENT_HTTP_SSN_START:
6726
TSHttpSsnReenable((TSHttpSsn) edata, TS_EVENT_HTTP_CONTINUE);
6728
case TS_EVENT_IMMEDIATE:
6729
case TS_EVENT_TIMEOUT:
6731
case TS_EVENT_HTTP_TXN_START:
6733
TSHttpTxnReenable((TSHttpTxn) edata, TS_EVENT_HTTP_CONTINUE);
6740
case TS_EVENT_HTTP_SSN_START:
6741
data->ssnp = (TSHttpSsn) edata;
6742
if (TSHttpSsnHookAdd(data->ssnp, TS_HTTP_TXN_START_HOOK, contp) != TS_SUCCESS) {
6743
SDK_RPRINT(data->test, "TSHttpSsnHookAdd", "TestCase1", TC_FAIL, "TSHttpSsnHookAdd doesn't return TS_SUCCESS");
6744
data->test_passed_ssn_hook_add--;
6746
if (TSHttpSsnReenable(data->ssnp, TS_EVENT_HTTP_CONTINUE) != TS_SUCCESS) {
6747
SDK_RPRINT(data->test, "TSHttpSsnReenable", "TestCase1", TC_FAIL,
6748
"TSHttpSsnReenable doesn't return TS_SUCCESS");
6749
data->test_passed_ssn_reenable--;
6753
case TS_EVENT_HTTP_TXN_START:
6754
TSSkipRemappingSet((TSHttpTxn) edata,1);
6755
SDK_RPRINT(data->test, "TSHttpSsnReenable", "TestCase", TC_PASS, "ok");
6756
data->test_passed_ssn_reenable++;
6758
txnp = (TSHttpTxn) edata;
6759
TSHttpSsn ssnp = TSHttpTxnSsnGet(txnp);
6760
if (ssnp != data->ssnp) {
6761
SDK_RPRINT(data->test, "TSHttpSsnHookAdd", "TestCase", TC_FAIL, "Value's mismatch");
6762
data->test_passed_ssn_hook_add--;
6763
SDK_RPRINT(data->test, "TSHttpTxnSsnGet", "TestCase", TC_FAIL, "Session doesn't match");
6764
data->test_passed_txn_ssn_get--;
6766
SDK_RPRINT(data->test, "TSHttpSsnHookAdd", "TestCase1", TC_PASS, "ok");
6767
data->test_passed_ssn_hook_add++;
6768
SDK_RPRINT(data->test, "TSHttpTxnSsnGet", "TestCase1", TC_PASS, "ok");
6769
data->test_passed_txn_ssn_get++;
6771
if (TSHttpTxnHookAdd(txnp, TS_HTTP_OS_DNS_HOOK, contp) != TS_SUCCESS) {
6772
SDK_RPRINT(data->test, "TSHttpTxnHookAdd", "TestCase1", TC_FAIL,
6773
"TSHttpTxnHookAdd doesn't return TS_SUCCESS");
6774
data->test_passed_txn_hook_add--;
6776
if (TSHttpTxnReenable(txnp, TS_EVENT_HTTP_CONTINUE) != TS_SUCCESS) {
6777
SDK_RPRINT(data->test, "TSHttpSsn", "TestCase1", TC_FAIL, "TSHttpTxnReenable doesn't return TS_SUCCESS");
6782
case TS_EVENT_HTTP_OS_DNS:
6783
SDK_RPRINT(data->test, "TSHttpTxnHookAdd", "TestCase1", TC_PASS, "ok");
6784
data->test_passed_txn_hook_add++;
6785
txnp = (TSHttpTxn) edata;
6787
if (TSHttpTxnHookAdd(txnp, TS_HTTP_SEND_RESPONSE_HDR_HOOK, contp) != TS_SUCCESS) {
6788
SDK_RPRINT(data->test, "TSHttpTxnHookAdd", "TestCase1", TC_FAIL, "TSHttpTxnHookAdd doesn't return TS_SUCCESS");
6789
data->test_passed_txn_hook_add--;
6792
checkHttpTxnParentProxy(data, txnp);
6794
if (TSHttpTxnReenable(txnp, TS_EVENT_HTTP_ERROR) != TS_SUCCESS) {
6795
SDK_RPRINT(data->test, "TSHttpSsn", "TestCase1", TC_FAIL, "TSHttpTxnReenable doesn't return TS_SUCCESS");
6799
case TS_EVENT_HTTP_SEND_RESPONSE_HDR:
6800
SDK_RPRINT(data->test, "TSHttpTxnHookAdd", "TestCase2", TC_PASS, "ok");
6801
data->test_passed_txn_hook_add++;
6802
txnp = (TSHttpTxn) edata;
6804
char *temp = TSstrdup(ERROR_BODY);
6805
if (TSHttpTxnErrorBodySet(txnp, temp, strlen(temp), NULL) != TS_SUCCESS) {
6806
SDK_RPRINT(data->test, "TSHttpTxnErrorBodySet", "TestCase1", TC_FAIL,
6807
"TSHttpTxnErrorBodySet doesn't return TS_SUCCESS");
6808
data->test_passed_txn_error_body_set--;
6811
if (TSHttpTxnReenable(txnp, TS_EVENT_HTTP_CONTINUE) != TS_SUCCESS) {
6812
SDK_RPRINT(data->test, "TSHttpSsn", "TestCase1", TC_FAIL, "TSHttpTxnReenable doesn't return TS_SUCCESS");
6816
case TS_EVENT_IMMEDIATE:
6817
case TS_EVENT_TIMEOUT:
6818
/* Browser still waiting the response ? */
6819
if (data->browser->status == REQUEST_INPROGRESS) {
6820
TSContSchedule(contp, 25, TS_THREAD_POOL_DEFAULT);
6822
/* Browser got the response. test is over. clean up */
6824
/* Check if browser response body is the one we expected */
6825
char *temp = data->browser->response;
6826
temp = strstr(temp, "\r\n\r\n");
6828
temp += strlen("\r\n\r\n");
6829
if ((temp[0] == '\0') || (strncmp(temp, "\r\n\r\n", 4) == 0)) {
6830
SDK_RPRINT(data->test, "TSHttpTxnErrorBodySet", "TestCase1", TC_FAIL, "No Error Body found");
6831
data->test_passed_txn_error_body_set--;
6833
if (strncmp(temp, ERROR_BODY, strlen(ERROR_BODY)) == 0) {
6834
SDK_RPRINT(data->test, "TSHttpTxnErrorBodySet", "TestCase1", TC_PASS, "ok");
6835
data->test_passed_txn_error_body_set++;
6838
SDK_RPRINT(data->test, "TSHttpTxnErrorBodySet", "TestCase1", TC_FAIL,
6839
"strstr returns NULL. Didn't find end of headers.");
6840
data->test_passed_txn_error_body_set--;
6843
/* Note: response is available using test->browser->response pointer */
6844
if ((data->browser->status == REQUEST_SUCCESS) &&
6845
(data->test_passed_ssn_hook_add == 1) &&
6846
(data->test_passed_ssn_reenable == 1) &&
6847
(data->test_passed_txn_ssn_get == 1) &&
6848
(data->test_passed_txn_hook_add == 2) && (data->test_passed_txn_error_body_set == 1)
6849
&& (data->test_passed_Parent_Proxy == true)
6851
*(data->pstatus) = REGRESSION_TEST_PASSED;
6853
*(data->pstatus) = REGRESSION_TEST_FAILED;
6856
// transaction is over. clean up.
6857
synclient_txn_delete(data->browser);
6858
/* Don't need it as didn't initialize the server
6859
synserver_delete(data->os);
6861
data->magic = MAGIC_DEAD;
6863
TSContDataSet(contp, NULL);
6868
*(data->pstatus) = REGRESSION_TEST_FAILED;
6869
SDK_RPRINT(data->test, "TSHttpSsn", "TestCase1", TC_FAIL, "Unexpected event %d", event);
6876
EXCLUSIVE_REGRESSION_TEST(SDK_API_HttpSsn) (RegressionTest * test, int atype, int *pstatus)
6878
NOWARN_UNUSED(atype);
6879
*pstatus = REGRESSION_TEST_INPROGRESS;
6881
TSCont cont = TSContCreate(ssn_handler, TSMutexCreate());
6882
if ((cont == NULL) || (cont == TS_ERROR_PTR)) {
6883
SDK_RPRINT(test, "TSHttpSsn", "TestCase1", TC_FAIL, "Unable to create Continuation.");
6884
*pstatus = REGRESSION_TEST_FAILED;
6888
ContData *socktest = (ContData *) TSmalloc(sizeof(ContData));
6889
socktest->test = test;
6890
socktest->pstatus = pstatus;
6891
socktest->test_passed_ssn_hook_add = 0;
6892
socktest->test_passed_ssn_reenable = 0;
6893
socktest->test_passed_txn_ssn_get = 0;
6894
socktest->test_passed_txn_hook_add = 0;
6895
socktest->test_passed_txn_error_body_set = 0;
6896
socktest->test_passed_Parent_Proxy = false;
6897
socktest->magic = MAGIC_ALIVE;
6898
TSContDataSet(cont, socktest);
6900
/* Register to HTTP hooks that are called in case of a cache MISS */
6901
TSHttpHookAdd(TS_HTTP_SSN_START_HOOK, cont);
6903
/* Create a client transaction */
6904
socktest->browser = synclient_txn_create();
6905
char *request = generate_request(3); // response is expected to be error case
6906
synclient_txn_send_request(socktest->browser, request);
6909
/* Wait until transaction is done */
6910
if (socktest->browser->status == REQUEST_INPROGRESS) {
6911
TSContSchedule(cont, 25, TS_THREAD_POOL_DEFAULT);
6917
/////////////////////////////////////////////////////
6918
// SDK_API_TSHttpTxnCache
6920
// Unit Test for API: TSHttpTxnCachedReqGet
6921
// TSHttpTxnCachedRespGet
6922
// TSHttpTxnCacheLookupStatusGet
6923
/////////////////////////////////////////////////////
6927
RegressionTest *test;
6930
ClientTxn *browser1;
6931
ClientTxn *browser2;
6933
bool test_passed_txn_cached_req_get;
6934
bool test_passed_txn_cached_resp_get;
6935
bool test_passed_txn_cache_lookup_status;
6941
cache_hook_handler(TSCont contp, TSEvent event, void *edata)
6944
TSHttpTxn txnp = NULL;
6945
CacheTestData *data = NULL;
6946
data = (CacheTestData *) TSContDataGet(contp);
6947
if ((data == TS_ERROR_PTR) || (data == NULL)) {
6949
case TS_EVENT_IMMEDIATE:
6950
case TS_EVENT_TIMEOUT:
6952
case TS_EVENT_HTTP_READ_CACHE_HDR:
6954
TSHttpTxnReenable((TSHttpTxn) edata, TS_EVENT_HTTP_CONTINUE);
6961
case TS_EVENT_HTTP_READ_REQUEST_HDR:
6962
txnp = (TSHttpTxn) edata;
6963
TSSkipRemappingSet(txnp,1);
6964
TSHttpTxnReenable(txnp, TS_EVENT_HTTP_CONTINUE);
6968
case TS_EVENT_HTTP_CACHE_LOOKUP_COMPLETE:
6971
if (data->first_time == true) {
6972
txnp = (TSHttpTxn) edata;
6973
if (TSHttpTxnCacheLookupStatusGet(txnp, &lookup_status) != TS_SUCCESS) {
6974
SDK_RPRINT(data->test, "TSHttpTxnCacheLookupStatusGet", "TestCase1", TC_FAIL,
6975
"TSHttpTxnCacheLookupStatus doesn't return TS_SUCCESS");
6977
if (lookup_status == TS_CACHE_LOOKUP_MISS) {
6978
SDK_RPRINT(data->test, "TSHttpTxnCacheLookupStatusGet", "TestCase1", TC_PASS, "ok");
6979
data->test_passed_txn_cache_lookup_status = true;
6981
SDK_RPRINT(data->test, "TSHttpTxnCacheLookupStatusGet", "TestCase1", TC_FAIL,
6982
"Incorrect Value returned by TSHttpTxnCacheLookupStatusGet");
6986
txnp = (TSHttpTxn) edata;
6987
if (TSHttpTxnCacheLookupStatusGet(txnp, &lookup_status) != TS_SUCCESS) {
6988
SDK_RPRINT(data->test, "TSHttpTxnCacheLookupStatusGet", "TestCase2", TC_FAIL,
6989
"TSHttpTxnCacheLookupStatus doesn't return TS_SUCCESS");
6990
data->test_passed_txn_cache_lookup_status = false;
6992
if (lookup_status == TS_CACHE_LOOKUP_HIT_FRESH) {
6993
SDK_RPRINT(data->test, "TSHttpTxnCacheLookupStatusGet", "TestCase2", TC_PASS, "ok");
6995
SDK_RPRINT(data->test, "TSHttpTxnCacheLookupStatusGet", "TestCase2", TC_FAIL,
6996
"Incorrect Value returned by TSHttpTxnCacheLookupStatusGet");
6997
data->test_passed_txn_cache_lookup_status = false;
7001
if (TSHttpTxnReenable(txnp, TS_EVENT_HTTP_CONTINUE) != TS_SUCCESS) {
7002
SDK_RPRINT(data->test, "TSHttpTxnCacheLookupStatusGet", "", TC_FAIL, "Unable to reenable the transaction");
7006
case TS_EVENT_HTTP_READ_CACHE_HDR:
7014
txnp = (TSHttpTxn) edata;
7016
if (TSHttpTxnCachedReqGet(txnp, &reqbuf, &reqhdr) == 0) {
7017
SDK_RPRINT(data->test, "TSHttpTxnCachedReqGet", "TestCase1", TC_FAIL, "TSHttpTxnCachedReqGet returns 0");
7019
if ((reqbuf == (((HttpSM *) txnp)->t_state.cache_req_hdr_heap_handle)) &&
7020
(reqhdr == ((((HttpSM *) txnp)->t_state.cache_info.object_read->request_get())->m_http))
7022
SDK_RPRINT(data->test, "TSHttpTxnCachedReqGet", "TestCase1", TC_PASS, "ok");
7023
data->test_passed_txn_cached_req_get = true;
7025
SDK_RPRINT(data->test, "TSHttpTxnCachedReqGet", "TestCase1", TC_FAIL, "Value's Mismatch");
7029
if (TSHttpTxnCachedRespGet(txnp, &respbuf, &resphdr) == 0) {
7030
SDK_RPRINT(data->test, "TSHttpTxnCachedRespGet", "TestCase1", TC_FAIL, "TSHttpTxnCachedRespGet returns 0");
7032
if ((respbuf == (((HttpSM *) txnp)->t_state.cache_resp_hdr_heap_handle)) &&
7033
(resphdr == ((((HttpSM *) txnp)->t_state.cache_info.object_read->response_get())->m_http))
7035
SDK_RPRINT(data->test, "TSHttpTxnCachedRespGet", "TestCase1", TC_PASS, "ok");
7036
data->test_passed_txn_cached_resp_get = true;
7038
SDK_RPRINT(data->test, "TSHttpTxnCachedRespGet", "TestCase1", TC_FAIL, "Value's Mismatch");
7042
if ((TSHandleMLocRelease(reqbuf, TS_NULL_MLOC, reqhdr) != TS_SUCCESS) ||
7043
(TSHandleMLocRelease(respbuf, TS_NULL_MLOC, resphdr) != TS_SUCCESS)
7045
SDK_RPRINT(data->test, "TSHttpTxnCache", "", TC_FAIL, "Unable to release handle to headers.");
7048
if (TSHttpTxnReenable(txnp, TS_EVENT_HTTP_CONTINUE) != TS_SUCCESS) {
7049
SDK_RPRINT(data->test, "TSHttpTxnCache", "", TC_FAIL, "Unable to reenable the transaction.");
7055
case TS_EVENT_IMMEDIATE:
7056
case TS_EVENT_TIMEOUT:
7057
/* Browser still waiting the response ? */
7058
if (data->first_time == true) {
7059
if (data->browser1->status == REQUEST_INPROGRESS) {
7060
TSContSchedule(contp, 25, TS_THREAD_POOL_DEFAULT);
7064
if (data->browser2->status == REQUEST_INPROGRESS) {
7065
TSContSchedule(contp, 25, TS_THREAD_POOL_DEFAULT);
7070
/* Browser got the response. test is over. clean up */
7072
/* If this is the first time, then the response is in cache and we should make */
7073
/* another request to get cache hit */
7074
if (data->first_time == true) {
7075
data->first_time = false;
7076
/* Kill the origin server */
7077
synserver_delete(data->os);
7078
/* Send another similar client request */
7079
synclient_txn_send_request(data->browser2, data->request);
7080
TSfree(data->request);
7081
TSContSchedule(contp, 25, TS_THREAD_POOL_DEFAULT);
7085
/* Note: response is available using test->browser->response pointer */
7086
if ((data->browser1->status == REQUEST_SUCCESS) &&
7087
(data->browser2->status == REQUEST_SUCCESS) &&
7088
(data->test_passed_txn_cached_req_get == true) &&
7089
(data->test_passed_txn_cached_resp_get == true) && (data->test_passed_txn_cache_lookup_status == true)
7091
*(data->pstatus) = REGRESSION_TEST_PASSED;
7093
*(data->pstatus) = REGRESSION_TEST_FAILED;
7096
// transaction is over. clean up.
7097
synclient_txn_delete(data->browser1);
7098
synclient_txn_delete(data->browser2);
7100
data->magic = MAGIC_DEAD;
7102
TSContDataSet(contp, NULL);
7107
*(data->pstatus) = REGRESSION_TEST_FAILED;
7108
SDK_RPRINT(data->test, "TSHttpTxnCache", "TestCase1", TC_FAIL, "Unexpected event %d", event);
7115
EXCLUSIVE_REGRESSION_TEST(SDK_API_HttpTxnCache) (RegressionTest * test, int atype, int *pstatus)
7117
NOWARN_UNUSED(atype);
7118
*pstatus = REGRESSION_TEST_INPROGRESS;
7120
TSCont cont = TSContCreate(cache_hook_handler, TSMutexCreate());
7121
if ((cont == NULL) || (cont == TS_ERROR_PTR)) {
7122
SDK_RPRINT(test, "TSHttpSsn", "TestCase1", TC_FAIL, "Unable to create Continuation.");
7123
*pstatus = REGRESSION_TEST_FAILED;
7127
CacheTestData *socktest = (CacheTestData *) TSmalloc(sizeof(CacheTestData));
7128
socktest->test = test;
7129
socktest->pstatus = pstatus;
7130
socktest->test_passed_txn_cached_req_get = false;
7131
socktest->test_passed_txn_cached_resp_get = false;
7132
socktest->first_time = true;
7133
socktest->magic = MAGIC_ALIVE;
7134
TSContDataSet(cont, socktest);
7136
TSHttpHookAdd(TS_HTTP_READ_REQUEST_HDR_HOOK, cont);
7137
/* Register to HTTP hooks that are called in case of a cache MISS */
7138
TSHttpHookAdd(TS_HTTP_READ_CACHE_HDR_HOOK, cont);
7139
TSHttpHookAdd(TS_HTTP_CACHE_LOOKUP_COMPLETE_HOOK, cont);
7141
/* Create a new synthetic server */
7142
socktest->os = synserver_create(SYNSERVER_LISTEN_PORT);
7143
synserver_start(socktest->os);
7145
/* Create a client transaction */
7146
socktest->browser1 = synclient_txn_create();
7147
socktest->browser2 = synclient_txn_create();
7148
socktest->request = generate_request(2);
7149
synclient_txn_send_request(socktest->browser1, socktest->request);
7151
/* Wait until transaction is done */
7152
TSContSchedule(cont, 25, TS_THREAD_POOL_DEFAULT);
7157
///////////////////////////////////////////////////////
7158
// SDK_API_TSHttpTxnTransform
7160
// Unit Test for API: TSHttpTxnTransformRespGet
7161
// TSHttpTxnTransformedRespCache
7162
// TSHttpTxnUntransformedRespCache
7163
///////////////////////////////////////////////////////
7165
/** Append Transform Data Structure **/
7169
TSIOBuffer output_buffer;
7170
TSIOBufferReader output_reader;
7173
/** Append Transform Data Structure Ends **/
7177
RegressionTest *test;
7180
ClientTxn *browser1;
7181
ClientTxn *browser2;
7182
ClientTxn *browser3;
7183
ClientTxn *browser4;
7186
bool test_passed_txn_transform_resp_get;
7187
bool test_passed_txn_transformed_resp_cache;
7188
bool test_passed_txn_untransformed_resp_cache;
7189
bool test_passed_transform_create;
7191
MyTransformData *transformData;
7193
} TransformTestData;
7195
/**** Append Transform Code (Tailored to needs)****/
7197
static TSIOBuffer append_buffer;
7198
static TSIOBufferReader append_buffer_reader;
7199
static int64_t append_buffer_length;
7201
static MyTransformData *
7204
MyTransformData *data;
7206
data = (MyTransformData *) TSmalloc(sizeof(MyTransformData));
7207
data->output_vio = NULL;
7208
data->output_buffer = NULL;
7209
data->output_reader = NULL;
7210
data->append_needed = 1;
7216
my_data_destroy(MyTransformData * data)
7219
if (data->output_buffer) {
7220
TSIOBufferDestroy(data->output_buffer);
7227
handle_transform(TSCont contp)
7229
TSVConn output_conn;
7231
TransformTestData *contData;
7232
MyTransformData *data;
7236
/* Get the output connection where we'll write data to. */
7237
output_conn = TSTransformOutputVConnGet(contp);
7239
/* Get the write VIO for the write operation that was performed on
7240
ourself. This VIO contains the buffer that we are to read from
7241
as well as the continuation we are to call when the buffer is
7243
write_vio = TSVConnWriteVIOGet(contp);
7245
/* Get our data structure for this operation. The private data
7246
structure contains the output VIO and output buffer. If the
7247
private data structure pointer is NULL, then we'll create it
7248
and initialize its internals. */
7249
contData = (TransformTestData *) TSContDataGet(contp);
7250
data = contData->transformData;
7252
towrite = TSVIONBytesGet(write_vio);
7253
if (towrite != INT64_MAX) {
7254
towrite += append_buffer_length;
7256
contData->transformData = my_data_alloc();
7257
data = contData->transformData;
7258
data->output_buffer = TSIOBufferCreate();
7259
data->output_reader = TSIOBufferReaderAlloc(data->output_buffer);
7260
data->output_vio = TSVConnWrite(output_conn, contp, data->output_reader, towrite);
7261
// Don't need this as the structure is encapsulated in another structure
7262
// which is set to be Continuation's Data.
7263
// TSContDataSet (contp, data);
7266
/* We also check to see if the write VIO's buffer is non-NULL. A
7267
NULL buffer indicates that the write operation has been
7268
shutdown and that the continuation does not want us to send any
7269
more WRITE_READY or WRITE_COMPLETE events. For this simplistic
7270
transformation that means we're done. In a more complex
7271
transformation we might have to finish writing the transformed
7272
data to our output connection. */
7273
if (!TSVIOBufferGet(write_vio)) {
7274
if (data->append_needed) {
7275
data->append_needed = 0;
7276
TSIOBufferCopy(TSVIOBufferGet(data->output_vio), append_buffer_reader, append_buffer_length, 0);
7279
TSVIONBytesSet(data->output_vio, TSVIONDoneGet(write_vio) + append_buffer_length);
7280
TSVIOReenable(data->output_vio);
7284
/* Determine how much data we have left to read. For this append
7285
transform plugin this is also the amount of data we have left
7286
to write to the output connection. */
7287
towrite = TSVIONTodoGet(write_vio);
7289
/* The amount of data left to read needs to be truncated by
7290
the amount of data actually in the read buffer. */
7291
avail = TSIOBufferReaderAvail(TSVIOReaderGet(write_vio));
7292
if (towrite > avail) {
7297
/* Copy the data from the read buffer to the output buffer. */
7298
TSIOBufferCopy(TSVIOBufferGet(data->output_vio), TSVIOReaderGet(write_vio), towrite, 0);
7300
/* Tell the read buffer that we have read the data and are no
7301
longer interested in it. */
7302
TSIOBufferReaderConsume(TSVIOReaderGet(write_vio), towrite);
7304
/* Modify the write VIO to reflect how much data we've
7306
TSVIONDoneSet(write_vio, TSVIONDoneGet(write_vio) + towrite);
7310
/* Now we check the write VIO to see if there is data left to
7312
if (TSVIONTodoGet(write_vio) > 0) {
7314
/* If there is data left to read, then we reenable the output
7315
connection by reenabling the output VIO. This will wakeup
7316
the output connection and allow it to consume data from the
7318
TSVIOReenable(data->output_vio);
7320
/* Call back the write VIO continuation to let it know that we
7321
are ready for more data. */
7322
TSContCall(TSVIOContGet(write_vio), TS_EVENT_VCONN_WRITE_READY, write_vio);
7325
if (data->append_needed) {
7326
data->append_needed = 0;
7327
TSIOBufferCopy(TSVIOBufferGet(data->output_vio), append_buffer_reader, append_buffer_length, 0);
7330
/* If there is no data left to read, then we modify the output
7331
VIO to reflect how much data the output connection should
7332
expect. This allows the output connection to know when it
7333
is done reading. We then reenable the output connection so
7334
that it can consume the data we just gave it. */
7335
TSVIONBytesSet(data->output_vio, TSVIONDoneGet(write_vio) + append_buffer_length);
7336
TSVIOReenable(data->output_vio);
7338
/* Call back the write VIO continuation to let it know that we
7339
have completed the write operation. */
7340
TSContCall(TSVIOContGet(write_vio), TS_EVENT_VCONN_WRITE_COMPLETE, write_vio);
7345
transformtest_transform(TSCont contp, TSEvent event, void *edata)
7347
NOWARN_UNUSED(edata);
7348
TransformTestData *contData = (TransformTestData *) TSContDataGet(contp);
7349
if (contData->test_passed_transform_create == false) {
7350
contData->test_passed_transform_create = true;
7351
SDK_RPRINT(contData->test, "TSTransformCreate", "TestCase1", TC_PASS, "ok");
7353
/* Check to see if the transformation has been closed by a call to
7355
if (TSVConnClosedGet(contp)) {
7356
my_data_destroy(contData->transformData);
7357
contData->transformData = NULL;
7358
TSContDestroy(contp);
7362
case TS_EVENT_ERROR:
7366
/* Get the write VIO for the write operation that was
7367
performed on ourself. This VIO contains the continuation of
7368
our parent transformation. */
7369
write_vio = TSVConnWriteVIOGet(contp);
7371
/* Call back the write VIO continuation to let it know that we
7372
have completed the write operation. */
7373
TSContCall(TSVIOContGet(write_vio), TS_EVENT_ERROR, write_vio);
7376
case TS_EVENT_VCONN_WRITE_COMPLETE:
7377
/* When our output connection says that it has finished
7378
reading all the data we've written to it then we should
7379
shutdown the write portion of its connection to
7380
indicate that we don't want to hear about it anymore. */
7381
TSVConnShutdown(TSTransformOutputVConnGet(contp), 0, 1);
7383
case TS_EVENT_VCONN_WRITE_READY:
7385
/* If we get a WRITE_READY event or any other type of
7386
event (sent, perhaps, because we were reenabled) then
7387
we'll attempt to transform more data. */
7388
handle_transform(contp);
7397
transformable(TSHttpTxn txnp, TransformTestData * data)
7402
if (TSHttpTxnServerRespGet(txnp, &bufp, &hdr_loc) == 0) {
7403
SDK_RPRINT(data->test, "TSHttpTxnTransform", "", TC_FAIL, "[transformable]: TSHttpTxnServerRespGet return 0");
7407
* We are only interested in "200 OK" responses.
7410
if (TS_HTTP_STATUS_OK == TSHttpHdrStatusGet(bufp, hdr_loc)) {
7413
// XXX - Can't return TS_ERROR because that is a different type
7415
// if (resp_status == TS_ERROR) {
7416
// SDK_RPRINT(data->test,"TSHttpTxnTransform","",TC_FAIL,"[transformable]: TSHttpHdrStatusGet returns TS_ERROR");
7419
return 0; /* not a 200 */
7423
transform_add(TSHttpTxn txnp, TransformTestData * data)
7427
connp = TSTransformCreate(transformtest_transform, txnp);
7428
TSContDataSet(connp, data);
7429
if ((connp == NULL) || (connp == TS_ERROR_PTR)) {
7430
SDK_RPRINT(data->test, "TSHttpTxnTransform", "", TC_FAIL, "Unable to create Transformation.");
7434
if (TSHttpTxnHookAdd(txnp, TS_HTTP_RESPONSE_TRANSFORM_HOOK, connp) != TS_SUCCESS) {
7435
SDK_RPRINT(data->test, "TSHttpTxnTransform", "", TC_FAIL, "Unable to add Transformation to the transform hook.");
7441
load(const char *append_string)
7443
TSIOBufferBlock blk;
7447
append_buffer = TSIOBufferCreate();
7448
append_buffer_reader = TSIOBufferReaderAlloc(append_buffer);
7450
blk = TSIOBufferStart(append_buffer);
7451
p = TSIOBufferBlockWriteStart(blk, &avail);
7453
ink_strncpy(p, append_string, avail);
7454
if (append_string != NULL) {
7455
TSIOBufferProduce(append_buffer, strlen(append_string));
7458
append_buffer_length = TSIOBufferReaderAvail(append_buffer_reader);
7463
/**** Append Transform Code Ends ****/
7466
transform_hook_handler(TSCont contp, TSEvent event, void *edata)
7468
TSHttpTxn txnp = NULL;
7469
TransformTestData *data = NULL;
7470
data = (TransformTestData *) TSContDataGet(contp);
7471
if ((data == TS_ERROR_PTR) || (data == NULL)) {
7473
case TS_EVENT_IMMEDIATE:
7474
case TS_EVENT_TIMEOUT:
7476
case TS_EVENT_HTTP_READ_RESPONSE_HDR:
7478
TSHttpTxnReenable((TSHttpTxn) edata, TS_EVENT_HTTP_CONTINUE);
7485
case TS_EVENT_HTTP_READ_REQUEST_HDR:
7486
txnp = (TSHttpTxn) edata;
7487
TSSkipRemappingSet(txnp,1);
7488
TSHttpTxnReenable(txnp, TS_EVENT_HTTP_CONTINUE);
7490
case TS_EVENT_HTTP_READ_RESPONSE_HDR:
7491
txnp = (TSHttpTxn) edata;
7492
/* Setup hooks for Transformation */
7493
if (transformable(txnp, data)) {
7494
transform_add(txnp, data);
7496
/* Call TransformedRespCache or UntransformedRespCache depending on request */
7502
if (TSHttpTxnClientReqGet(txnp, &bufp, &hdr) == 0) {
7503
SDK_RPRINT(data->test, "TSHttpTxnTransform", "TestCase", TC_FAIL, "TSHttpTxnClientReqGet returns 0");
7505
field = TSMimeHdrFieldFind(bufp, hdr, "Request", -1);
7506
if ((field == NULL) || (field == TS_ERROR_PTR)) {
7507
SDK_RPRINT(data->test, "TSHttpTxnTransform", "TestCase", TC_FAIL, "Didn't find field request");
7510
if (TSMimeHdrFieldValueIntGet(bufp, hdr, field, 0, &reqid) != TS_SUCCESS) {
7511
SDK_RPRINT(data->test, "TSHttpTxnTransform", "TestCase", TC_FAIL, "Error in getting field Value");
7514
if ((TSHttpTxnTransformedRespCache(txnp, 0) != TS_SUCCESS) ||
7515
(TSHttpTxnUntransformedRespCache(txnp, 1) != TS_SUCCESS)
7517
SDK_RPRINT(data->test, "TSHttpTxnTransformedRespCache", "TestCase", TC_FAIL,
7518
"TSHttpTxnTransformedRespCache or TSHttpTxnUntransformedRespCache doesn't return TS_SUCCESS.reqid=%d",
7523
if ((TSHttpTxnTransformedRespCache(txnp, 1) != TS_SUCCESS) ||
7524
(TSHttpTxnUntransformedRespCache(txnp, 0) != TS_SUCCESS)
7526
SDK_RPRINT(data->test, "TSHttpTxnTransformedRespCache", "TestCase", TC_FAIL,
7527
"TSHttpTxnTransformedRespCache or TSHttpTxnUntransformedRespCache doesn't return TS_SUCCESS.reqid=%d",
7532
if (TSHandleMLocRelease(bufp, hdr, field) != TS_SUCCESS) {
7533
SDK_RPRINT(data->test, "TSHttpTxnTransform", "TestCase", TC_FAIL,
7534
"Unable to release handle to field in Client request");
7537
if (TSHandleMLocRelease(bufp, TS_NULL_MLOC, hdr) != TS_SUCCESS) {
7538
SDK_RPRINT(data->test, "TSHttpTxnTransform", "TestCase", TC_FAIL,
7539
"Unable to release handle to Client request");
7544
/* Add the transaction hook to SEND_RESPONSE_HDR_HOOK */
7545
if (TSHttpTxnHookAdd(txnp, TS_HTTP_SEND_RESPONSE_HDR_HOOK, contp) != TS_SUCCESS) {
7546
SDK_RPRINT(data->test, "TSHttpTxnTransform", "", TC_FAIL,
7547
"Cannot add transaction hook to SEND_RESPONSE_HDR_HOOK");
7549
/* Reenable the transaction */
7550
if (TSHttpTxnReenable(txnp, TS_EVENT_HTTP_CONTINUE) != TS_SUCCESS) {
7551
SDK_RPRINT(data->test, "TSHttpTxnTransform", "", TC_FAIL,
7552
"Reenabling the transaction doesn't return TS_SUCCESS");
7556
case TS_EVENT_HTTP_SEND_RESPONSE_HDR:
7560
txnp = (TSHttpTxn) edata;
7561
if (TSHttpTxnTransformRespGet(txnp, &bufp, &hdr) == 0) {
7562
SDK_RPRINT(data->test, "TSHttpTxnTransformRespGet", "TestCase", TC_FAIL,
7563
"TSHttpTxnTransformRespGet returns 0");
7564
data->test_passed_txn_transform_resp_get = false;
7566
if ((bufp == &(((HttpSM *) txnp)->t_state.hdr_info.transform_response)) &&
7567
(hdr == (&(((HttpSM *) txnp)->t_state.hdr_info.transform_response))->m_http)
7569
SDK_RPRINT(data->test, "TSHttpTxnTransformRespGet", "TestCase", TC_PASS, "ok");
7571
SDK_RPRINT(data->test, "TSHttpTxnTransformRespGet", "TestCase", TC_FAIL, "Value's Mismatch");
7572
data->test_passed_txn_transform_resp_get = false;
7574
if (TSHandleMLocRelease(bufp, TS_NULL_MLOC, hdr) != TS_SUCCESS) {
7575
SDK_RPRINT(data->test, "TSHttpTxnTransformRespGet", "TestCase", TC_FAIL,
7576
"Unable to release handle to Transform header handle");
7581
if (TSHttpTxnReenable(txnp, TS_EVENT_HTTP_CONTINUE) != TS_SUCCESS) {
7582
SDK_RPRINT(data->test, "TSHttpTxnTransformRespGet", "", TC_FAIL,
7583
"Reenabling the transaction doesn't return TS_SUCCESS");
7587
case TS_EVENT_IMMEDIATE:
7588
case TS_EVENT_TIMEOUT:
7590
switch (data->req_no) {
7592
if (data->browser1->status == REQUEST_INPROGRESS) {
7593
TSContSchedule(contp, 25, TS_THREAD_POOL_DEFAULT);
7597
Debug(UTDBG_TAG "_transform", "Running Browser 2");
7598
synclient_txn_send_request(data->browser2, data->request2);
7599
TSContSchedule(contp, 25, TS_THREAD_POOL_DEFAULT);
7602
if (data->browser2->status == REQUEST_INPROGRESS) {
7603
TSContSchedule(contp, 25, TS_THREAD_POOL_DEFAULT);
7607
Debug(UTDBG_TAG "_transform", "Running Browser 3");
7608
synclient_txn_send_request(data->browser3, data->request1);
7609
TSContSchedule(contp, 25, TS_THREAD_POOL_DEFAULT);
7612
if (data->browser3->status == REQUEST_INPROGRESS) {
7613
TSContSchedule(contp, 25, TS_THREAD_POOL_DEFAULT);
7617
Debug(UTDBG_TAG "_transform", "Running Browser 4");
7618
synclient_txn_send_request(data->browser4, data->request2);
7619
TSContSchedule(contp, 25, TS_THREAD_POOL_DEFAULT);
7622
if (data->browser4->status == REQUEST_INPROGRESS) {
7623
TSContSchedule(contp, 25, TS_THREAD_POOL_DEFAULT);
7626
synserver_delete(data->os);
7628
TSfree(data->request1);
7629
TSfree(data->request2);
7630
// for squid log: if this is the last (or only) test in your
7631
// regression run you will not see any log entries in squid
7632
// (because logging is buffered and not flushed before
7633
// termination when running regressions)
7637
SDK_RPRINT(data->test, "TSHttpTxnTransform", "TestCase", TC_FAIL, "Something terribly wrong with the test");
7641
/* Browser got the response. test is over */
7643
/* Check if we got the response we were expecting or not */
7644
if ((strstr(data->browser1->response, TRANSFORM_APPEND_STRING) != NULL) &&
7645
(strstr(data->browser3->response, TRANSFORM_APPEND_STRING) == NULL)
7647
SDK_RPRINT(data->test, "TSHttpTxnUntransformedResponseCache", "TestCase1", TC_PASS, "ok");
7648
data->test_passed_txn_untransformed_resp_cache = true;
7650
SDK_RPRINT(data->test, "TSHttpTxnUntransformedResponseCache", "TestCase1", TC_FAIL, "Value's Mismatch");
7653
if ((strstr(data->browser2->response, TRANSFORM_APPEND_STRING) != NULL) &&
7654
(strstr(data->browser4->response, TRANSFORM_APPEND_STRING) != NULL)
7656
SDK_RPRINT(data->test, "TSHttpTxnTransformedResponseCache", "TestCase1", TC_PASS, "ok");
7657
data->test_passed_txn_transformed_resp_cache = true;
7659
SDK_RPRINT(data->test, "TSHttpTxnTransformedResponseCache", "TestCase1", TC_FAIL, "Value's Mismatch");
7662
/* Note: response is available using test->browser->response pointer */
7663
*(data->pstatus) = REGRESSION_TEST_PASSED;
7664
if (data->browser1->status != REQUEST_SUCCESS) {
7665
SDK_RPRINT(data->test, "TSTransformCreate", "TestCase1", TC_FAIL, "Browser 1 status was not REQUEST_SUCCESS");
7666
*(data->pstatus) = REGRESSION_TEST_FAILED;
7668
if (data->browser2->status != REQUEST_SUCCESS) {
7669
SDK_RPRINT(data->test, "TSTransformCreate", "TestCase1", TC_FAIL, "Browser 2 status was not REQUEST_SUCCESS");
7670
*(data->pstatus) = REGRESSION_TEST_FAILED;
7672
if (data->browser3->status != REQUEST_SUCCESS) {
7673
SDK_RPRINT(data->test, "TSTransformCreate", "TestCase1", TC_FAIL, "Browser 3 status was not REQUEST_SUCCESS");
7674
*(data->pstatus) = REGRESSION_TEST_FAILED;
7676
if (data->browser4->status != REQUEST_SUCCESS) {
7677
SDK_RPRINT(data->test, "TSTransformCreate", "TestCase1", TC_FAIL, "Browser 4 status was not REQUEST_SUCCESS");
7678
*(data->pstatus) = REGRESSION_TEST_FAILED;
7680
if (data->test_passed_txn_transform_resp_get != true) {
7681
SDK_RPRINT(data->test, "TSTransformCreate", "TestCase1", TC_FAIL, "did not pass transform_resp_get");
7682
*(data->pstatus) = REGRESSION_TEST_FAILED;
7684
if (data->test_passed_txn_transformed_resp_cache != true) {
7685
SDK_RPRINT(data->test, "TSTransformCreate", "TestCase1", TC_FAIL, "did not pass transformed_resp_cache");
7686
*(data->pstatus) = REGRESSION_TEST_FAILED;
7688
if (data->test_passed_txn_untransformed_resp_cache != true) {
7689
SDK_RPRINT(data->test, "TSTransformCreate", "TestCase1", TC_FAIL, "did not pass untransformed_resp_cache");
7690
*(data->pstatus) = REGRESSION_TEST_FAILED;
7692
if (data->test_passed_transform_create != true) {
7693
SDK_RPRINT(data->test, "TSTransformCreate", "TestCase1", TC_FAIL, "did not pass transform_create");
7694
*(data->pstatus) = REGRESSION_TEST_FAILED;
7696
// transaction is over. clean up.
7697
synclient_txn_delete(data->browser1);
7698
synclient_txn_delete(data->browser2);
7699
synclient_txn_delete(data->browser3);
7700
synclient_txn_delete(data->browser4);
7702
data->magic = MAGIC_DEAD;
7704
TSContDataSet(contp, NULL);
7709
*(data->pstatus) = REGRESSION_TEST_FAILED;
7710
SDK_RPRINT(data->test, "TSHttpTxnTransform", "TestCase1", TC_FAIL, "Unexpected event %d", event);
7717
EXCLUSIVE_REGRESSION_TEST(SDK_API_HttpTxnTransform) (RegressionTest * test, int atype, int *pstatus)
7719
NOWARN_UNUSED(atype);
7720
*pstatus = REGRESSION_TEST_INPROGRESS;
7722
Debug(UTDBG_TAG "_transform", "Starting test");
7724
TSCont cont = TSContCreate(transform_hook_handler, TSMutexCreate());
7725
if ((cont == NULL) || (cont == TS_ERROR_PTR)) {
7726
SDK_RPRINT(test, "TSHttpSsn", "TestCase1", TC_FAIL, "Unable to create Continuation.");
7727
*pstatus = REGRESSION_TEST_FAILED;
7731
TransformTestData *socktest = (TransformTestData *) TSmalloc(sizeof(TransformTestData));
7732
socktest->test = test;
7733
socktest->pstatus = pstatus;
7734
socktest->test_passed_txn_transform_resp_get = true;
7735
socktest->test_passed_txn_transformed_resp_cache = false;
7736
socktest->test_passed_txn_transformed_resp_cache = false;
7737
socktest->test_passed_transform_create = false;
7738
socktest->transformData = NULL;
7739
socktest->req_no = 1;
7740
socktest->magic = MAGIC_ALIVE;
7741
TSContDataSet(cont, socktest);
7743
/* Prepare the buffer to be appended to responses */
7744
load(TRANSFORM_APPEND_STRING);
7746
TSHttpHookAdd(TS_HTTP_READ_REQUEST_HDR_HOOK, cont); //so we can skip remapping
7748
/* Register to HTTP hooks that are called in case of a cache MISS */
7749
TSHttpHookAdd(TS_HTTP_READ_RESPONSE_HDR_HOOK, cont);
7751
/* Create a new synthetic server */
7752
socktest->os = synserver_create(SYNSERVER_LISTEN_PORT);
7753
synserver_start(socktest->os);
7755
/* Create a client transaction */
7756
socktest->browser1 = synclient_txn_create();
7757
socktest->browser2 = synclient_txn_create();
7758
socktest->browser3 = synclient_txn_create();
7759
socktest->browser4 = synclient_txn_create();
7760
socktest->request1 = generate_request(4);
7761
socktest->request2 = generate_request(5);
7762
Debug(UTDBG_TAG "_transform", "Running Browser 1");
7763
synclient_txn_send_request(socktest->browser1, socktest->request1);
7764
// synclient_txn_send_request(socktest->browser2, socktest->request2);
7766
/* Wait until transaction is done */
7767
TSContSchedule(cont, 25, TS_THREAD_POOL_DEFAULT);
7772
//////////////////////////////////////////////
7773
// SDK_API_TSHttpTxnAltInfo
7775
// Unit Test for API: TSHttpTxnCachedReqGet
7776
// TSHttpTxnCachedRespGet
7777
//////////////////////////////////////////////
7781
RegressionTest *test;
7784
ClientTxn *browser1;
7785
ClientTxn *browser2;
7786
ClientTxn *browser3;
7790
bool test_passed_txn_alt_info_client_req_get;
7791
bool test_passed_txn_alt_info_cached_req_get;
7792
bool test_passed_txn_alt_info_cached_resp_get;
7793
bool test_passed_txn_alt_info_quality_set;
7794
bool run_at_least_once;
7800
altinfo_hook_handler(TSCont contp, TSEvent event, void *edata)
7802
AltInfoTestData *data = NULL;
7803
TSHttpTxn txnp = NULL;
7805
data = (AltInfoTestData *) TSContDataGet(contp);
7806
if ((data == TS_ERROR_PTR) || (data == NULL)) {
7808
case TS_EVENT_IMMEDIATE:
7809
case TS_EVENT_TIMEOUT:
7811
case TS_EVENT_HTTP_SELECT_ALT:
7814
TSHttpTxnReenable((TSHttpTxn) edata, TS_EVENT_HTTP_CONTINUE);
7821
case TS_EVENT_HTTP_READ_REQUEST_HDR:
7822
txnp = (TSHttpTxn) edata;
7823
TSSkipRemappingSet(txnp,1);
7824
TSHttpTxnReenable(txnp, TS_EVENT_HTTP_CONTINUE);
7827
case TS_EVENT_HTTP_SELECT_ALT:
7829
TSMBuffer clientreqbuf;
7830
TSMBuffer cachereqbuf;
7831
TSMBuffer cacherespbuf;
7833
TSMLoc clientreqhdr;
7835
TSMLoc cacheresphdr;
7837
TSHttpAltInfo infop = (TSHttpAltInfo) edata;
7839
data->run_at_least_once = true;
7840
if (TSHttpAltInfoClientReqGet(infop, &clientreqbuf, &clientreqhdr) != TS_SUCCESS) {
7841
SDK_RPRINT(data->test, "TSHttpAltInfoClientReqGet", "TestCase", TC_FAIL,
7842
"TSHttpAltInfoClientReqGet doesn't return TS_SUCCESS");
7843
data->test_passed_txn_alt_info_client_req_get = false;
7845
if ((clientreqbuf == (&(((HttpAltInfo *) infop)->m_client_req))) &&
7846
(clientreqhdr == ((HttpAltInfo *) infop)->m_client_req.m_http)
7848
SDK_RPRINT(data->test, "TSHttpAltInfoClientReqGet", "TestCase", TC_PASS, "ok");
7850
SDK_RPRINT(data->test, "TSHttpAltInfoClientReqGet", "TestCase", TC_FAIL, "Value's Mismatch");
7851
data->test_passed_txn_alt_info_client_req_get = false;
7855
if (TSHttpAltInfoCachedReqGet(infop, &cachereqbuf, &cachereqhdr) != TS_SUCCESS) {
7856
SDK_RPRINT(data->test, "TSHttpAltInfoCachedReqGet", "TestCase", TC_FAIL,
7857
"TSHttpAltInfoCachedReqGet doesn't return TS_SUCCESS");
7858
data->test_passed_txn_alt_info_cached_req_get = false;
7860
if ((cachereqbuf == (&(((HttpAltInfo *) infop)->m_cached_req))) &&
7861
(cachereqhdr == ((HttpAltInfo *) infop)->m_cached_req.m_http)
7863
SDK_RPRINT(data->test, "TSHttpAltInfoCachedReqGet", "TestCase", TC_PASS, "ok");
7865
SDK_RPRINT(data->test, "TSHttpAltInfoCachedReqGet", "TestCase", TC_FAIL, "Value's Mismatch");
7866
data->test_passed_txn_alt_info_cached_req_get = false;
7870
if (TSHttpAltInfoCachedRespGet(infop, &cacherespbuf, &cacheresphdr) != TS_SUCCESS) {
7871
SDK_RPRINT(data->test, "TSHttpAltInfoCachedRespGet", "TestCase", TC_FAIL,
7872
"TSHttpAltInfoCachedRespGet doesn't return TS_SUCCESS");
7873
data->test_passed_txn_alt_info_cached_resp_get = false;
7875
if ((cacherespbuf == (&(((HttpAltInfo *) infop)->m_cached_resp))) &&
7876
(cacheresphdr == ((HttpAltInfo *) infop)->m_cached_resp.m_http)
7878
SDK_RPRINT(data->test, "TSHttpAltInfoCachedRespGet", "TestCase", TC_PASS, "ok");
7880
SDK_RPRINT(data->test, "TSHttpAltInfoCachedRespGet", "TestCase", TC_FAIL, "Value's Mismatch");
7881
data->test_passed_txn_alt_info_cached_resp_get = false;
7885
if (TSHttpAltInfoQualitySet(infop, 0.5) != TS_SUCCESS) {
7886
SDK_RPRINT(data->test, "TSHttpAltInfoQualityset", "TestCase", TC_FAIL,
7887
"TSHttpAltInfoQualitySet doesn't return TS_SUCCESS");
7888
data->test_passed_txn_alt_info_quality_set = false;
7890
SDK_RPRINT(data->test, "TSHttpAltInfoQualitySet", "TestCase", TC_PASS, "ok");
7896
case TS_EVENT_IMMEDIATE:
7897
case TS_EVENT_TIMEOUT:
7898
/* Browser still waiting the response ? */
7899
if (data->first_time == true) {
7900
if ((data->browser1->status == REQUEST_INPROGRESS) || (data->browser2->status == REQUEST_INPROGRESS)) {
7901
TSContSchedule(contp, 25, TS_THREAD_POOL_DEFAULT);
7905
if (data->browser3->status == REQUEST_INPROGRESS) {
7906
TSContSchedule(contp, 25, TS_THREAD_POOL_DEFAULT);
7911
/* Browser got the response. test is over. clean up */
7913
/* If this is the first time, then both the responses are in cache and we should make */
7914
/* another request to get cache hit */
7915
if (data->first_time == true) {
7916
data->first_time = false;
7917
/* Kill the origin server */
7918
synserver_delete(data->os);
7919
// ink_release_assert(0);
7920
/* Send another similar client request */
7921
synclient_txn_send_request(data->browser3, data->request3);
7923
/* Register to HTTP hooks that are called in case of alternate selection */
7924
if (TSHttpHookAdd(TS_HTTP_SELECT_ALT_HOOK, contp) != TS_SUCCESS) {
7925
SDK_RPRINT(data->test, "TSHttpAltInfo", "", TC_FAIL, "TSHttpHookAdd doesn't return TS_SUCCESS");
7928
TSContSchedule(contp, 25, TS_THREAD_POOL_DEFAULT);
7932
/* Note: response is available using test->browser->response pointer */
7933
if ((data->browser3->status == REQUEST_SUCCESS) &&
7934
(data->test_passed_txn_alt_info_client_req_get == true) &&
7935
(data->test_passed_txn_alt_info_cached_req_get == true) &&
7936
(data->test_passed_txn_alt_info_cached_resp_get == true) &&
7937
(data->test_passed_txn_alt_info_quality_set == true) && (data->run_at_least_once == true)
7939
*(data->pstatus) = REGRESSION_TEST_PASSED;
7941
if (data->run_at_least_once == false) {
7942
SDK_RPRINT(data->test, "TSHttpAltInfo", "All", TC_FAIL, "Test not executed even once");
7944
*(data->pstatus) = REGRESSION_TEST_FAILED;
7947
// transaction is over. clean up.
7948
synclient_txn_delete(data->browser1);
7949
synclient_txn_delete(data->browser2);
7950
synclient_txn_delete(data->browser3);
7952
TSfree(data->request1);
7953
TSfree(data->request2);
7954
TSfree(data->request3);
7956
data->magic = MAGIC_DEAD;
7958
TSContDataSet(contp, NULL);
7963
*(data->pstatus) = REGRESSION_TEST_FAILED;
7964
SDK_RPRINT(data->test, "TSHttpTxnCache", "TestCase1", TC_FAIL, "Unexpected event %d", event);
7972
EXCLUSIVE_REGRESSION_TEST(SDK_API_HttpAltInfo) (RegressionTest * test, int atype, int *pstatus)
7974
NOWARN_UNUSED(atype);
7975
*pstatus = REGRESSION_TEST_INPROGRESS;
7977
TSCont cont = TSContCreate(altinfo_hook_handler, TSMutexCreate());
7978
if ((cont == NULL) || (cont == TS_ERROR_PTR)) {
7979
SDK_RPRINT(test, "TSHttpSsn", "TestCase1", TC_FAIL, "Unable to create Continuation.");
7980
*pstatus = REGRESSION_TEST_FAILED;
7984
TSHttpHookAdd(TS_HTTP_READ_REQUEST_HDR_HOOK, cont); //so we can skip remapping
7986
AltInfoTestData *socktest = (AltInfoTestData *) TSmalloc(sizeof(AltInfoTestData));
7987
socktest->test = test;
7988
socktest->pstatus = pstatus;
7989
socktest->test_passed_txn_alt_info_client_req_get = true;
7990
socktest->test_passed_txn_alt_info_cached_req_get = true;
7991
socktest->test_passed_txn_alt_info_cached_resp_get = true;
7992
socktest->test_passed_txn_alt_info_quality_set = true;
7993
socktest->run_at_least_once = false;
7994
socktest->first_time = true;
7995
socktest->magic = MAGIC_ALIVE;
7996
TSContDataSet(cont, socktest);
7998
/* Create a new synthetic server */
7999
socktest->os = synserver_create(SYNSERVER_LISTEN_PORT);
8000
synserver_start(socktest->os);
8002
/* Create a client transaction */
8003
socktest->browser1 = synclient_txn_create();
8004
socktest->browser2 = synclient_txn_create();
8005
socktest->browser3 = synclient_txn_create();
8006
socktest->request1 = generate_request(6);
8007
socktest->request2 = generate_request(7);
8008
socktest->request3 = generate_request(8);
8009
synclient_txn_send_request(socktest->browser1, socktest->request1);
8010
synclient_txn_send_request(socktest->browser2, socktest->request2);
8012
/* Wait until transaction is done */
8013
TSContSchedule(cont, 25, TS_THREAD_POOL_DEFAULT);
8019
//////////////////////////////////////////////
8020
// SDK_API_TSHttpConnect
8022
// Unit Test for APIs:
8024
// - TSHttpTxnIntercept
8025
// - TSHttpTxnInterceptServer
8030
// Same test strategy:
8031
// - create a synthetic server listening on port A
8032
// - use HttpConnect to send a request to TS for an url on a remote host H, port B
8033
// - use TxnIntercept or TxnServerIntercept to forward the request
8034
// to the synthetic server on local host, port A
8035
// - make sure response is correct
8037
//////////////////////////////////////////////
8039
// Important: we create servers listening on different port than the default one
8040
// to make sure our synthetix servers are called
8042
#define TEST_CASE_CONNECT_ID1 9 //TSHttpTxnIntercept
8043
#define TEST_CASE_CONNECT_ID2 10 //TSHttpTxnServerIntercept
8045
#define SYNSERVER_DUMMY_PORT -1
8049
RegressionTest *test;
8056
unsigned long magic;
8061
cont_test_handler(TSCont contp, TSEvent event, void *edata)
8063
TSHttpTxn txnp = (TSHttpTxn) edata;
8064
ConnectTestData *data = (ConnectTestData *) TSContDataGet(contp);
8065
int request_id = -1;
8067
TSReleaseAssert(data->magic == MAGIC_ALIVE);
8068
TSReleaseAssert((data->test_case == TEST_CASE_CONNECT_ID1) || (data->test_case == TEST_CASE_CONNECT_ID2));
8070
TSDebug(UTDBG_TAG, "Calling cont_test_handler with event %d", event);
8073
case TS_EVENT_HTTP_READ_REQUEST_HDR:
8074
TSDebug(UTDBG_TAG, "cont_test_handler: event READ_REQUEST");
8076
// First make sure we're getting called for either request 9 or txn 10
8077
// Otherwise, this is a request sent by another test. do nothing.
8078
request_id = get_request_id(txnp);
8079
TSReleaseAssert(request_id != -1);
8081
TSDebug(UTDBG_TAG, "cont_test_handler: Request id = %d", request_id);
8083
if ((request_id != TEST_CASE_CONNECT_ID1) && (request_id != TEST_CASE_CONNECT_ID2)) {
8084
TSDebug(UTDBG_TAG, "This is not an event for this test !");
8085
TSHttpTxnReenable(txnp, TS_EVENT_HTTP_CONTINUE);
8089
if ((request_id == TEST_CASE_CONNECT_ID1) && (data->test_case == TEST_CASE_CONNECT_ID1)) {
8090
TSDebug(UTDBG_TAG, "Calling TSHttpTxnIntercept");
8091
TSHttpTxnIntercept(data->os->accept_cont, txnp);
8092
} else if ((request_id == TEST_CASE_CONNECT_ID2) && (data->test_case == TEST_CASE_CONNECT_ID2)) {
8093
TSDebug(UTDBG_TAG, "Calling TSHttpTxnServerIntercept");
8094
TSHttpTxnServerIntercept(data->os->accept_cont, txnp);
8097
TSHttpTxnReenable(txnp, TS_EVENT_HTTP_CONTINUE);
8100
case TS_EVENT_TIMEOUT:
8101
/* Browser still waiting the response ? */
8102
if (data->browser->status == REQUEST_INPROGRESS) {
8103
TSDebug(UTDBG_TAG, "Browser still waiting response...");
8104
TSContSchedule(contp, 25, TS_THREAD_POOL_DEFAULT);
8106
/* Browser got the response */
8108
/* Check if browser response body is the one we expected */
8109
char *body_response = get_body_ptr(data->browser->response);
8110
const char *body_expected;
8111
if (data->test_case == TEST_CASE_CONNECT_ID1) {
8112
body_expected = "Body for response 9";
8114
body_expected = "Body for response 10";
8116
TSDebug(UTDBG_TAG, "Body Response = \n|%s|\nBody Expected = \n|%s|", body_response, body_expected);
8118
if (strncmp(body_response, body_expected, strlen(body_expected)) != 0) {
8119
if (data->test_case == TEST_CASE_CONNECT_ID1) {
8120
SDK_RPRINT(data->test, "TSHttpConnect", "TestCase1", TC_FAIL, "Unexpected response");
8121
SDK_RPRINT(data->test, "TSHttpTxnIntercept", "TestCase1", TC_FAIL, "Unexpected response");
8123
SDK_RPRINT(data->test, "TSHttpConnect", "TestCase2", TC_FAIL, "Unexpected response");
8124
SDK_RPRINT(data->test, "TSHttpTxnServerIntercept", "TestCase2", TC_FAIL, "Unexpected response");
8126
*(data->pstatus) = REGRESSION_TEST_FAILED;
8129
if (data->test_case == TEST_CASE_CONNECT_ID1) {
8130
SDK_RPRINT(data->test, "TSHttpConnect", "TestCase1", TC_PASS, "ok");
8131
SDK_RPRINT(data->test, "TSHttpTxnIntercept", "TestCase1", TC_PASS, "ok");
8133
SDK_RPRINT(data->test, "TSHttpConnect", "TestCase2", TC_PASS, "ok");
8134
SDK_RPRINT(data->test, "TSHttpTxnServerIntercept", "TestCase2", TC_PASS, "ok");
8136
*(data->pstatus) = REGRESSION_TEST_PASSED;
8139
// transaction is over. clean it up.
8140
synclient_txn_delete(data->browser);
8141
synserver_delete(data->os);
8143
// As we registered to a global hook, we may be called back again.
8144
// Do not destroy the continuation...
8145
// data->magic = MAGIC_DEAD;
8147
// TSContDataSet(contp, NULL);
8152
*(data->pstatus) = REGRESSION_TEST_FAILED;
8153
SDK_RPRINT(data->test, "TSHttpConnect", "TestCase1 or 2", TC_FAIL, "Unexpected event %d", event);
8158
return TS_EVENT_IMMEDIATE;
8162
EXCLUSIVE_REGRESSION_TEST(SDK_API_TSHttpConnectIntercept) (RegressionTest * test, int atype, int *pstatus)
8164
NOWARN_UNUSED(atype);
8165
*pstatus = REGRESSION_TEST_INPROGRESS;
8167
TSDebug(UTDBG_TAG, "Starting test TSHttpConnectIntercept");
8169
TSCont cont_test = TSContCreate(cont_test_handler, TSMutexCreate());
8170
ConnectTestData *data = (ConnectTestData *) TSmalloc(sizeof(ConnectTestData));
8171
TSContDataSet(cont_test, data);
8174
data->pstatus = pstatus;
8175
data->magic = MAGIC_ALIVE;
8176
data->test_case = TEST_CASE_CONNECT_ID1;
8178
/* Register to hook READ_REQUEST */
8179
TSHttpHookAdd(TS_HTTP_READ_REQUEST_HDR_HOOK, cont_test);
8181
// Create a synthetic server which won't really listen on a socket port
8182
// It will be called by the Http SM with a VC
8183
data->os = synserver_create(SYNSERVER_DUMMY_PORT);
8185
data->browser = synclient_txn_create();
8186
data->request = generate_request(9);
8188
/* Now send a request to the OS via TS using TSHttpConnect */
8190
/* ip and log do not matter as it is used for logging only */
8191
TSHttpConnect(1, 1, &(data->vc));
8193
synclient_txn_send_request_to_vc(data->browser, data->request, data->vc);
8195
/* Wait until transaction is done */
8196
TSContSchedule(cont_test, 25, TS_THREAD_POOL_DEFAULT);
8202
EXCLUSIVE_REGRESSION_TEST(SDK_API_TSHttpConnectServerIntercept) (RegressionTest * test, int atype, int *pstatus)
8204
NOWARN_UNUSED(atype);
8205
*pstatus = REGRESSION_TEST_INPROGRESS;
8207
TSDebug(UTDBG_TAG, "Starting test TSHttpConnectServerintercept");
8209
TSCont cont_test = TSContCreate(cont_test_handler, TSMutexCreate());
8210
ConnectTestData *data = (ConnectTestData *) TSmalloc(sizeof(ConnectTestData));
8211
TSContDataSet(cont_test, data);
8214
data->pstatus = pstatus;
8215
data->magic = MAGIC_ALIVE;
8216
data->test_case = TEST_CASE_CONNECT_ID2;
8218
/* Register to hook READ_REQUEST */
8219
TSHttpHookAdd(TS_HTTP_READ_REQUEST_HDR_HOOK, cont_test);
8221
/* This is cool ! we can use the code written for the synthetic server and client in InkAPITest.cc */
8222
data->os = synserver_create(SYNSERVER_DUMMY_PORT);
8224
data->browser = synclient_txn_create();
8225
data->request = generate_request(10);
8227
/* Now send a request to the OS via TS using TSHttpConnect */
8229
/* ip and log do not matter as it is used for logging only */
8230
TSHttpConnect(2, 2, &(data->vc));
8232
synclient_txn_send_request_to_vc(data->browser, data->request, data->vc);
8234
/* Wait until transaction is done */
8235
TSContSchedule(cont_test, 25, TS_THREAD_POOL_DEFAULT);
8241
////////////////////////////////////////////////
8242
// SDK_API_OVERRIDABLE_CONFIGS
8244
// Unit Test for API: TSHttpTxnConfigFind
8245
// TSHttpTxnConfigIntSet
8246
// TSHttpTxnConfigIntGet
8247
// TSHttpTxnConfigFloatSet
8248
// TSHttpTxnConfigFloatGet
8249
// TSHttpTxnConfigStringSet
8250
// TSHttpTxnConfigStringGet
8251
////////////////////////////////////////////////
8253
// The order of these should be the same as TSOverridableConfigKey
8254
const char *SDK_Overridable_Configs[] = {
8255
"proxy.config.url_remap.pristine_host_hdr",
8256
"proxy.config.http.chunking_enabled",
8257
"proxy.config.http.negative_caching_enabled",
8258
"proxy.config.http.negative_caching_lifetime",
8259
"proxy.config.http.cache.when_to_revalidate",
8260
"proxy.config.http.keep_alive_enabled",
8261
"proxy.config.http.keep_alive_post_out",
8262
"proxy.config.net.sock_recv_buffer_size_out",
8263
"proxy.config.net.sock_send_buffer_size_out",
8264
"proxy.config.net.sock_option_flag_out",
8265
"proxy.config.http.anonymize_remove_from",
8266
"proxy.config.http.anonymize_remove_referer",
8267
"proxy.config.http.anonymize_remove_user_agent",
8268
"proxy.config.http.anonymize_remove_cookie",
8269
"proxy.config.http.anonymize_remove_client_ip",
8270
"proxy.config.http.anonymize_insert_client_ip",
8271
"proxy.config.http.append_xforwards_header",
8272
"proxy.config.http.response_server_enabled",
8273
"proxy.config.http.insert_squid_x_forwarded_for",
8274
"proxy.config.http.send_http11_requests",
8275
"proxy.config.http.cache.http",
8276
"proxy.config.http.cache.ignore_client_no_cache",
8277
"proxy.config.http.cache.ignore_client_cc_max_age",
8278
"proxy.config.http.cache.ims_on_client_no_cache",
8279
"proxy.config.http.cache.ignore_server_no_cache",
8280
"proxy.config.http.cache.cache_responses_to_cookies",
8281
"proxy.config.http.cache.ignore_authentication",
8282
"proxy.config.http.cache.cache_urls_that_look_dynamic",
8283
"proxy.config.http.cache.required_headers",
8284
"proxy.config.http.insert_request_via_str",
8285
"proxy.config.http.insert_response_via_str",
8286
"proxy.config.http.cache.heuristic_min_lifetime",
8287
"proxy.config.http.cache.heuristic_max_lifetime",
8288
"proxy.config.http.cache.guaranteed_min_lifetime",
8289
"proxy.config.http.cache.guaranteed_max_lifetime",
8290
"proxy.config.http.cache.max_stale_age",
8291
"proxy.config.http.keep_alive_no_activity_timeout_in",
8292
"proxy.config.http.transaction_no_activity_timeout_in",
8293
"proxy.config.http.transaction_no_activity_timeout_out",
8294
"proxy.config.http.transaction_active_timeout_out",
8295
"proxy.config.http.origin_max_connections",
8296
"proxy.config.http.connect_attempts_max_retries",
8297
"proxy.config.http.connect_attempts_max_retries_dead_server",
8298
"proxy.config.http.connect_attempts_rr_retries",
8299
"proxy.config.http.connect_attempts_timeout",
8300
"proxy.config.http.post_connect_attempts_timeout",
8301
"proxy.config.http.down_server.cache_time",
8302
"proxy.config.http.down_server.abort_threshold",
8303
"proxy.config.http.cache.fuzz.time",
8304
"proxy.config.http.cache.fuzz.min_time",
8306
// These are "special", since they are not MgmtInt's
8307
"proxy.config.http.response_server_str",
8308
"proxy.config.http.cache.heuristic_lm_factor",
8309
"proxy.config.http.cache.fuzz.probability",
8314
REGRESSION_TEST(SDK_API_OVERRIDABLE_CONFIGS) (RegressionTest * test, int atype, int *pstatus)
8316
NOWARN_UNUSED(atype);
8318
TSOverridableConfigKey key;
8319
TSRecordDataType type;
8320
HttpSM* s = HttpSM::allocate();
8321
bool success = true;
8322
TSHttpTxn txnp = static_cast<TSHttpTxn>(s); // Convenience ...
8326
const char* test_string = "The Apache Traffic Server";
8330
*pstatus = REGRESSION_TEST_INPROGRESS;
8331
for (int i=TS_CONFIG_NULL + 1; i < TS_CONFIG_LAST_ENTRY; ++i) {
8332
conf = SDK_Overridable_Configs[i];
8333
if (TS_SUCCESS == TSHttpTxnConfigFind(conf, -1, &key, &type)) {
8335
SDK_RPRINT(test, "TSHttpTxnConfigFind", "TestCase1", TC_FAIL, "Failed on %s, expected %d, got %d", conf, i, key);
8340
SDK_RPRINT(test, "TSHttpTxnConfigFind", "TestCase1", TC_FAIL, "Called returned unexpected TS_ERROR");
8344
// Now check the getters / setters
8346
case TS_RECORDDATATYPE_INT:
8347
TSHttpTxnConfigIntSet(txnp, key, 17);
8348
TSHttpTxnConfigIntGet(txnp, key, &ival);
8350
SDK_RPRINT(test, "TSHttpTxnConfigIntSet", "TestCase1", TC_FAIL, "Failed on %s, expected 17, got %d", conf, ival);
8356
case TS_RECORDDATATYPE_FLOAT:
8357
TSHttpTxnConfigFloatSet(txnp, key, 17.17);
8358
TSHttpTxnConfigFloatGet(txnp, key, &fval);
8359
if (17.17 != fval) {
8360
SDK_RPRINT(test, "TSHttpTxnConfigFloatSet", "TestCase1", TC_FAIL, "Failed on %s, expected 17, got %d", conf, ival);
8366
case TS_RECORDDATATYPE_STRING:
8367
TSHttpTxnConfigStringSet(txnp, key, test_string, -1);
8368
TSHttpTxnConfigStringGet(txnp, key, &sval, NULL);
8369
if (test_string != sval) {
8370
SDK_RPRINT(test, "TSHttpTxnConfigStringSet", "TestCase1", TC_FAIL, "Failed on %s, expected 17, got %s", conf, sval);
8383
*pstatus = REGRESSION_TEST_PASSED;
8384
SDK_RPRINT(test, "TSHttpTxnConfigFind", "TestCase1", TC_PASS, "ok");
8385
SDK_RPRINT(test, "TSHttpTxnConfigIntSet", "TestCase1", TC_PASS, "ok");
8386
SDK_RPRINT(test, "TSHttpTxnConfigFloatSet", "TestCase1", TC_PASS, "ok");
8387
SDK_RPRINT(test, "TSHttpTxnConfigStringSet", "TestCase1", TC_PASS, "ok");
8389
*pstatus = REGRESSION_TEST_FAILED;