00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #if defined(__GNUC__) && (__GNUC__ >= 4) && (__GNUC_MINOR__ >= 3)
00026 #pragma GCC diagnostic ignored "-Wdeprecated"
00027 #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
00028 #endif
00029
00030 #include "ink_config.h"
00031 #include <sys/types.h>
00032
00033 #include <errno.h>
00034
00035
00036 #include <pthread.h>
00037 #include <unistd.h>
00038 #include <stdio.h>
00039 #include <string.h>
00040
00041 #include "Regression.h"
00042 #include "api/ts/ts.h"
00043 #include "api/ts/experimental.h"
00044 #include "I_RecCore.h"
00045 #include <sys/types.h>
00046
00047 #include "InkAPITestTool.cc"
00048 #include "http/HttpSM.h"
00049 #include "ts/TestBox.h"
00050
00051 #define TC_PASS 1
00052 #define TC_FAIL 0
00053
00054 #define UTDBG_TAG "sdk_ut"
00055
00056
00057
00058
00059 int
00060 SDK_RPRINT(RegressionTest * t, const char *api_name, const char *testcase_name, int status, const char *err_details_format, ...)
00061 {
00062 int l;
00063 char buffer[8192];
00064 char format2[8192];
00065 snprintf(format2, sizeof(format2), "[%s] %s : [%s] <<%s>> { %s }\n", t->name,
00066 api_name, testcase_name, status == TC_PASS ? "PASS" : "FAIL", err_details_format);
00067 va_list ap;
00068 va_start(ap, err_details_format);
00069 l = ink_bvsprintf(buffer, format2, ap);
00070 va_end(ap);
00071 fputs(buffer, stderr);
00072 return (l);
00073 }
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103 REGRESSION_TEST(SDK_API_TSTrafficServerVersionGet) (RegressionTest * test, int , int *pstatus)
00104 {
00105 *pstatus = REGRESSION_TEST_INPROGRESS;
00106
00107
00108 const char *ts_version = TSTrafficServerVersionGet();
00109 if (!ts_version) {
00110 SDK_RPRINT(test, "TSTrafficServerVersionGet", "TestCase1", TC_FAIL, "can't get traffic server version");
00111 *pstatus = REGRESSION_TEST_FAILED;
00112 return;
00113 }
00114
00115 int major_ts_version = 0;
00116 int minor_ts_version = 0;
00117 int patch_ts_version = 0;
00118
00119 if (sscanf(ts_version, "%d.%d.%d", &major_ts_version, &minor_ts_version, &patch_ts_version) != 3) {
00120 SDK_RPRINT(test, "TSTrafficServerVersionGet", "TestCase2", TC_FAIL, "traffic server version format is incorrect");
00121 *pstatus = REGRESSION_TEST_FAILED;
00122 return;
00123 }
00124
00125 if (major_ts_version < 2) {
00126 SDK_RPRINT(test, "TSTrafficServerVersionGet", "TestCase3", TC_FAIL, "traffic server major version is incorrect");
00127 *pstatus = REGRESSION_TEST_FAILED;
00128 return;
00129 }
00130
00131 SDK_RPRINT(test, "TSTrafficServerVersionGet", "TestCase1", TC_PASS, "ok");
00132 *pstatus = REGRESSION_TEST_PASSED;
00133 return;
00134 }
00135
00136
00137
00138
00139
00140
00141
00142
00143 REGRESSION_TEST(SDK_API_TSPluginDirGet) (RegressionTest * test, int , int *pstatus)
00144 {
00145 *pstatus = REGRESSION_TEST_INPROGRESS;
00146
00147 const char *plugin_dir = TSPluginDirGet();
00148 const char *install_dir = TSInstallDirGet();
00149
00150 if (!plugin_dir) {
00151 SDK_RPRINT(test, "TSPluginDirGet", "TestCase1", TC_FAIL, "can't get plugin dir");
00152 *pstatus = REGRESSION_TEST_FAILED;
00153 return;
00154 }
00155
00156 if (!install_dir) {
00157 SDK_RPRINT(test, "TSInstallDirGet", "TestCase1", TC_FAIL, "can't get installation dir");
00158 *pstatus = REGRESSION_TEST_FAILED;
00159 return;
00160 }
00161
00162 if (strstr(plugin_dir, TS_BUILD_LIBEXECDIR) == NULL) {
00163 SDK_RPRINT(test, "TSPluginDirGet", "TestCase2", TC_FAIL,
00164 "plugin dir(%s) is incorrect, expected (%s) in path.",
00165 plugin_dir, TS_BUILD_LIBEXECDIR);
00166 *pstatus = REGRESSION_TEST_FAILED;
00167 return;
00168 }
00169
00170 if (strstr(plugin_dir, install_dir) == NULL) {
00171 SDK_RPRINT(test, "TSInstallDirGet", "TestCase2", TC_FAIL, "install dir is incorrect");
00172 *pstatus = REGRESSION_TEST_FAILED;
00173 return;
00174 }
00175
00176 SDK_RPRINT(test, "TSPluginDirGet", "TestCase1", TC_PASS, "ok");
00177 SDK_RPRINT(test, "TSInstallDirGet", "TestCase1", TC_PASS, "ok");
00178 *pstatus = REGRESSION_TEST_PASSED;
00179 return;
00180 }
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192 static int my_config_id = -1;
00193 typedef struct
00194 {
00195 const char *a;
00196 const char *b;
00197 } ConfigData;
00198
00199 static void
00200 config_destroy_func(void *data)
00201 {
00202 ConfigData *config = (ConfigData *) data;
00203 TSfree(config);
00204 return;
00205 }
00206
00207 REGRESSION_TEST(SDK_API_TSConfig) (RegressionTest * test, int , int *pstatus)
00208 {
00209 *pstatus = REGRESSION_TEST_INPROGRESS;
00210 ConfigData *config = (ConfigData *) TSmalloc(sizeof(ConfigData));
00211 config->a = "unit";
00212 config->b = "test";
00213
00214 my_config_id = TSConfigSet(0, config, config_destroy_func);
00215
00216 TSConfig test_config = NULL;
00217 test_config = TSConfigGet(my_config_id);
00218
00219 if (!test_config) {
00220 SDK_RPRINT(test, "TSConfigSet", "TestCase1", TC_FAIL, "can't correctly set global config structure");
00221 SDK_RPRINT(test, "TSConfigGet", "TestCase1", TC_FAIL, "can't correctly get global config structure");
00222 TSConfigRelease(my_config_id, reinterpret_cast<TSConfig>(config));
00223 *pstatus = REGRESSION_TEST_FAILED;
00224 return;
00225 }
00226
00227 if (TSConfigDataGet(test_config) != config) {
00228 SDK_RPRINT(test, "TSConfigDataGet", "TestCase1", TC_FAIL, "failed to get config data");
00229 TSConfigRelease(my_config_id, reinterpret_cast<TSConfig>(config));
00230 *pstatus = REGRESSION_TEST_FAILED;
00231 return;
00232 }
00233
00234 SDK_RPRINT(test, "TSConfigGet", "TestCase1", TC_PASS, "ok");
00235 SDK_RPRINT(test, "TSConfigSet", "TestCase1", TC_PASS, "ok");
00236 SDK_RPRINT(test, "TSConfigDataGet", "TestCase1", TC_PASS, "ok");
00237
00238 TSConfigRelease(my_config_id, reinterpret_cast<TSConfig>(config));
00239 *pstatus = REGRESSION_TEST_PASSED;
00240 return;
00241 }
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253 struct SDK_NetVConn_Params
00254 {
00255 SDK_NetVConn_Params(const char * _a, RegressionTest * _t, int * _p)
00256 : buffer(NULL), api(_a), port(0), test(_t), pstatus(_p) {
00257 this->status.client = this->status.server = REGRESSION_TEST_INPROGRESS;
00258 }
00259
00260 ~SDK_NetVConn_Params() {
00261 if (this->buffer) {
00262 TSIOBufferDestroy(this->buffer);
00263 }
00264 }
00265
00266 TSIOBuffer buffer;
00267 const char * api;
00268 unsigned short port;
00269 RegressionTest * test;
00270 int * pstatus;
00271 struct {
00272 int client;
00273 int server;
00274 } status;
00275 };
00276
00277 int
00278 server_handler(TSCont contp, TSEvent event, void * data)
00279 {
00280 SDK_NetVConn_Params * params = (SDK_NetVConn_Params *)TSContDataGet(contp);
00281
00282 if (event == TS_EVENT_NET_ACCEPT) {
00283
00284 SDK_RPRINT(params->test, params->api, "ServerEvent NET_ACCEPT", TC_PASS, "ok");
00285 params->buffer = TSIOBufferCreate();
00286 TSVConnRead((TSVConn)data, contp, params->buffer, 100);
00287 } else if (event == TS_EVENT_VCONN_EOS) {
00288
00289
00290
00291 TSContDestroy(contp);
00292
00293 SDK_RPRINT(params->test, params->api, "ServerEvent EOS", TC_PASS, "ok");
00294 *params->pstatus = REGRESSION_TEST_PASSED;
00295 delete params;
00296 } else {
00297 SDK_RPRINT(params->test, params->api, "ServerEvent", TC_FAIL, "received unexpected event %d", event);
00298 *params->pstatus = REGRESSION_TEST_FAILED;
00299 delete params;
00300 }
00301
00302 return 1;
00303 }
00304
00305 int
00306 client_handler(TSCont contp, TSEvent event, void *data)
00307 {
00308 SDK_NetVConn_Params * params = (SDK_NetVConn_Params *)TSContDataGet(contp);
00309
00310 if (event == TS_EVENT_NET_CONNECT_FAILED) {
00311 SDK_RPRINT(params->test, params->api, "ClientConnect", TC_FAIL, "can't connect to server");
00312
00313 *params->pstatus = REGRESSION_TEST_FAILED;
00314
00315
00316
00317 TSContDestroy(contp);
00318 return 1;
00319 } else {
00320 sockaddr const* addr = TSNetVConnRemoteAddrGet(static_cast<TSVConn>(data));
00321 uint16_t input_server_port = ats_ip_port_host_order(addr);
00322
00323 sleep(1);
00324
00325 if (ats_is_ip_loopback(addr)) {
00326 SDK_RPRINT(params->test, params->api, "TSNetVConnRemoteIPGet", TC_PASS, "ok");
00327 } else {
00328 ip_text_buffer s, ipb;
00329 IpEndpoint loopback;
00330 ats_ip4_set(&loopback, htonl(INADDR_LOOPBACK));
00331 SDK_RPRINT(params->test, params->api, "TSNetVConnRemoteIPGet", TC_FAIL, "server ip [%s] is incorrect - expected [%s]",
00332 ats_ip_ntop(addr, s, sizeof s),
00333 ats_ip_ntop(&loopback.sa, ipb, sizeof ipb)
00334 );
00335
00336 TSContDestroy(contp);
00337
00338 *params->pstatus = REGRESSION_TEST_FAILED;
00339 return 1;
00340 }
00341
00342 if (input_server_port == params->port) {
00343 SDK_RPRINT(params->test, params->api, "TSNetVConnRemotePortGet", TC_PASS, "ok");
00344 } else {
00345 SDK_RPRINT(params->test, params->api, "TSNetVConnRemotePortGet", TC_FAIL, "server port [%d] is incorrect -- expected [%d]", input_server_port, params->port);
00346
00347 TSContDestroy(contp);
00348
00349 *params->pstatus = REGRESSION_TEST_FAILED;
00350 return 1;
00351 }
00352
00353 SDK_RPRINT(params->test, params->api, "TSNetConnect", TC_PASS, "ok");
00354
00355
00356
00357
00358 TSVConnClose((TSVConn) data);
00359 }
00360
00361 TSContDestroy(contp);
00362
00363 return 1;
00364 }
00365
00366 REGRESSION_TEST(SDK_API_TSNetVConn) (RegressionTest * test, int , int *pstatus)
00367 {
00368 *pstatus = REGRESSION_TEST_INPROGRESS;
00369
00370 SDK_NetVConn_Params * params = new SDK_NetVConn_Params("TSNetAccept", test, pstatus);
00371
00372 params->port = 12345;
00373
00374 TSCont server_cont = TSContCreate(server_handler, TSMutexCreate());
00375 TSCont client_cont = TSContCreate(client_handler, TSMutexCreate());
00376
00377 TSContDataSet(server_cont, params);
00378 TSContDataSet(client_cont, params);
00379
00380 TSNetAccept(server_cont, params->port, -1, 0);
00381
00382 IpEndpoint addr;
00383 ats_ip4_set(&addr, htonl(INADDR_LOOPBACK), htons(params->port));
00384 TSNetConnect(client_cont, &addr.sa);
00385 }
00386
00387 REGRESSION_TEST(SDK_API_TSPortDescriptor) (RegressionTest * test, int , int *pstatus)
00388 {
00389 *pstatus = REGRESSION_TEST_INPROGRESS;
00390
00391 TSPortDescriptor port;
00392 char desc[64];
00393 SDK_NetVConn_Params * params = new SDK_NetVConn_Params("TSPortDescriptorAccept", test, pstatus);
00394 TSCont server_cont = TSContCreate(server_handler, TSMutexCreate());
00395 TSCont client_cont = TSContCreate(client_handler, TSMutexCreate());
00396
00397 params->port = 54321;
00398
00399 TSContDataSet(server_cont, params);
00400 TSContDataSet(client_cont, params);
00401
00402 port = TSPortDescriptorParse(NULL);
00403 if (port) {
00404 SDK_RPRINT(test, "TSPortDescriptorParse", "NULL port descriptor", TC_FAIL,
00405 "TSPortDescriptorParse(NULL) returned %s", port);
00406 *pstatus = REGRESSION_TEST_FAILED;
00407 return;
00408 }
00409
00410 snprintf(desc, sizeof(desc), "%u", params->port);
00411 port = TSPortDescriptorParse(desc);
00412
00413 if (TSPortDescriptorAccept(port, server_cont) == TS_ERROR) {
00414 SDK_RPRINT(test, "TSPortDescriptorParse", "Basic port descriptor", TC_FAIL,
00415 "TSPortDescriptorParse(%s) returned TS_ERROR", desc);
00416 *pstatus = REGRESSION_TEST_FAILED;
00417 return;
00418 }
00419
00420 IpEndpoint addr;
00421 ats_ip4_set(&addr, htonl(INADDR_LOOPBACK), htons(params->port));
00422 TSNetConnect(client_cont, &addr.sa);
00423 }
00424
00425
00426
00427
00428
00429
00430
00431
00432
00433
00434
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444
00445
00446
00447
00448
00449
00450
00451
00452
00453
00454
00455
00456
00457
00458
00459
00460
00461
00462
00463
00464
00465
00466 #define OBJECT_SIZE 100000 // size of the object we'll write/read/remove in cache
00467
00468
00469 RegressionTest *SDK_Cache_test;
00470 int *SDK_Cache_pstatus;
00471 static char content[OBJECT_SIZE];
00472 static int read_counter = 0;
00473
00474 typedef struct
00475 {
00476 TSIOBuffer bufp;
00477 TSIOBuffer out_bufp;
00478 TSIOBufferReader readerp;
00479 TSIOBufferReader out_readerp;
00480
00481 TSVConn write_vconnp;
00482 TSVConn read_vconnp;
00483 TSVIO read_vio;
00484 TSVIO write_vio;
00485
00486 TSCacheKey key;
00487 } CacheVConnStruct;
00488
00489 int
00490 cache_handler(TSCont contp, TSEvent event, void *data)
00491 {
00492 Debug("sdk_ut_cache_write", "Event %d data %p", event, data);
00493
00494 CacheVConnStruct *cache_vconn = (CacheVConnStruct *) TSContDataGet(contp);
00495
00496 TSIOBufferBlock blockp;
00497 char *ptr_block;
00498 int64_t ntodo, ndone, nbytes, towrite, avail, content_length;
00499
00500 switch (event) {
00501 case TS_EVENT_CACHE_OPEN_WRITE:
00502 Debug(UTDBG_TAG "_cache_event", "TS_EVENT_CACHE_OPEN_WRITE %d %p", event, data);
00503 SDK_RPRINT(SDK_Cache_test, "TSCacheWrite", "TestCase1", TC_PASS, "ok");
00504
00505
00506 cache_vconn->write_vconnp = (TSVConn) data;
00507
00508
00509 cache_vconn->bufp = TSIOBufferCreate();
00510 cache_vconn->readerp = TSIOBufferReaderAlloc(cache_vconn->bufp);
00511 cache_vconn->out_bufp = TSIOBufferCreate();
00512 cache_vconn->out_readerp = TSIOBufferReaderAlloc(cache_vconn->out_bufp);
00513
00514
00515 ntodo = OBJECT_SIZE;
00516 ndone = 0;
00517 while (ntodo > 0) {
00518 blockp = TSIOBufferStart(cache_vconn->bufp);
00519 ptr_block = TSIOBufferBlockWriteStart(blockp, &avail);
00520 towrite = ((ntodo < avail) ? ntodo : avail);
00521 memcpy(ptr_block, content + ndone, towrite);
00522 TSIOBufferProduce(cache_vconn->bufp, towrite);
00523 ntodo -= towrite;
00524 ndone += towrite;
00525 }
00526
00527
00528 cache_vconn->write_vio = TSVConnWrite((TSVConn) data, contp, cache_vconn->readerp, OBJECT_SIZE / 2);
00529 return 1;
00530
00531 case TS_EVENT_CACHE_OPEN_WRITE_FAILED:
00532 Debug(UTDBG_TAG "_cache_event", "TS_EVENT_CACHE_OPEN_WRITE_FAILED %d %p", event, data);
00533 SDK_RPRINT(SDK_Cache_test, "TSCacheWrite", "TestCase1", TC_FAIL, "can't open cache vc, edtata = %p", data);
00534 TSReleaseAssert(!"cache");
00535
00536
00537 *SDK_Cache_pstatus = REGRESSION_TEST_FAILED;
00538 return 1;
00539
00540 case TS_EVENT_CACHE_OPEN_READ:
00541 Debug(UTDBG_TAG "_cache_event", "TS_EVENT_CACHE_OPEN_READ %d %p", event, data);
00542 if (read_counter == 2) {
00543 SDK_RPRINT(SDK_Cache_test, "TSCacheRead", "TestCase2", TC_FAIL, "shouldn't open cache vc");
00544
00545
00546 *SDK_Cache_pstatus = REGRESSION_TEST_FAILED;
00547 return 1;
00548 }
00549
00550 SDK_RPRINT(SDK_Cache_test, "TSCacheRead", "TestCase1", TC_PASS, "ok");
00551
00552 cache_vconn->read_vconnp = (TSVConn) data;
00553 content_length = TSVConnCacheObjectSizeGet(cache_vconn->read_vconnp);
00554 Debug(UTDBG_TAG "_cache_read", "In cache open read [Content-Length: %" PRId64"]", content_length);
00555 if (content_length != OBJECT_SIZE) {
00556 SDK_RPRINT(SDK_Cache_test, "TSVConnCacheObjectSizeGet", "TestCase1", TC_FAIL, "cached data size is incorrect");
00557
00558
00559 *SDK_Cache_pstatus = REGRESSION_TEST_FAILED;
00560 return 1;
00561 } else {
00562 SDK_RPRINT(SDK_Cache_test, "TSVConnCacheObjectSizeGet", "TestCase1", TC_PASS, "ok");
00563 cache_vconn->read_vio = TSVConnRead((TSVConn) data, contp, cache_vconn->out_bufp, content_length);
00564 }
00565 return 1;
00566
00567 case TS_EVENT_CACHE_OPEN_READ_FAILED:
00568 Debug(UTDBG_TAG "_cache_event", "TS_EVENT_CACHE_OPEN_READ_FAILED %d %p", event, data);
00569 if (read_counter == 1) {
00570 SDK_RPRINT(SDK_Cache_test, "TSCacheRead", "TestCase1", TC_FAIL, "can't open cache vc");
00571
00572
00573 *SDK_Cache_pstatus = REGRESSION_TEST_FAILED;
00574 return 1;
00575 }
00576 SDK_RPRINT(SDK_Cache_test, "TSCacheRead", "TestCase2", TC_PASS, "ok");
00577
00578
00579 break;
00580
00581 case TS_EVENT_CACHE_REMOVE:
00582 Debug(UTDBG_TAG "_cache_event", "TS_EVENT_CACHE_REMOVE %d %p", event, data);
00583 SDK_RPRINT(SDK_Cache_test, "TSCacheRemove", "TestCase1", TC_PASS, "ok");
00584
00585
00586 read_counter++;
00587 TSCacheRead(contp, cache_vconn->key);
00588 return 1;
00589
00590 case TS_EVENT_CACHE_REMOVE_FAILED:
00591 Debug(UTDBG_TAG "_cache_event", "TS_EVENT_CACHE_REMOVE_FAILED %d %p", event, data);
00592 SDK_RPRINT(SDK_Cache_test, "TSCacheRemove", "TestCase1", TC_FAIL, "can't remove cached item");
00593
00594
00595 *SDK_Cache_pstatus = REGRESSION_TEST_FAILED;
00596 return 1;
00597
00598 case TS_EVENT_VCONN_WRITE_COMPLETE:
00599 Debug(UTDBG_TAG "_cache_event", "TS_EVENT_VCONN_WRITE_COMPLETE %d %p", event, data);
00600
00601
00602 nbytes = TSVIONBytesGet(cache_vconn->write_vio);
00603 ndone = TSVIONDoneGet(cache_vconn->write_vio);
00604 ntodo = TSVIONTodoGet(cache_vconn->write_vio);
00605 Debug(UTDBG_TAG "_cache_write", "Nbytes=%" PRId64" Ndone=%" PRId64" Ntodo=%" PRId64"", nbytes, ndone, ntodo);
00606
00607 if (ndone == (OBJECT_SIZE / 2)) {
00608 TSVIONBytesSet(cache_vconn->write_vio, (OBJECT_SIZE - 100));
00609 TSVIOReenable(cache_vconn->write_vio);
00610 Debug(UTDBG_TAG "_cache_write", "Increment write_counter in write_complete [a]");
00611 return 1;
00612 } else if (ndone == (OBJECT_SIZE - 100)) {
00613 TSVIONBytesSet(cache_vconn->write_vio, OBJECT_SIZE);
00614 TSVIOReenable(cache_vconn->write_vio);
00615 Debug(UTDBG_TAG "_cache_write", "Increment write_counter in write_complete [b]");
00616 return 1;
00617 } else if (ndone == OBJECT_SIZE) {
00618 Debug(UTDBG_TAG "_cache_write", "finishing up [c]");
00619
00620 SDK_RPRINT(SDK_Cache_test, "TSVIOReenable", "TestCase2", TC_PASS, "ok");
00621 SDK_RPRINT(SDK_Cache_test, "TSVIONBytesSet", "TestCase1", TC_PASS, "ok");
00622 SDK_RPRINT(SDK_Cache_test, "TSVConnWrite", "TestCase1", TC_PASS, "ok");
00623 } else {
00624 SDK_RPRINT(SDK_Cache_test, "TSCacheWrite", "TestCase1", TC_FAIL, "Did not write expected # of bytes");
00625
00626 *SDK_Cache_pstatus = REGRESSION_TEST_FAILED;
00627 return 1;
00628 }
00629
00630 if ((TSVIO) data != cache_vconn->write_vio) {
00631 SDK_RPRINT(SDK_Cache_test, "TSVConnWrite", "TestCase1", TC_FAIL, "write_vio corrupted");
00632
00633 *SDK_Cache_pstatus = REGRESSION_TEST_FAILED;
00634 return 1;
00635 }
00636 Debug(UTDBG_TAG "_cache_write", "finishing up [d]");
00637
00638
00639 if (TSVIOBufferGet(cache_vconn->write_vio) != cache_vconn->bufp) {
00640 SDK_RPRINT(SDK_Cache_test, "TSVIOBufferGet", "TestCase1", TC_FAIL, "write_vio corrupted");
00641 *SDK_Cache_pstatus = REGRESSION_TEST_FAILED;
00642 return 1;
00643 } else {
00644 SDK_RPRINT(SDK_Cache_test, "TSVIOBufferGet", "TestCase1", TC_PASS, "ok");
00645 }
00646
00647 if (TSVIOContGet(cache_vconn->write_vio) != contp) {
00648 SDK_RPRINT(SDK_Cache_test, "TSVIOContGet", "TestCase1", TC_FAIL, "write_vio corrupted");
00649 *SDK_Cache_pstatus = REGRESSION_TEST_FAILED;
00650 return 1;
00651 } else {
00652 SDK_RPRINT(SDK_Cache_test, "TSVIOContGet", "TestCase1", TC_PASS, "ok");
00653 }
00654
00655 Debug(UTDBG_TAG "_cache_write", "finishing up [f]");
00656
00657 if (TSVIOMutexGet(cache_vconn->write_vio) != TSContMutexGet(contp)) {
00658 SDK_RPRINT(SDK_Cache_test, "TSVIOMutexGet", "TestCase1", TC_FAIL, "write_vio corrupted");
00659 *SDK_Cache_pstatus = REGRESSION_TEST_FAILED;
00660 return 1;
00661 } else {
00662 SDK_RPRINT(SDK_Cache_test, "TSVIOMutexGet", "TestCase1", TC_PASS, "ok");
00663 }
00664
00665 if (TSVIOVConnGet(cache_vconn->write_vio) != cache_vconn->write_vconnp) {
00666 SDK_RPRINT(SDK_Cache_test, "TSVIOVConnGet", "TestCase1", TC_FAIL, "write_vio corrupted");
00667 *SDK_Cache_pstatus = REGRESSION_TEST_FAILED;
00668 return 1;
00669 } else {
00670 SDK_RPRINT(SDK_Cache_test, "TSVIOVConnGet", "TestCase1", TC_PASS, "ok");
00671 }
00672
00673 Debug(UTDBG_TAG "_cache_write", "finishing up [g]");
00674
00675 if (TSVIOReaderGet(cache_vconn->write_vio) != cache_vconn->readerp) {
00676 SDK_RPRINT(SDK_Cache_test, "TSVIOReaderGet", "TestCase1", TC_FAIL, "write_vio corrupted");
00677 *SDK_Cache_pstatus = REGRESSION_TEST_FAILED;
00678 return 1;
00679 } else {
00680 SDK_RPRINT(SDK_Cache_test, "TSVIOReaderGet", "TestCase1", TC_PASS, "ok");
00681 }
00682
00683
00684 TSVConnClose(cache_vconn->write_vconnp);
00685 cache_vconn->write_vconnp = NULL;
00686
00687 Debug(UTDBG_TAG "_cache_write", "finishing up [h]");
00688
00689
00690
00691 read_counter++;
00692 TSCacheRead(contp, cache_vconn->key);
00693 Debug(UTDBG_TAG "_cache_read", "starting read [i]");
00694 return 1;
00695
00696
00697 case TS_EVENT_VCONN_WRITE_READY:
00698 Debug(UTDBG_TAG "_cache_event", "TS_EVENT_VCONN_WRITE_READY %d %p", event, data);
00699 if ((TSVIO) data != cache_vconn->write_vio) {
00700 SDK_RPRINT(SDK_Cache_test, "TSVConnWrite", "TestCase1", TC_FAIL, "write_vio corrupted");
00701 *SDK_Cache_pstatus = REGRESSION_TEST_FAILED;
00702 return 1;
00703 }
00704
00705 nbytes = TSVIONBytesGet(cache_vconn->write_vio);
00706 ndone = TSVIONDoneGet(cache_vconn->write_vio);
00707 ntodo = TSVIONTodoGet(cache_vconn->write_vio);
00708 Debug(UTDBG_TAG "_cache_write", "Nbytes=%" PRId64" Ndone=%" PRId64" Ntodo=%" PRId64"", nbytes, ndone, ntodo);
00709
00710 TSVIOReenable(cache_vconn->write_vio);
00711 return 1;
00712
00713 case TS_EVENT_VCONN_READ_COMPLETE:
00714 Debug(UTDBG_TAG "_cache_event", "TS_EVENT_VCONN_READ_COMPLETE %d %p", event, data);
00715 if ((TSVIO) data != cache_vconn->read_vio) {
00716 SDK_RPRINT(SDK_Cache_test, "TSVConnRead", "TestCase1", TC_FAIL, "read_vio corrupted");
00717
00718
00719 *SDK_Cache_pstatus = REGRESSION_TEST_FAILED;
00720 return 1;
00721 }
00722
00723 nbytes = TSVIONBytesGet(cache_vconn->read_vio);
00724 ntodo = TSVIONTodoGet(cache_vconn->read_vio);
00725 ndone = TSVIONDoneGet(cache_vconn->read_vio);
00726 Debug(UTDBG_TAG "_cache_read", "Nbytes=%" PRId64" Ndone=%" PRId64" Ntodo=%" PRId64"", nbytes, ndone, ntodo);
00727
00728 if (nbytes != (ndone + ntodo)) {
00729 SDK_RPRINT(SDK_Cache_test, "TSVIONBytesGet", "TestCase1", TC_FAIL, "read_vio corrupted");
00730 SDK_RPRINT(SDK_Cache_test, "TSVIONTodoGet", "TestCase1", TC_FAIL, "read_vio corrupted");
00731 SDK_RPRINT(SDK_Cache_test, "TSVIONDoneGet", "TestCase1", TC_FAIL, "read_vio corrupted");
00732
00733
00734 *SDK_Cache_pstatus = REGRESSION_TEST_FAILED;
00735 return 1;
00736 } else {
00737 SDK_RPRINT(SDK_Cache_test, "TSVIONBytesGet", "TestCase1", TC_PASS, "ok");
00738 SDK_RPRINT(SDK_Cache_test, "TSVIONTodoGet", "TestCase1", TC_PASS, "ok");
00739 SDK_RPRINT(SDK_Cache_test, "TSVIONDoneGet", "TestCase1", TC_PASS, "ok");
00740
00741 TSVIONDoneSet(cache_vconn->read_vio, 0);
00742 if (TSVIONDoneGet(cache_vconn->read_vio) != 0) {
00743 SDK_RPRINT(SDK_Cache_test, "TSVIONDoneSet", "TestCase1", TC_FAIL, "fail to set");
00744
00745
00746 *SDK_Cache_pstatus = REGRESSION_TEST_FAILED;
00747 return 1;
00748 } else
00749 SDK_RPRINT(SDK_Cache_test, "TSVIONDoneSet", "TestCase1", TC_PASS, "ok");
00750
00751 Debug(UTDBG_TAG "_cache_write", "finishing up [i]");
00752
00753
00754
00755 TSContSchedule(contp, 100, TS_THREAD_POOL_DEFAULT);
00756 }
00757
00758 return 1;
00759
00760 case TS_EVENT_VCONN_READ_READY:
00761 Debug(UTDBG_TAG "_cache_event", "TS_EVENT_VCONN_READ_READY %d %p", event, data);
00762 if ((TSVIO) data != cache_vconn->read_vio) {
00763 SDK_RPRINT(SDK_Cache_test, "TSVConnRead", "TestCase1", TC_FAIL, "read_vio corrupted");
00764
00765
00766 *SDK_Cache_pstatus = REGRESSION_TEST_FAILED;
00767 return 1;
00768 }
00769
00770 nbytes = TSVIONBytesGet(cache_vconn->read_vio);
00771 ntodo = TSVIONTodoGet(cache_vconn->read_vio);
00772 ndone = TSVIONDoneGet(cache_vconn->read_vio);
00773 Debug(UTDBG_TAG "_cache_read", "Nbytes=%" PRId64" Ndone=%" PRId64" Ntodo=%" PRId64"", nbytes, ndone, ntodo);
00774
00775 if (nbytes != (ndone + ntodo)) {
00776 SDK_RPRINT(SDK_Cache_test, "TSVIONBytesGet", "TestCase1", TC_FAIL, "read_vio corrupted");
00777 SDK_RPRINT(SDK_Cache_test, "TSVIONTodoGet", "TestCase1", TC_FAIL, "read_vio corrupted");
00778 SDK_RPRINT(SDK_Cache_test, "TSVIONDoneGet", "TestCase1", TC_FAIL, "read_vio corrupted");
00779
00780
00781 *SDK_Cache_pstatus = REGRESSION_TEST_FAILED;
00782 return 1;
00783 } else {
00784 SDK_RPRINT(SDK_Cache_test, "TSVIONBytesGet", "TestCase1", TC_PASS, "ok");
00785 SDK_RPRINT(SDK_Cache_test, "TSVIONTodoGet", "TestCase1", TC_PASS, "ok");
00786 SDK_RPRINT(SDK_Cache_test, "TSVIONDoneGet", "TestCase1", TC_PASS, "ok");
00787 }
00788
00789
00790 nbytes = TSIOBufferReaderAvail(cache_vconn->out_readerp);
00791 TSIOBufferReaderConsume(cache_vconn->out_readerp, nbytes);
00792 TSDebug(UTDBG_TAG "_cache_read", "Consuming %" PRId64" bytes from cache read VC", nbytes);
00793
00794 TSVIOReenable(cache_vconn->read_vio);
00795 Debug(UTDBG_TAG "_cache_read", "finishing up [j]");
00796 return 1;
00797
00798 case TS_EVENT_TIMEOUT:
00799 Debug(UTDBG_TAG "_cache_event", "TS_EVENT_TIMEOUT %d %p", event, data);
00800
00801 TSCacheRemove(contp, cache_vconn->key);
00802 return 1;
00803
00804 default:
00805 TSReleaseAssert(!"Test SDK_API_TSCache: unexpected event");
00806 }
00807
00808 Debug(UTDBG_TAG "_cache_event", "DONE DONE DONE");
00809
00810
00811 Debug(UTDBG_TAG "_cache_write", "all tests passed [z]");
00812 TSIOBufferDestroy(cache_vconn->bufp);
00813 TSIOBufferDestroy(cache_vconn->out_bufp);
00814 TSCacheKeyDestroy(cache_vconn->key);
00815 TSfree(cache_vconn);
00816 *SDK_Cache_pstatus = REGRESSION_TEST_PASSED;
00817
00818 return 1;
00819 }
00820
00821 REGRESSION_TEST(SDK_API_TSCache) (RegressionTest * test, int , int *pstatus)
00822 {
00823 *pstatus = REGRESSION_TEST_INPROGRESS;
00824 SDK_Cache_test = test;
00825 SDK_Cache_pstatus = pstatus;
00826 int is_ready = 0;
00827
00828
00829 TSCacheReady(&is_ready);
00830 if (!is_ready) {
00831 SDK_RPRINT(test, "TSCacheReady", "TestCase1", TC_FAIL, "cache is not ready");
00832
00833
00834 *pstatus = REGRESSION_TEST_FAILED;
00835 return;
00836 } else {
00837 SDK_RPRINT(test, "TSCacheReady", "TestCase1", TC_PASS, "ok");
00838 }
00839
00840
00841 char key_name[] = "key_for_regression_test";
00842 TSCacheKey key = TSCacheKeyCreate();
00843 TSCacheKey key_cmp = TSCacheKeyCreate();
00844 SDK_RPRINT(test, "TSCacheKeyCreate", "TestCase1", TC_PASS, "ok");
00845 TSCacheKeyDigestSet(key, key_name, strlen(key_name));
00846 TSCacheKeyDigestSet(key_cmp, key_name, strlen(key_name));
00847
00848
00849 #if 0
00850 if (memcmp(key, key_cmp, sizeof(TSCacheKey)) != 0) {
00851 SDK_RPRINT(test, "TSCacheKeySetDigest", "TestCase1", TC_FAIL, "digest is wrong");
00852
00853
00854 *pstatus = REGRESSION_TEST_FAILED;
00855 TSCacheKeyDestroy(key);
00856 TSCacheKeyDestroy(key_cmp);
00857 return;
00858 } else {
00859 SDK_RPRINT(test, "TSCacheKeySetDigest", "TestCase1", TC_PASS, "ok");
00860 TSCacheKeyDestroy(key_cmp);
00861 }
00862 #endif
00863
00864
00865
00866 for (int i = 0; i < (OBJECT_SIZE - 1); i++) {
00867 content[i] = 'a';
00868 }
00869 content[OBJECT_SIZE - 1] = '\0';
00870
00871
00872 TSCont contp = TSContCreate(cache_handler, TSMutexCreate());
00873 CacheVConnStruct *cache_vconn = (CacheVConnStruct *) TSmalloc(sizeof(CacheVConnStruct));
00874 cache_vconn->key = key;
00875 TSContDataSet(contp, cache_vconn);
00876
00877 TSCacheWrite(contp, key);
00878 }
00879
00880
00881
00882
00883
00884
00885
00886
00887
00888
00889
00890
00891
00892
00893
00894
00895 #define PFX "plugin.config"
00896
00897 REGRESSION_TEST(SDK_API_TSfopen) (RegressionTest * test, int , int *pstatus)
00898 {
00899 *pstatus = REGRESSION_TEST_INPROGRESS;
00900
00901 char write_file_name[PATH_NAME_MAX + 1];
00902
00903 TSFile source_read_file;
00904 TSFile write_file;
00905 TSFile cmp_read_file;
00906
00907 char input_buffer[BUFSIZ];
00908 char cmp_buffer[BUFSIZ];
00909 struct stat stat_buffer_pre, stat_buffer_post, stat_buffer_input;
00910 char *ret_val;
00911 int error_counter = 0, read = 0, wrote = 0;
00912 int64_t read_amount = 0;
00913 char INPUT_TEXT_FILE[] = "plugin.config";
00914 char input_file_full_path[BUFSIZ];
00915
00916
00917
00918
00919
00920
00921
00922
00923 if (TSInstallDirGet() == NULL) {
00924 error_counter++;
00925 *pstatus = REGRESSION_TEST_FAILED;
00926 return;
00927 }
00928
00929 ink_filepath_make(input_file_full_path, sizeof(input_file_full_path), TSConfigDirGet(), INPUT_TEXT_FILE);
00930
00931
00932 if (!(source_read_file = TSfopen(input_file_full_path, "r"))) {
00933 SDK_RPRINT(test, "TSfopen", "TestCase1", TC_FAIL, "can't open file for reading");
00934 error_counter++;
00935
00936
00937 *pstatus = REGRESSION_TEST_FAILED;
00938 return;
00939 } else
00940 SDK_RPRINT(test, "TSfopen", "TestCase1", TC_PASS, "ok");
00941
00942
00943 snprintf(write_file_name, PATH_NAME_MAX, "/tmp/%sXXXXXX", PFX);
00944 int write_file_fd;
00945 if ((write_file_fd = mkstemp(write_file_name)) <= 0) {
00946 SDK_RPRINT(test, "mkstemp", "std func", TC_FAIL, "can't create file for writing");
00947 error_counter++;
00948
00949
00950 *pstatus = REGRESSION_TEST_FAILED;
00951 if (source_read_file != NULL)
00952 TSfclose(source_read_file);
00953 return;
00954 }
00955 close(write_file_fd);
00956
00957
00958 if (!(write_file = TSfopen(write_file_name, "w"))) {
00959 SDK_RPRINT(test, "TSfopen", "TestCase2", TC_FAIL, "can't open file for writing");
00960 error_counter++;
00961
00962
00963 *pstatus = REGRESSION_TEST_FAILED;
00964 if (source_read_file != NULL)
00965 TSfclose(source_read_file);
00966 return;
00967 }
00968 SDK_RPRINT(test, "TSfopen", "TestCase2", TC_PASS, "ok");
00969
00970 memset(input_buffer, '\0', BUFSIZ);
00971
00972
00973 if (stat(input_file_full_path, &stat_buffer_input) != 0) {
00974 SDK_RPRINT(test, "stat", "std func", TC_FAIL, "source file and input file messed up");
00975 error_counter++;
00976
00977
00978 *pstatus = REGRESSION_TEST_FAILED;
00979 if (source_read_file != NULL)
00980 TSfclose(source_read_file);
00981 if (write_file != NULL)
00982 TSfclose(write_file);
00983 return;
00984 }
00985
00986 read_amount = (stat_buffer_input.st_size <= (off_t)sizeof(input_buffer)) ?
00987 (stat_buffer_input.st_size) : (sizeof(input_buffer));
00988
00989
00990 if ((ret_val = TSfgets(source_read_file, input_buffer, read_amount))
00991 == NULL) {
00992 SDK_RPRINT(test, "TSfgets", "TestCase1", TC_FAIL, "can't read from file");
00993 error_counter++;
00994
00995
00996 *pstatus = REGRESSION_TEST_FAILED;
00997 if (source_read_file != NULL)
00998 TSfclose(source_read_file);
00999 if (write_file != NULL)
01000 TSfclose(write_file);
01001 return;
01002 } else {
01003 if (ret_val != input_buffer) {
01004 SDK_RPRINT(test, "TSfgets", "TestCase2", TC_FAIL, "reading error");
01005 error_counter++;
01006
01007
01008 *pstatus = REGRESSION_TEST_FAILED;
01009 if (source_read_file != NULL)
01010 TSfclose(source_read_file);
01011 if (write_file != NULL)
01012 TSfclose(write_file);
01013 return;
01014 } else
01015 SDK_RPRINT(test, "TSfgets", "TestCase1", TC_PASS, "ok");
01016 }
01017
01018
01019 wrote = TSfwrite(write_file, input_buffer, read_amount);
01020 if (wrote != read_amount) {
01021 SDK_RPRINT(test, "TSfwrite", "TestCase1", TC_FAIL, "writing error");
01022 error_counter++;
01023
01024
01025 *pstatus = REGRESSION_TEST_FAILED;
01026 if (source_read_file != NULL)
01027 TSfclose(source_read_file);
01028 if (write_file != NULL)
01029 TSfclose(write_file);
01030 return;
01031 }
01032
01033 SDK_RPRINT(test, "TSfwrite", "TestCase1", TC_PASS, "ok");
01034
01035
01036 if (stat(write_file_name, &stat_buffer_pre) != 0) {
01037 SDK_RPRINT(test, "stat", "std func", TC_FAIL, "TSfwrite error");
01038 error_counter++;
01039
01040
01041 *pstatus = REGRESSION_TEST_FAILED;
01042 if (source_read_file != NULL)
01043 TSfclose(source_read_file);
01044 if (write_file != NULL)
01045 TSfclose(write_file);
01046 return;
01047 }
01048
01049 TSfflush(write_file);
01050
01051 if (stat(write_file_name, &stat_buffer_post) != 0) {
01052 SDK_RPRINT(test, "stat", "std func", TC_FAIL, "TSfflush error");
01053 error_counter++;
01054
01055
01056 *pstatus = REGRESSION_TEST_FAILED;
01057 if (source_read_file != NULL)
01058 TSfclose(source_read_file);
01059 if (write_file != NULL)
01060 TSfclose(write_file);
01061 return;
01062 }
01063
01064 if ((stat_buffer_pre.st_size == 0) && (stat_buffer_post.st_size == read_amount)) {
01065 SDK_RPRINT(test, "TSfflush", "TestCase1", TC_PASS, "ok");
01066 } else {
01067 SDK_RPRINT(test, "TSfflush", "TestCase1", TC_FAIL, "TSfflush error");
01068 error_counter++;
01069
01070
01071 *pstatus = REGRESSION_TEST_FAILED;
01072 if (source_read_file != NULL)
01073 TSfclose(source_read_file);
01074 if (write_file != NULL)
01075 TSfclose(write_file);
01076 return;
01077 }
01078
01079
01080
01081 cmp_read_file = TSfopen(write_file_name, "r");
01082 if (cmp_read_file == NULL) {
01083 SDK_RPRINT(test, "TSfopen", "TestCase3", TC_FAIL, "can't open file for reading");
01084 error_counter++;
01085
01086
01087 *pstatus = REGRESSION_TEST_FAILED;
01088 if (source_read_file != NULL)
01089 TSfclose(source_read_file);
01090 if (write_file != NULL)
01091 TSfclose(write_file);
01092 return;
01093 }
01094
01095 read_amount = (stat_buffer_input.st_size <= (off_t)sizeof(cmp_buffer)) ? (stat_buffer_input.st_size) : (sizeof(cmp_buffer));
01096
01097
01098 read = TSfread(cmp_read_file, cmp_buffer, read_amount);
01099 if (read != read_amount) {
01100 SDK_RPRINT(test, "TSfread", "TestCase1", TC_FAIL, "can't reading");
01101 error_counter++;
01102
01103
01104 *pstatus = REGRESSION_TEST_FAILED;
01105 if (source_read_file != NULL)
01106 TSfclose(source_read_file);
01107 if (write_file != NULL)
01108 TSfclose(write_file);
01109 if (cmp_read_file != NULL)
01110 TSfclose(cmp_read_file);
01111 return;
01112 } else
01113 SDK_RPRINT(test, "TSfread", "TestCase1", TC_PASS, "ok");
01114
01115
01116 if (memcmp(input_buffer, cmp_buffer, read_amount) != 0) {
01117 SDK_RPRINT(test, "TSfread", "TestCase2", TC_FAIL, "reading error");
01118 error_counter++;
01119
01120
01121 *pstatus = REGRESSION_TEST_FAILED;
01122 if (source_read_file != NULL)
01123 TSfclose(source_read_file);
01124 if (write_file != NULL)
01125 TSfclose(write_file);
01126 if (cmp_read_file != NULL)
01127 TSfclose(cmp_read_file);
01128 return;
01129 } else
01130 SDK_RPRINT(test, "TSfread", "TestCase2", TC_PASS, "ok");
01131
01132
01133 if (unlink(write_file_name) != 0) {
01134 SDK_RPRINT(test, "unlink", "std func", TC_FAIL, "can't remove temp file");
01135 }
01136
01137 TSfclose(source_read_file);
01138 SDK_RPRINT(test, "TSfclose", "TestCase1", TC_PASS, "ok");
01139
01140
01141 TSfclose(write_file);
01142 SDK_RPRINT(test, "TSfclose", "TestCase2", TC_PASS, "ok");
01143
01144 if (error_counter == 0) {
01145 *pstatus = REGRESSION_TEST_PASSED;
01146 } else {
01147 *pstatus = REGRESSION_TEST_FAILED;
01148 }
01149 if (cmp_read_file != NULL)
01150 TSfclose(cmp_read_file);
01151 }
01152
01153
01154
01155
01156
01157
01158
01159
01160
01161
01162 static int thread_err_count = 0;
01163 static RegressionTest *SDK_Thread_test;
01164 static int *SDK_Thread_pstatus;
01165 static void *thread_create_handler(void *arg);
01166
01167 static void *
01168 thread_create_handler(void * )
01169 {
01170 TSThread athread;
01171
01172 sleep(10);
01173
01174 athread = TSThreadSelf();
01175 if (athread == 0) {
01176 thread_err_count++;
01177 SDK_RPRINT(SDK_Thread_test, "TSThreadCreate", "TestCase2", TC_FAIL, "can't get thread");
01178 } else {
01179 SDK_RPRINT(SDK_Thread_test, "TSThreadCreate", "TestCase2", TC_PASS, "ok");
01180 }
01181
01182 if (thread_err_count > 0)
01183 *SDK_Thread_pstatus = REGRESSION_TEST_FAILED;
01184 else
01185 *SDK_Thread_pstatus = REGRESSION_TEST_PASSED;
01186
01187 return NULL;
01188 }
01189
01190
01191
01192
01193
01194
01195 REGRESSION_TEST(SDK_API_TSThread) (RegressionTest * test, int , int *pstatus)
01196 {
01197 *pstatus = REGRESSION_TEST_INPROGRESS;
01198 SDK_Thread_test = test;
01199 SDK_Thread_pstatus = pstatus;
01200
01201 TSThread curr_thread = 0;
01202
01203 pthread_t curr_tid;
01204
01205 curr_tid = pthread_self();
01206
01207
01208 curr_thread = TSThreadSelf();
01209 if (curr_thread == 0) {
01210 SDK_RPRINT(test, "TSThreadSelf", "TestCase1", TC_FAIL, "can't get the current thread");
01211 thread_err_count++;
01212 } else {
01213 SDK_RPRINT(test, "TSThreadSelf", "TestCase1", TC_PASS, "ok");
01214 }
01215
01216
01217 TSThread created_thread = TSThreadCreate(thread_create_handler, (void *)(intptr_t)curr_tid);
01218 if (created_thread == NULL) {
01219 thread_err_count++;
01220 SDK_RPRINT(test, "TSThreadCreate", "TestCase1", TC_FAIL, "can't create thread");
01221 } else {
01222 SDK_RPRINT(test, "TSThreadCreate", "TestCase1", TC_PASS, "ok");
01223 }
01224 }
01225
01226
01227
01228
01229
01230
01231
01232
01233 static int thread_init_err_count = 0;
01234 static RegressionTest *SDK_ThreadInit_test;
01235 static int *SDK_ThreadInit_pstatus;
01236 static void *pthread_start_func(void *arg);
01237
01238 static void *
01239 pthread_start_func(void * )
01240 {
01241 TSThread temp_thread = 0;
01242
01243
01244 temp_thread = TSThreadInit();
01245
01246 if (!temp_thread) {
01247 SDK_RPRINT(SDK_ThreadInit_test, "TSThreadInit", "TestCase2", TC_FAIL, "can't init thread");
01248 thread_init_err_count++;
01249 } else
01250 SDK_RPRINT(SDK_ThreadInit_test, "TSThreadInit", "TestCase2", TC_PASS, "ok");
01251
01252
01253 if (temp_thread)
01254 TSThreadDestroy(temp_thread);
01255
01256 if (thread_init_err_count > 0)
01257 *SDK_ThreadInit_pstatus = REGRESSION_TEST_FAILED;
01258 else
01259 *SDK_ThreadInit_pstatus = REGRESSION_TEST_PASSED;
01260
01261 return NULL;
01262 }
01263
01264 REGRESSION_TEST(SDK_API_TSThreadInit) (RegressionTest * test, int , int *pstatus)
01265 {
01266 *pstatus = REGRESSION_TEST_INPROGRESS;
01267 SDK_ThreadInit_test = test;
01268 SDK_ThreadInit_pstatus = pstatus;
01269
01270 pthread_t curr_tid, new_tid;
01271
01272 curr_tid = pthread_self();
01273
01274 int ret;
01275 errno = 0;
01276 ret = pthread_create(&new_tid, NULL, pthread_start_func, (void *)(intptr_t)curr_tid);
01277 if (ret != 0) {
01278 thread_init_err_count++;
01279 SDK_RPRINT(test, "TSThreadInit", "TestCase1", TC_FAIL, "can't create pthread");
01280 } else
01281 SDK_RPRINT(test, "TSThreadInit", "TestCase1", TC_PASS, "ok");
01282
01283 }
01284
01285
01286
01287
01288
01289
01290
01291
01292
01293 static RegressionTest *SDK_ActionCancel_test;
01294 static int *SDK_ActionCancel_pstatus;
01295
01296 int
01297 action_cancel_handler(TSCont contp, TSEvent event, void * )
01298 {
01299 if (event == TS_EVENT_IMMEDIATE) {
01300 SDK_RPRINT(SDK_ActionCancel_test, "TSActionCancel", "TestCase1", TC_PASS, "ok");
01301 *SDK_ActionCancel_pstatus = REGRESSION_TEST_PASSED;
01302 } else if (event == TS_EVENT_TIMEOUT) {
01303 SDK_RPRINT(SDK_ActionCancel_test, "TSActionCancel", "TestCase1", TC_FAIL, "bad action");
01304 *SDK_ActionCancel_pstatus = REGRESSION_TEST_FAILED;
01305 } else {
01306 SDK_RPRINT(SDK_ActionCancel_test, "TSActionCancel", "TestCase1", TC_FAIL, "bad event");
01307 *SDK_ActionCancel_pstatus = REGRESSION_TEST_FAILED;
01308 }
01309
01310 TSContDestroy(contp);
01311 return 0;
01312 }
01313
01314 REGRESSION_TEST(SDK_API_TSActionCancel) (RegressionTest * test, int , int *pstatus)
01315 {
01316 *pstatus = REGRESSION_TEST_INPROGRESS;
01317
01318 SDK_ActionCancel_test = test;
01319 SDK_ActionCancel_pstatus = pstatus;
01320
01321 TSMutex cont_mutex = TSMutexCreate();
01322 TSCont contp = TSContCreate(action_cancel_handler, cont_mutex);
01323 TSAction actionp = TSContSchedule(contp, 10000, TS_THREAD_POOL_DEFAULT);
01324
01325 TSMutexLock(cont_mutex);
01326 if (TSActionDone(actionp)) {
01327 *pstatus = REGRESSION_TEST_FAILED;
01328 TSMutexUnlock(cont_mutex);
01329 return;
01330 } else {
01331 TSActionCancel(actionp);
01332 }
01333 TSMutexUnlock(cont_mutex);
01334
01335 TSContSchedule(contp, 0, TS_THREAD_POOL_DEFAULT);
01336 }
01337
01338
01339
01340
01341
01342
01343
01344
01345
01346
01347
01348
01349
01350
01351
01352
01353
01354
01355
01356
01357
01358
01359
01360 static RegressionTest *SDK_ContCreate_test;
01361 static int *SDK_ContCreate_pstatus;
01362
01363 int
01364 cont_handler(TSCont , TSEvent , void * )
01365 {
01366 SDK_RPRINT(SDK_ContCreate_test, "TSContCreate", "TestCase1", TC_PASS, "ok");
01367 SDK_RPRINT(SDK_ContCreate_test, "TSContCall", "TestCase1", TC_PASS, "ok");
01368
01369 *SDK_ContCreate_pstatus = REGRESSION_TEST_PASSED;
01370
01371 return 0;
01372 }
01373
01374
01375 REGRESSION_TEST(SDK_API_TSContCreate) (RegressionTest * test, int , int *pstatus)
01376 {
01377 *pstatus = REGRESSION_TEST_INPROGRESS;
01378
01379
01380 SDK_ContCreate_test = test;
01381 SDK_ContCreate_pstatus = pstatus;
01382
01383 TSMutex mutexp = TSMutexCreate();
01384 TSCont contp = TSContCreate(cont_handler, mutexp);
01385
01386 if (TS_SUCCESS == TSMutexLockTry(mutexp)) {
01387 TSContCall(contp, (TSEvent) 0, NULL);
01388 TSMutexUnlock(mutexp);
01389 } else {
01390 SDK_RPRINT(SDK_ContCreate_test, "TSContCreate", "TestCase1", TC_FAIL, "continuation creation has problems");
01391 SDK_RPRINT(SDK_ContCreate_test, "TSContCall", "TestCase1", TC_FAIL, "continuation has problems");
01392
01393 *pstatus = REGRESSION_TEST_FAILED;
01394 }
01395
01396 TSContDestroy(contp);
01397 }
01398
01399
01400
01401
01402
01403
01404
01405
01406
01407
01408 static RegressionTest *SDK_ContData_test;
01409 static int *SDK_ContData_pstatus;
01410
01411
01412 typedef struct
01413 {
01414 int data1;
01415 int data2;
01416 } MyData;
01417
01418 int
01419 cont_data_handler(TSCont contp, TSEvent , void * )
01420 {
01421 MyData *my_data = (MyData *) TSContDataGet(contp);
01422
01423 if (my_data->data1 == 1 && my_data->data2 == 2) {
01424 SDK_RPRINT(SDK_ContData_test, "TSContDataSet", "TestCase1", TC_PASS, "ok");
01425 SDK_RPRINT(SDK_ContData_test, "TSContDataGet", "TestCase1", TC_PASS, "ok");
01426
01427 *SDK_ContData_pstatus = REGRESSION_TEST_PASSED;
01428 } else {
01429
01430 SDK_RPRINT(SDK_ContData_test, "TSContDataSet", "TestCase1", TC_FAIL, "bad data");
01431 SDK_RPRINT(SDK_ContData_test, "TSContDataGet", "TestCase1", TC_FAIL, "bad data");
01432
01433 *SDK_ContData_pstatus = REGRESSION_TEST_FAILED;
01434 }
01435
01436 TSfree(my_data);
01437 TSContDestroy(contp);
01438 return 0;
01439 }
01440
01441
01442 REGRESSION_TEST(SDK_API_TSContDataGet) (RegressionTest * test, int , int *pstatus)
01443 {
01444 *pstatus = REGRESSION_TEST_INPROGRESS;
01445
01446
01447 SDK_ContData_test = test;
01448 SDK_ContData_pstatus = pstatus;
01449
01450 TSCont contp = TSContCreate(cont_data_handler, TSMutexCreate());
01451
01452 MyData *my_data = (MyData *) TSmalloc(sizeof(MyData));
01453 my_data->data1 = 1;
01454 my_data->data2 = 2;
01455
01456 TSContDataSet(contp, (void *) my_data);
01457
01458 TSContSchedule(contp, 0, TS_THREAD_POOL_DEFAULT);
01459 }
01460
01461
01462
01463
01464
01465
01466
01467
01468
01469 REGRESSION_TEST(SDK_API_TSContMutexGet) (RegressionTest * test, int , int *pstatus)
01470 {
01471 bool test_passed = false;
01472 *pstatus = REGRESSION_TEST_INPROGRESS;
01473
01474 TSMutex mutexp_input;
01475 TSMutex mutexp_output;
01476 TSCont contp;
01477
01478 mutexp_input = TSMutexCreate();
01479 contp = TSContCreate(cont_handler, mutexp_input);
01480
01481 mutexp_output = TSContMutexGet(contp);
01482
01483 if (mutexp_input == mutexp_output) {
01484 SDK_RPRINT(test, "TSContMutexGet", "TestCase1", TC_PASS, "ok");
01485 test_passed = true;
01486 } else
01487 SDK_RPRINT(test, "TSContMutexGet", "TestCase1", TC_FAIL, "Continutation's mutex corrupted");
01488
01489
01490 *pstatus = ((test_passed == true) ? REGRESSION_TEST_PASSED : REGRESSION_TEST_FAILED);
01491
01492 TSContDestroy(contp);
01493 }
01494
01495
01496
01497
01498
01499
01500
01501
01502 static RegressionTest *SDK_ContSchedule_test;
01503 static int *SDK_ContSchedule_pstatus;
01504
01505
01506 static int tc1_count = 0;
01507 static int tc2_count = 0;
01508
01509 int
01510 cont_schedule_handler(TSCont contp, TSEvent event, void * )
01511 {
01512 if (event == TS_EVENT_IMMEDIATE) {
01513
01514 SDK_RPRINT(SDK_ContSchedule_test, "TSContSchedule", "TestCase1", TC_PASS, "ok");
01515 tc1_count++;
01516 } else if (event == TS_EVENT_TIMEOUT) {
01517
01518 SDK_RPRINT(SDK_ContSchedule_test, "TSContSchedule", "TestCase2", TC_PASS, "ok");
01519 tc2_count++;
01520 } else {
01521
01522 SDK_RPRINT(SDK_ContSchedule_test, "TSContSchedule", "TestCase1|2", TC_FAIL, "received unexpected event number %d", event);
01523 *SDK_ContSchedule_pstatus = REGRESSION_TEST_FAILED;
01524 return 0;
01525 }
01526
01527
01528 if ((tc1_count == 1) && (tc2_count == 1)) {
01529 *SDK_ContSchedule_pstatus = REGRESSION_TEST_PASSED;
01530 }
01531
01532 else if (tc1_count + tc2_count >= 2) {
01533 *SDK_ContSchedule_pstatus = REGRESSION_TEST_FAILED;
01534 }
01535
01536 TSContDestroy(contp);
01537 return 0;
01538 }
01539
01540
01541
01542
01543
01544
01545
01546
01547
01548
01549
01550
01551
01552
01553
01554
01555 REGRESSION_TEST(SDK_API_TSMutexCreate) (RegressionTest * test, int , int *pstatus)
01556 {
01557 bool test_passed = false;
01558 *pstatus = REGRESSION_TEST_INPROGRESS;
01559
01560 TSMutex mutexp = TSMutexCreate();
01561
01562 TSMutexLock(mutexp);
01563
01564
01565 TSReturnCode lock = TS_ERROR;
01566
01567 TSMutexLockTry(mutexp);
01568 lock = TSMutexLockTry(mutexp);
01569
01570 if (TS_SUCCESS == lock) {
01571 SDK_RPRINT(test, "TSMutexCreate", "TestCase1", TC_PASS, "ok");
01572 SDK_RPRINT(test, "TSMutexLock", "TestCase1", TC_PASS, "ok");
01573 SDK_RPRINT(test, "TSMutexLockTry", "TestCase1", TC_PASS, "ok");
01574 test_passed = true;
01575 } else {
01576 SDK_RPRINT(test, "TSMutexCreate", "TestCase1", TC_FAIL, "mutex can't be grabbed twice from the same thread");
01577 SDK_RPRINT(test, "TSMutexLock", "TestCase1", TC_FAIL, "mutex can't be grabbed twice from the same thread");
01578 SDK_RPRINT(test, "TSMutexLockTry", "TestCase1", TC_FAIL, "mutex can't be grabbed twice from the same thread");
01579
01580 }
01581
01582 TSMutexUnlock(mutexp);
01583 SDK_RPRINT(test, "TSMutexUnLock", "TestCase1", TC_PASS, "ok");
01584
01585 if (test_passed) {
01586 *pstatus = REGRESSION_TEST_PASSED;
01587 } else {
01588 *pstatus = REGRESSION_TEST_FAILED;
01589 }
01590
01591 }
01592
01593
01594
01595
01596
01597
01598
01599
01600
01601
01602
01603 REGRESSION_TEST(SDK_API_TSIOBufferCreate) (RegressionTest * test, int , int *pstatus)
01604 {
01605 bool test_passed = false;
01606 *pstatus = REGRESSION_TEST_INPROGRESS;
01607
01608 int64_t watermark = 1000;
01609
01610 TSIOBuffer bufp = TSIOBufferCreate();
01611
01612 TSIOBufferWaterMarkSet(bufp, watermark);
01613 watermark = TSIOBufferWaterMarkGet(bufp);
01614
01615 if (watermark == 1000) {
01616 SDK_RPRINT(test, "TSIOBufferCreate", "TestCase1", TC_PASS, "ok");
01617 SDK_RPRINT(test, "TSIOBufferWaterMarkGet", "TestCase1", TC_PASS, "ok");
01618 SDK_RPRINT(test, "TSIOBufferWaterMarkSet", "TestCase1", TC_PASS, "ok");
01619 test_passed = true;
01620 } else {
01621 SDK_RPRINT(test, "TSIOBufferCreate", "TestCase1", TC_FAIL, "watermark failed");
01622 SDK_RPRINT(test, "TSIOBufferWaterMarkGet", "TestCase1", TC_FAIL, "watermark failed");
01623 SDK_RPRINT(test, "TSIOBufferWaterMarkSet", "TestCase1", TC_FAIL, "watermark failed");
01624 }
01625
01626 TSIOBufferDestroy(bufp);
01627
01628
01629 *pstatus = ((test_passed == true) ? REGRESSION_TEST_PASSED : REGRESSION_TEST_FAILED);
01630 return;
01631
01632 }
01633
01634
01635
01636
01637
01638
01639
01640
01641
01642
01643
01644 REGRESSION_TEST(SDK_API_TSIOBufferProduce) (RegressionTest * test, int , int *pstatus)
01645 {
01646 bool test_passed = false;
01647 *pstatus = REGRESSION_TEST_INPROGRESS;
01648
01649 TSIOBuffer bufp = TSIOBufferSizedCreate(TS_IOBUFFER_SIZE_INDEX_4K);
01650
01651 TSIOBufferReader readerp = TSIOBufferReaderAlloc(bufp);
01652
01653 TSIOBufferProduce(bufp, 10);
01654
01655 int64_t reader_avail = TSIOBufferReaderAvail(readerp);
01656 if (reader_avail == 10) {
01657 SDK_RPRINT(test, "TSIOBufferProduce", "TestCase1", TC_PASS, "ok");
01658 SDK_RPRINT(test, "TSIOBufferReaderAlloc", "TestCase1", TC_PASS, "ok");
01659 SDK_RPRINT(test, "TSIOBufferReaderAvail", "TestCase1", TC_PASS, "ok");
01660 test_passed = true;
01661 } else {
01662 SDK_RPRINT(test, "TSIOBufferProduce", "TestCase1", TC_FAIL, "failed");
01663 SDK_RPRINT(test, "TSIOBufferReaderAlloc", "TestCase1", TC_FAIL, "failed");
01664 SDK_RPRINT(test, "TSIOBufferReaderAvail", "TestCase1", TC_FAIL, "failed");
01665 }
01666
01667
01668 *pstatus = ((test_passed == true) ? REGRESSION_TEST_PASSED : REGRESSION_TEST_FAILED);
01669 return;
01670 }
01671
01672
01673
01674
01675
01676
01677
01678
01679 REGRESSION_TEST(SDK_API_TSIOBufferReaderConsume) (RegressionTest * test, int , int *pstatus)
01680 {
01681 bool test_passed = false;
01682 *pstatus = REGRESSION_TEST_INPROGRESS;
01683
01684 TSIOBuffer bufp = TSIOBufferSizedCreate(TS_IOBUFFER_SIZE_INDEX_4K);
01685
01686 TSIOBufferReader readerp = TSIOBufferReaderAlloc(bufp);
01687
01688 TSIOBufferProduce(bufp, 10);
01689 TSIOBufferReaderConsume(readerp, 10);
01690
01691 int64_t reader_avail = TSIOBufferReaderAvail(readerp);
01692 if (reader_avail == 0) {
01693 SDK_RPRINT(test, "TSIOBufferReaderConsume", "TestCase1", TC_PASS, "ok");
01694 test_passed = true;
01695 } else {
01696 SDK_RPRINT(test, "TSIOBufferReaderConsume", "TestCase1", TC_FAIL, "failed");
01697 }
01698
01699
01700 *pstatus = ((test_passed == true) ? REGRESSION_TEST_PASSED : REGRESSION_TEST_FAILED);
01701 return;
01702 }
01703
01704
01705
01706
01707
01708
01709
01710 REGRESSION_TEST(SDK_API_TSIOBufferReaderClone) (RegressionTest * test, int , int *pstatus)
01711 {
01712 bool test_passed = false;
01713 *pstatus = REGRESSION_TEST_INPROGRESS;
01714
01715 TSIOBuffer bufp = TSIOBufferSizedCreate(TS_IOBUFFER_SIZE_INDEX_4K);
01716 TSIOBufferReader readerp = TSIOBufferReaderAlloc(bufp);
01717
01718 TSIOBufferProduce(bufp, 10);
01719 TSIOBufferReaderConsume(readerp, 5);
01720
01721 TSIOBufferReader readerp2 = TSIOBufferReaderClone(readerp);
01722
01723 int64_t reader_avail = TSIOBufferReaderAvail(readerp2);
01724 if (reader_avail == 5) {
01725 SDK_RPRINT(test, "TSIOBufferReaderClone", "TestCase1", TC_PASS, "ok");
01726 test_passed = true;
01727 } else {
01728 SDK_RPRINT(test, "TSIOBufferReaderClone", "TestCase1", TC_FAIL, "failed");
01729 }
01730
01731
01732 *pstatus = ((test_passed == true) ? REGRESSION_TEST_PASSED : REGRESSION_TEST_FAILED);
01733 return;
01734 }
01735
01736
01737
01738
01739
01740
01741
01742
01743 REGRESSION_TEST(SDK_API_TSIOBufferStart) (RegressionTest * test, int , int *pstatus)
01744 {
01745 bool test_passed = false;
01746 *pstatus = REGRESSION_TEST_INPROGRESS;
01747
01748 TSIOBuffer bufp = TSIOBufferSizedCreate(TS_IOBUFFER_SIZE_INDEX_4K);
01749
01750 TSIOBufferReader readerp = TSIOBufferReaderAlloc(bufp);
01751
01752 if (TSIOBufferStart(bufp) == TSIOBufferReaderStart(readerp)) {
01753 SDK_RPRINT(test, "TSIOBufferStart", "TestCase1", TC_PASS, "ok");
01754 SDK_RPRINT(test, "TSIOBufferReaderStart", "TestCase1", TC_PASS, "ok");
01755 test_passed = true;
01756 } else {
01757 SDK_RPRINT(test, "TSIOBufferStart", "TestCase1", TC_FAIL, "failed");
01758 SDK_RPRINT(test, "TSIOBufferReaderStart", "TestCase1", TC_FAIL, "failed");
01759 }
01760
01761
01762 *pstatus = ((test_passed == true) ? REGRESSION_TEST_PASSED : REGRESSION_TEST_FAILED);
01763 return;
01764 }
01765
01766
01767
01768
01769
01770
01771
01772
01773
01774
01775 REGRESSION_TEST(SDK_API_TSIOBufferCopy) (RegressionTest * test, int , int *pstatus)
01776 {
01777 bool test_passed = false;
01778 *pstatus = REGRESSION_TEST_INPROGRESS;
01779
01780 char input_buf[] = "This is the test for TSIOBufferCopy, TSIOBufferWrite, TSIOBufferReaderCopy";
01781 char output_buf[1024];
01782 TSIOBuffer bufp = TSIOBufferSizedCreate(TS_IOBUFFER_SIZE_INDEX_4K);
01783 TSIOBuffer bufp2 = TSIOBufferSizedCreate(TS_IOBUFFER_SIZE_INDEX_4K);
01784
01785 TSIOBufferReader readerp = TSIOBufferReaderAlloc(bufp);
01786 TSIOBufferWrite(bufp, input_buf, (strlen(input_buf) + 1));
01787 TSIOBufferCopy(bufp2, readerp, (strlen(input_buf) + 1), 0);
01788 TSIOBufferReaderCopy(readerp, output_buf, (strlen(input_buf) + 1));
01789
01790 if (strcmp(input_buf, output_buf) == 0) {
01791 SDK_RPRINT(test, "TSIOBufferWrite", "TestCase1", TC_PASS, "ok");
01792 SDK_RPRINT(test, "TSIOBufferCopy", "TestCase1", TC_PASS, "ok");
01793 SDK_RPRINT(test, "TSIOBufferReaderCopy", "TestCase1", TC_PASS, "ok");
01794 test_passed = true;
01795 } else {
01796 SDK_RPRINT(test, "TSIOBufferWrite", "TestCase1", TC_FAIL, "failed");
01797 SDK_RPRINT(test, "TSIOBufferCopy", "TestCase1", TC_FAIL, "failed");
01798 SDK_RPRINT(test, "TSIOBufferReaderCopy", "TestCase1", TC_FAIL, "failed");
01799 }
01800
01801
01802 *pstatus = ((test_passed == true) ? REGRESSION_TEST_PASSED : REGRESSION_TEST_FAILED);
01803 return;
01804 }
01805
01806
01807
01808
01809
01810
01811
01812
01813
01814 REGRESSION_TEST(SDK_API_TSIOBufferBlockReadAvail) (RegressionTest * test, int , int *pstatus)
01815 {
01816 bool test_passed_1 = false;
01817 bool test_passed_2 = false;
01818 *pstatus = REGRESSION_TEST_INPROGRESS;
01819
01820 int i = 10000;
01821 TSIOBuffer bufp = TSIOBufferCreate();
01822 TSIOBufferWrite(bufp, (char*)&i, sizeof(int));
01823 TSIOBufferReader readerp = TSIOBufferReaderAlloc(bufp);
01824
01825 int64_t avail_write, avail_read;
01826
01827
01828 TSIOBufferBlock blockp = TSIOBufferStart(bufp);
01829
01830 if ((TSIOBufferBlockWriteStart(blockp, &avail_write) - TSIOBufferBlockReadStart(blockp, readerp, &avail_read)) ==
01831 sizeof(int)) {
01832 SDK_RPRINT(test, "TSIOBufferBlockReadStart", "TestCase1", TC_PASS, "ok");
01833 SDK_RPRINT(test, "TSIOBufferBlockWriteStart", "TestCase1", TC_PASS, "ok");
01834 test_passed_1 = true;
01835 } else {
01836 SDK_RPRINT(test, "TSIOBufferBlockReadStart", "TestCase1", TC_FAIL, "failed");
01837 SDK_RPRINT(test, "TSIOBufferBlockWriteStart", "TestCase1", TC_FAIL, "failed");
01838 }
01839
01840 if ((TSIOBufferBlockReadAvail(blockp, readerp) + TSIOBufferBlockWriteAvail(blockp)) == 4096) {
01841 SDK_RPRINT(test, "TSIOBufferBlockReadAvail", "TestCase1", TC_PASS, "ok");
01842 SDK_RPRINT(test, "TSIOBufferBlockWriteAvail", "TestCase1", TC_PASS, "ok");
01843 test_passed_2 = true;
01844 } else {
01845 SDK_RPRINT(test, "TSIOBufferBlockReadAvail", "TestCase1", TC_FAIL, "failed");
01846 SDK_RPRINT(test, "TSIOBufferBlockWriteAvail", "TestCase1", TC_FAIL, "failed");
01847 }
01848
01849 if (test_passed_1 && test_passed_2) {
01850 *pstatus = REGRESSION_TEST_PASSED;
01851 } else {
01852 *pstatus = REGRESSION_TEST_FAILED;
01853 }
01854
01855 return;
01856 }
01857
01858
01859
01860
01861
01862
01863
01864 REGRESSION_TEST(SDK_API_TSIOBufferBlockNext) (RegressionTest * test, int , int *pstatus)
01865 {
01866 bool test_passed = false;
01867 *pstatus = REGRESSION_TEST_INPROGRESS;
01868
01869 int i = 10000;
01870 TSIOBuffer bufp = TSIOBufferCreate();
01871 TSIOBufferWrite(bufp, (char*)&i, sizeof(int));
01872
01873 TSIOBufferReader readerp = TSIOBufferReaderAlloc(bufp);
01874 TSIOBufferBlock blockp = TSIOBufferReaderStart(readerp);
01875
01876
01877
01878 if (TSIOBufferBlockNext(blockp) == NULL) {
01879 SDK_RPRINT(test, "TSIOBufferBlockNext", "TestCase1", TC_PASS, "ok");
01880 test_passed = true;
01881 } else {
01882 SDK_RPRINT(test, "TSIOBufferBlockNext", "TestCase1", TC_FAIL, "fail");
01883 }
01884
01885 if (test_passed) {
01886 *pstatus = REGRESSION_TEST_PASSED;
01887 } else {
01888 *pstatus = REGRESSION_TEST_FAILED;
01889 }
01890
01891 return;
01892 }
01893
01894
01895 REGRESSION_TEST(SDK_API_TSContSchedule) (RegressionTest * test, int , int *pstatus)
01896 {
01897 *pstatus = REGRESSION_TEST_INPROGRESS;
01898
01899
01900 SDK_ContSchedule_test = test;
01901 SDK_ContSchedule_pstatus = pstatus;
01902
01903 TSCont contp = TSContCreate(cont_schedule_handler, TSMutexCreate());
01904 TSCont contp2 = TSContCreate(cont_schedule_handler, TSMutexCreate());
01905
01906
01907 TSContSchedule(contp, 0, TS_THREAD_POOL_DEFAULT);
01908
01909
01910 TSContSchedule(contp2, 10, TS_THREAD_POOL_DEFAULT);
01911 }
01912
01913
01914
01915
01916
01917
01918
01919
01920
01921
01922
01923
01924
01925
01926
01927
01928 #define HTTP_HOOK_TEST_REQUEST_ID 1
01929
01930 typedef struct
01931 {
01932 RegressionTest *regtest;
01933 int *pstatus;
01934 SocketServer *os;
01935 ClientTxn *browser;
01936 int hook_mask;
01937 int reenable_mask;
01938 bool test_client_ip_get;
01939 bool test_client_incoming_port_get;
01940 bool test_client_remote_port_get;
01941 bool test_client_req_get;
01942 bool test_client_resp_get;
01943 bool test_server_ip_get;
01944 bool test_server_req_get;
01945 bool test_server_resp_get;
01946 bool test_next_hop_ip_get;
01947
01948 unsigned int magic;
01949 } SocketTest;
01950
01951
01952
01953 static int
01954 checkHttpTxnClientIPGet(SocketTest * test, void *data)
01955 {
01956
01957 sockaddr const* ptr;
01958 in_addr_t ip;
01959 TSHttpTxn txnp = (TSHttpTxn) data;
01960 in_addr_t actual_ip = htonl(INADDR_LOOPBACK);
01961
01962 ptr = TSHttpTxnClientAddrGet(txnp);
01963 if (ptr == 0 || INADDR_ANY == (ip = ats_ip4_addr_cast(ptr))) {
01964 test->test_client_ip_get = false;
01965 SDK_RPRINT(test->regtest, "TSHttpTxnClientIPGet", "TestCase1", TC_FAIL, "TSHttpTxnClientIPGet returns 0 %s", ptr ? "address" : "pointer");
01966 return TS_EVENT_CONTINUE;
01967 }
01968
01969 if (ip == actual_ip) {
01970 test->test_client_ip_get = true;
01971 SDK_RPRINT(test->regtest, "TSHttpTxnClientIPGet", "TestCase1", TC_PASS, "ok [%0.8x]", ip);
01972 } else {
01973 test->test_client_ip_get = false;
01974 SDK_RPRINT(test->regtest, "TSHttpTxnClientIPGet", "TestCase1", TC_FAIL, "Value's Mismatch [expected %.8x got %.8x]", actual_ip, ip);
01975 }
01976 return TS_EVENT_CONTINUE;
01977
01978 }
01979
01980
01981 static int
01982 checkHttpTxnNextHopIPGet(SocketTest * test, void *data)
01983 {
01984 TSHttpTxn txnp = (TSHttpTxn) data;
01985 in_addr_t actual_ip = htonl(INADDR_LOOPBACK);
01986 sockaddr const* ptr;
01987 in_addr_t nexthopip;
01988
01989 ptr = TSHttpTxnNextHopAddrGet(txnp);
01990 if (ptr == 0 || (nexthopip = ats_ip4_addr_cast(ptr)) == 0) {
01991 test->test_next_hop_ip_get = false;
01992 SDK_RPRINT(test->regtest, "TSHttpTxnNextHopIPGet", "TestCase1", TC_FAIL, "TSHttpTxnNextHopIPGet returns 0 %s", ptr ? "address" : "pointer" );
01993 return TS_EVENT_CONTINUE;
01994 }
01995
01996 if (nexthopip == actual_ip) {
01997 test->test_next_hop_ip_get = true;
01998 SDK_RPRINT(test->regtest, "TSHttpTxnNextHopIPGet", "TestCase1", TC_PASS, "ok");
01999 } else {
02000 test->test_next_hop_ip_get = false;
02001 SDK_RPRINT(test->regtest, "TSHttpTxnNextHopIPGet", "TestCase1", TC_FAIL, "Value's Mismatch [expected %0.8x got %0.8x]", actual_ip, nexthopip);
02002 }
02003
02004 return TS_EVENT_CONTINUE;
02005 }
02006
02007
02008
02009
02010 static int
02011 checkHttpTxnServerIPGet(SocketTest * test, void *data)
02012 {
02013 sockaddr const* ptr;
02014 in_addr_t ip;
02015 TSHttpTxn txnp = (TSHttpTxn) data;
02016 in_addr_t actual_ip = htonl(INADDR_LOOPBACK);
02017
02018 ptr = TSHttpTxnServerAddrGet(txnp);
02019 if (0 == ptr || 0 == (ip = ats_ip4_addr_cast(ptr))) {
02020 test->test_server_ip_get = false;
02021 SDK_RPRINT(test->regtest, "TSHttpTxnServerIPGet", "TestCase1", TC_FAIL, "TSHttpTxnServerIPGet returns 0 %s", ptr ? "address" : "pointer");
02022 return TS_EVENT_CONTINUE;
02023 }
02024
02025 if (ip == actual_ip) {
02026 test->test_server_ip_get = true;
02027 SDK_RPRINT(test->regtest, "TSHttpTxnServerIPGet", "TestCase1", TC_PASS, "ok");
02028 } else {
02029 test->test_server_ip_get = false;
02030 SDK_RPRINT(test->regtest, "TSHttpTxnServerIPGet", "TestCase1", TC_FAIL, "Value's Mismatch");
02031 }
02032
02033
02034 return TS_EVENT_CONTINUE;
02035
02036 }
02037
02038
02039 static int
02040 checkHttpTxnIncomingAddrGet(SocketTest * test, void *data)
02041 {
02042 uint16_t port;
02043 HttpProxyPort* proxy_port = HttpProxyPort::findHttp(AF_INET);
02044 TSHttpTxn txnp = (TSHttpTxn) data;
02045 sockaddr const* ptr = TSHttpTxnIncomingAddrGet(txnp);
02046
02047 if (0 == proxy_port) {
02048 SDK_RPRINT(test->regtest, "TSHttpTxnIncomingPortGet", "TestCase1", TC_FAIL,
02049 "TSHttpTxnIncomingAddrGet failed to find configured HTTP port.");
02050 test->test_client_incoming_port_get = false;
02051 return TS_EVENT_CONTINUE;
02052 }
02053 if (0 == ptr) {
02054 SDK_RPRINT(test->regtest, "TSHttpTxnIncomingPortGet", "TestCase1", TC_FAIL,
02055 "TSHttpTxnIncomingAddrGet returns 0 pointer");
02056 test->test_client_incoming_port_get = false;
02057 return TS_EVENT_CONTINUE;
02058 }
02059 port = ats_ip_port_host_order(ptr);
02060
02061 TSDebug(UTDBG_TAG, "TS HTTP port = %x, Txn incoming client port %x", proxy_port->m_port, port);
02062
02063 if (port == proxy_port->m_port) {
02064 SDK_RPRINT(test->regtest, "TSHttpTxnIncomingAddrGet", "TestCase1", TC_PASS, "ok");
02065 test->test_client_incoming_port_get = true;
02066 } else {
02067 SDK_RPRINT(test->regtest, "TSHttpTxnIncomingAddrGet", "TestCase1", TC_FAIL,
02068 "Value's Mismatch. From Function: %d Expected value: %d", port, proxy_port->m_port);
02069 test->test_client_incoming_port_get = false;
02070 }
02071 return TS_EVENT_CONTINUE;
02072 }
02073
02074
02075 static int
02076 checkHttpTxnClientAddrGet(SocketTest *test, void *data)
02077 {
02078
02079 uint16_t port;
02080 uint16_t browser_port;
02081 TSHttpTxn txnp = (TSHttpTxn) data;
02082 sockaddr const* ptr = TSHttpTxnClientAddrGet(txnp);
02083
02084 browser_port = test->browser->local_port;
02085
02086 if (0 == ptr) {
02087 SDK_RPRINT(test->regtest, "TSHttpTxnClientClientAddrGet", "TestCase2", TC_FAIL,
02088 "TSHttpTxnClientAddrGet returned 0 pointer.");
02089 test->test_client_remote_port_get = false;
02090 return TS_EVENT_CONTINUE;
02091 }
02092
02093 port = ats_ip_port_host_order(ptr);
02094 TSDebug(UTDBG_TAG, "Browser port = %x, Txn remote port = %x", browser_port, port);
02095
02096 if (port == browser_port) {
02097 SDK_RPRINT(test->regtest, "TSHttpTxnClientAddrGet", "TestCase1", TC_PASS, "ok");
02098 test->test_client_remote_port_get = true;
02099 } else {
02100 SDK_RPRINT(test->regtest, "TSHttpTxnClientAddrGet", "TestCase1", TC_FAIL,
02101 "Value's Mismatch. From Function: %d Expected Value: %d", port, browser_port);
02102 test->test_client_remote_port_get = false;
02103 }
02104 return TS_EVENT_CONTINUE;
02105 }
02106
02107
02108 static int
02109 checkHttpTxnClientReqGet(SocketTest * test, void *data)
02110 {
02111
02112 TSMBuffer bufp;
02113 TSMLoc mloc;
02114 TSHttpTxn txnp = (TSHttpTxn) data;
02115
02116 if (TSHttpTxnClientReqGet(txnp, &bufp, &mloc) != TS_SUCCESS) {
02117 test->test_client_req_get = false;
02118 SDK_RPRINT(test->regtest, "TSHttpTxnClientReqGet", "TestCase1", TC_FAIL, "Unable to get handle to client request");
02119 return TS_EVENT_CONTINUE;
02120 }
02121
02122 if ((bufp == reinterpret_cast<TSMBuffer>(&((HttpSM *) txnp)->t_state.hdr_info.client_request)) &&
02123 (mloc == reinterpret_cast<TSMLoc>(((HttpSM *)txnp)->t_state.hdr_info.client_request.m_http))) {
02124 test->test_client_req_get = true;
02125 SDK_RPRINT(test->regtest, "TSHttpTxnClientReqGet", "TestCase1", TC_PASS, "ok");
02126 } else {
02127 test->test_client_req_get = false;
02128 SDK_RPRINT(test->regtest, "TSHttpTxnClientReqGet", "TestCase1", TC_FAIL, "Value's Mismatch");
02129 }
02130
02131 return TS_EVENT_CONTINUE;
02132 }
02133
02134
02135 static int
02136 checkHttpTxnClientRespGet(SocketTest * test, void *data)
02137 {
02138
02139 TSMBuffer bufp;
02140 TSMLoc mloc;
02141 TSHttpTxn txnp = (TSHttpTxn) data;
02142
02143 if (TSHttpTxnClientRespGet(txnp, &bufp, &mloc) != TS_SUCCESS) {
02144 test->test_client_resp_get = false;
02145 SDK_RPRINT(test->regtest, "TSHttpTxnClientRespGet", "TestCase1", TC_FAIL, "Unable to get handle to client response");
02146 return TS_EVENT_CONTINUE;
02147 }
02148
02149 if ((bufp == reinterpret_cast<TSMBuffer>(&((HttpSM *) txnp)->t_state.hdr_info.client_response)) &&
02150 (mloc == reinterpret_cast<TSMLoc>(((HttpSM *) txnp)->t_state.hdr_info.client_response.m_http))) {
02151 test->test_client_resp_get = true;
02152 SDK_RPRINT(test->regtest, "TSHttpTxnClientRespGet", "TestCase1", TC_PASS, "ok");
02153 } else {
02154 test->test_client_resp_get = false;
02155 SDK_RPRINT(test->regtest, "TSHttpTxnClientRespGet", "TestCase1", TC_FAIL, "Value's Mismatch");
02156 }
02157
02158 return TS_EVENT_CONTINUE;
02159 }
02160
02161
02162 static int
02163 checkHttpTxnServerReqGet(SocketTest * test, void *data)
02164 {
02165
02166 TSMBuffer bufp;
02167 TSMLoc mloc;
02168 TSHttpTxn txnp = (TSHttpTxn) data;
02169
02170 if (TSHttpTxnServerReqGet(txnp, &bufp, &mloc) != TS_SUCCESS) {
02171 test->test_server_req_get = false;
02172 SDK_RPRINT(test->regtest, "TSHttpTxnServerReqGet", "TestCase1", TC_FAIL, "Unable to get handle to server request");
02173 return TS_EVENT_CONTINUE;
02174 }
02175
02176 if ((bufp == reinterpret_cast<TSMBuffer>(&((HttpSM *) txnp)->t_state.hdr_info.server_request)) &&
02177 (mloc == reinterpret_cast<TSMLoc>(((HttpSM *) txnp)->t_state.hdr_info.server_request.m_http))) {
02178 test->test_server_req_get = true;
02179 SDK_RPRINT(test->regtest, "TSHttpTxnServerReqGet", "TestCase1", TC_PASS, "ok");
02180 } else {
02181 test->test_server_req_get = false;
02182 SDK_RPRINT(test->regtest, "TSHttpTxnServerReqGet", "TestCase1", TC_FAIL, "Value's Mismatch");
02183 }
02184
02185 return TS_EVENT_CONTINUE;
02186 }
02187
02188
02189 static int
02190 checkHttpTxnServerRespGet(SocketTest * test, void *data)
02191 {
02192
02193 TSMBuffer bufp;
02194 TSMLoc mloc;
02195 TSHttpTxn txnp = (TSHttpTxn) data;
02196
02197 if (TSHttpTxnServerRespGet(txnp, &bufp, &mloc) != TS_SUCCESS) {
02198 test->test_server_resp_get = false;
02199 SDK_RPRINT(test->regtest, "TSHttpTxnServerRespGet", "TestCase1", TC_FAIL, "Unable to get handle to server response");
02200 return TS_EVENT_CONTINUE;
02201 }
02202
02203 if ((bufp == reinterpret_cast<TSMBuffer>(&((HttpSM *) txnp)->t_state.hdr_info.server_response)) &&
02204 (mloc == reinterpret_cast<TSMLoc>(((HttpSM *) txnp)->t_state.hdr_info.server_response.m_http))) {
02205 test->test_server_resp_get = true;
02206 SDK_RPRINT(test->regtest, "TSHttpTxnServerRespGet", "TestCase1", TC_PASS, "ok");
02207 } else {
02208 test->test_server_resp_get = false;
02209 SDK_RPRINT(test->regtest, "TSHttpTxnServerRespGet", "TestCase1", TC_FAIL, "Value's Mismatch");
02210 }
02211
02212 return TS_EVENT_CONTINUE;
02213 }
02214
02215
02216
02217
02218 static int
02219 mytest_handler(TSCont contp, TSEvent event, void *data)
02220 {
02221 SocketTest *test = (SocketTest *) TSContDataGet(contp);
02222 if (test == NULL) {
02223 if ((event == TS_EVENT_IMMEDIATE) || (event == TS_EVENT_TIMEOUT)) {
02224 return 0;
02225 }
02226 TSHttpTxnReenable((TSHttpTxn) data, TS_EVENT_HTTP_CONTINUE);
02227 return 0;
02228 }
02229 TSAssert(test->magic == MAGIC_ALIVE);
02230 TSAssert(test->browser->magic == MAGIC_ALIVE);
02231
02232 switch (event) {
02233 case TS_EVENT_HTTP_TXN_START:
02234 if (test->hook_mask == 0) {
02235 test->hook_mask |= 1;
02236 }
02237
02238 TSHttpTxnReenable((TSHttpTxn) data, TS_EVENT_HTTP_CONTINUE);
02239 test->reenable_mask |= 1;
02240 break;
02241
02242 case TS_EVENT_HTTP_READ_REQUEST_HDR:
02243 if (test->hook_mask == 1) {
02244 test->hook_mask |= 2;
02245 }
02246 TSSkipRemappingSet((TSHttpTxn) data,1);
02247 checkHttpTxnClientReqGet(test, data);
02248
02249 TSHttpTxnReenable((TSHttpTxn) data, TS_EVENT_HTTP_CONTINUE);
02250 test->reenable_mask |= 2;
02251 break;
02252
02253 case TS_EVENT_HTTP_OS_DNS:
02254 if (test->hook_mask == 7) {
02255 test->hook_mask |= 8;
02256 }
02257
02258 checkHttpTxnIncomingAddrGet(test, data);
02259 checkHttpTxnClientAddrGet(test, data);
02260
02261 checkHttpTxnClientIPGet(test, data);
02262 checkHttpTxnServerIPGet(test, data);
02263
02264 TSHttpTxnReenable((TSHttpTxn) data, TS_EVENT_HTTP_CONTINUE);
02265 test->reenable_mask |= 8;
02266 break;
02267
02268 case TS_EVENT_HTTP_CACHE_LOOKUP_COMPLETE:
02269 if (test->hook_mask == 3) {
02270 test->hook_mask |= 4;
02271 }
02272 TSHttpTxnReenable((TSHttpTxn) data, TS_EVENT_HTTP_CONTINUE);
02273 test->reenable_mask |= 4;
02274 break;
02275
02276 case TS_EVENT_HTTP_SEND_REQUEST_HDR:
02277 if (test->hook_mask == 15) {
02278 test->hook_mask |= 16;
02279 }
02280
02281 checkHttpTxnServerReqGet(test, data);
02282 checkHttpTxnNextHopIPGet(test, data);
02283
02284 TSHttpTxnReenable((TSHttpTxn) data, TS_EVENT_HTTP_CONTINUE);
02285 test->reenable_mask |= 16;
02286 break;
02287
02288 case TS_EVENT_HTTP_READ_RESPONSE_HDR:
02289 if (test->hook_mask == 31) {
02290 test->hook_mask |= 32;
02291 }
02292 checkHttpTxnServerRespGet(test, data);
02293
02294 TSHttpTxnReenable((TSHttpTxn) data, TS_EVENT_HTTP_CONTINUE);
02295 test->reenable_mask |= 32;
02296 break;
02297
02298 case TS_EVENT_HTTP_SEND_RESPONSE_HDR:
02299 if (test->hook_mask == 63) {
02300 test->hook_mask |= 64;
02301 }
02302
02303 checkHttpTxnClientRespGet(test, data);
02304
02305 TSHttpTxnReenable((TSHttpTxn) data, TS_EVENT_HTTP_CONTINUE);
02306 test->reenable_mask |= 64;
02307 break;
02308
02309 case TS_EVENT_HTTP_TXN_CLOSE:
02310 if (test->hook_mask == 127) {
02311 test->hook_mask |= 128;
02312 }
02313
02314 TSHttpTxnReenable((TSHttpTxn) data, TS_EVENT_HTTP_CONTINUE);
02315 test->reenable_mask |= 128;
02316 break;
02317
02318 case TS_EVENT_IMMEDIATE:
02319 case TS_EVENT_TIMEOUT:
02320
02321 if (test->browser->status == REQUEST_INPROGRESS) {
02322 TSContSchedule(contp, 25, TS_THREAD_POOL_DEFAULT);
02323 }
02324
02325 else {
02326
02327 if ((test->browser->status == REQUEST_SUCCESS) && (test->hook_mask == 255)) {
02328 *(test->pstatus) = REGRESSION_TEST_PASSED;
02329 SDK_RPRINT(test->regtest, "TSHttpHookAdd", "TestCase1", TC_PASS, "ok");
02330
02331 } else {
02332 *(test->pstatus) = REGRESSION_TEST_FAILED;
02333 SDK_RPRINT(test->regtest, "TSHttpHookAdd", "TestCase1", TC_FAIL,
02334 "Hooks not called or request failure. Hook mask = %d\n %s", test->hook_mask,test->browser->response);
02335 }
02336
02337 if (test->reenable_mask == 255) {
02338 SDK_RPRINT(test->regtest, "TSHttpTxnReenable", "TestCase1", TC_PASS, "ok");
02339
02340 } else {
02341 *(test->pstatus) = REGRESSION_TEST_FAILED;
02342 SDK_RPRINT(test->regtest, "TSHttpTxnReenable", "TestCase1", TC_FAIL, "Txn not re-enabled properly");
02343
02344 }
02345
02346 if ((test->test_client_ip_get != true) ||
02347 (test->test_client_incoming_port_get != true) ||
02348 (test->test_client_remote_port_get != true) ||
02349 (test->test_client_req_get != true) ||
02350 (test->test_client_resp_get != true) ||
02351 (test->test_server_ip_get != true) ||
02352 (test->test_server_req_get != true) ||
02353 (test->test_server_resp_get != true) || (test->test_next_hop_ip_get != true)) {
02354 *(test->pstatus) = REGRESSION_TEST_FAILED;
02355 }
02356
02357 synclient_txn_delete(test->browser);
02358 synserver_delete(test->os);
02359
02360 test->magic = MAGIC_DEAD;
02361 TSfree(test);
02362 TSContDataSet(contp, NULL);
02363 }
02364 break;
02365
02366 default:
02367 *(test->pstatus) = REGRESSION_TEST_FAILED;
02368 SDK_RPRINT(test->regtest, "TSHttpHookAdd", "TestCase1", TC_FAIL, "Unexpected event %d", event);
02369 break;
02370 }
02371
02372 return TS_EVENT_IMMEDIATE;
02373 }
02374
02375
02376
02377 EXCLUSIVE_REGRESSION_TEST(SDK_API_HttpHookAdd) (RegressionTest * test, int , int *pstatus)
02378 {
02379 *pstatus = REGRESSION_TEST_INPROGRESS;
02380
02381 TSCont cont = TSContCreate(mytest_handler, TSMutexCreate());
02382 SocketTest *socktest = (SocketTest *) TSmalloc(sizeof(SocketTest));
02383
02384 socktest->regtest = test;
02385 socktest->pstatus = pstatus;
02386 socktest->hook_mask = 0;
02387 socktest->reenable_mask = 0;
02388 socktest->test_client_ip_get = false;
02389 socktest->test_client_incoming_port_get = false;
02390 socktest->test_client_req_get = false;
02391 socktest->test_client_resp_get = false;
02392 socktest->test_server_ip_get = false;
02393 socktest->test_server_req_get = false;
02394 socktest->test_server_resp_get = false;
02395 socktest->test_next_hop_ip_get = false;
02396 socktest->magic = MAGIC_ALIVE;
02397 TSContDataSet(cont, socktest);
02398
02399
02400 TSHttpHookAdd(TS_HTTP_TXN_START_HOOK, cont);
02401 TSHttpHookAdd(TS_HTTP_READ_REQUEST_HDR_HOOK, cont);
02402 TSHttpHookAdd(TS_HTTP_OS_DNS_HOOK, cont);
02403 TSHttpHookAdd(TS_HTTP_CACHE_LOOKUP_COMPLETE_HOOK, cont);
02404 TSHttpHookAdd(TS_HTTP_SEND_REQUEST_HDR_HOOK, cont);
02405 TSHttpHookAdd(TS_HTTP_READ_RESPONSE_HDR_HOOK, cont);
02406 TSHttpHookAdd(TS_HTTP_SEND_RESPONSE_HDR_HOOK, cont);
02407 TSHttpHookAdd(TS_HTTP_TXN_CLOSE_HOOK, cont);
02408
02409
02410 socktest->os = synserver_create(SYNSERVER_LISTEN_PORT);
02411 synserver_start(socktest->os);
02412
02413
02414 socktest->browser = synclient_txn_create();
02415 char *request = generate_request(HTTP_HOOK_TEST_REQUEST_ID);
02416 synclient_txn_send_request(socktest->browser, request);
02417 TSfree(request);
02418
02419
02420 if (socktest->browser->status == REQUEST_INPROGRESS) {
02421 TSContSchedule(cont, 25, TS_THREAD_POOL_DEFAULT);
02422 }
02423
02424 return;
02425 }
02426
02427
02428
02429
02430
02431
02432
02433
02434
02435
02436
02437
02438
02439
02440
02441
02442
02443
02444
02445
02446
02447
02448
02449
02450
02451
02452
02453
02454
02455
02456
02457
02458
02459 char *
02460 test_url_print(TSMBuffer bufp, TSMLoc hdr_loc)
02461 {
02462 TSIOBuffer output_buffer;
02463 TSIOBufferReader reader;
02464 int64_t total_avail;
02465
02466 TSIOBufferBlock block;
02467 const char *block_start;
02468 int64_t block_avail;
02469
02470 char *output_string;
02471 int output_len;
02472
02473 output_buffer = TSIOBufferCreate();
02474
02475 if (!output_buffer) {
02476 TSError("couldn't allocate IOBuffer\n");
02477 }
02478
02479 reader = TSIOBufferReaderAlloc(output_buffer);
02480
02481
02482
02483 TSUrlPrint(bufp, hdr_loc, output_buffer);
02484
02485
02486
02487
02488
02489 total_avail = TSIOBufferReaderAvail(reader);
02490
02491
02492
02493 output_string = (char *) TSmalloc(total_avail + 1);
02494 output_len = 0;
02495
02496
02497
02498
02499 block = TSIOBufferReaderStart(reader);
02500 while (block) {
02501
02502 block_start = TSIOBufferBlockReadStart(block, reader, &block_avail);
02503
02504
02505
02506
02507
02508
02509 if (block_avail == 0) {
02510 break;
02511 }
02512
02513 memcpy(output_string + output_len, block_start, block_avail);
02514 output_len += block_avail;
02515
02516
02517 TSIOBufferReaderConsume(reader, block_avail);
02518
02519
02520
02521 block = TSIOBufferReaderStart(reader);
02522 }
02523
02524
02525 output_string[output_len] = '\0';
02526 output_len++;
02527
02528
02529 TSIOBufferReaderFree(reader);
02530 TSIOBufferDestroy(output_buffer);
02531
02532 return output_string;
02533 }
02534
02535 REGRESSION_TEST(SDK_API_TSUrl) (RegressionTest * test, int , int *pstatus)
02536 {
02537 TSMBuffer bufp1 = (TSMBuffer)NULL;
02538 TSMBuffer bufp2 = (TSMBuffer)NULL;
02539 TSMBuffer bufp3 = (TSMBuffer)NULL;
02540 TSMLoc url_loc1;
02541 TSMLoc url_loc2;
02542 TSMLoc url_loc3;
02543 const char *scheme = TS_URL_SCHEME_HTTP;
02544 const char *scheme_get;
02545 const char *user = "yyy";
02546 const char *user_get;
02547 const char *password = "xxx";
02548 const char *password_get;
02549 const char *host = "www.example.com";
02550 const char *host_get;
02551 int port = 2021;
02552 char port_char[10];
02553 int port_get = 80;
02554 const char *path = "about/overview.html";
02555 const char *path_get;
02556 const char *params = "abcdef";
02557 const char *params_get;
02558 const char *query = "name=xxx";
02559 const char *query_get;
02560 const char *fragment = "yyy";
02561 const char *fragment_get;
02562 char *url_expected_string;
02563 char *url_string_from_1 = (char *)NULL;
02564 char *url_string_from_2 = (char *)NULL;
02565 char *url_string_from_3 = (char *)NULL;
02566 char *url_string_from_print = (char *)NULL;
02567 int url_expected_length;
02568 int url_length_from_1;
02569 int url_length_from_2;
02570 int type = 'a';
02571 int type_get;
02572 int tmp_len;
02573
02574 bool test_passed_create = false;
02575 bool test_passed_scheme = false;
02576 bool test_passed_user = false;
02577 bool test_passed_password = false;
02578 bool test_passed_host = false;
02579 bool test_passed_port = false;
02580 bool test_passed_path = false;
02581 bool test_passed_params = false;
02582 bool test_passed_query = false;
02583 bool test_passed_fragment = false;
02584 bool test_passed_copy = false;
02585 bool test_passed_clone = false;
02586 bool test_passed_string1 = false;
02587 bool test_passed_string2 = false;
02588 bool test_passed_print = false;
02589 bool test_passed_length1 = false;
02590 bool test_passed_length2 = false;
02591 bool test_passed_type = false;
02592
02593 int length;
02594
02595 *pstatus = REGRESSION_TEST_INPROGRESS;
02596
02597
02598 memset(port_char, 0, 10);
02599 snprintf(port_char, sizeof(port_char), "%d", port);
02600
02601
02602
02603 url_expected_length = strlen(scheme) + strlen("://") +
02604 ((user == NULL) ? 0 : strlen(user)) +
02605 ((password == NULL) ? ((user == NULL) ? 0 : strlen("@")) : strlen(":") + strlen(password) + strlen("@")) +
02606 strlen(host) +
02607 ((port == 80) ? 0 : strlen(port_char) + strlen(":")) +
02608 strlen("/") + strlen(path) +
02609 ((params == NULL) ? 0 : strlen(";") + strlen(params)) +
02610 ((query == NULL) ? 0 : strlen("?") + strlen(query)) + ((fragment == NULL) ? 0 : strlen("#") + strlen(fragment));
02611
02612 size_t len = url_expected_length + 1;
02613 url_expected_string = (char *) TSmalloc(len * sizeof(char));
02614 memset(url_expected_string, 0, url_expected_length + 1);
02615 snprintf(url_expected_string, len, "%s://%s%s%s%s%s%s%s/%s%s%s%s%s%s%s",
02616 scheme,
02617 ((user == NULL) ? "" : user),
02618 ((password == NULL) ? "" : ":"),
02619 ((password == NULL) ? "" : password),
02620 (((user == NULL) && (password == NULL)) ? "" : "@"),
02621 host,
02622 ((port == 80) ? "" : ":"),
02623 ((port == 80) ? "" : port_char),
02624 ((path == NULL) ? "" : path),
02625 ((params == NULL) ? "" : ";"),
02626 ((params == NULL) ? "" : params),
02627 ((query == NULL) ? "" : "?"),
02628 ((query == NULL) ? "" : query), ((fragment == NULL) ? "" : "#"), ((fragment == NULL) ? "" : fragment)
02629 );
02630
02631
02632
02633
02634 bufp1 = TSMBufferCreate();
02635 if (TSUrlCreate(bufp1, &url_loc1) != TS_SUCCESS) {
02636
02637 SDK_RPRINT(test, "TSUrlCreate", "TestCase1", TC_FAIL, "unable to create URL within buffer.");
02638 goto print_results;
02639 }
02640
02641 if (TSUrlSchemeSet(bufp1, url_loc1, scheme, -1) != TS_SUCCESS) {
02642 SDK_RPRINT(test, "TSUrlSchemeSet", "TestCase1", TC_FAIL, "TSUrlSchemeSet Returned TS_ERROR");
02643 } else {
02644 scheme_get = TSUrlSchemeGet(bufp1, url_loc1, &length);
02645 if (strncmp(scheme_get, scheme, length) == 0) {
02646 SDK_RPRINT(test, "TSUrlSchemeSet&Get", "TestCase1", TC_PASS, "ok");
02647 test_passed_scheme = true;
02648 } else {
02649 SDK_RPRINT(test, "TSUrlSchemeSet&Get", "TestCase1", TC_FAIL, "Values don't match");
02650 }
02651 }
02652
02653
02654 if (TSUrlUserSet(bufp1, url_loc1, user, -1) != TS_SUCCESS) {
02655 SDK_RPRINT(test, "TSUrlUserSet", "TestCase1", TC_FAIL, "Returned TS_ERROR");
02656 } else {
02657 user_get = TSUrlUserGet(bufp1, url_loc1, &length);
02658 if (((user_get == NULL) && (user == NULL)) || (strncmp(user_get, user, length) == 0)) {
02659 SDK_RPRINT(test, "TSUrlUserSet&Get", "TestCase1", TC_PASS, "ok");
02660 test_passed_user = true;
02661 } else {
02662 SDK_RPRINT(test, "TSUrlUserSet&Get", "TestCase1", TC_FAIL, "Values don't match");
02663 }
02664 }
02665
02666
02667 if (TSUrlPasswordSet(bufp1, url_loc1, password, -1) != TS_SUCCESS) {
02668 SDK_RPRINT(test, "TSUrlPasswordSet", "TestCase1", TC_FAIL, "Returned TS_ERROR");
02669 } else {
02670 password_get = TSUrlPasswordGet(bufp1, url_loc1, &length);
02671 if (((password_get == NULL) && (password == NULL)) || (strncmp(password_get, password, length) == 0)) {
02672 SDK_RPRINT(test, "TSUrlPasswordSet&Get", "TestCase1", TC_PASS, "ok");
02673 test_passed_password = true;
02674 } else {
02675 SDK_RPRINT(test, "TSUrlPasswordSet&Get", "TestCase1", TC_FAIL, "Values don't match");
02676 }
02677 }
02678
02679
02680 if (TSUrlHostSet(bufp1, url_loc1, host, -1) != TS_SUCCESS) {
02681 SDK_RPRINT(test, "TSUrlHostSet", "TestCase1", TC_FAIL, "Returned TS_ERROR");
02682 } else {
02683 host_get = TSUrlHostGet(bufp1, url_loc1, &length);
02684 if (strncmp(host_get, host, length) == 0) {
02685 SDK_RPRINT(test, "TSUrlHostSet&Get", "TestCase1", TC_PASS, "ok");
02686 test_passed_host = true;
02687 } else {
02688 SDK_RPRINT(test, "TSUrlHostSet&Get", "TestCase1", TC_FAIL, "Values don't match");
02689 }
02690 }
02691
02692
02693 if (TSUrlPortSet(bufp1, url_loc1, port) != TS_SUCCESS) {
02694 SDK_RPRINT(test, "TSUrlPortSet", "TestCase1", TC_FAIL, "Returned TS_ERROR");
02695 } else {
02696 port_get = TSUrlPortGet(bufp1, url_loc1);
02697 if (port_get == port) {
02698 SDK_RPRINT(test, "TSUrlPortSet&Get", "TestCase1", TC_PASS, "ok");
02699 test_passed_port = true;
02700 } else {
02701 SDK_RPRINT(test, "TSUrlPortSet&Get", "TestCase1", TC_FAIL, "Values don't match");
02702 }
02703 }
02704
02705
02706 if (TSUrlPathSet(bufp1, url_loc1, path, -1) != TS_SUCCESS) {
02707 SDK_RPRINT(test, "TSUrlPathSet", "TestCase1", TC_FAIL, "Returned TS_ERROR");
02708 } else {
02709 path_get = TSUrlPathGet(bufp1, url_loc1, &length);
02710 if (((path == NULL) && (path_get == NULL)) || (strncmp(path, path_get, length) == 0)) {
02711 SDK_RPRINT(test, "TSUrlPathSet&Get", "TestCase1", TC_PASS, "ok");
02712 test_passed_path = true;
02713 } else {
02714 SDK_RPRINT(test, "TSUrlPathSet&Get", "TestCase1", TC_FAIL, "Values don't match");
02715 }
02716 }
02717
02718
02719 if (TSUrlHttpParamsSet(bufp1, url_loc1, params, -1) != TS_SUCCESS) {
02720 SDK_RPRINT(test, "TSUrlHttpParamsSet", "TestCase1", TC_FAIL, "Returned TS_ERROR");
02721 } else {
02722 params_get = TSUrlHttpParamsGet(bufp1, url_loc1, &length);
02723 if (((params == NULL) && (params_get == NULL)) || (strncmp(params, params_get, length) == 0)) {
02724 SDK_RPRINT(test, "TSUrlHttpParamsSet&Get", "TestCase1", TC_PASS, "ok");
02725 test_passed_params = true;
02726 } else {
02727 SDK_RPRINT(test, "TSUrlHttpParamsSet&Get", "TestCase1", TC_FAIL, "Values don't match");
02728 }
02729 }
02730
02731
02732 if (TSUrlHttpQuerySet(bufp1, url_loc1, query, -1) != TS_SUCCESS) {
02733 SDK_RPRINT(test, "TSUrlHttpQuerySet", "TestCase1", TC_FAIL, "Returned TS_ERROR");
02734 } else {
02735 query_get = TSUrlHttpQueryGet(bufp1, url_loc1, &length);
02736 if (((query == NULL) && (query_get == NULL)) || (strncmp(query, query_get, length) == 0)) {
02737 SDK_RPRINT(test, "TSUrlHttpQuerySet&Get", "TestCase1", TC_PASS, "ok");
02738 test_passed_query = true;
02739 } else {
02740 SDK_RPRINT(test, "TSUrlHttpQuerySet&Get", "TestCase1", TC_FAIL, "Values don't match");
02741 }
02742 }
02743
02744
02745 if (TSUrlHttpFragmentSet(bufp1, url_loc1, fragment, -1) != TS_SUCCESS) {
02746 SDK_RPRINT(test, "TSUrlHttpFragmentSet", "TestCase1", TC_FAIL, "Returned TS_ERROR");
02747 } else {
02748 fragment_get = TSUrlHttpFragmentGet(bufp1, url_loc1, &length);
02749 if (((fragment == NULL) && (fragment_get == NULL)) || (strncmp(fragment, fragment_get, length) == 0)) {
02750 SDK_RPRINT(test, "TSUrlHttpFragmentSet&Get", "TestCase1", TC_PASS, "ok");
02751 test_passed_fragment = true;
02752 } else {
02753 SDK_RPRINT(test, "TSUrlHttpFragmentSet&Get", "TestCase1", TC_FAIL, "Values don't match");
02754 }
02755 }
02756
02757
02758 url_length_from_1 = TSUrlLengthGet(bufp1, url_loc1);
02759 if (url_length_from_1 == url_expected_length) {
02760 SDK_RPRINT(test, "TSUrlLengthGet", "TestCase1", TC_PASS, "ok");
02761 test_passed_length1 = true;
02762 } else {
02763 SDK_RPRINT(test, "TSUrlLengthGet", "TestCase1", TC_FAIL, "Values don't match");
02764 }
02765
02766
02767 url_string_from_1 = TSUrlStringGet(bufp1, url_loc1, &tmp_len);
02768 if (strcmp(url_string_from_1, url_expected_string) == 0) {
02769 SDK_RPRINT(test, "TSUrlStringGet", "TestCase1", TC_PASS, "ok");
02770 test_passed_string1 = true;
02771 } else {
02772 SDK_RPRINT(test, "TSUrlStringGet", "TestCase1", TC_FAIL, "Values don't match");
02773 }
02774
02775
02776 bufp2 = TSMBufferCreate();
02777 if (TSUrlCreate(bufp2, &url_loc2) != TS_SUCCESS) {
02778
02779 SDK_RPRINT(test, "TSUrlCreate", "TestCase2", TC_FAIL, "unable to create URL within buffer for TSUrlCopy.");
02780 goto print_results;
02781 }
02782 if (TSUrlCopy(bufp2, url_loc2, bufp1, url_loc1) == TS_ERROR) {
02783 SDK_RPRINT(test, "TSUrlCopy", "TestCase1", TC_FAIL, "Returned TS_ERROR");
02784 } else {
02785
02786 url_length_from_2 = TSUrlLengthGet(bufp2, url_loc2);
02787 if (url_length_from_2 == url_expected_length) {
02788 SDK_RPRINT(test, "TSUrlLengthGet", "TestCase2", TC_PASS, "ok");
02789 test_passed_length2 = true;
02790 } else {
02791 SDK_RPRINT(test, "TSUrlCopy", "TestCase1", TC_FAIL, "Values don't match");
02792 }
02793
02794
02795
02796 url_string_from_2 = TSUrlStringGet(bufp2, url_loc2, &tmp_len);
02797 if (strcmp(url_string_from_2, url_expected_string) == 0) {
02798 SDK_RPRINT(test, "TSUrlStringGet", "TestCase2", TC_PASS, "ok");
02799 test_passed_string2 = true;
02800 } else {
02801 SDK_RPRINT(test, "TSUrlStringGet", "TestCase2", TC_FAIL, "Values don't match");
02802 }
02803
02804
02805 if (strcmp(url_string_from_1, url_string_from_2) == 0) {
02806 SDK_RPRINT(test, "TSUrlCopy", "TestCase1", TC_PASS, "ok");
02807 test_passed_copy = true;
02808 } else {
02809 SDK_RPRINT(test, "TSUrlCopy", "TestCase1", TC_FAIL, "Values Don't Match");
02810 }
02811 }
02812
02813
02814 bufp3 = TSMBufferCreate();
02815 if (TSUrlClone(bufp3, bufp1, url_loc1, &url_loc3) != TS_SUCCESS) {
02816 SDK_RPRINT(test, "TSUrlClone", "TestCase1", TC_FAIL, "Returned TS_ERROR");
02817 } else {
02818
02819 url_string_from_3 = TSUrlStringGet(bufp3, url_loc3, &tmp_len);
02820
02821 if (strcmp(url_string_from_1, url_string_from_3) == 0) {
02822 SDK_RPRINT(test, "TSUrlClone", "TestCase1", TC_PASS, "ok");
02823 test_passed_clone = true;
02824 } else {
02825 SDK_RPRINT(test, "TSUrlClone", "TestCase1", TC_FAIL, "Values Don't Match");
02826 }
02827 }
02828
02829
02830 url_string_from_print = test_url_print(bufp1, url_loc1);
02831 if (url_string_from_print == NULL) {
02832 SDK_RPRINT(test, "TSUrlPrint", "TestCase1", TC_FAIL, "TSUrlPrint doesn't return TS_SUCCESS");
02833 } else {
02834 if (strcmp(url_string_from_print, url_expected_string) == 0) {
02835 SDK_RPRINT(test, "TSUrlPrint", "TestCase1", TC_PASS, "ok");
02836 test_passed_print = true;
02837 } else {
02838 SDK_RPRINT(test, "TSUrlPrint", "TestCase1", TC_FAIL, "TSUrlPrint doesn't return TS_SUCCESS");
02839 }
02840 TSfree(url_string_from_print);
02841 }
02842
02843 if (TSUrlFtpTypeSet(bufp1, url_loc1, type) != TS_SUCCESS) {
02844 SDK_RPRINT(test, "TSUrlFtpTypeSet", "TestCase1", TC_FAIL, "TSUrlFtpTypeSet Returned TS_ERROR");
02845 } else {
02846 type_get = TSUrlFtpTypeGet(bufp1, url_loc1);
02847 if (type_get == type) {
02848 SDK_RPRINT(test, "TSUrlFtpTypeSet&Get", "TestCase1", TC_PASS, "ok");
02849 test_passed_type = true;
02850 } else {
02851 SDK_RPRINT(test, "TSUrlFtpTypeSet&Get", "TestCase1", TC_FAIL, "Values don't match");
02852 }
02853 }
02854
02855 SDK_RPRINT(test, "TSUrlCreate", "TestCase1&2", TC_PASS, "ok");
02856 TSHandleMLocRelease(bufp1, TS_NULL_MLOC, url_loc1);
02857 TSHandleMLocRelease(bufp2, TS_NULL_MLOC, url_loc2);
02858 TSHandleMLocRelease(bufp3, TS_NULL_MLOC, url_loc3);
02859 test_passed_create = true;
02860
02861 print_results:
02862 TSfree(url_expected_string);
02863 if (url_string_from_1 != NULL) {
02864 TSfree(url_string_from_1);
02865 }
02866 if (url_string_from_2 != NULL) {
02867 TSfree(url_string_from_2);
02868 }
02869 if (url_string_from_3 != NULL) {
02870 TSfree(url_string_from_3);
02871 }
02872 if (bufp1 != NULL) {
02873 TSMBufferDestroy(bufp1);
02874 }
02875 if (bufp2 != NULL) {
02876 TSMBufferDestroy(bufp2);
02877 }
02878 if (bufp3 != NULL) {
02879 TSMBufferDestroy(bufp3);
02880 }
02881 if ((test_passed_create == false) ||
02882 (test_passed_scheme == false) ||
02883 (test_passed_user == false) ||
02884 (test_passed_password == false) ||
02885 (test_passed_host == false) ||
02886 (test_passed_port == false) ||
02887 (test_passed_path == false) ||
02888 (test_passed_params == false) ||
02889 (test_passed_query == false) ||
02890 (test_passed_fragment == false) ||
02891 (test_passed_copy == false) ||
02892 (test_passed_clone == false) ||
02893 (test_passed_string1 == false) ||
02894 (test_passed_string2 == false) ||
02895 (test_passed_print == false) ||
02896 (test_passed_length1 == false) || (test_passed_length2 == false) || (test_passed_type == false)) {
02897
02898
02899
02900
02901
02902
02903
02904
02905
02906
02907
02908
02909
02910
02911
02912
02913
02914
02915 *pstatus = REGRESSION_TEST_FAILED;
02916 } else {
02917 *pstatus = REGRESSION_TEST_PASSED;
02918 }
02919 }
02920
02921
02922
02923
02924
02925
02926
02927
02928
02929
02930
02931
02932
02933
02934
02935
02936
02937
02938
02939
02940
02941
02942
02943
02944
02945 REGRESSION_TEST(SDK_API_TSHttpHdr) (RegressionTest * test, int , int *pstatus)
02946 {
02947 TSMBuffer bufp1 = (TSMBuffer)NULL;
02948 TSMBuffer bufp2 = (TSMBuffer)NULL;
02949 TSMBuffer bufp3 = (TSMBuffer)NULL;
02950 TSMBuffer bufp4 = (TSMBuffer)NULL;
02951
02952 TSMLoc hdr_loc1 = (TSMLoc)NULL;
02953 TSMLoc hdr_loc2 = (TSMLoc)NULL;
02954 TSMLoc hdr_loc3 = (TSMLoc)NULL;
02955 TSMLoc hdr_loc4 = (TSMLoc)NULL;
02956
02957 TSHttpType hdr1type;
02958 TSHttpType hdr2type;
02959
02960 const char *methodGet;
02961
02962 TSMLoc url_loc;
02963 TSMLoc url_loc_Get;
02964 const char *url_host = "www.example.com";
02965 int url_port = 2345;
02966 const char *url_path = "abcd/efg/hij.htm";
02967
02968 const char *response_reason = "aefa";
02969 const char *response_reason_get;
02970
02971 TSHttpStatus status_get;
02972
02973 int version_major = 2;
02974 int version_minor = 1;
02975 int version_get;
02976
02977
02978
02979 const char *method1;
02980 const char *method2;
02981 int length1;
02982 int length2;
02983 TSMLoc url_loc1;
02984 TSMLoc url_loc2;
02985
02986
02987
02988 int length;
02989 const char *expected_iobuf = "GET http://www.example.com:2345/abcd/efg/hij.htm HTTP/2.1\r\n\r\n";
02990 int actual_length;
02991 int expected_length;
02992 bool test_passed_Http_Hdr_Create = false;
02993 bool test_passed_Http_Hdr_Type = false;
02994 bool test_passed_Http_Hdr_Method = false;
02995 bool test_passed_Http_Hdr_Url = false;
02996 bool test_passed_Http_Hdr_Status = false;
02997 bool test_passed_Http_Hdr_Reason = false;
02998 bool test_passed_Http_Hdr_Reason_Lookup = false;
02999 bool test_passed_Http_Hdr_Version = false;
03000 bool test_passed_Http_Hdr_Copy = false;
03001 bool test_passed_Http_Hdr_Clone = false;
03002 bool test_passed_Http_Hdr_Length = false;
03003 bool test_passed_Http_Hdr_Print = false;
03004 bool test_passed_Http_Hdr_Destroy = false;
03005 bool try_print_function = true;
03006 bool test_buffer_created = true;
03007
03008
03009 *pstatus = REGRESSION_TEST_INPROGRESS;
03010
03011 bufp1 = TSMBufferCreate();
03012 bufp2 = TSMBufferCreate();
03013 bufp3 = TSMBufferCreate();
03014 bufp4 = TSMBufferCreate();
03015
03016
03017 if (test_buffer_created == true) {
03018 hdr_loc1 = TSHttpHdrCreate(bufp1);
03019 hdr_loc2 = TSHttpHdrCreate(bufp2);
03020 hdr_loc3 = TSHttpHdrCreate(bufp3);
03021 SDK_RPRINT(test, "TSHttpHdrCreate", "TestCase1&2&3", TC_PASS, "ok");
03022 test_passed_Http_Hdr_Create = true;
03023 } else {
03024 SDK_RPRINT(test, "TSHttpHdrCreate", "All Test Cases", TC_FAIL, "Cannot run test as unable to allocate MBuffers");
03025 }
03026
03027
03028
03029 if (test_passed_Http_Hdr_Create == true) {
03030 if ((TSHttpHdrTypeSet(bufp1, hdr_loc1, TS_HTTP_TYPE_REQUEST) == TS_ERROR) ||
03031 (TSHttpHdrTypeSet(bufp2, hdr_loc2, TS_HTTP_TYPE_RESPONSE) == TS_ERROR)) {
03032 SDK_RPRINT(test, "TSHttpHdrTypeSet", "TestCase1|2", TC_FAIL, "TSHttpHdrTypeSet returns TS_ERROR");
03033 } else {
03034 hdr1type = TSHttpHdrTypeGet(bufp1, hdr_loc1);
03035 hdr2type = TSHttpHdrTypeGet(bufp2, hdr_loc2);
03036 if ((hdr1type == TS_HTTP_TYPE_REQUEST) && (hdr2type == TS_HTTP_TYPE_RESPONSE)) {
03037 SDK_RPRINT(test, "TSHttpHdrTypeSet&Get", "TestCase1&2", TC_PASS, "ok");
03038 test_passed_Http_Hdr_Type = true;
03039 } else {
03040 SDK_RPRINT(test, "TSHttpHdrTypeSet&Get", "TestCase1&2", TC_FAIL, "Values mismatch");
03041 }
03042 }
03043 } else {
03044 SDK_RPRINT(test, "TSHttpHdrTypeSet&Get", "All Test Case", TC_FAIL, "Cannot run test as Header Creation Test failed");
03045 }
03046
03047
03048 if (test_passed_Http_Hdr_Type == true) {
03049 if (TSHttpHdrMethodSet(bufp1, hdr_loc1, TS_HTTP_METHOD_GET, -1) == TS_ERROR) {
03050 SDK_RPRINT(test, "TSHttpHdrMethodSet&Get", "TestCase1", TC_FAIL, "TSHttpHdrMethodSet returns TS_ERROR");
03051 } else {
03052 methodGet = TSHttpHdrMethodGet(bufp1, hdr_loc1, &length);
03053 if ((strncmp(methodGet, TS_HTTP_METHOD_GET, length) == 0) && (length == (int) strlen(TS_HTTP_METHOD_GET))) {
03054 SDK_RPRINT(test, "TSHttpHdrMethodSet&Get", "TestCase1", TC_PASS, "ok");
03055 test_passed_Http_Hdr_Method = true;
03056 } else {
03057 SDK_RPRINT(test, "TSHttpHdrMethodSet&Get", "TestCase1", TC_FAIL, "Value's mismatch");
03058 }
03059 }
03060 } else {
03061 SDK_RPRINT(test, "TSHttpHdrMethodSet&Get", "All Test Case", TC_FAIL, "Cannot run test as Header's Type cannot be set");
03062 }
03063
03064
03065 if (test_passed_Http_Hdr_Type == true) {
03066 if (TSUrlCreate(bufp1, &url_loc) != TS_SUCCESS) {
03067 SDK_RPRINT(test, "TSHttpHdrUrlSet&Get", "TestCase1", TC_FAIL, "Cannot run test as TSUrlCreate returns TS_ERROR");
03068 } else {
03069 if (TSHttpHdrUrlSet(bufp1, hdr_loc1, url_loc) == TS_ERROR) {
03070 SDK_RPRINT(test, "TSHttpHdrUrlSet&Get", "TestCase1", TC_FAIL, "TSHttpHdrUrlSet returns TS_ERROR");
03071 } else {
03072 if (TSHttpHdrUrlGet(bufp1, hdr_loc1, &url_loc_Get) != TS_SUCCESS) {
03073 SDK_RPRINT(test, "TSHttpHdrUrlSet&Get", "TestCase1", TC_FAIL, "TSHttpHdrUrlGet retuns TS_ERROR");
03074 } else {
03075 if (url_loc == url_loc_Get) {
03076 SDK_RPRINT(test, "TSHttpHdrUrlSet&Get", "TestCase1", TC_PASS, "ok");
03077 test_passed_Http_Hdr_Url = true;
03078 } else {
03079 SDK_RPRINT(test, "TSHttpHdrUrlSet&Get", "TestCase1", TC_FAIL, "Value's mismatch");
03080 }
03081 if (TSHandleMLocRelease(bufp1, hdr_loc1, url_loc_Get) == TS_ERROR) {
03082 SDK_RPRINT(test, "TSHandleMLocRelease", "", TC_FAIL, "Unable to release handle to URL");
03083 }
03084 }
03085 }
03086
03087
03088 if (TSUrlSchemeSet(bufp1, url_loc, TS_URL_SCHEME_HTTP, -1) == TS_ERROR) {
03089 SDK_RPRINT(test, "TSUrlSchemeSet", "", TC_FAIL, "Unable to set scheme in URL in the HTTP Header");
03090 try_print_function = false;
03091 }
03092 if (TSUrlHostSet(bufp1, url_loc, url_host, -1) == TS_ERROR) {
03093 SDK_RPRINT(test, "TSUrlHostSet", "", TC_FAIL, "Unable to set host in URL in the HTTP Header");
03094 try_print_function = false;
03095 }
03096 if (TSUrlPortSet(bufp1, url_loc, url_port) == TS_ERROR) {
03097 SDK_RPRINT(test, "TSUrlPortSet", "", TC_FAIL, "Unable to set port in URL in the HTTP Header");
03098 try_print_function = false;
03099 }
03100 if (TSUrlPathSet(bufp1, url_loc, url_path, -1) == TS_ERROR) {
03101 SDK_RPRINT(test, "TSUrlPathSet", "", TC_FAIL, "Unable to set path in URL in the HTTP Header");
03102 try_print_function = false;
03103 }
03104 if (TSHandleMLocRelease(bufp1, hdr_loc1, url_loc) == TS_ERROR) {
03105 SDK_RPRINT(test, "TSHandleMLocRelease", "", TC_FAIL, "Unable to release handle to URL");
03106 }
03107 }
03108 } else {
03109 SDK_RPRINT(test, "TSHttpHdrUrlSet&Get", "All Test Case", TC_FAIL, "Cannot run test as Header's Type cannot be set");
03110 }
03111
03112
03113 if (test_passed_Http_Hdr_Type == true) {
03114 if (TSHttpHdrReasonSet(bufp2, hdr_loc2, response_reason, -1) == TS_ERROR) {
03115 SDK_RPRINT(test, "TSHttpHdrReasonSet&Get", "TestCase1", TC_FAIL, "TSHttpHdrReasonSet returns TS_ERROR");
03116 } else {
03117 response_reason_get = TSHttpHdrReasonGet(bufp2, hdr_loc2, &length);
03118 if ((strncmp(response_reason_get, response_reason, length) == 0) && (length == (int) strlen(response_reason))) {
03119 SDK_RPRINT(test, "TSHttpHdrReasonSet&Get", "TestCase1", TC_PASS, "ok");
03120 test_passed_Http_Hdr_Reason = true;
03121 } else {
03122 SDK_RPRINT(test, "TSHttpHdrReasonSet&Get", "TestCase1", TC_FAIL, "Value's mismatch");
03123 }
03124 }
03125 } else {
03126 SDK_RPRINT(test, "TSHttpHdrReasonSet&Get", "All Test Case", TC_FAIL, "Cannot run test as Header's Type cannot be set");
03127 }
03128
03129
03130 if (test_passed_Http_Hdr_Type == true) {
03131 if (TSHttpHdrStatusSet(bufp2, hdr_loc2, TS_HTTP_STATUS_OK) == TS_ERROR) {
03132 SDK_RPRINT(test, "TSHttpHdrStatusSet&Get", "TestCase1", TC_FAIL, "TSHttpHdrStatusSet returns TS_ERROR");
03133 } else {
03134 status_get = TSHttpHdrStatusGet(bufp2, hdr_loc2);
03135 if (status_get == TS_HTTP_STATUS_OK) {
03136 SDK_RPRINT(test, "TSHttpHdrStatusSet&Get", "TestCase1", TC_PASS, "ok");
03137 test_passed_Http_Hdr_Status = true;
03138 } else {
03139 SDK_RPRINT(test, "TSHttpHdrStatusSet&Get", "TestCase1", TC_FAIL, "Value's mismatch");
03140 }
03141 }
03142 } else {
03143 SDK_RPRINT(test, "TSHttpHdrStatusSet&Get", "All Test Case", TC_FAIL, "Cannot run test as Header's Type cannot be set");
03144 }
03145
03146
03147 if (test_passed_Http_Hdr_Type == true) {
03148 if (TSHttpHdrVersionSet(bufp1, hdr_loc1, TS_HTTP_VERSION(version_major, version_minor)) == TS_ERROR) {
03149 SDK_RPRINT(test, "TSHttpHdrVersionSet&Get", "TestCase1", TC_FAIL, "TSHttpHdrVersionSet returns TS_ERROR");
03150 } else {
03151 version_get = TSHttpHdrVersionGet(bufp1, hdr_loc1);
03152 if ((version_major == TS_HTTP_MAJOR(version_get)) && (version_minor == TS_HTTP_MINOR(version_get))) {
03153 SDK_RPRINT(test, "TSHttpHdrVersionSet&Get", "TestCase1", TC_PASS, "ok");
03154 test_passed_Http_Hdr_Version = true;
03155 } else {
03156 SDK_RPRINT(test, "TSHttpHdrVersionSet&Get", "TestCase1", TC_FAIL, "Value's mismatch");
03157 }
03158 }
03159 } else {
03160 SDK_RPRINT(test, "TSHttpHdrVersionSet&Get", "All Test Case", TC_FAIL, "Cannot run test as Header's Type cannot be set");
03161 }
03162
03163 if (test_passed_Http_Hdr_Version == true) {
03164 if (TSHttpHdrVersionSet(bufp2, hdr_loc2, TS_HTTP_VERSION(version_major, version_minor)) == TS_ERROR) {
03165 SDK_RPRINT(test, "TSHttpHdrVersionSet&Get", "TestCase2", TC_FAIL, "TSHttpHdrVersionSet returns TS_ERROR");
03166 test_passed_Http_Hdr_Version = false;
03167 } else {
03168 version_get = TSHttpHdrVersionGet(bufp2, hdr_loc2);
03169 if ((version_major == TS_HTTP_MAJOR(version_get)) && (version_minor == TS_HTTP_MINOR(version_get))) {
03170 SDK_RPRINT(test, "TSHttpHdrVersionSet&Get", "TestCase2", TC_PASS, "ok");
03171 } else {
03172 SDK_RPRINT(test, "TSHttpHdrVersionSet&Get", "TestCase2", TC_FAIL, "Value's mismatch");
03173 test_passed_Http_Hdr_Version = false;
03174 }
03175 }
03176 }
03177
03178 if (strcmp("None", TSHttpHdrReasonLookup(TS_HTTP_STATUS_NONE)) != 0) {
03179 SDK_RPRINT(test, "TSHttpHdrReasonLookup", "TestCase1", TC_FAIL,
03180 "TSHttpHdrReasonLookup returns Value's mismatch");
03181 } else {
03182 SDK_RPRINT(test, "TSHttpHdrReasonLookup", "TestCase1", TC_PASS, "ok");
03183 test_passed_Http_Hdr_Reason_Lookup = true;
03184 }
03185
03186 if (strcmp("OK", TSHttpHdrReasonLookup(TS_HTTP_STATUS_OK)) != 0) {
03187 SDK_RPRINT(test, "TSHttpHdrReasonLookup", "TestCase2", TC_FAIL,
03188 "TSHttpHdrReasonLookup returns Value's mismatch");
03189 if (test_passed_Http_Hdr_Reason_Lookup == true) {
03190 test_passed_Http_Hdr_Reason_Lookup = false;
03191 }
03192 } else {
03193 SDK_RPRINT(test, "TSHttpHdrReasonLookup", "TestCase2", TC_PASS, "ok");
03194 }
03195
03196 if (strcmp("Continue", TSHttpHdrReasonLookup(TS_HTTP_STATUS_CONTINUE)) != 0) {
03197 SDK_RPRINT(test, "TSHttpHdrReasonLookup", "TestCase3", TC_FAIL,
03198 "TSHttpHdrReasonLookup returns Value's mismatch");
03199 if (test_passed_Http_Hdr_Reason_Lookup == true) {
03200 test_passed_Http_Hdr_Reason_Lookup = false;
03201 }
03202 } else {
03203 SDK_RPRINT(test, "TSHttpHdrReasonLookup", "TestCase3", TC_PASS, "ok");
03204 }
03205
03206 if (strcmp("Not Modified", TSHttpHdrReasonLookup(TS_HTTP_STATUS_NOT_MODIFIED)) != 0) {
03207 SDK_RPRINT(test, "TSHttpHdrReasonLookup", "TestCase2", TC_FAIL,
03208 "TSHttpHdrReasonLookup returns Value's mismatch");
03209 if (test_passed_Http_Hdr_Reason_Lookup == true) {
03210 test_passed_Http_Hdr_Reason_Lookup = false;
03211 }
03212 } else {
03213 SDK_RPRINT(test, "TSHttpHdrReasonLookup", "TestCase4", TC_PASS, "ok");
03214 }
03215
03216
03217 if (test_passed_Http_Hdr_Create == true) {
03218 if (TSHttpHdrCopy(bufp3, hdr_loc3, bufp1, hdr_loc1) == TS_ERROR) {
03219 SDK_RPRINT(test, "TSHttpHdrCopy", "TestCase1", TC_FAIL, "TSHttpHdrCopy returns TS_ERROR");
03220 } else {
03221
03222 bool flag = true;
03223
03224 if (flag == true) {
03225 TSHttpType type1 = TSHttpHdrTypeGet(bufp1, hdr_loc1);
03226 TSHttpType type2 = TSHttpHdrTypeGet(bufp3, hdr_loc3);
03227
03228 if (type1 != type2) {
03229 SDK_RPRINT(test, "TSHttpHdrCopy", "TestCase1", TC_FAIL, "Type mismatch in both headers");
03230 flag = false;
03231 }
03232 }
03233
03234 if (flag == true) {
03235 int version1 = TSHttpHdrVersionGet(bufp1, hdr_loc1);
03236 int version2 = TSHttpHdrVersionGet(bufp3, hdr_loc3);
03237
03238 if (version1 != version2) {
03239 SDK_RPRINT(test, "TSHttpHdrCopy", "TestCase1", TC_FAIL, "Version mismatch in both headers");
03240 flag = false;
03241 }
03242 }
03243
03244 if (flag == true) {
03245 method1 = TSHttpHdrMethodGet(bufp1, hdr_loc1, &length1);
03246 method2 = TSHttpHdrMethodGet(bufp3, hdr_loc3, &length2);
03247 if ((length1 != length2) || (strncmp(method1, method2, length1) != 0)) {
03248 SDK_RPRINT(test, "TSHttpHdrCopy", "TestCase1", TC_FAIL, "Method mismatch in both headers");
03249 flag = false;
03250 }
03251 }
03252
03253 if (flag == true) {
03254
03255 if ((TSHttpHdrUrlGet(bufp1, hdr_loc1, &url_loc1) != TS_SUCCESS) ||
03256 (TSHttpHdrUrlGet(bufp3, hdr_loc3, &url_loc2) != TS_SUCCESS)) {
03257 SDK_RPRINT(test, "TSHttpHdrCopy", "TestCase1", TC_FAIL, "TSHttpVersionGet returns TS_ERROR");
03258 } else {
03259 const char *scheme1;
03260 const char *scheme2;
03261
03262 const char *host1;
03263 const char *host2;
03264
03265 int port1;
03266 int port2;
03267
03268 const char *path1;
03269 const char *path2;
03270
03271
03272 scheme1 = TSUrlSchemeGet(bufp1, url_loc1, &length1);
03273 scheme2 = TSUrlSchemeGet(bufp3, url_loc2, &length2);
03274 if ((length1 != length2) || (strncmp(scheme1, scheme2, length1) != 0)) {
03275 SDK_RPRINT(test, "TSHttpHdrCopy", "TestCase1", TC_FAIL, "Url Scheme has different values in both headers");
03276 flag = false;
03277 }
03278
03279
03280 if (flag == true) {
03281 host1 = TSUrlHostGet(bufp1, url_loc1, &length1);
03282 host2 = TSUrlHostGet(bufp3, url_loc2, &length2);
03283 if ((length1 != length2) || (strncmp(host1, host2, length1) != 0)) {
03284 SDK_RPRINT(test, "TSHttpHdrCopy", "TestCase1", TC_FAIL, "Url Host has different values in both headers");
03285 flag = false;
03286 }
03287 }
03288
03289 if (flag == true) {
03290 port1 = TSUrlPortGet(bufp1, url_loc1);
03291 port2 = TSUrlPortGet(bufp3, url_loc2);
03292 if (port1 != port2) {
03293 SDK_RPRINT(test, "TSHttpHdrCopy", "TestCase1", TC_FAIL, "Url Port has different values in both headers");
03294 flag = false;
03295 }
03296 }
03297
03298 if (flag == true) {
03299 path1 = TSUrlPathGet(bufp1, url_loc1, &length1);
03300 path2 = TSUrlPathGet(bufp3, url_loc2, &length2);
03301 if ((path1 != NULL) && (path2 != NULL)) {
03302 if ((length1 != length2) || (strncmp(path1, path2, length1) != 0)) {
03303 SDK_RPRINT(test, "TSHttpHdrCopy", "TestCase1", TC_FAIL, "Url Path has different values in both headers");
03304 flag = false;
03305 }
03306 } else {
03307 if (path1 != path2) {
03308 SDK_RPRINT(test, "TSHttpHdrCopy", "TestCase1", TC_FAIL, "Url Host has different values in both headers");
03309 flag = false;
03310 }
03311 }
03312 if ((TSHandleMLocRelease(bufp1, hdr_loc1, url_loc1) == TS_ERROR) ||
03313 (TSHandleMLocRelease(bufp3, hdr_loc3, url_loc2) == TS_ERROR)) {
03314 SDK_RPRINT(test, "TSHandleMLocRelease", "", TC_FAIL, "Unable to release Handle acquired by TSHttpHdrUrlGet");
03315 }
03316 }
03317
03318 if (flag == true) {
03319 SDK_RPRINT(test, "TSHttpHdrCopy", "TestCase1", TC_PASS, "ok");
03320 test_passed_Http_Hdr_Copy = true;
03321 }
03322 }
03323 }
03324 }
03325 } else {
03326 SDK_RPRINT(test, "TSHttpHdrCopy", "All Test Cases", TC_PASS, "Cannot run test as TSHttpHdrCreate has failed");
03327 }
03328
03329
03330 if (test_passed_Http_Hdr_Create == true) {
03331 if (TSHttpHdrClone(bufp4, bufp1, hdr_loc1, &hdr_loc4) != TS_SUCCESS) {
03332 SDK_RPRINT(test, "TSHttpHdrClone", "TestCase1", TC_FAIL, "TSHttpHdrClone returns TS_ERROR");
03333 } else {
03334
03335 bool flag = true;
03336
03337 if (flag == true) {
03338 TSHttpType type1 = TSHttpHdrTypeGet(bufp1, hdr_loc1);
03339 TSHttpType type2 = TSHttpHdrTypeGet(bufp4, hdr_loc4);
03340
03341 if (type1 != type2) {
03342 SDK_RPRINT(test, "TSHttpHdrClone", "TestCase1", TC_FAIL, "Type mismatch in both headers");
03343 flag = false;
03344 }
03345 }
03346
03347 if (flag == true) {
03348 int version1 = TSHttpHdrVersionGet(bufp1, hdr_loc1);
03349 int version2 = TSHttpHdrVersionGet(bufp4, hdr_loc4);
03350
03351 if (version1 != version2) {
03352 SDK_RPRINT(test, "TSHttpHdrClone", "TestCase1", TC_FAIL, "Version mismatch in both headers");
03353 flag = false;
03354 }
03355 }
03356
03357 if (flag == true) {
03358 method1 = TSHttpHdrMethodGet(bufp1, hdr_loc1, &length1);
03359 method2 = TSHttpHdrMethodGet(bufp4, hdr_loc4, &length2);
03360 if ((length1 != length2) || (strncmp(method1, method2, length1) != 0)) {
03361 SDK_RPRINT(test, "TSHttpHdrClone", "TestCase1", TC_FAIL, "Method mismatch in both headers");
03362 flag = false;
03363 }
03364 }
03365
03366 if (flag == true) {
03367
03368 if ((TSHttpHdrUrlGet(bufp1, hdr_loc1, &url_loc1) != TS_SUCCESS) ||
03369 (TSHttpHdrUrlGet(bufp4, hdr_loc4, &url_loc2) != TS_SUCCESS)) {
03370 SDK_RPRINT(test, "TSHttpHdrClone", "TestCase1", TC_FAIL, "TSHttpVersionGet returns TS_ERROR");
03371 } else {
03372 const char *scheme1;
03373 const char *scheme2;
03374
03375 const char *host1;
03376 const char *host2;
03377
03378 int port1;
03379 int port2;
03380
03381 const char *path1;
03382 const char *path2;
03383
03384
03385 scheme1 = TSUrlSchemeGet(bufp1, url_loc1, &length1);
03386 scheme2 = TSUrlSchemeGet(bufp4, url_loc2, &length2);
03387 if ((length1 != length2) || (strncmp(scheme1, scheme2, length1) != 0)) {
03388 SDK_RPRINT(test, "TSHttpHdrClone", "TestCase1", TC_FAIL, "Url Scheme has different values in both headers");
03389 flag = false;
03390 }
03391
03392
03393 if (flag == true) {
03394 host1 = TSUrlHostGet(bufp1, url_loc1, &length1);
03395 host2 = TSUrlHostGet(bufp4, url_loc2, &length2);
03396 if ((length1 != length2) || (strncmp(host1, host2, length1) != 0)) {
03397 SDK_RPRINT(test, "TSHttpHdrClone", "TestCase1", TC_FAIL, "Url Host has different values in both headers");
03398 flag = false;
03399 }
03400 }
03401
03402 if (flag == true) {
03403 port1 = TSUrlPortGet(bufp1, url_loc1);
03404 port2 = TSUrlPortGet(bufp4, url_loc2);
03405 if (port1 != port2) {
03406 SDK_RPRINT(test, "TSHttpHdrClone", "TestCase1", TC_FAIL, "Url Port has different values in both headers");
03407 flag = false;
03408 }
03409 }
03410
03411 if (flag == true) {
03412 path1 = TSUrlPathGet(bufp1, url_loc1, &length1);
03413 path2 = TSUrlPathGet(bufp4, url_loc2, &length2);
03414 if ((path1 != NULL) && (path2 != NULL)) {
03415 if ((length1 != length2) || (strncmp(path1, path2, length1) != 0)) {
03416 SDK_RPRINT(test, "TSHttpHdrCopy", "TestCase1", TC_FAIL, "Url Path has different values in both headers");
03417 flag = false;
03418 }
03419 } else {
03420 if (path1 != path2) {
03421 SDK_RPRINT(test, "TSHttpHdrCopy", "TestCase1", TC_FAIL, "Url Host has different values in both headers");
03422 flag = false;
03423 }
03424 }
03425 if ((TSHandleMLocRelease(bufp1, hdr_loc1, url_loc1) == TS_ERROR) ||
03426 (TSHandleMLocRelease(bufp4, hdr_loc4, url_loc2) == TS_ERROR)) {
03427 SDK_RPRINT(test, "TSHandleMLocRelease", "", TC_FAIL, "Unable to release Handle acquired by TSHttpHdrUrlGet");
03428 }
03429 }
03430
03431 if (flag == true) {
03432 SDK_RPRINT(test, "TSHttpHdrClone", "TestCase1", TC_PASS, "ok");
03433 test_passed_Http_Hdr_Clone = true;
03434 }
03435 }
03436 }
03437 }
03438 } else {
03439 SDK_RPRINT(test, "TSHttpHdrClone", "All Test Cases", TC_PASS, "Cannot run test as TSHttpHdrCreate has failed");
03440 }
03441
03442
03443
03444 if (test_passed_Http_Hdr_Create == true) {
03445 actual_length = TSHttpHdrLengthGet(bufp1, hdr_loc1);
03446 TSIOBuffer iobuf = TSIOBufferCreate();
03447 TSHttpHdrPrint(bufp1, hdr_loc1, iobuf);
03448 TSIOBufferReader iobufreader = TSIOBufferReaderAlloc(iobuf);
03449
03450 expected_length = TSIOBufferReaderAvail(iobufreader);
03451 if (actual_length == expected_length) {
03452 SDK_RPRINT(test, "TSHttpHdrLengthGet", "TestCase1", TC_PASS, "ok");
03453 test_passed_Http_Hdr_Length = true;
03454 } else {
03455 SDK_RPRINT(test, "TSHttpHdrLengthGet", "TestCase1", TC_FAIL, "Incorrect value returned.");
03456 }
03457
03458
03459 if ((test_passed_Http_Hdr_Method == true) && (test_passed_Http_Hdr_Url == true) &&
03460 (test_passed_Http_Hdr_Version == true) && (test_passed_Http_Hdr_Length == true) &&
03461 (try_print_function == true)) {
03462 char *actual_iobuf = NULL;
03463
03464 actual_iobuf = (char *) TSmalloc((actual_length + 1) * sizeof(char));
03465
03466 if (actual_iobuf == NULL) {
03467 SDK_RPRINT(test, "TSHttpHdrPrint", "TestCase1", TC_FAIL, "Unable to allocate memory");
03468 } else {
03469
03470 TSIOBufferBlock iobufblock;
03471 int64_t bytes_read;
03472
03473 memset(actual_iobuf, 0, (actual_length + 1) * sizeof(char));
03474 bytes_read = 0;
03475
03476 iobufblock = TSIOBufferReaderStart(iobufreader);
03477
03478 while (iobufblock != NULL) {
03479 const char *block_start;
03480 int64_t block_size;
03481
03482 block_start = TSIOBufferBlockReadStart(iobufblock, iobufreader, &block_size);
03483 if (block_size <= 0)
03484 break;
03485
03486 memcpy(actual_iobuf + bytes_read, block_start, block_size);
03487 bytes_read += block_size;
03488 TSIOBufferReaderConsume(iobufreader, block_size);
03489 iobufblock = TSIOBufferReaderStart(iobufreader);
03490 }
03491 if (strcmp(actual_iobuf, expected_iobuf) == 0) {
03492 SDK_RPRINT(test, "TSHttpHdrPrint", "TestCase1", TC_PASS, "ok");
03493 test_passed_Http_Hdr_Print = true;
03494 } else {
03495 SDK_RPRINT(test, "TSHttpHdrPrint", "TestCase1", TC_FAIL, "Value's mismatch");
03496 }
03497
03498 TSfree(actual_iobuf);
03499 TSIOBufferReaderFree(iobufreader);
03500 TSIOBufferDestroy(iobuf);
03501 }
03502 } else {
03503 SDK_RPRINT(test, "TSHttpHdrPrint", "TestCase1", TC_FAIL, "Unable to run test for TSHttpHdrPrint");
03504 }
03505 } else {
03506 SDK_RPRINT(test, "TSHttpHdrLengthGet", "All Test Cases", TC_PASS, "Cannot run test as TSHttpHdrCreate has failed");
03507 }
03508
03509
03510 if (test_passed_Http_Hdr_Create == true) {
03511 TSHttpHdrDestroy(bufp1, hdr_loc1);
03512 TSHttpHdrDestroy(bufp2, hdr_loc2);
03513 TSHttpHdrDestroy(bufp3, hdr_loc3);
03514 TSHttpHdrDestroy(bufp4, hdr_loc4);
03515 if ((TSHandleMLocRelease(bufp1, TS_NULL_MLOC, hdr_loc1) == TS_ERROR) ||
03516 (TSHandleMLocRelease(bufp2, TS_NULL_MLOC, hdr_loc2) == TS_ERROR) ||
03517 (TSHandleMLocRelease(bufp3, TS_NULL_MLOC, hdr_loc3) == TS_ERROR) ||
03518 (TSHandleMLocRelease(bufp4, TS_NULL_MLOC, hdr_loc4) == TS_ERROR)) {
03519 SDK_RPRINT(test, "TSHandleMLocRelease", "TestCase1|2|3|4", TC_FAIL, "Unable to release the handle to headers");
03520 }
03521 SDK_RPRINT(test, "TSHttpHdrDestroy", "TestCase1&2&3&4", TC_PASS, "ok");
03522 test_passed_Http_Hdr_Destroy = true;
03523 } else {
03524 SDK_RPRINT(test, "TSHttpHdrDestroy", "All Test Cases", TC_FAIL, "Cannot run test as header was not created");
03525 }
03526
03527 if (bufp1) {
03528 if (TSMBufferDestroy(bufp1) == TS_ERROR) {
03529 SDK_RPRINT(test, "TSMBufferDestroy", "TestCase1", TC_FAIL, "Unable to destroy MBuffer");
03530 }
03531 }
03532
03533 if (bufp2) {
03534 if (TSMBufferDestroy(bufp2) == TS_ERROR) {
03535 SDK_RPRINT(test, "TSMBufferDestroy", "TestCase2", TC_FAIL, "Unable to destroy MBuffer");
03536 }
03537 }
03538
03539 if (bufp3) {
03540 if (TSMBufferDestroy(bufp3) == TS_ERROR) {
03541 SDK_RPRINT(test, "TSMBufferDestroy", "TestCase3", TC_FAIL, "Unable to destroy MBuffer");
03542 }
03543 }
03544
03545 if (bufp4) {
03546 if (TSMBufferDestroy(bufp4) == TS_ERROR) {
03547 SDK_RPRINT(test, "TSMBufferDestroy", "TestCase4", TC_FAIL, "Unable to destroy MBuffer");
03548 }
03549 }
03550
03551 if ((test_passed_Http_Hdr_Create == true) &&
03552 (test_passed_Http_Hdr_Type == true) &&
03553 (test_passed_Http_Hdr_Method == true) &&
03554 (test_passed_Http_Hdr_Url == true) &&
03555 (test_passed_Http_Hdr_Status == true) &&
03556 (test_passed_Http_Hdr_Reason == true) &&
03557 (test_passed_Http_Hdr_Reason_Lookup == true) &&
03558 (test_passed_Http_Hdr_Version == true) &&
03559 (test_passed_Http_Hdr_Copy == true) &&
03560 (test_passed_Http_Hdr_Clone == true) &&
03561 (test_passed_Http_Hdr_Length == true) &&
03562 (test_passed_Http_Hdr_Print == true) && (test_passed_Http_Hdr_Destroy == true)) {
03563 *pstatus = REGRESSION_TEST_PASSED;
03564 } else {
03565 *pstatus = REGRESSION_TEST_FAILED;
03566 }
03567
03568 return;
03569
03570 }
03571
03572
03573
03574
03575
03576
03577
03578
03579
03580
03581
03582
03583
03584
03585
03586
03587
03588
03589
03590
03591
03592
03593
03594
03595
03596
03597
03598
03599
03600
03601
03602
03603
03604
03605
03606
03607
03608
03609
03610 TSReturnCode
03611 compare_field_names(RegressionTest * , TSMBuffer bufp1, TSMLoc mime_loc1, TSMLoc field_loc1,
03612 TSMBuffer bufp2, TSMLoc mime_loc2, TSMLoc field_loc2)
03613 {
03614 const char *name1;
03615 const char *name2;
03616 int length1;
03617 int length2;
03618
03619 name1 = TSMimeHdrFieldNameGet(bufp1, mime_loc1, field_loc1, &length1);
03620 name2 = TSMimeHdrFieldNameGet(bufp2, mime_loc2, field_loc2, &length2);
03621
03622 if ((length1 == length2) && (strncmp(name1, name2, length1) == 0) ) {
03623 return TS_SUCCESS;
03624 } else {
03625 return TS_ERROR;
03626 }
03627 }
03628
03629 REGRESSION_TEST(SDK_API_TSMimeHdrField) (RegressionTest * test, int , int *pstatus)
03630 {
03631 TSMBuffer bufp1 = (TSMBuffer)NULL;
03632
03633 TSMLoc mime_loc1 = (TSMLoc)NULL;
03634
03635 TSMLoc field_loc11 = (TSMLoc)NULL;
03636 TSMLoc field_loc12 = (TSMLoc)NULL;
03637 TSMLoc field_loc13 = (TSMLoc)NULL;
03638 TSMLoc field_loc14 = (TSMLoc)NULL;
03639 TSMLoc field_loc15 = (TSMLoc)NULL;
03640
03641
03642 const char *field1Name = "field1";
03643 const char *field2Name = "field2";
03644 const char *field3Name = "field3";
03645 const char *field4Name = "field4";
03646 const char *field5Name = "field5";
03647
03648 const char *field1NameGet;
03649 const char *field2NameGet;
03650 const char *field3NameGet;
03651 const char *field4NameGet;
03652 const char *field5NameGet;
03653
03654 int field1NameGetLength;
03655 int field2NameGetLength;
03656 int field3NameGetLength;
03657 int field4NameGetLength;
03658 int field5NameGetLength;
03659
03660 int field1_length;
03661 int field2_length;
03662 int field3_length;
03663 int field4_length;
03664
03665
03666 TSMLoc test_field_loc11 = (TSMLoc)NULL;
03667 TSMLoc test_field_loc12 = (TSMLoc)NULL;
03668 TSMLoc test_field_loc13 = (TSMLoc)NULL;
03669 TSMLoc test_field_loc14 = (TSMLoc)NULL;
03670 TSMLoc test_field_loc15 = (TSMLoc)NULL;
03671
03672 int actualNumberOfFields;
03673 int numberOfFields;
03674
03675 const char *field1Value1 = "field1Value1";
03676 const char *field1Value2 = "field1Value2";
03677 const char *field1Value3 = "field1Value3";
03678 const char *field1Value4 = "field1Value4";
03679 const char *field1Value5 = "field1Value5";
03680 const char *field1ValueNew = "newfieldValue";
03681
03682 const char *field1Value1Get;
03683 const char *field1Value2Get;
03684 const char *field1Value3Get;
03685 const char *field1Value4Get;
03686 const char *field1Value5Get;
03687 const char *field1ValueAllGet;
03688 const char *field1ValueNewGet;
03689
03690 int lengthField1Value1;
03691 int lengthField1Value2;
03692 int lengthField1Value3;
03693 int lengthField1Value4;
03694 int lengthField1Value5;
03695 int lengthField1ValueAll;
03696 int lengthField1ValueNew;
03697
03698 time_t field2Value1 = time(NULL);
03699 time_t field2Value1Get;
03700 time_t field2ValueNew;
03701 time_t field2ValueNewGet;
03702
03703 int field3Value1 = 31;
03704 int field3Value2 = 32;
03705 int field3Value3 = 33;
03706 int field3Value4 = 34;
03707 int field3Value5 = 35;
03708 int field3ValueNew = 30;
03709
03710 int field3Value1Get;
03711 int field3Value2Get;
03712 int field3Value3Get;
03713 int field3Value4Get;
03714 int field3Value5Get;
03715 int field3ValueNewGet;
03716
03717 unsigned int field4Value1 = 41;
03718 unsigned int field4Value2 = 42;
03719 unsigned int field4Value3 = 43;
03720 unsigned int field4Value4 = 44;
03721 unsigned int field4Value5 = 45;
03722 unsigned int field4ValueNew = 40;
03723
03724 unsigned int field4Value1Get;
03725 unsigned int field4Value2Get;
03726 unsigned int field4Value3Get;
03727 unsigned int field4Value4Get;
03728 unsigned int field4Value5Get;
03729 unsigned int field4ValueNewGet;
03730
03731 const char *field5Value1 = "field5Value1";
03732 const char *field5Value1Append = "AppendedValue";
03733 const char *fieldValueAppendGet;
03734 int lengthFieldValueAppended;
03735 int field5Value2 = 52;
03736 const char *field5Value3 = "DeleteValue";
03737 const char *fieldValueDeleteGet;
03738 int lengthFieldValueDeleteGet;
03739 unsigned int field5Value4 = 54;
03740 int numberOfValueInField;
03741
03742 TSMLoc field_loc;
03743
03744 bool test_passed_MBuffer_Create = false;
03745 bool test_passed_Mime_Hdr_Create = false;
03746 bool test_passed_Mime_Hdr_Field_Create = false;
03747 bool test_passed_Mime_Hdr_Field_Name = false;
03748 bool test_passed_Mime_Hdr_Field_Append = false;
03749 bool test_passed_Mime_Hdr_Field_Get = false;
03750 bool test_passed_Mime_Hdr_Field_Next = false;
03751 bool test_passed_Mime_Hdr_Fields_Count = false;
03752 bool test_passed_Mime_Hdr_Field_Value_String_Insert = false;
03753 bool test_passed_Mime_Hdr_Field_Value_String_Get = false;
03754 bool test_passed_Mime_Hdr_Field_Value_String_Set = false;
03755 bool test_passed_Mime_Hdr_Field_Value_Date_Insert = false;
03756 bool test_passed_Mime_Hdr_Field_Value_Date_Get = false;
03757 bool test_passed_Mime_Hdr_Field_Value_Date_Set = false;
03758 bool test_passed_Mime_Hdr_Field_Value_Int_Insert = false;
03759 bool test_passed_Mime_Hdr_Field_Value_Int_Get = false;
03760 bool test_passed_Mime_Hdr_Field_Value_Int_Set = false;
03761 bool test_passed_Mime_Hdr_Field_Value_Uint_Insert = false;
03762 bool test_passed_Mime_Hdr_Field_Value_Uint_Get = false;
03763 bool test_passed_Mime_Hdr_Field_Value_Uint_Set = false;
03764 bool test_passed_Mime_Hdr_Field_Value_Append = false;
03765 bool test_passed_Mime_Hdr_Field_Value_Delete = false;
03766 bool test_passed_Mime_Hdr_Field_Values_Clear = false;
03767 bool test_passed_Mime_Hdr_Field_Values_Count = false;
03768 bool test_passed_Mime_Hdr_Field_Destroy = false;
03769 bool test_passed_Mime_Hdr_Fields_Clear = false;
03770 bool test_passed_Mime_Hdr_Destroy = false;
03771 bool test_passed_MBuffer_Destroy = false;
03772 bool test_passed_Mime_Hdr_Field_Length_Get = false;
03773
03774 *pstatus = REGRESSION_TEST_INPROGRESS;
03775
03776
03777 bufp1 = TSMBufferCreate();
03778 SDK_RPRINT(test, "TSMBufferCreate", "TestCase1", TC_PASS, "ok");
03779 test_passed_MBuffer_Create = true;
03780
03781
03782 if (test_passed_MBuffer_Create == true) {
03783 if (TSMimeHdrCreate(bufp1, &mime_loc1) != TS_SUCCESS) {
03784 SDK_RPRINT(test, "TSMimeHdrCreate", "TestCase1", TC_FAIL, "TSMimeHdrCreate Returns TS_ERROR");
03785 } else {
03786 SDK_RPRINT(test, "TSMimeHdrCreate", "TestCase1", TC_PASS, "ok");
03787 test_passed_Mime_Hdr_Create = true;
03788 }
03789 } else {
03790 SDK_RPRINT(test, "TSMimeHdrCreate", "TestCase1", TC_FAIL, "Cannot run test as Test for TSMBufferCreate Failed");
03791 }
03792
03793
03794 if (test_passed_Mime_Hdr_Create == true) {
03795 if ((TSMimeHdrFieldCreate(bufp1, mime_loc1, &field_loc11) != TS_SUCCESS) ||
03796 (TSMimeHdrFieldCreate(bufp1, mime_loc1, &field_loc12) != TS_SUCCESS) ||
03797 (TSMimeHdrFieldCreate(bufp1, mime_loc1, &field_loc13) != TS_SUCCESS) ||
03798 (TSMimeHdrFieldCreate(bufp1, mime_loc1, &field_loc14) != TS_SUCCESS) ||
03799 (TSMimeHdrFieldCreate(bufp1, mime_loc1, &field_loc15) != TS_SUCCESS)) {
03800 SDK_RPRINT(test, "TSMimeHdrFieldCreate", "TestCase1|2|3|4|5", TC_FAIL, "TSMimeHdrFieldCreate Returns TS_ERROR");
03801 } else {
03802 SDK_RPRINT(test, "TSMimeHdrFieldCreate", "TestCase1|2|3|4|5", TC_PASS, "ok");
03803 test_passed_Mime_Hdr_Field_Create = true;
03804 }
03805 } else {
03806 SDK_RPRINT(test, "TSMimeHdrFieldCreate", "All Test Case", TC_FAIL, "Cannot run test as Test for TSMimeHdrCreate Failed");
03807 }
03808
03809
03810
03811 if (test_passed_Mime_Hdr_Field_Create == true) {
03812 if ((TSMimeHdrFieldNameSet(bufp1, mime_loc1, field_loc11, field1Name, -1) == TS_ERROR) ||
03813 (TSMimeHdrFieldNameSet(bufp1, mime_loc1, field_loc12, field2Name, -1) == TS_ERROR) ||
03814 (TSMimeHdrFieldNameSet(bufp1, mime_loc1, field_loc13, field3Name, -1) == TS_ERROR) ||
03815 (TSMimeHdrFieldNameSet(bufp1, mime_loc1, field_loc14, field4Name, -1) == TS_ERROR) ||
03816 (TSMimeHdrFieldNameSet(bufp1, mime_loc1, field_loc15, field5Name, -1) == TS_ERROR)) {
03817 SDK_RPRINT(test, "TSMimeHdrFieldNameSet", "TestCase1|2|3|4|5", TC_FAIL, "TSMimeHdrFieldNameSet Returns TS_ERROR");
03818 } else {
03819 field1NameGet = TSMimeHdrFieldNameGet(bufp1, mime_loc1, field_loc11, &field1NameGetLength);
03820 field2NameGet = TSMimeHdrFieldNameGet(bufp1, mime_loc1, field_loc12, &field2NameGetLength);
03821 field3NameGet = TSMimeHdrFieldNameGet(bufp1, mime_loc1, field_loc13, &field3NameGetLength);
03822 field4NameGet = TSMimeHdrFieldNameGet(bufp1, mime_loc1, field_loc14, &field4NameGetLength);
03823 field5NameGet = TSMimeHdrFieldNameGet(bufp1, mime_loc1, field_loc15, &field5NameGetLength);
03824 if (((strncmp(field1NameGet, field1Name, field1NameGetLength) == 0) && (field1NameGetLength == (int) strlen(field1Name))) &&
03825 ((strncmp(field2NameGet, field2Name, field2NameGetLength) == 0) && (field2NameGetLength == (int) strlen(field2Name))) &&
03826 ((strncmp(field3NameGet, field3Name, field3NameGetLength) == 0) && (field3NameGetLength == (int) strlen(field3Name))) &&
03827 ((strncmp(field4NameGet, field4Name, field4NameGetLength) == 0) && (field4NameGetLength == (int) strlen(field4Name))) &&
03828 ((strncmp(field5NameGet, field5Name, field5NameGetLength) == 0) && field5NameGetLength == (int) strlen(field5Name))) {
03829 SDK_RPRINT(test, "TSMimeHdrFieldNameGet&Set", "TestCase1&2&3&4&5", TC_PASS, "ok");
03830 test_passed_Mime_Hdr_Field_Name = true;
03831 } else {
03832 SDK_RPRINT(test, "TSMimeHdrFieldNameGet&Set", "TestCase1|2|3|4|5", TC_FAIL, "Values Don't Match");
03833 }
03834 }
03835 } else {
03836 SDK_RPRINT(test, "TSMimeHdrFieldNameGet&Set", "All Test Case", TC_FAIL,
03837 "Cannot run test as Test for TSMBufferFieldCreate Failed");
03838 }
03839
03840
03841
03842 if (test_passed_Mime_Hdr_Field_Name == true) {
03843 if ((TSMimeHdrFieldAppend(bufp1, mime_loc1, field_loc11) != TS_SUCCESS) ||
03844 (TSMimeHdrFieldAppend(bufp1, mime_loc1, field_loc12) != TS_SUCCESS) ||
03845 (TSMimeHdrFieldAppend(bufp1, mime_loc1, field_loc13) != TS_SUCCESS) ||
03846 (TSMimeHdrFieldAppend(bufp1, mime_loc1, field_loc14) != TS_SUCCESS) ||
03847 (TSMimeHdrFieldAppend(bufp1, mime_loc1, field_loc15) != TS_SUCCESS)) {
03848 SDK_RPRINT(test, "TSMimeHdrFieldAppend", "TestCase1|2|3|4|5", TC_FAIL, "TSMimeHdrFieldAppend Returns TS_ERROR");
03849 } else {
03850 if (TS_NULL_MLOC == (test_field_loc11 = TSMimeHdrFieldGet(bufp1, mime_loc1, 0))) {
03851 SDK_RPRINT(test, "TSMimeHdrFieldAppend", "TestCase1|2|3|4|5", TC_FAIL, "TSMimeHdrFieldGet Returns TS_NULL_MLOC");
03852 SDK_RPRINT(test, "TSMimeHdrFieldNext", "TestCase1", TC_FAIL,
03853 "Cannot Test TSMimeHdrFieldNext as TSMimeHdrFieldGet Returns TS_NULL_MLOC");
03854 SDK_RPRINT(test, "TSMimeHdrFieldGet", "TestCase1", TC_FAIL, "TSMimeHdrFieldGet Returns TS_NULL_MLOC");
03855 } else {
03856 if (compare_field_names(test, bufp1, mime_loc1, field_loc11, bufp1, mime_loc1, test_field_loc11) == TS_ERROR) {
03857 SDK_RPRINT(test, "TSMimeHdrFieldAppend", "TestCase1", TC_FAIL, "Values Don't match");
03858 SDK_RPRINT(test, "TSMimeHdrFieldNext", "TestCase1", TC_FAIL, "Cannot Test TSMimeHdrFieldNext as Values don't match");
03859 SDK_RPRINT(test, "TSMimeHdrFieldGet", "TestCase1", TC_FAIL, "Values Don't match");
03860 } else {
03861 SDK_RPRINT(test, "TSMimeHdrFieldAppend", "TestCase1", TC_PASS, "ok");
03862 SDK_RPRINT(test, "TSMimeHdrFieldGet", "TestCase1", TC_PASS, "ok");
03863 test_passed_Mime_Hdr_Field_Append = true;
03864 test_passed_Mime_Hdr_Field_Get = true;
03865 }
03866 }
03867
03868 if (test_passed_Mime_Hdr_Field_Append == true) {
03869 test_field_loc12 = TSMimeHdrFieldNext(bufp1, mime_loc1, test_field_loc11);
03870 if (compare_field_names(test, bufp1, mime_loc1, field_loc12, bufp1, mime_loc1, test_field_loc12) == TS_ERROR) {
03871 SDK_RPRINT(test, "TSMimeHdrFieldAppend", "TestCase2", TC_PASS, "Values Don't match");
03872 SDK_RPRINT(test, "TSMimeHdrFieldNext", "TestCase2", TC_PASS, "Values Don't match");
03873 SDK_RPRINT(test, "TSMimeHdrFieldGet", "TestCase2", TC_PASS, "Values Don't match");
03874 test_passed_Mime_Hdr_Field_Append = false;
03875 test_passed_Mime_Hdr_Field_Next = false;
03876 test_passed_Mime_Hdr_Field_Get = false;
03877 } else {
03878 SDK_RPRINT(test, "TSMimeHdrFieldAppend", "TestCase2", TC_PASS, "ok");
03879 SDK_RPRINT(test, "TSMimeHdrFieldNext", "TestCase2", TC_PASS, "ok");
03880 SDK_RPRINT(test, "TSMimeHdrFieldGet", "TestCase2", TC_PASS, "ok");
03881 test_passed_Mime_Hdr_Field_Next = true;
03882 }
03883 }
03884
03885 if (test_passed_Mime_Hdr_Field_Append == true) {
03886 test_field_loc13 = TSMimeHdrFieldNext(bufp1, mime_loc1, test_field_loc12);
03887 if (compare_field_names(test, bufp1, mime_loc1, field_loc13, bufp1, mime_loc1, test_field_loc13) == TS_ERROR) {
03888 SDK_RPRINT(test, "TSMimeHdrFieldAppend", "TestCase3", TC_FAIL, "Values Don't match");
03889 SDK_RPRINT(test, "TSMimeHdrFieldNext", "TestCase3", TC_FAIL, "Values Don't match");
03890 SDK_RPRINT(test, "TSMimeHdrFieldGet", "TestCase3", TC_FAIL, "Values Don't match");
03891 test_passed_Mime_Hdr_Field_Append = false;
03892 test_passed_Mime_Hdr_Field_Next = false;
03893 test_passed_Mime_Hdr_Field_Get = false;
03894 } else {
03895 SDK_RPRINT(test, "TSMimeHdrFieldAppend", "TestCase3", TC_PASS, "ok");
03896 SDK_RPRINT(test, "TSMimeHdrFieldNext", "TestCase3", TC_PASS, "ok");
03897 SDK_RPRINT(test, "TSMimeHdrFieldGet", "TestCase3", TC_PASS, "ok");
03898 }
03899 }
03900
03901 if (test_passed_Mime_Hdr_Field_Append == true) {
03902 test_field_loc14 = TSMimeHdrFieldNext(bufp1, mime_loc1, test_field_loc13);
03903 if (compare_field_names(test, bufp1, mime_loc1, field_loc14, bufp1, mime_loc1, test_field_loc14) == TS_ERROR) {
03904 SDK_RPRINT(test, "TSMimeHdrFieldAppend", "TestCase4", TC_FAIL, "Values Don't match");
03905 SDK_RPRINT(test, "TSMimeHdrFieldNext", "TestCase4", TC_FAIL, "Values Don't match");
03906 SDK_RPRINT(test, "TSMimeHdrFieldGet", "TestCase4", TC_FAIL, "Values Don't match");
03907 test_passed_Mime_Hdr_Field_Append = false;
03908 test_passed_Mime_Hdr_Field_Next = false;
03909 test_passed_Mime_Hdr_Field_Get = false;
03910 } else {
03911 SDK_RPRINT(test, "TSMimeHdrFieldAppend", "TestCase4", TC_PASS, "ok");
03912 SDK_RPRINT(test, "TSMimeHdrFieldNext", "TestCase4", TC_PASS, "ok");
03913 SDK_RPRINT(test, "TSMimeHdrFieldGet", "TestCase4", TC_PASS, "ok");
03914 }
03915 }
03916
03917 if (test_passed_Mime_Hdr_Field_Append == true) {
03918 test_field_loc15 = TSMimeHdrFieldNext(bufp1, mime_loc1, test_field_loc14);
03919 if (compare_field_names(test, bufp1, mime_loc1, field_loc15, bufp1, mime_loc1, test_field_loc15) == TS_ERROR) {
03920 SDK_RPRINT(test, "TSMimeHdrFieldAppend", "TestCase5", TC_FAIL, "Values Don't match");
03921 SDK_RPRINT(test, "TSMimeHdrFieldNext", "TestCase5", TC_FAIL, "Values Don't match");
03922 test_passed_Mime_Hdr_Field_Append = false;
03923 test_passed_Mime_Hdr_Field_Next = false;
03924 test_passed_Mime_Hdr_Field_Get = false;
03925 } else {
03926 SDK_RPRINT(test, "TSMimeHdrFieldAppend", "TestCase5", TC_PASS, "ok");
03927 SDK_RPRINT(test, "TSMimeHdrFieldNext", "TestCase5", TC_PASS, "ok");
03928 }
03929 }
03930
03931 if ((TSHandleMLocRelease(bufp1, mime_loc1, test_field_loc11) == TS_ERROR) ||
03932 (TSHandleMLocRelease(bufp1, mime_loc1, test_field_loc12) == TS_ERROR) ||
03933 (TSHandleMLocRelease(bufp1, mime_loc1, test_field_loc13) == TS_ERROR) ||
03934 (TSHandleMLocRelease(bufp1, mime_loc1, test_field_loc14) == TS_ERROR) ||
03935 (TSHandleMLocRelease(bufp1, mime_loc1, test_field_loc15) == TS_ERROR)) {
03936 SDK_RPRINT(test, "TSMimeHdrFieldAppend/Next/Get", "", TC_FAIL,
03937 "Unable to release handle using TSHandleMLocRelease. Can be bad handle.");
03938 }
03939 }
03940 } else {
03941 SDK_RPRINT(test, "TSMimeHdrFieldAppend & TSMimeHdrFieldNext", "All Test Case", TC_FAIL,
03942 "Cannot run test as Test for TSMimeHdrFieldNameGet&Set Failed");
03943 }
03944
03945
03946
03947 if (test_passed_Mime_Hdr_Field_Create == true) {
03948 if ((numberOfFields = TSMimeHdrFieldsCount(bufp1, mime_loc1)) < 0 ) {
03949 SDK_RPRINT(test, "TSMimeHdrFieldsCount", "TestCase1", TC_FAIL, "TSMimeHdrFieldsCount Returns TS_ERROR");
03950 } else {
03951 actualNumberOfFields = 0;
03952 if ((field_loc = TSMimeHdrFieldGet(bufp1, mime_loc1, actualNumberOfFields)) == TS_NULL_MLOC) {
03953 SDK_RPRINT(test, "TSMimeHdrFieldsCount", "TestCase1", TC_FAIL, "TSMimeHdrFieldGet Returns TS_NULL_MLOC");
03954 } else {
03955 while (field_loc != NULL) {
03956 TSMLoc next_field_loc;
03957
03958 actualNumberOfFields++;
03959 next_field_loc = TSMimeHdrFieldNext(bufp1, mime_loc1, field_loc);
03960 if (TSHandleMLocRelease(bufp1, mime_loc1, field_loc) == TS_ERROR) {
03961 SDK_RPRINT(test, "TSMimeHdrFieldsCount", "TestCase1", TC_FAIL, "Unable to release handle using TSHandleMLocRelease");
03962 }
03963 field_loc = next_field_loc;
03964 next_field_loc = NULL;
03965 }
03966 if (actualNumberOfFields == numberOfFields) {
03967 SDK_RPRINT(test, "TSMimeHdrFieldsCount", "TestCase1", TC_PASS, "ok");
03968 test_passed_Mime_Hdr_Fields_Count = true;
03969 } else {
03970 SDK_RPRINT(test, "TSMimeHdrFieldsCount", "TestCase1", TC_FAIL, "Values don't match");
03971 }
03972 }
03973 }
03974 } else {
03975 SDK_RPRINT(test, "TSMimeHdrFieldsCount", "TestCase1", TC_FAIL, "Cannot run Test as TSMimeHdrFieldCreate failed");
03976 }
03977
03978
03979 if (test_passed_Mime_Hdr_Field_Create == true) {
03980 if ((TSMimeHdrFieldValueStringInsert(bufp1, mime_loc1, field_loc11, -1, field1Value2, -1) == TS_ERROR) ||
03981 (TSMimeHdrFieldValueStringInsert(bufp1, mime_loc1, field_loc11, 0, field1Value1, -1) == TS_ERROR) ||
03982 (TSMimeHdrFieldValueStringInsert(bufp1, mime_loc1, field_loc11, -1, field1Value5, -1) == TS_ERROR) ||
03983 (TSMimeHdrFieldValueStringInsert(bufp1, mime_loc1, field_loc11, 2, field1Value4, -1) == TS_ERROR) ||
03984 (TSMimeHdrFieldValueStringInsert(bufp1, mime_loc1, field_loc11, 2, field1Value3, -1) == TS_ERROR)) {
03985 SDK_RPRINT(test, "TSMimeHdrFieldValueStringInsert", "TestCase1|2|3|4|5", TC_FAIL,
03986 "TSMimeHdrFieldValueStringInsert Returns TS_ERROR");
03987 SDK_RPRINT(test, "TSMimeHdrFieldValueStringGet", "TestCase1&2&3&4&5", TC_FAIL,
03988 "Cannot run Test as TSMimeHdrFieldValueStringInsert returns TS_ERROR");
03989 SDK_RPRINT(test, "TSMimeHdrFieldValueStringSet", "TestCase1", TC_FAIL,
03990 "Cannot run Test as TSMimeHdrFieldValueStringInsert returns TS_ERROR");
03991 } else {
03992 field1Value1Get = TSMimeHdrFieldValueStringGet(bufp1, mime_loc1, field_loc11, 0, &lengthField1Value1);
03993 field1Value2Get = TSMimeHdrFieldValueStringGet(bufp1, mime_loc1, field_loc11, 1, &lengthField1Value2);
03994 field1Value3Get = TSMimeHdrFieldValueStringGet(bufp1, mime_loc1, field_loc11, 2, &lengthField1Value3);
03995 field1Value4Get = TSMimeHdrFieldValueStringGet(bufp1, mime_loc1, field_loc11, 3, &lengthField1Value4);
03996 field1Value5Get = TSMimeHdrFieldValueStringGet(bufp1, mime_loc1, field_loc11, 4, &lengthField1Value5);
03997 field1ValueAllGet = TSMimeHdrFieldValueStringGet(bufp1, mime_loc1, field_loc11, -1, &lengthField1ValueAll);
03998 if (((strncmp(field1Value1Get, field1Value1, lengthField1Value1) == 0) && lengthField1Value1 == (int) strlen(field1Value1)) &&
03999 ((strncmp(field1Value2Get, field1Value2, lengthField1Value2) == 0) && lengthField1Value2 == (int) strlen(field1Value2)) &&
04000 ((strncmp(field1Value3Get, field1Value3, lengthField1Value3) == 0) && lengthField1Value3 == (int) strlen(field1Value3)) &&
04001 ((strncmp(field1Value4Get, field1Value4, lengthField1Value4) == 0) && lengthField1Value4 == (int) strlen(field1Value4)) &&
04002 ((strncmp(field1Value5Get, field1Value5, lengthField1Value5) == 0) && lengthField1Value5 == (int) strlen(field1Value5)) &&
04003 (strstr(field1ValueAllGet, field1Value1Get) == field1Value1Get) &&
04004 (strstr(field1ValueAllGet, field1Value2Get) == field1Value2Get) &&
04005 (strstr(field1ValueAllGet, field1Value3Get) == field1Value3Get) &&
04006 (strstr(field1ValueAllGet, field1Value4Get) == field1Value4Get) &&
04007 (strstr(field1ValueAllGet, field1Value5Get) == field1Value5Get)) {
04008 SDK_RPRINT(test, "TSMimeHdrFieldValueStringInsert", "TestCase1&2&3&4&5", TC_PASS, "ok");
04009 SDK_RPRINT(test, "TSMimeHdrFieldValueStringGet", "TestCase1&2&3&4&5", TC_PASS, "ok");
04010 SDK_RPRINT(test, "TSMimeHdrFieldValueStringGet with IDX=-1", "TestCase1&2&3&4&5", TC_PASS, "ok");
04011 test_passed_Mime_Hdr_Field_Value_String_Insert = true;
04012 test_passed_Mime_Hdr_Field_Value_String_Get = true;
04013
04014 if ((TSMimeHdrFieldValueStringSet(bufp1, mime_loc1, field_loc11, 3, field1ValueNew, -1)) == TS_ERROR) {
04015 SDK_RPRINT(test, "TSMimeHdrFieldValueStringSet", "TestCase1", TC_FAIL, "TSMimeHdrFieldValueStringSet returns TS_ERROR");
04016 } else {
04017 field1ValueNewGet = TSMimeHdrFieldValueStringGet(bufp1, mime_loc1, field_loc11, 3, &lengthField1ValueNew);
04018 if ((strncmp(field1ValueNewGet, field1ValueNew, lengthField1ValueNew) == 0) &&
04019 (lengthField1ValueNew == (int) strlen(field1ValueNew))) {
04020 SDK_RPRINT(test, "TSMimeHdrFieldValueStringSet", "TestCase1", TC_PASS, "ok");
04021 test_passed_Mime_Hdr_Field_Value_String_Set = true;
04022 } else {
04023 SDK_RPRINT(test, "TSMimeHdrFieldValueStringSet", "TestCase1", TC_FAIL, "Value's Don't match");
04024 }
04025 }
04026 } else {
04027 SDK_RPRINT(test, "TSMimeHdrFieldValueStringInsert", "TestCase1|2|3|4|5", TC_PASS, "Value's Don't Match");
04028 SDK_RPRINT(test, "TSMimeHdrFieldValueStringGet", "TestCase1|2|3|4|5", TC_PASS, "Value's Don't Match");
04029 SDK_RPRINT(test, "TSMimeHdrFieldValueStringSet", "TestCase1", TC_FAIL,
04030 "TSMimeHdrFieldValueStringSet cannot be tested as TSMimeHdrFieldValueStringInsert|Get failed");
04031 }
04032 }
04033 } else {
04034 SDK_RPRINT(test, "TSMimeHdrFieldValueStringInsert&Set&Get", "All", TC_FAIL, "Cannot run Test as TSMimeHdrFieldCreate failed");
04035 }
04036
04037
04038
04039 if (test_passed_Mime_Hdr_Field_Create == true) {
04040 if (TSMimeHdrFieldValueDateInsert(bufp1, mime_loc1, field_loc12, field2Value1) == TS_ERROR) {
04041 SDK_RPRINT(test, "TSMimeHdrFieldValueDateInsert", "TestCase1", TC_FAIL, "TSMimeHdrFieldValueDateInsert Returns TS_ERROR");
04042 SDK_RPRINT(test, "TSMimeHdrFieldValueDateGet", "TestCase1", TC_FAIL,
04043 "Cannot run Test as TSMimeHdrFieldValueDateInsert returns TS_ERROR");
04044 SDK_RPRINT(test, "TSMimeHdrFieldValueDateSet", "TestCase1", TC_FAIL,
04045 "Cannot run Test as TSMimeHdrFieldValueDateInsert returns TS_ERROR");
04046 } else {
04047 field2Value1Get = TSMimeHdrFieldValueDateGet(bufp1, mime_loc1, field_loc12);
04048 if (field2Value1Get == field2Value1) {
04049 SDK_RPRINT(test, "TSMimeHdrFieldValueDateInsert", "TestCase1", TC_PASS, "ok");
04050 SDK_RPRINT(test, "TSMimeHdrFieldValueDateGet", "TestCase1", TC_PASS, "ok");
04051 test_passed_Mime_Hdr_Field_Value_Date_Insert = true;
04052 test_passed_Mime_Hdr_Field_Value_Date_Get = true;
04053 field2ValueNew = time(NULL);
04054 if ((TSMimeHdrFieldValueDateSet(bufp1, mime_loc1, field_loc12, field2ValueNew)) == TS_ERROR) {
04055 SDK_RPRINT(test, "TSMimeHdrFieldValueDateSet", "TestCase1", TC_FAIL, "TSMimeHdrFieldValueDateSet returns TS_ERROR");
04056 } else {
04057 field2ValueNewGet = TSMimeHdrFieldValueDateGet(bufp1, mime_loc1, field_loc12);
04058 if (field2ValueNewGet == field2ValueNew) {
04059 SDK_RPRINT(test, "TSMimeHdrFieldValueDateSet", "TestCase1", TC_PASS, "ok");
04060 test_passed_Mime_Hdr_Field_Value_Date_Set = true;
04061 } else {
04062 SDK_RPRINT(test, "TSMimeHdrFieldValueDateSet", "TestCase1", TC_FAIL, "Value's Don't match");
04063 }
04064 }
04065 } else {
04066 SDK_RPRINT(test, "TSMimeHdrFieldValueDateInsert", "TestCase1", TC_PASS, "Value's Don't Match");
04067 SDK_RPRINT(test, "TSMimeHdrFieldValueDateGet", "TestCase1", TC_PASS, "Value's Don't Match");
04068 SDK_RPRINT(test, "TSMimeHdrFieldValueDateSet", "TestCase1", TC_FAIL,
04069 "TSMimeHdrFieldValueDateSet cannot be tested as TSMimeHdrFieldValueDateInsert|Get failed");
04070 }
04071 }
04072 } else {
04073 SDK_RPRINT(test, "TSMimeHdrFieldValueDateInsert&Set&Get", "TestCase1", TC_FAIL, "Cannot run Test as TSMimeHdrFieldCreate failed");
04074 }
04075
04076
04077
04078 if (test_passed_Mime_Hdr_Field_Create == true) {
04079 if ((TSMimeHdrFieldValueIntInsert(bufp1, mime_loc1, field_loc13, -1, field3Value2) == TS_ERROR) ||
04080 (TSMimeHdrFieldValueIntInsert(bufp1, mime_loc1, field_loc13, 0, field3Value1) == TS_ERROR) ||
04081 (TSMimeHdrFieldValueIntInsert(bufp1, mime_loc1, field_loc13, -1, field3Value5) == TS_ERROR) ||
04082 (TSMimeHdrFieldValueIntInsert(bufp1, mime_loc1, field_loc13, 2, field3Value4) == TS_ERROR) ||
04083 (TSMimeHdrFieldValueIntInsert(bufp1, mime_loc1, field_loc13, 2, field3Value3) == TS_ERROR)) {
04084 SDK_RPRINT(test, "TSMimeHdrFieldValueIntInsert", "TestCase1|2|3|4|5", TC_FAIL, "TSMimeHdrFieldValueIntInsert Returns TS_ERROR");
04085 SDK_RPRINT(test, "TSMimeHdrFieldValueIntGet", "TestCase1&2&3&4&5", TC_FAIL,
04086 "Cannot run Test as TSMimeHdrFieldValueIntInsert returns TS_ERROR");
04087 SDK_RPRINT(test, "TSMimeHdrFieldValueIntSet", "TestCase1", TC_FAIL,
04088 "Cannot run Test as TSMimeHdrFieldValueIntInsert returns TS_ERROR");
04089 } else {
04090 field3Value1Get = TSMimeHdrFieldValueIntGet(bufp1, mime_loc1, field_loc13, 0);
04091 field3Value2Get = TSMimeHdrFieldValueIntGet(bufp1, mime_loc1, field_loc13, 1);
04092 field3Value3Get = TSMimeHdrFieldValueIntGet(bufp1, mime_loc1, field_loc13, 2);
04093 field3Value4Get = TSMimeHdrFieldValueIntGet(bufp1, mime_loc1, field_loc13, 3);
04094 field3Value5Get = TSMimeHdrFieldValueIntGet(bufp1, mime_loc1, field_loc13, 4);
04095 if ((field3Value1Get == field3Value1) && (field3Value2Get == field3Value2) && (field3Value3Get == field3Value3) &&
04096 (field3Value4Get == field3Value4) && (field3Value5Get == field3Value5)) {
04097 SDK_RPRINT(test, "TSMimeHdrFieldValueIntInsert", "TestCase1&2&3&4&5", TC_PASS, "ok");
04098 SDK_RPRINT(test, "TSMimeHdrFieldValueIntGet", "TestCase1&2&3&4&5", TC_PASS, "ok");
04099 test_passed_Mime_Hdr_Field_Value_Int_Insert = true;
04100 test_passed_Mime_Hdr_Field_Value_Int_Get = true;
04101 if ((TSMimeHdrFieldValueIntSet(bufp1, mime_loc1, field_loc13, 3, field3ValueNew)) == TS_ERROR) {
04102 SDK_RPRINT(test, "TSMimeHdrFieldValueIntSet", "TestCase1", TC_FAIL, "TSMimeHdrFieldValueIntSet returns TS_ERROR");
04103 } else {
04104 field3ValueNewGet = TSMimeHdrFieldValueIntGet(bufp1, mime_loc1, field_loc13, 3);
04105 if (field3ValueNewGet == field3ValueNew) {
04106 SDK_RPRINT(test, "TSMimeHdrFieldValueIntSet", "TestCase1", TC_PASS, "ok");
04107 test_passed_Mime_Hdr_Field_Value_Int_Set = true;
04108 } else {
04109 SDK_RPRINT(test, "TSMimeHdrFieldValueIntSet", "TestCase1", TC_FAIL, "Value's Don't match");
04110 }
04111 }
04112 } else {
04113 SDK_RPRINT(test, "TSMimeHdrFieldValueIntInsert", "TestCase1|2|3|4|5", TC_PASS, "Value's Don't Match");
04114 SDK_RPRINT(test, "TSMimeHdrFieldValueIntGet", "TestCase1|2|3|4|5", TC_PASS, "Value's Don't Match");
04115 SDK_RPRINT(test, "TSMimeHdrFieldValueIntSet", "TestCase1", TC_FAIL,
04116 "TSMimeHdrFieldValueIntSet cannot be tested as TSMimeHdrFieldValueIntInsert|Get failed");
04117 }
04118 }
04119 } else {
04120 SDK_RPRINT(test, "TSMimeHdrFieldValueIntInsert&Set&Get", "All", TC_FAIL, "Cannot run Test as TSMimeHdrFieldCreate failed");
04121 }
04122
04123
04124 if (test_passed_Mime_Hdr_Field_Create == true) {
04125 if ((TSMimeHdrFieldValueUintInsert(bufp1, mime_loc1, field_loc14, -1, field4Value2) == TS_ERROR) ||
04126 (TSMimeHdrFieldValueUintInsert(bufp1, mime_loc1, field_loc14, 0, field4Value1) == TS_ERROR) ||
04127 (TSMimeHdrFieldValueUintInsert(bufp1, mime_loc1, field_loc14, -1, field4Value5) == TS_ERROR) ||
04128 (TSMimeHdrFieldValueUintInsert(bufp1, mime_loc1, field_loc14, 2, field4Value4) == TS_ERROR) ||
04129 (TSMimeHdrFieldValueUintInsert(bufp1, mime_loc1, field_loc14, 2, field4Value3) == TS_ERROR)) {
04130 SDK_RPRINT(test, "TSMimeHdrFieldValueUintInsert", "TestCase1|2|3|4|5", TC_FAIL,
04131 "TSMimeHdrFieldValueUintInsert Returns TS_ERROR");
04132 SDK_RPRINT(test, "TSMimeHdrFieldValueUintGet", "TestCase1&2&3&4&5", TC_FAIL,
04133 "Cannot run Test as TSMimeHdrFieldValueUintInsert returns TS_ERROR");
04134 SDK_RPRINT(test, "TSMimeHdrFieldValueUintSet", "TestCase1", TC_FAIL,
04135 "Cannot run Test as TSMimeHdrFieldValueUintInsert returns TS_ERROR");
04136 } else {
04137 field4Value1Get = TSMimeHdrFieldValueUintGet(bufp1, mime_loc1, field_loc14, 0);
04138 field4Value2Get = TSMimeHdrFieldValueUintGet(bufp1, mime_loc1, field_loc14, 1);
04139 field4Value3Get = TSMimeHdrFieldValueUintGet(bufp1, mime_loc1, field_loc14, 2);
04140 field4Value4Get = TSMimeHdrFieldValueUintGet(bufp1, mime_loc1, field_loc14, 3);
04141 field4Value5Get = TSMimeHdrFieldValueUintGet(bufp1, mime_loc1, field_loc14, 4);
04142 if ((field4Value1Get == field4Value1) && (field4Value2Get == field4Value2) && (field4Value3Get == field4Value3) &&
04143 (field4Value4Get == field4Value4) && (field4Value5Get == field4Value5)) {
04144 SDK_RPRINT(test, "TSMimeHdrFieldValueUintInsert", "TestCase1&2&3&4&5", TC_PASS, "ok");
04145 SDK_RPRINT(test, "TSMimeHdrFieldValueUintGet", "TestCase1&2&3&4&5", TC_PASS, "ok");
04146 test_passed_Mime_Hdr_Field_Value_Uint_Insert = true;
04147 test_passed_Mime_Hdr_Field_Value_Uint_Get = true;
04148 if ((TSMimeHdrFieldValueUintSet(bufp1, mime_loc1, field_loc14, 3, field4ValueNew)) == TS_ERROR) {
04149 SDK_RPRINT(test, "TSMimeHdrFieldValueUintSet", "TestCase1", TC_FAIL, "TSMimeHdrFieldValueUintSet returns TS_ERROR");
04150 } else {
04151 field4ValueNewGet = TSMimeHdrFieldValueUintGet(bufp1, mime_loc1, field_loc14, 3);
04152 if (field4ValueNewGet == field4ValueNew) {
04153 SDK_RPRINT(test, "TSMimeHdrFieldValueUintSet", "TestCase1", TC_PASS, "ok");
04154 test_passed_Mime_Hdr_Field_Value_Uint_Set = true;
04155 } else {
04156 SDK_RPRINT(test, "TSMimeHdrFieldValueUintSet", "TestCase1", TC_FAIL, "Value's Don't match");
04157 }
04158 }
04159 } else {
04160 SDK_RPRINT(test, "TSMimeHdrFieldValueUintInsert", "TestCase1|2|3|4|5", TC_PASS, "Value's Don't Match");
04161 SDK_RPRINT(test, "TSMimeHdrFieldValueUintGet", "TestCase1|2|3|4|5", TC_PASS, "Value's Don't Match");
04162 SDK_RPRINT(test, "TSMimeHdrFieldValueUintSet", "TestCase1", TC_FAIL,
04163 "TSMimeHdrFieldValueUintSet cannot be tested as TSMimeHdrFieldValueUintInsert|Get failed");
04164 }
04165 }
04166 } else {
04167 SDK_RPRINT(test, "TSMimeHdrFieldValueUintInsert&Set&Get", "All", TC_FAIL, "Cannot run Test as TSMimeHdrFieldCreate failed");
04168 }
04169
04170
04171 field1_length = TSMimeHdrFieldLengthGet(bufp1, mime_loc1, field_loc11);
04172 field2_length = TSMimeHdrFieldLengthGet(bufp1, mime_loc1, field_loc12);
04173 field3_length = TSMimeHdrFieldLengthGet(bufp1, mime_loc1, field_loc13);
04174 field4_length = TSMimeHdrFieldLengthGet(bufp1, mime_loc1, field_loc14);
04175 if ((field1_length == 0) || (field2_length == 0) || (field3_length == 0) || (field4_length == 0)) {
04176 SDK_RPRINT(test, "TSMimeHdrFieldLengthGet", "TestCase1", TC_FAIL, "Returned bad length");
04177 test_passed_Mime_Hdr_Field_Length_Get = false;
04178 } else {
04179 SDK_RPRINT(test, "TSMimeHdrFieldLengthGet", "TestCase1", TC_PASS, "ok");
04180 test_passed_Mime_Hdr_Field_Length_Get = true;
04181 }
04182
04183
04184
04185
04186
04187 if (test_passed_Mime_Hdr_Field_Create == true) {
04188 if ((TSMimeHdrFieldValueStringInsert(bufp1, mime_loc1, field_loc15, -1, field5Value1, -1) == TS_ERROR) ||
04189 (TSMimeHdrFieldValueIntInsert(bufp1, mime_loc1, field_loc15, -1, field5Value2) == TS_ERROR) ||
04190 (TSMimeHdrFieldValueStringInsert(bufp1, mime_loc1, field_loc15, -1, field5Value3, -1) == TS_ERROR) ||
04191 (TSMimeHdrFieldValueUintInsert(bufp1, mime_loc1, field_loc15, -1, field5Value4) == TS_ERROR)) {
04192 SDK_RPRINT(test, "TSMimeHdrFieldValueAppend", "TestCase1", TC_FAIL,
04193 "TSMimeHdrFieldValueString|Int|UintInsert returns TS_ERROR. Cannot create field for testing.");
04194 SDK_RPRINT(test, "TSMimeHdrFieldValueDelete", "TestCase1", TC_FAIL,
04195 "TSMimeHdrFieldValueString|Int|UintInsert returns TS_ERROR. Cannot create field for testing.");
04196 SDK_RPRINT(test, "TSMimeHdrFieldValuesCount", "TestCase1", TC_FAIL,
04197 "TSMimeHdrFieldValueString|Int|UintInsert returns TS_ERROR. Cannot create field for testing.");
04198 SDK_RPRINT(test, "TSMimeHdrFieldValuesClear", "TestCase1", TC_FAIL,
04199 "TSMimeHdrFieldValueString|Int|UintInsert returns TS_ERROR. Cannot create field for testing.");
04200 } else {
04201 if (TSMimeHdrFieldValueAppend(bufp1, mime_loc1, field_loc15, 0, field5Value1Append, -1) == TS_ERROR) {
04202 SDK_RPRINT(test, "TSMimeHdrFieldValueAppend", "TestCase1", TC_FAIL,
04203 "TSMimeHdrFieldValueAppend returns TS_ERROR");
04204 } else {
04205 fieldValueAppendGet = TSMimeHdrFieldValueStringGet(bufp1, mime_loc1, field_loc15, 0, &lengthFieldValueAppended);
04206 char *expected_value;
04207 size_t len = strlen(field5Value1) + strlen(field5Value1Append) + 1;
04208 expected_value = (char *) TSmalloc(len);
04209 memset(expected_value, 0, len);
04210 ink_strlcpy(expected_value, field5Value1, len);
04211 ink_strlcat(expected_value, field5Value1Append, len);
04212 if ((strncmp(fieldValueAppendGet, expected_value, lengthFieldValueAppended) == 0) &&
04213 (lengthFieldValueAppended = strlen(expected_value))) {
04214 SDK_RPRINT(test, "TSMimeHdrFieldValueAppend", "TestCase1", TC_PASS, "ok");
04215 test_passed_Mime_Hdr_Field_Value_Append = true;
04216 } else {
04217 SDK_RPRINT(test, "TSMimeHdrFieldValueAppend", "TestCase1", TC_FAIL, "Values mismatch");
04218 }
04219 TSfree(expected_value);
04220 }
04221
04222 numberOfValueInField = TSMimeHdrFieldValuesCount(bufp1, mime_loc1, field_loc15);
04223 if (numberOfValueInField == 4) {
04224 SDK_RPRINT(test, "TSMimeHdrFieldValuesCount", "TestCase1", TC_PASS, "ok");
04225 test_passed_Mime_Hdr_Field_Values_Count = true;
04226 } else {
04227 SDK_RPRINT(test, "TSMimeHdrFieldValuesCount", "TestCase1", TC_FAIL, "Values don't match");
04228 }
04229
04230 if (TSMimeHdrFieldValueDelete(bufp1, mime_loc1, field_loc15, 2) == TS_ERROR) {
04231 SDK_RPRINT(test, "TSMimeHdrFieldValueDelete", "TestCase1", TC_FAIL, "TSMimeHdrFieldValueDelete Returns TS_ERROR");
04232 } else {
04233 fieldValueDeleteGet = TSMimeHdrFieldValueStringGet(bufp1, mime_loc1, field_loc15, 2, &lengthFieldValueDeleteGet);
04234 if ((strncmp(fieldValueDeleteGet, field5Value3, lengthFieldValueDeleteGet) == 0) &&
04235 (lengthFieldValueDeleteGet == (int) strlen(field5Value3))) {
04236 SDK_RPRINT(test, "TSMimeHdrFieldValueDelete", "TestCase1", TC_FAIL,
04237 "Value not deleted from field or incorrect index deleted from field.");
04238 } else {
04239 SDK_RPRINT(test, "TSMimeHdrFieldValueDelete", "TestCase1", TC_PASS, "ok");
04240 test_passed_Mime_Hdr_Field_Value_Delete = true;
04241 }
04242 }
04243
04244 if (TSMimeHdrFieldValuesClear(bufp1, mime_loc1, field_loc15) == TS_ERROR) {
04245 SDK_RPRINT(test, "TSMimeHdrFieldValuesClear", "TestCase1", TC_FAIL, "TSMimeHdrFieldValuesClear returns TS_ERROR");
04246 } else {
04247 numberOfValueInField = TSMimeHdrFieldValuesCount(bufp1, mime_loc1, field_loc15);
04248 if (numberOfValueInField == 0) {
04249 SDK_RPRINT(test, "TSMimeHdrFieldValuesClear", "TestCase1", TC_PASS, "ok");
04250 test_passed_Mime_Hdr_Field_Values_Clear = true;
04251 } else {
04252 SDK_RPRINT(test, "TSMimeHdrFieldValuesClear", "TestCase1", TC_FAIL, "Values don't match");
04253 }
04254 }
04255 }
04256
04257
04258 if (TSMimeHdrFieldDestroy(bufp1, mime_loc1, field_loc15) != TS_SUCCESS) {
04259 SDK_RPRINT(test, "TSMimeHdrFieldDestroy", "TestCase1", TC_FAIL, "TSMimeHdrFieldDestroy returns TS_ERROR");
04260 } else {
04261 if ((test_field_loc15 = TSMimeHdrFieldFind(bufp1, mime_loc1, field5Name, -1)) == TS_NULL_MLOC) {
04262 SDK_RPRINT(test, "TSMimeHdrFieldDestroy", "TestCase1", TC_PASS, "ok");
04263 test_passed_Mime_Hdr_Field_Destroy = true;
04264 } else {
04265 SDK_RPRINT(test, "TSMimeHdrFieldDestroy", "TestCase1", TC_FAIL, "Field not destroyed");
04266 if (TSHandleMLocRelease(bufp1, mime_loc1, test_field_loc15) == TS_ERROR) {
04267 SDK_RPRINT(test, "TSMimeHdrFieldDestroy", "TestCase1", TC_FAIL, "Unable to release handle using TSHandleMLocRelease");
04268 }
04269 }
04270 if (TSHandleMLocRelease(bufp1, mime_loc1, field_loc15) == TS_ERROR) {
04271 SDK_RPRINT(test, "TSMimeHdrFieldDestroy", "TestCase2", TC_FAIL, "Unable to release handle using TSHandleMLocRelease");
04272 }
04273 }
04274 } else {
04275 SDK_RPRINT(test, "TSMimeHdrFieldValueAppend", "TestCase1", TC_FAIL, "Cannot run test as TSMimeHdrFieldCreate has failed");
04276 SDK_RPRINT(test, "TSMimeHdrFieldValueDelete", "TestCase1", TC_FAIL, "Cannot run test as TSMimeHdrFieldCreate has failed");
04277 SDK_RPRINT(test, "TSMimeHdrFieldValuesCount", "TestCase1", TC_FAIL, "Cannot run test as TSMimeHdrFieldCreate has failed");
04278 SDK_RPRINT(test, "TSMimeHdrFieldValuesClear", "TestCase1", TC_FAIL, "Cannot run test as TSMimeHdrFieldCreate has failed");
04279 SDK_RPRINT(test, "TSMimeHdrFieldDestroy", "TestCase1", TC_FAIL, "Cannot run test as TSMimeHdrFieldCreate has failed");
04280 }
04281
04282
04283 if (test_passed_Mime_Hdr_Field_Append == true) {
04284 if (TSMimeHdrFieldsClear(bufp1, mime_loc1) != TS_SUCCESS) {
04285 SDK_RPRINT(test, "TSMimeHdrFieldsClear", "TestCase1", TC_FAIL, "TSMimeHdrFieldsClear returns TS_ERROR");
04286 } else {
04287 if ((numberOfFields = TSMimeHdrFieldsCount(bufp1, mime_loc1)) < 0) {
04288 SDK_RPRINT(test, "TSMimeHdrFieldsClear", "TestCase1", TC_FAIL, "TSMimeHdrFieldsCount returns TS_ERROR");
04289 } else {
04290 if (numberOfFields == 0) {
04291 SDK_RPRINT(test, "TSMimeHdrFieldsClear", "TestCase1", TC_PASS, "ok");
04292 test_passed_Mime_Hdr_Fields_Clear = true;
04293 } else {
04294 SDK_RPRINT(test, "TSMimeHdrFieldsClear", "TestCase1", TC_FAIL, "Fields still exist");
04295 }
04296 }
04297 if ((TSHandleMLocRelease(bufp1, mime_loc1, field_loc11) == TS_ERROR) ||
04298 (TSHandleMLocRelease(bufp1, mime_loc1, field_loc12) == TS_ERROR) ||
04299 (TSHandleMLocRelease(bufp1, mime_loc1, field_loc13) == TS_ERROR) ||
04300 (TSHandleMLocRelease(bufp1, mime_loc1, field_loc14) == TS_ERROR)) {
04301 SDK_RPRINT(test, "TSMimeHdrFieldsDestroy", "", TC_FAIL, "Unable to release handle using TSHandleMLocRelease");
04302 }
04303 }
04304 } else {
04305 SDK_RPRINT(test, "TSMimeHdrFieldsClear", "TestCase1", TC_FAIL,
04306 "Cannot run test as Fields have not been inserted in the mime header");
04307 }
04308
04309
04310 if (test_passed_Mime_Hdr_Create == true) {
04311 if (TSMimeHdrDestroy(bufp1, mime_loc1) == TS_ERROR) {
04312 SDK_RPRINT(test, "TSMimeHdrDestroy", "TestCase1", TC_FAIL, "TSMimeHdrDestroy return TS_ERROR");
04313 SDK_RPRINT(test, "TSMimeHdrDestroy", "TestCase1", TC_FAIL, "Probably TSMimeHdrCreate failed.");
04314 } else {
04315 SDK_RPRINT(test, "TSMimeHdrDestroy", "TestCase1", TC_PASS, "ok");
04316 test_passed_Mime_Hdr_Destroy = true;
04317 }
04318
04319
04320
04321
04322
04323
04324 } else {
04325 SDK_RPRINT(test, "TSMimeHdrDestroy", "TestCase1", TC_FAIL, "Cannot run test as TSMimeHdrCreate failed");
04326 }
04327
04328
04329 if (test_passed_MBuffer_Create == true) {
04330 if (TSMBufferDestroy(bufp1) == TS_ERROR) {
04331 SDK_RPRINT(test, "TSMBufferDestroy", "TestCase1", TC_FAIL, "TSMBufferDestroy return TS_ERROR");
04332 SDK_RPRINT(test, "TSMBufferDestroy", "TestCase1", TC_FAIL, "Probably TSMBufferCreate failed.");
04333 } else {
04334 SDK_RPRINT(test, "TSMBufferDestroy", "TestCase1", TC_PASS, "ok");
04335 test_passed_MBuffer_Destroy = true;
04336 }
04337 } else {
04338 SDK_RPRINT(test, "TSMimeHdrDestroy", "TestCase1", TC_FAIL, "Cannot run test as TSMimeHdrCreate failed");
04339 }
04340
04341
04342 if ((test_passed_MBuffer_Create == true) &&
04343 (test_passed_Mime_Hdr_Create == true) &&
04344 (test_passed_Mime_Hdr_Field_Create == true) &&
04345 (test_passed_Mime_Hdr_Field_Name == true) &&
04346 (test_passed_Mime_Hdr_Field_Append == true) &&
04347 (test_passed_Mime_Hdr_Field_Get == true) &&
04348 (test_passed_Mime_Hdr_Field_Next == true) &&
04349 (test_passed_Mime_Hdr_Fields_Count == true) &&
04350 (test_passed_Mime_Hdr_Field_Value_String_Insert == true) &&
04351 (test_passed_Mime_Hdr_Field_Value_String_Get == true) &&
04352 (test_passed_Mime_Hdr_Field_Value_String_Set == true) &&
04353 (test_passed_Mime_Hdr_Field_Value_Date_Insert == true) &&
04354 (test_passed_Mime_Hdr_Field_Value_Date_Get == true) &&
04355 (test_passed_Mime_Hdr_Field_Value_Date_Set == true) &&
04356 (test_passed_Mime_Hdr_Field_Value_Int_Insert == true) &&
04357 (test_passed_Mime_Hdr_Field_Value_Int_Get == true) &&
04358 (test_passed_Mime_Hdr_Field_Value_Int_Set == true) &&
04359 (test_passed_Mime_Hdr_Field_Value_Uint_Insert == true) &&
04360 (test_passed_Mime_Hdr_Field_Value_Uint_Get == true) &&
04361 (test_passed_Mime_Hdr_Field_Value_Uint_Set == true) &&
04362 (test_passed_Mime_Hdr_Field_Value_Append == true) &&
04363 (test_passed_Mime_Hdr_Field_Value_Delete == true) &&
04364 (test_passed_Mime_Hdr_Field_Values_Clear == true) &&
04365 (test_passed_Mime_Hdr_Field_Values_Count == true) &&
04366 (test_passed_Mime_Hdr_Field_Destroy == true) &&
04367 (test_passed_Mime_Hdr_Fields_Clear == true) &&
04368 (test_passed_Mime_Hdr_Destroy == true) &&
04369 (test_passed_MBuffer_Destroy == true) && (test_passed_Mime_Hdr_Field_Length_Get == true)) {
04370 *pstatus = REGRESSION_TEST_PASSED;
04371 } else {
04372 *pstatus = REGRESSION_TEST_FAILED;
04373 }
04374 return;
04375
04376 }
04377
04378
04379
04380
04381
04382
04383
04384
04385
04386
04387
04388
04389 char *
04390 convert_http_hdr_to_string(TSMBuffer bufp, TSMLoc hdr_loc)
04391 {
04392 TSIOBuffer output_buffer;
04393 TSIOBufferReader reader;
04394 int64_t total_avail;
04395
04396 TSIOBufferBlock block;
04397 const char *block_start;
04398 int64_t block_avail;
04399
04400 char *output_string;
04401 int output_len;
04402
04403 output_buffer = TSIOBufferCreate();
04404
04405 if (!output_buffer) {
04406 TSError("couldn't allocate IOBuffer\n");
04407 }
04408
04409 reader = TSIOBufferReaderAlloc(output_buffer);
04410
04411
04412
04413 TSHttpHdrPrint(bufp, hdr_loc, output_buffer);
04414
04415
04416
04417
04418
04419 total_avail = TSIOBufferReaderAvail(reader);
04420
04421
04422
04423 output_string = (char *) TSmalloc(total_avail + 1);
04424 output_len = 0;
04425
04426
04427
04428
04429 block = TSIOBufferReaderStart(reader);
04430 while (block) {
04431
04432 block_start = TSIOBufferBlockReadStart(block, reader, &block_avail);
04433
04434
04435
04436
04437
04438
04439 if (block_avail == 0) {
04440 break;
04441 }
04442
04443 memcpy(output_string + output_len, block_start, block_avail);
04444 output_len += block_avail;
04445
04446
04447 TSIOBufferReaderConsume(reader, block_avail);
04448
04449
04450
04451 block = TSIOBufferReaderStart(reader);
04452 }
04453
04454
04455 output_string[output_len] = '\0';
04456 output_len++;
04457
04458
04459 TSIOBufferReaderFree(reader);
04460 TSIOBufferDestroy(output_buffer);
04461
04462 return output_string;
04463 }
04464
04465 REGRESSION_TEST(SDK_API_TSHttpHdrParse) (RegressionTest * test, int , int *pstatus)
04466 {
04467 const char *req =
04468 "GET http://www.example.com/ HTTP/1.1\r\nmimefield1:field1value1,field1value2\r\nmimefield2:field2value1,field2value2\r\n\r\n";
04469 const char *resp =
04470 "HTTP/1.1 200 OK\r\n1mimefield:1field1value,1field2value\r\n2mimefield:2field1value,2field2value\r\n\r\n";
04471 const char *start;
04472 const char *end;
04473 char *temp;
04474
04475 int retval;
04476
04477 TSMBuffer reqbufp;
04478 TSMBuffer respbufp = (TSMBuffer)NULL;
04479
04480 TSMLoc req_hdr_loc = (TSMLoc)NULL;
04481 TSMLoc resp_hdr_loc = (TSMLoc)NULL;
04482
04483 TSHttpParser parser;
04484
04485 bool test_passed_parse_req = false;
04486 bool test_passed_parse_resp = false;
04487 bool test_passed_parser_clear = false;
04488 bool test_passed_parser_destroy = false;
04489
04490
04491 parser = TSHttpParserCreate();
04492 SDK_RPRINT(test, "TSHttpParserCreate", "TestCase1", TC_PASS, "ok");
04493
04494
04495 reqbufp = TSMBufferCreate();
04496 req_hdr_loc = TSHttpHdrCreate(reqbufp);
04497 start = req;
04498 end = req + strlen(req) + 1;
04499 if ((retval = TSHttpHdrParseReq(parser, reqbufp, req_hdr_loc, &start, end)) == TS_PARSE_ERROR) {
04500 SDK_RPRINT(test, "TSHttpHdrParseReq", "TestCase1", TC_FAIL, "TSHttpHdrParseReq returns TS_PARSE_ERROR");
04501 } else {
04502 if (retval == TS_PARSE_DONE) {
04503 test_passed_parse_req = true;
04504 } else {
04505 SDK_RPRINT(test, "TSHttpHdrParseReq", "TestCase1", TC_FAIL, "Parsing Error");
04506 }
04507 }
04508
04509 TSHttpParserClear(parser);
04510 SDK_RPRINT(test, "TSHttpParserClear", "TestCase1", TC_PASS, "ok");
04511 test_passed_parser_clear = true;
04512
04513
04514 if (test_passed_parser_clear == true) {
04515 respbufp = TSMBufferCreate();
04516 resp_hdr_loc = TSHttpHdrCreate(respbufp);
04517 start = resp;
04518 end = resp + strlen(resp) + 1;
04519 if ((retval = TSHttpHdrParseResp(parser, respbufp, resp_hdr_loc, &start, end)) == TS_PARSE_ERROR) {
04520 SDK_RPRINT(test, "TSHttpHdrParseResp", "TestCase1", TC_FAIL, "TSHttpHdrParseResp returns TS_PARSE_ERROR.");
04521 } else {
04522 if (retval == TS_PARSE_DONE) {
04523 test_passed_parse_resp = true;
04524 } else {
04525 SDK_RPRINT(test, "TSHttpHdrParseResp", "TestCase1", TC_FAIL, "Parsing Error");
04526 }
04527 }
04528 }
04529
04530 if (test_passed_parse_req == true) {
04531 temp = convert_http_hdr_to_string(reqbufp, req_hdr_loc);
04532 if (strcmp(req, temp) == 0) {
04533 SDK_RPRINT(test, "TSHttpHdrParseReq", "TestCase1", TC_PASS, "ok");
04534 } else {
04535 SDK_RPRINT(test, "TSHttpHdrParseReq", "TestCase1", TC_FAIL, "Incorrect parsing");
04536 test_passed_parse_req = false;
04537 }
04538 TSfree(temp);
04539 }
04540
04541 if (test_passed_parse_resp == true) {
04542 temp = convert_http_hdr_to_string(respbufp, resp_hdr_loc);
04543 if (strcmp(resp, temp) == 0) {
04544 SDK_RPRINT(test, "TSHttpHdrParseResp", "TestCase1", TC_PASS, "ok");
04545 } else {
04546 SDK_RPRINT(test, "TSHttpHdrParseResp", "TestCase1", TC_FAIL, "Incorrect parsing");
04547 test_passed_parse_resp = false;
04548 }
04549 TSfree(temp);
04550 }
04551
04552 TSHttpParserDestroy(parser);
04553 SDK_RPRINT(test, "TSHttpParserDestroy", "TestCase1", TC_PASS, "ok");
04554 test_passed_parser_destroy = true;
04555
04556 if ((test_passed_parse_req != true) ||
04557 (test_passed_parse_resp != true) || (test_passed_parser_clear != true) || (test_passed_parser_destroy != true)) {
04558 *pstatus = REGRESSION_TEST_FAILED;
04559 } else {
04560 *pstatus = REGRESSION_TEST_PASSED;
04561 }
04562
04563 TSMimeHdrDestroy(reqbufp, req_hdr_loc);
04564 TSHandleMLocRelease(reqbufp, TS_NULL_MLOC, req_hdr_loc);
04565 TSMBufferDestroy(reqbufp);
04566
04567 if (resp_hdr_loc) {
04568 TSMimeHdrDestroy(respbufp, resp_hdr_loc);
04569 TSHandleMLocRelease(respbufp, TS_NULL_MLOC, resp_hdr_loc);
04570 }
04571
04572 if (respbufp) {
04573 TSMBufferDestroy(respbufp);
04574 }
04575
04576 return;
04577 }
04578
04579
04580
04581
04582
04583
04584
04585
04586
04587
04588
04589
04590
04591
04592
04593
04594
04595
04596
04597
04598
04599
04600
04601 static char *
04602 convert_mime_hdr_to_string(TSMBuffer bufp, TSMLoc hdr_loc)
04603 {
04604 TSIOBuffer output_buffer;
04605 TSIOBufferReader reader;
04606 int64_t total_avail;
04607
04608 TSIOBufferBlock block;
04609 const char *block_start;
04610 int64_t block_avail;
04611
04612 char *output_string;
04613 int output_len;
04614
04615 output_buffer = TSIOBufferCreate();
04616
04617 if (!output_buffer) {
04618 TSError("couldn't allocate IOBuffer\n");
04619 }
04620
04621 reader = TSIOBufferReaderAlloc(output_buffer);
04622
04623
04624
04625 TSMimeHdrPrint(bufp, hdr_loc, output_buffer);
04626
04627
04628
04629
04630
04631 total_avail = TSIOBufferReaderAvail(reader);
04632
04633
04634
04635 output_string = (char *) TSmalloc(total_avail + 1);
04636 output_len = 0;
04637
04638
04639
04640
04641 block = TSIOBufferReaderStart(reader);
04642 while (block) {
04643
04644 block_start = TSIOBufferBlockReadStart(block, reader, &block_avail);
04645
04646
04647
04648
04649
04650
04651 if (block_avail == 0) {
04652 break;
04653 }
04654
04655 memcpy(output_string + output_len, block_start, block_avail);
04656 output_len += block_avail;
04657
04658
04659 TSIOBufferReaderConsume(reader, block_avail);
04660
04661
04662
04663 block = TSIOBufferReaderStart(reader);
04664 }
04665
04666
04667 output_string[output_len] = '\0';
04668 output_len++;
04669
04670
04671 TSIOBufferReaderFree(reader);
04672 TSIOBufferDestroy(output_buffer);
04673
04674 return output_string;
04675 }
04676
04677 TSReturnCode
04678 compare_field_values(RegressionTest * test, TSMBuffer bufp1, TSMLoc hdr_loc1, TSMLoc field_loc1, TSMBuffer bufp2,
04679 TSMLoc hdr_loc2, TSMLoc field_loc2)
04680 {
04681 int no_of_values1;
04682 int no_of_values2;
04683 int i;
04684
04685 const char *str1 = NULL;
04686 const char *str2 = NULL;
04687
04688 int length1 = 0;
04689 int length2 = 0;
04690
04691 no_of_values1 = TSMimeHdrFieldValuesCount(bufp1, hdr_loc1, field_loc1);
04692 no_of_values2 = TSMimeHdrFieldValuesCount(bufp2, hdr_loc2, field_loc2);
04693 if (no_of_values1 != no_of_values2) {
04694 SDK_RPRINT(test, "compare_field_values", "TestCase", TC_FAIL, "Field Values not equal");
04695 return TS_ERROR;
04696 }
04697
04698 for (i = 0; i < no_of_values1; i++) {
04699 str1 = TSMimeHdrFieldValueStringGet(bufp1, hdr_loc1, field_loc1, i, &length1);
04700 str2 = TSMimeHdrFieldValueStringGet(bufp2, hdr_loc2, field_loc2, i, &length2);
04701 if (!((length1 == length2) && (strncmp(str1, str2, length1) == 0))) {
04702 SDK_RPRINT(test, "compare_field_values", "TestCase", TC_FAIL, "Field Value %d differ from each other", i);
04703 return TS_ERROR;
04704 }
04705 }
04706
04707 return TS_SUCCESS;
04708 }
04709
04710
04711 REGRESSION_TEST(SDK_API_TSMimeHdrParse) (RegressionTest * test, int , int *pstatus)
04712 {
04713 const char *parse_string =
04714 "field1:field1Value1,field1Value2\r\nfield2:10,-34,45\r\nfield3:field3Value1,23\r\nfield2: 2345, field2Value2\r\n\r\n";
04715 const char *DUPLICATE_FIELD_NAME = "field2";
04716 const char *REMOVE_FIELD_NAME = "field3";
04717
04718 TSMimeParser parser;
04719
04720 TSMBuffer bufp1 = (TSMBuffer)NULL;
04721 TSMBuffer bufp2 = (TSMBuffer)NULL;
04722 TSMBuffer bufp3 = (TSMBuffer)NULL;
04723
04724 TSMLoc mime_hdr_loc1 = (TSMLoc)NULL;
04725 TSMLoc mime_hdr_loc2 = (TSMLoc)NULL;
04726 TSMLoc mime_hdr_loc3 = (TSMLoc)NULL;
04727
04728 TSMLoc field_loc1 = (TSMLoc)NULL;
04729 TSMLoc field_loc2 = (TSMLoc)NULL;
04730
04731 const char *start;
04732 const char *end;
04733 char *temp;
04734
04735 TSParseResult retval;
04736 int hdrLength;
04737
04738 bool test_passed_parser_create = false;
04739 bool test_passed_parse = false;
04740 bool test_passed_parser_clear = false;
04741 bool test_passed_parser_destroy = false;
04742 bool test_passed_mime_hdr_print = false;
04743 bool test_passed_mime_hdr_length_get = false;
04744 bool test_passed_mime_hdr_field_next_dup = false;
04745 bool test_passed_mime_hdr_copy = false;
04746 bool test_passed_mime_hdr_clone = false;
04747 bool test_passed_mime_hdr_field_remove = false;
04748 bool test_passed_mime_hdr_field_copy = false;
04749 bool test_passed_mime_hdr_field_copy_values = false;
04750 bool test_passed_handle_mloc_release = false;
04751 bool test_passed_mime_hdr_field_find = false;
04752
04753
04754 parser = TSMimeParserCreate();
04755 SDK_RPRINT(test, "TSMimeParserCreate", "TestCase1", TC_PASS, "ok");
04756 test_passed_parser_create = true;
04757
04758 if (test_passed_parser_create == true) {
04759
04760 bufp1 = TSMBufferCreate();
04761 if (TSMimeHdrCreate(bufp1, &mime_hdr_loc1) != TS_SUCCESS) {
04762 SDK_RPRINT(test, "TSMimeHdrParse", "TestCase1", TC_FAIL, "Cannot create Mime hdr for parsing");
04763 SDK_RPRINT(test, "TSMimeHdrPrint", "TestCase1", TC_FAIL, "Cannot run test as unable to create Mime Header for parsing");
04764 SDK_RPRINT(test, "TSMimeHdrLengthGet", "TestCase1", TC_FAIL, "Cannot run test as unable to create Mime Header for parsing");
04765
04766 if (TSMBufferDestroy(bufp1) == TS_ERROR) {
04767 SDK_RPRINT(test, "TSMimeHdrParse", "TestCase1", TC_FAIL, "Error in Destroying MBuffer");
04768 }
04769 } else {
04770 start = parse_string;
04771 end = parse_string + strlen(parse_string) + 1;
04772 if ((retval = TSMimeHdrParse(parser, bufp1, mime_hdr_loc1, &start, end)) == TS_PARSE_ERROR) {
04773 SDK_RPRINT(test, "TSMimeHdrParse", "TestCase1", TC_FAIL, "TSMimeHdrParse returns TS_PARSE_ERROR");
04774 SDK_RPRINT(test, "TSMimeHdrPrint", "TestCase1", TC_FAIL, "Cannot run test as TSMimeHdrParse returned Error.");
04775 SDK_RPRINT(test, "TSMimeHdrLengthGet", "TestCase1", TC_FAIL, "Cannot run test as TSMimeHdrParse returned Error.");
04776 } else {
04777 if (retval == TS_PARSE_DONE) {
04778 temp = convert_mime_hdr_to_string(bufp1, mime_hdr_loc1);
04779 if (strcmp(parse_string, temp) == 0) {
04780 SDK_RPRINT(test, "TSMimeHdrParse", "TestCase1", TC_PASS, "ok");
04781 SDK_RPRINT(test, "TSMimeHdrPrint", "TestCase1", TC_PASS, "ok");
04782
04783
04784 hdrLength = TSMimeHdrLengthGet(bufp1, mime_hdr_loc1);
04785 if (hdrLength == (int) strlen(temp)) {
04786 SDK_RPRINT(test, "TSMimeHdrLengthGet", "TestCase1", TC_PASS, "ok");
04787 test_passed_mime_hdr_length_get = true;
04788 } else {
04789 SDK_RPRINT(test, "TSMimeHdrLengthGet", "TestCase1", TC_FAIL, "Value's Mismatch");
04790 }
04791
04792 test_passed_parse = true;
04793 test_passed_mime_hdr_print = true;
04794 } else {
04795 SDK_RPRINT(test, "TSMimeHdrParse|TSMimeHdrPrint", "TestCase1", TC_FAIL, "Incorrect parsing or incorrect Printing");
04796 SDK_RPRINT(test, "TSMimeHdrLengthGet", "TestCase1", TC_FAIL,
04797 "Cannot run test as TSMimeHdrParse|TSMimeHdrPrint failed.");
04798 }
04799
04800 TSfree(temp);
04801 } else {
04802 SDK_RPRINT(test, "TSMimeHdrParse", "TestCase1", TC_FAIL, "Parsing Error");
04803 SDK_RPRINT(test, "TSMimeHdrPrint", "TestCase1", TC_FAIL, "Cannot run test as TSMimeHdrParse returned error.");
04804 SDK_RPRINT(test, "TSMimeHdrLengthGet", "TestCase1", TC_FAIL, "Cannot run test as TSMimeHdrParse returned error.");
04805 }
04806 }
04807 }
04808 } else {
04809 SDK_RPRINT(test, "TSMimeHdrParse", "TestCase1", TC_FAIL, "Cannot run test as unable to create a parser");
04810 SDK_RPRINT(test, "TSMimeHdrPrint", "TestCase1", TC_FAIL, "Cannot run test as unable to create a parser");
04811 SDK_RPRINT(test, "TSMimeHdrLengthGet", "TestCase1", TC_FAIL, "Cannot run test as unable to create a parser");
04812 }
04813
04814
04815
04816 if (test_passed_parser_create == true) {
04817 TSMimeParserClear(parser);
04818 SDK_RPRINT(test, "TSMimeParserClear", "TestCase1", TC_PASS, "ok");
04819 test_passed_parser_clear = true;
04820 } else {
04821 SDK_RPRINT(test, "TSMimeParserClear", "TestCase1", TC_FAIL, "Cannot run test as unable to create a parser");
04822 }
04823
04824
04825 if (test_passed_parser_create == true) {
04826 TSMimeParserDestroy(parser);
04827 SDK_RPRINT(test, "TSMimeParserDestroy", "TestCase1", TC_PASS, "ok");
04828 test_passed_parser_destroy = true;
04829 } else {
04830 SDK_RPRINT(test, "TSMimeParserDestroy", "TestCase1", TC_FAIL, "Cannot run test as unable to create a parser");
04831 }
04832
04833
04834 if (test_passed_parse == true) {
04835 if ((field_loc1 = TSMimeHdrFieldFind(bufp1, mime_hdr_loc1, DUPLICATE_FIELD_NAME, -1)) == TS_NULL_MLOC) {
04836 SDK_RPRINT(test, "TSMimeHdrFieldNextDup", "TestCase1", TC_FAIL, "TSMimeHdrFieldFind returns TS_NULL_MLOC");
04837 SDK_RPRINT(test, "TSMimeHdrFieldFind", "TestCase1", TC_PASS, "TSMimeHdrFieldFind returns TS_NULL_MLOC");
04838 } else {
04839 const char *fieldName;
04840 int length;
04841
04842 fieldName = TSMimeHdrFieldNameGet(bufp1, mime_hdr_loc1, field_loc1, &length);
04843 if (strncmp(fieldName, DUPLICATE_FIELD_NAME, length) == 0) {
04844 SDK_RPRINT(test, "TSMimeHdrFieldFind", "TestCase1", TC_PASS, "ok");
04845 test_passed_mime_hdr_field_find = true;
04846 } else {
04847 SDK_RPRINT(test, "TSMimeHdrFieldFind", "TestCase1", TC_PASS, "TSMimeHdrFieldFind returns incorrect field pointer");
04848 }
04849
04850 field_loc2 = TSMimeHdrFieldNextDup(bufp1, mime_hdr_loc1, field_loc1);
04851 if (compare_field_names(test, bufp1, mime_hdr_loc1, field_loc1, bufp1, mime_hdr_loc1, field_loc2) == TS_ERROR) {
04852 SDK_RPRINT(test, "TSMimeHdrFieldNextDup", "TestCase1", TC_FAIL, "Incorrect Pointer");
04853 } else {
04854 SDK_RPRINT(test, "TSMimeHdrFieldNextDup", "TestCase1", TC_PASS, "ok");
04855 test_passed_mime_hdr_field_next_dup = true;
04856 }
04857
04858
04859 if (TSHandleMLocRelease(bufp1, mime_hdr_loc1, field_loc1) == TS_ERROR) {
04860 SDK_RPRINT(test, "TSHandleMLocRelease", "TestCase1", TC_FAIL, "TSHandleMLocRelease returns TS_ERROR");
04861 } else {
04862 SDK_RPRINT(test, "TSHandleMLocRelease", "TestCase1", TC_PASS, "ok");
04863 test_passed_handle_mloc_release = true;
04864 }
04865
04866 if (field_loc2 != NULL) {
04867 if (TSHandleMLocRelease(bufp1, mime_hdr_loc1, field_loc2) == TS_ERROR) {
04868 SDK_RPRINT(test, "TSHandleMLocRelease", "TestCase2", TC_FAIL, "TSHandleMLocRelease returns TS_ERROR");
04869 test_passed_handle_mloc_release = false;
04870 } else {
04871 SDK_RPRINT(test, "TSHandleMLocRelease", "TestCase2", TC_PASS, "ok");
04872 }
04873 }
04874 }
04875 } else {
04876 SDK_RPRINT(test, "TSMimeHdrFieldNext", "TestCase1", TC_FAIL, "Unable to run test as parsing failed.");
04877 }
04878
04879
04880 if (test_passed_parse == true) {
04881
04882 bufp2 = TSMBufferCreate();
04883 if (TSMimeHdrCreate(bufp2, &mime_hdr_loc2) != TS_SUCCESS) {
04884 SDK_RPRINT(test, "TSMimeHdrCopy", "TestCase1", TC_FAIL, "Cannot create Mime hdr for copying");
04885 if (TSMBufferDestroy(bufp2) == TS_ERROR) {
04886 SDK_RPRINT(test, "TSMimeHdrCopy", "TestCase1", TC_FAIL, "Error in Destroying MBuffer");
04887 }
04888 } else {
04889 if (TSMimeHdrCopy(bufp2, mime_hdr_loc2, bufp1, mime_hdr_loc1) == TS_ERROR) {
04890 SDK_RPRINT(test, "TSMimeHdrCopy", "TestCase1", TC_FAIL, "TSMimeHdrCopy returns TS_ERROR");
04891 } else {
04892 temp = convert_mime_hdr_to_string(bufp2, mime_hdr_loc2);
04893 if (strcmp(parse_string, temp) == 0) {
04894 SDK_RPRINT(test, "TSMimeHdrCopy", "TestCase1", TC_PASS, "ok");
04895 test_passed_mime_hdr_copy = true;
04896 } else {
04897 SDK_RPRINT(test, "TSMimeHdrCopy", "TestCase1", TC_FAIL, "Value's Mismatch");
04898 }
04899 TSfree(temp);
04900 }
04901 }
04902 } else {
04903 SDK_RPRINT(test, "TSMimeHdrCopy", "TestCase1", TC_FAIL, "Unable to run test as parsing failed.");
04904 }
04905
04906 bufp3 = TSMBufferCreate();
04907 TSMimeHdrCreate(bufp3, &mime_hdr_loc3);
04908 test_passed_mime_hdr_clone = true;
04909
04910
04911 if (test_passed_mime_hdr_copy == true) {
04912 if ((field_loc1 = TSMimeHdrFieldFind(bufp2, mime_hdr_loc2, REMOVE_FIELD_NAME, -1)) == TS_NULL_MLOC) {
04913 SDK_RPRINT(test, "TSMimeHdrFieldRemove", "TestCase1", TC_FAIL, "TSMimeHdrFieldFind returns TS_NULL_MLOC");
04914 } else {
04915 if (TSMimeHdrFieldRemove(bufp2, mime_hdr_loc2, field_loc1) != TS_SUCCESS) {
04916 SDK_RPRINT(test, "TSMimeHdrFieldRemove", "TestCase1", TC_FAIL, "TSMimeHdrFieldRemove returns TS_ERROR");
04917 } else {
04918
04919 field_loc2 = TSMimeHdrFieldFind(bufp2, mime_hdr_loc2, REMOVE_FIELD_NAME, -1);
04920 if ((field_loc2 == TS_NULL_MLOC) || (field_loc1 != field_loc2)) {
04921 test_passed_mime_hdr_field_remove = true;
04922 } else {
04923 SDK_RPRINT(test, "TSMimeHdrFieldRemove", "TestCase1", TC_FAIL, "Field Not Removed");
04924 }
04925
04926 if (test_passed_mime_hdr_field_remove == true) {
04927 if (TSMimeHdrFieldAppend(bufp2, mime_hdr_loc2, field_loc1) != TS_SUCCESS) {
04928 SDK_RPRINT(test, "TSMimeHdrFieldRemove", "TestCase1", TC_FAIL,
04929 "Unable to readd the field to mime header. Probably destroyed");
04930 test_passed_mime_hdr_field_remove = false;
04931 } else {
04932 SDK_RPRINT(test, "TSMimeHdrFieldRemove", "TestCase1", TC_PASS, "ok");
04933 }
04934 }
04935 }
04936
04937
04938 if (TSHandleMLocRelease(bufp2, mime_hdr_loc2, field_loc1) == TS_ERROR) {
04939 SDK_RPRINT(test, "TSHandleMLocRelease", "TestCase3", TC_FAIL, "TSHandleMLocRelease returns TS_ERROR");
04940 test_passed_handle_mloc_release = false;
04941 } else {
04942 SDK_RPRINT(test, "TSHandleMLocRelease", "TestCase3", TC_PASS, "ok");
04943 }
04944
04945 if (field_loc2 != NULL) {
04946 if (TSHandleMLocRelease(bufp2, mime_hdr_loc2, field_loc2) == TS_ERROR) {
04947 SDK_RPRINT(test, "TSHandleMLocRelease", "TestCase4", TC_FAIL, "TSHandleMLocRelease returns TS_ERROR");
04948 test_passed_handle_mloc_release = false;
04949 } else {
04950 SDK_RPRINT(test, "TSHandleMLocRelease", "TestCase4", TC_PASS, "ok");
04951 }
04952 }
04953 }
04954 } else {
04955 SDK_RPRINT(test, "TSMimeHdrFieldNext", "TestCase1", TC_FAIL, "Unable to run test as parsing failed.");
04956 }
04957
04958
04959 if (test_passed_mime_hdr_copy == true) {
04960 if (TSMimeHdrFieldCreate(bufp2, mime_hdr_loc2, &field_loc1) != TS_SUCCESS) {
04961 SDK_RPRINT(test, "TSMimeHdrFieldCopy", "TestCase1", TC_FAIL, "Unable to create field for Copying");
04962 } else {
04963 if ((field_loc2 = TSMimeHdrFieldGet(bufp1, mime_hdr_loc1, 0)) == TS_NULL_MLOC) {
04964 SDK_RPRINT(test, "TSMimeHdrFieldCopy", "TestCase1", TC_FAIL, "Unable to get source field for copying");
04965 } else {
04966 if (TSMimeHdrFieldCopy(bufp2, mime_hdr_loc2, field_loc1, bufp1, mime_hdr_loc1, field_loc2) == TS_ERROR) {
04967 SDK_RPRINT(test, "TSMimeHdrFieldCopy", "TestCase1", TC_FAIL, "TSMimeHdrFieldCopy returns TS_ERROR");
04968 } else {
04969 if ((compare_field_names(test, bufp2, mime_hdr_loc2, field_loc1, bufp1, mime_hdr_loc1, field_loc2) == TS_ERROR) ||
04970 (compare_field_values(test, bufp2, mime_hdr_loc2, field_loc1, bufp1, mime_hdr_loc1, field_loc2) == TS_ERROR)) {
04971 SDK_RPRINT(test, "TSMimeHdrFieldCopy", "TestCase1", TC_FAIL, "Value's Mismatch");
04972 } else {
04973 SDK_RPRINT(test, "TSMimeHdrFieldCopy", "TestCase1", TC_PASS, "ok");
04974 test_passed_mime_hdr_field_copy = true;
04975 }
04976 }
04977 }
04978 if (TSHandleMLocRelease(bufp2, mime_hdr_loc2, field_loc1) == TS_ERROR) {
04979 SDK_RPRINT(test, "TSHandleMLocRelease", "TestCase5", TC_FAIL, "TSHandleMLocRelease returns TS_ERROR");
04980 test_passed_handle_mloc_release = false;
04981 } else {
04982 SDK_RPRINT(test, "TSHandleMLocRelease", "TestCase5", TC_PASS, "ok");
04983 }
04984
04985 if (field_loc2 != NULL) {
04986 if (TSHandleMLocRelease(bufp1, mime_hdr_loc1, field_loc2) == TS_ERROR) {
04987 SDK_RPRINT(test, "TSHandleMLocRelease", "TestCase6", TC_FAIL, "TSHandleMLocRelease returns TS_ERROR");
04988 test_passed_handle_mloc_release = false;
04989 } else {
04990 SDK_RPRINT(test, "TSHandleMLocRelease", "TestCase6", TC_PASS, "ok");
04991 }
04992 }
04993 }
04994 } else {
04995 SDK_RPRINT(test, "TSMimeHdrFieldCopy", "TestCase1", TC_FAIL, "Unable to run test as bufp2 might not have been created");
04996 }
04997
04998
04999 if (test_passed_mime_hdr_clone == true) {
05000 field_loc1 = NULL;
05001 field_loc2 = NULL;
05002 if ((field_loc2 = TSMimeHdrFieldGet(bufp1, mime_hdr_loc1, 0)) == TS_NULL_MLOC) {
05003 SDK_RPRINT(test, "TSMimeHdrFieldClone", "TestCase1", TC_FAIL, "Unable to get source field for copying");
05004 } else {
05005 if (TSMimeHdrFieldClone(bufp3, mime_hdr_loc3, bufp1, mime_hdr_loc1, field_loc2, &field_loc1) != TS_SUCCESS) {
05006 SDK_RPRINT(test, "TSMimeHdrFieldClone", "TestCase1", TC_FAIL, "TSMimeHdrFieldClone returns TS_ERROR");
05007 } else {
05008 if ((compare_field_names(test, bufp3, mime_hdr_loc3, field_loc1, bufp1, mime_hdr_loc1, field_loc2) == TS_ERROR) ||
05009 (compare_field_values(test, bufp3, mime_hdr_loc3, field_loc1, bufp1, mime_hdr_loc1, field_loc2) == TS_ERROR)) {
05010 SDK_RPRINT(test, "TSMimeHdrFieldClone", "TestCase1", TC_FAIL, "Value's Mismatch");
05011 } else {
05012 SDK_RPRINT(test, "TSMimeHdrFieldClone", "TestCase1", TC_PASS, "ok");
05013 }
05014 }
05015 }
05016 if (field_loc1 != NULL) {
05017 if (TSHandleMLocRelease(bufp3, mime_hdr_loc3, field_loc1) == TS_ERROR) {
05018 SDK_RPRINT(test, "TSHandleMLocRelease", "TestCase7", TC_FAIL, "TSHandleMLocRelease returns TS_ERROR");
05019 test_passed_handle_mloc_release = false;
05020 } else {
05021 SDK_RPRINT(test, "TSHandleMLocRelease", "TestCase7", TC_PASS, "ok");
05022 }
05023 }
05024
05025 if (field_loc2 != NULL) {
05026 if (TSHandleMLocRelease(bufp1, mime_hdr_loc1, field_loc2) == TS_ERROR) {
05027 SDK_RPRINT(test, "TSHandleMLocRelease", "TestCase8", TC_FAIL, "TSHandleMLocRelease returns TS_ERROR");
05028 test_passed_handle_mloc_release = false;
05029 } else {
05030 SDK_RPRINT(test, "TSHandleMLocRelease", "TestCase8", TC_PASS, "ok");
05031 }
05032 }
05033 } else {
05034 SDK_RPRINT(test, "TSMimeHdrFieldClone", "TestCase1", TC_FAIL, "Unable to run test as bufp3 might not have been created");
05035 }
05036
05037
05038 if (test_passed_mime_hdr_copy == true) {
05039 if (TSMimeHdrFieldCreate(bufp2, mime_hdr_loc2, &field_loc1) != TS_SUCCESS) {
05040 SDK_RPRINT(test, "TSMimeHdrFieldCopyValues", "TestCase1", TC_FAIL, "Unable to create field for Copying");
05041 } else {
05042 if ((field_loc2 = TSMimeHdrFieldGet(bufp1, mime_hdr_loc1, 0)) == TS_NULL_MLOC) {
05043 SDK_RPRINT(test, "TSMimeHdrFieldCopyValues", "TestCase1", TC_FAIL, "Unable to get source field for copying");
05044 } else {
05045 if (TSMimeHdrFieldCopyValues(bufp2, mime_hdr_loc2, field_loc1, bufp1, mime_hdr_loc1, field_loc2) == TS_ERROR) {
05046 SDK_RPRINT(test, "TSMimeHdrFieldCopyValues", "TestCase1", TC_FAIL, "TSMimeHdrFieldCopy returns TS_ERROR");
05047 } else {
05048 if (compare_field_values(test, bufp2, mime_hdr_loc2, field_loc1, bufp1, mime_hdr_loc1, field_loc2) == TS_ERROR) {
05049 SDK_RPRINT(test, "TSMimeHdrFieldCopyValues", "TestCase1", TC_FAIL, "Value's Mismatch");
05050 } else {
05051 SDK_RPRINT(test, "TSMimeHdrFieldCopyValues", "TestCase1", TC_PASS, "ok");
05052 test_passed_mime_hdr_field_copy_values = true;
05053 }
05054 }
05055 }
05056 if (TSHandleMLocRelease(bufp2, mime_hdr_loc2, field_loc1) == TS_ERROR) {
05057 SDK_RPRINT(test, "TSHandleMLocRelease", "TestCase9", TC_FAIL, "TSHandleMLocRelease returns TS_ERROR");
05058 test_passed_handle_mloc_release = false;
05059 } else {
05060 SDK_RPRINT(test, "TSHandleMLocRelease", "TestCase9", TC_PASS, "ok");
05061 }
05062
05063 if (field_loc2 != NULL) {
05064 if (TSHandleMLocRelease(bufp1, mime_hdr_loc1, field_loc2) == TS_ERROR) {
05065 SDK_RPRINT(test, "TSHandleMLocRelease", "TestCase10", TC_FAIL, "TSHandleMLocRelease returns TS_ERROR");
05066 test_passed_handle_mloc_release = false;
05067 } else {
05068 SDK_RPRINT(test, "TSHandleMLocRelease", "TestCase10", TC_PASS, "ok");
05069 }
05070 }
05071 }
05072 } else {
05073 SDK_RPRINT(test, "TSMimeHdrFieldCopy", "TestCase1", TC_FAIL, "Unable to run test as bufp2 might not have been created");
05074 }
05075
05076 if ((TSMimeHdrDestroy(bufp1, mime_hdr_loc1) == TS_ERROR) ||
05077 (TSMimeHdrDestroy(bufp2, mime_hdr_loc2) == TS_ERROR) || (TSMimeHdrDestroy(bufp3, mime_hdr_loc3) == TS_ERROR)) {
05078 SDK_RPRINT(test, "", "TestCase", TC_FAIL, "TSMimeHdrDestroy returns TS_ERROR");
05079 }
05080
05081 if (TSHandleMLocRelease(bufp1, TS_NULL_MLOC, mime_hdr_loc1) == TS_ERROR) {
05082 SDK_RPRINT(test, "TSHandleMLocRelease", "TestCase11|12|13", TC_FAIL, "Unable to release mime_hdr_loc1 to Mime Hdrs");
05083 test_passed_handle_mloc_release = false;
05084 }
05085
05086 if (TSHandleMLocRelease(bufp2, TS_NULL_MLOC, mime_hdr_loc2) == TS_ERROR) {
05087 SDK_RPRINT(test, "TSHandleMLocRelease", "TestCase11|12|13", TC_FAIL, "Unable to release mime_hdr_loc2 to Mime Hdrs");
05088 test_passed_handle_mloc_release = false;
05089 }
05090
05091 if (TSHandleMLocRelease(bufp3, TS_NULL_MLOC, mime_hdr_loc3) == TS_ERROR) {
05092 SDK_RPRINT(test, "TSHandleMLocRelease", "TestCase11|12|13", TC_FAIL, "Unable to release mime_hdr_loc3 to Mime Hdrs");
05093 test_passed_handle_mloc_release = false;
05094 }
05095
05096 if (TSMBufferDestroy(bufp1) == TS_ERROR) {
05097 SDK_RPRINT(test, "", "TestCase", TC_FAIL, "TSMBufferDestroy(bufp1) returns TS_ERROR");
05098 }
05099
05100 if (TSMBufferDestroy(bufp2) == TS_ERROR) {
05101 SDK_RPRINT(test, "", "TestCase", TC_FAIL, "TSMBufferDestroy(bufp2) returns TS_ERROR");
05102 }
05103
05104 if (TSMBufferDestroy(bufp3) == TS_ERROR) {
05105 SDK_RPRINT(test, "", "TestCase", TC_FAIL, "TSMBufferDestroy(bufp3) returns TS_ERROR");
05106 }
05107
05108 if ((test_passed_parser_create != true) ||
05109 (test_passed_parse != true) ||
05110 (test_passed_parser_clear != true) ||
05111 (test_passed_parser_destroy != true) ||
05112 (test_passed_mime_hdr_print != true) ||
05113 (test_passed_mime_hdr_length_get != true) ||
05114 (test_passed_mime_hdr_field_next_dup != true) ||
05115 (test_passed_mime_hdr_copy != true) ||
05116 (test_passed_mime_hdr_clone != true) ||
05117 (test_passed_mime_hdr_field_remove != true) ||
05118 (test_passed_mime_hdr_field_copy != true) ||
05119 (test_passed_mime_hdr_field_copy_values != true) ||
05120 (test_passed_handle_mloc_release != true) ||
05121 (test_passed_mime_hdr_field_find != true)) {
05122 *pstatus = REGRESSION_TEST_FAILED;
05123 } else {
05124 *pstatus = REGRESSION_TEST_PASSED;
05125 }
05126
05127 }
05128
05129
05130
05131
05132
05133
05134
05135 REGRESSION_TEST(SDK_API_TSUrlParse) (RegressionTest * test, int , int *pstatus)
05136 {
05137 static char const * const urls[] = {
05138 "file:///test.dat;ab?abc=def#abc",
05139 "http://www.example.com",
05140 "http://abc:def@www.example.com",
05141 "http://www.example.com:3426",
05142 "http://abc:def@www.example.com:3426",
05143 "http://www.example.com/homepage.cgi",
05144 "http://www.example.com/homepage.cgi;ab?abc=def#abc",
05145 "http://abc:def@www.example.com:3426/homepage.cgi;ab?abc=def#abc",
05146 "https://abc:def@www.example.com:3426/homepage.cgi;ab?abc=def#abc",
05147 "ftp://abc:def@www.example.com:3426/homepage.cgi;ab?abc=def#abc",
05148 "file:///c:/test.dat;ab?abc=def#abc",
05149 "file:///test.dat;ab?abc=def#abc",
05150 "foo://bar.com/baz/",
05151 "http://a.b.com/xx.jpg?newpath=http://b.c.com"
05152 };
05153
05154 static int const num_urls = sizeof(urls) / sizeof(urls[0]);
05155 bool test_passed[num_urls] = {false};
05156
05157
05158 const char *start;
05159 const char *end;
05160 char *temp;
05161
05162 int retval;
05163
05164 TSMBuffer bufp;
05165 TSMLoc url_loc = (TSMLoc)NULL;
05166 int length;
05167
05168 *pstatus = REGRESSION_TEST_INPROGRESS;
05169
05170
05171 int idx;
05172 for (idx = 0; idx < num_urls; idx++) {
05173 char const *url = urls[idx];
05174
05175 bufp = TSMBufferCreate();
05176 if (TSUrlCreate(bufp, &url_loc) != TS_SUCCESS) {
05177 SDK_RPRINT(test, "TSUrlParse", url, TC_FAIL, "Cannot create Url for parsing the url");
05178 if (TSMBufferDestroy(bufp) == TS_ERROR) {
05179 SDK_RPRINT(test, "TSUrlParse", url, TC_FAIL, "Error in Destroying MBuffer");
05180 }
05181 } else {
05182 start = url;
05183 end = url + strlen(url) + 1;
05184 if ((retval = TSUrlParse(bufp, url_loc, &start, end)) == TS_PARSE_ERROR) {
05185 SDK_RPRINT(test, "TSUrlParse", url, TC_FAIL, "TSUrlParse returns TS_PARSE_ERROR");
05186 } else {
05187 if (retval == TS_PARSE_DONE) {
05188 temp = TSUrlStringGet(bufp, url_loc, &length);
05189 if (strncmp(url, temp, length) == 0) {
05190 SDK_RPRINT(test, "TSUrlParse", url, TC_PASS, "ok");
05191 test_passed[idx] = true;
05192 } else {
05193 SDK_RPRINT(test, "TSUrlParse", url, TC_FAIL, "Value's Mismatch");
05194 }
05195 TSfree(temp);
05196 } else {
05197 SDK_RPRINT(test, "TSUrlParse", url, TC_FAIL, "Parsing Error");
05198 }
05199 }
05200 }
05201
05202 TSHandleMLocRelease(bufp, TS_NULL_MLOC, url_loc);
05203 TSMBufferDestroy(bufp);
05204 }
05205
05206 for (idx = 0; idx < num_urls; idx++) {
05207 if (test_passed[idx] != true) {
05208 *pstatus = REGRESSION_TEST_FAILED;
05209 break;
05210 }
05211 }
05212
05213 if (idx >= num_urls) {
05214 *pstatus = REGRESSION_TEST_PASSED;
05215 }
05216
05217
05218 return;
05219 }
05220
05221
05222
05223
05224
05225
05226
05227
05228
05229 #define LOG_TEST_PATTERN "SDK team rocks"
05230
05231 typedef struct
05232 {
05233 RegressionTest *test;
05234 int *pstatus;
05235 char *fullpath_logname;
05236 unsigned long magic;
05237 TSTextLogObject log;
05238 } LogTestData;
05239
05240
05241 static int
05242 log_test_handler(TSCont contp, TSEvent event, void * )
05243 {
05244 TSFile filep;
05245 char buf[1024];
05246 bool str_found;
05247 int retVal = 0;
05248
05249 TSAssert(event == TS_EVENT_TIMEOUT);
05250
05251 LogTestData *data = (LogTestData *) TSContDataGet(contp);
05252 TSAssert(data->magic == MAGIC_ALIVE);
05253
05254
05255
05256 if ((filep = TSfopen(data->fullpath_logname, "r")) == NULL) {
05257 SDK_RPRINT(data->test, "TSTextLogObject", "TestCase1", TC_FAIL, "can not open log file %s", data->fullpath_logname);
05258 *(data->pstatus) = REGRESSION_TEST_FAILED;
05259 return -1;
05260 } else {
05261
05262 str_found = false;
05263 while (TSfgets(filep, buf, 1024) != NULL) {
05264 if (strstr(buf, LOG_TEST_PATTERN) != NULL) {
05265 str_found = true;
05266 break;
05267 }
05268 }
05269 TSfclose(filep);
05270 if (str_found == false) {
05271 SDK_RPRINT(data->test, "TSTextLogObject", "TestCase1", TC_FAIL, "can not find pattern %s in log file", LOG_TEST_PATTERN);
05272 *(data->pstatus) = REGRESSION_TEST_FAILED;
05273 return -1;
05274 }
05275 }
05276
05277 retVal = TSTextLogObjectDestroy(data->log);
05278 if (retVal != TS_SUCCESS) {
05279 SDK_RPRINT(data->test, "TSTextLogObjectDestroy", "TestCase1", TC_FAIL, "can not destroy log object");
05280 *(data->pstatus) = REGRESSION_TEST_FAILED;
05281 return -1;
05282 } else {
05283 SDK_RPRINT(data->test, "TSTextLogObjectDestroy", "TestCase1", TC_PASS, "ok");
05284 }
05285
05286 *(data->pstatus) = REGRESSION_TEST_PASSED;
05287 SDK_RPRINT(data->test, "TSTextLogObject", "TestCase1", TC_PASS, "ok");
05288
05289
05290
05291
05292 int i = -1, l = 0;
05293 char c;
05294 while (c = data->fullpath_logname[l], c != 0) {
05295 if (c == '/') {
05296 i = l;
05297 }
05298 ++l;
05299 }
05300
05301
05302
05303 char *meta_filename = (char *)ats_malloc(l + 7);
05304
05305 if (i < 0) {
05306 ink_string_concatenate_strings(meta_filename, ".", data->fullpath_logname, ".meta", NULL);
05307 } else {
05308 memcpy(meta_filename, data->fullpath_logname, i + 1);
05309 ink_string_concatenate_strings(&meta_filename[i + 1], ".", &data->fullpath_logname[i + 1]
05310 , ".meta", NULL);
05311 }
05312
05313 unlink(data->fullpath_logname);
05314 unlink(meta_filename);
05315 TSfree(data->fullpath_logname);
05316 TSfree(meta_filename);
05317 meta_filename = NULL;
05318
05319 data->magic = MAGIC_DEAD;
05320 TSfree(data);
05321 data = NULL;
05322
05323 return -1;
05324 }
05325
05326 REGRESSION_TEST(SDK_API_TSTextLog) (RegressionTest * test, int , int *pstatus)
05327 {
05328 *pstatus = REGRESSION_TEST_INPROGRESS;
05329
05330 TSTextLogObject log;
05331 TSReturnCode retVal;
05332
05333 char logname[PATH_NAME_MAX];
05334 char fullpath_logname[PATH_NAME_MAX];
05335
05336
05337
05338 ats_scoped_str tmp(RecConfigReadLogDir());
05339 snprintf(logname, sizeof(logname), "RegressionTestLog%d.log", (int) getpid());
05340 snprintf(fullpath_logname, sizeof(fullpath_logname), "%s/%s", (const char *)tmp, logname);
05341
05342 unlink(fullpath_logname);
05343 retVal = TSTextLogObjectCreate(logname, TS_LOG_MODE_ADD_TIMESTAMP, &log);
05344 if (retVal != TS_SUCCESS) {
05345 SDK_RPRINT(test, "TSTextLogObjectCreate", "TestCase1", TC_FAIL, "can not create log object");
05346 *pstatus = REGRESSION_TEST_FAILED;
05347 return;
05348 } else {
05349 SDK_RPRINT(test, "TSTextLogObjectCreate", "TestCase1", TC_PASS, "ok");
05350 }
05351
05352 retVal = TSTextLogObjectWrite(log, (char*)LOG_TEST_PATTERN);
05353 if (retVal != TS_SUCCESS) {
05354 SDK_RPRINT(test, "TSTextLogObjectWrite", "TestCase1", TC_FAIL, "can not write to log object");
05355 *pstatus = REGRESSION_TEST_FAILED;
05356 return;
05357 } else {
05358 SDK_RPRINT(test, "TSTextLogObjectWrite", "TestCase1", TC_PASS, "ok");
05359 }
05360
05361 TSTextLogObjectFlush(log);
05362 SDK_RPRINT(test, "TSTextLogObjectFlush", "TestCase1", TC_PASS, "ok");
05363
05364 TSCont log_test_cont = TSContCreate(log_test_handler, TSMutexCreate());
05365 LogTestData *data = (LogTestData *) TSmalloc(sizeof(LogTestData));
05366 data->test = test;
05367 data->pstatus = pstatus;
05368 data->fullpath_logname = TSstrdup(fullpath_logname);
05369 data->magic = MAGIC_ALIVE;
05370 data->log = log;
05371 TSContDataSet(log_test_cont, data);
05372
05373 TSContSchedule(log_test_cont, 6000, TS_THREAD_POOL_DEFAULT);
05374 return;
05375 }
05376
05377
05378
05379
05380
05381
05382
05383
05384
05385
05386
05387 REGRESSION_TEST(SDK_API_TSMgmtGet) (RegressionTest * test, int , int *pstatus)
05388 {
05389 const char *CONFIG_PARAM_COUNTER_NAME = "proxy.process.http.total_parent_proxy_connections";
05390 int CONFIG_PARAM_COUNTER_VALUE = 0;
05391
05392 const char *CONFIG_PARAM_FLOAT_NAME = "proxy.config.http.background_fill_completed_threshold";
05393 float CONFIG_PARAM_FLOAT_VALUE = 0.0;
05394
05395 const char *CONFIG_PARAM_INT_NAME = "proxy.config.http.cache.http";
05396 int CONFIG_PARAM_INT_VALUE = 1;
05397
05398 const char *CONFIG_PARAM_STRING_NAME = "proxy.config.product_name";
05399 const char *CONFIG_PARAM_STRING_VALUE = "Traffic Server";
05400
05401 *pstatus = REGRESSION_TEST_INPROGRESS;
05402
05403 int err = 0;
05404 TSMgmtCounter cvalue = 0;
05405 TSMgmtFloat fvalue = 0.0;
05406 TSMgmtInt ivalue = -1;
05407 TSMgmtString svalue = NULL;
05408
05409 if (TS_SUCCESS != TSMgmtCounterGet(CONFIG_PARAM_COUNTER_NAME, &cvalue)) {
05410 SDK_RPRINT(test, "TSMgmtCounterGet", "TestCase1.1", TC_FAIL, "can not get value of param %s", CONFIG_PARAM_COUNTER_NAME);
05411 err = 1;
05412 } else if (cvalue != CONFIG_PARAM_COUNTER_VALUE) {
05413 SDK_RPRINT(test, "TSMgmtCounterGet", "TestCase1.1", TC_FAIL,
05414 "got incorrect value of param %s, should have been %d, found %d", CONFIG_PARAM_COUNTER_NAME,
05415 CONFIG_PARAM_COUNTER_VALUE, cvalue);
05416 err = 1;
05417 } else {
05418 SDK_RPRINT(test, "TSMgmtCounterGet", "TestCase1.1", TC_PASS, "ok");
05419 }
05420
05421 if ((TS_SUCCESS != TSMgmtFloatGet(CONFIG_PARAM_FLOAT_NAME, &fvalue)) || (fvalue != CONFIG_PARAM_FLOAT_VALUE)) {
05422 SDK_RPRINT(test, "TSMgmtFloatGet", "TestCase2", TC_FAIL, "can not get value of param %s", CONFIG_PARAM_FLOAT_NAME);
05423 err = 1;
05424 } else {
05425 SDK_RPRINT(test, "TSMgmtFloatGet", "TestCase1.2", TC_PASS, "ok");
05426 }
05427
05428 if ((TSMgmtIntGet(CONFIG_PARAM_INT_NAME, &ivalue) != TS_SUCCESS) || (ivalue != CONFIG_PARAM_INT_VALUE)) {
05429 SDK_RPRINT(test, "TSMgmtIntGet", "TestCase1.3", TC_FAIL, "can not get value of param %s", CONFIG_PARAM_INT_NAME);
05430 err = 1;
05431 } else {
05432 SDK_RPRINT(test, "TSMgmtIntGet", "TestCase1.3", TC_PASS, "ok");
05433 }
05434
05435 if (TS_SUCCESS != TSMgmtStringGet(CONFIG_PARAM_STRING_NAME, &svalue)) {
05436 SDK_RPRINT(test, "TSMgmtStringGet", "TestCase1.4", TC_FAIL, "can not get value of param %s", CONFIG_PARAM_STRING_NAME);
05437 err = 1;
05438 } else if (strcmp(svalue, CONFIG_PARAM_STRING_VALUE) != 0) {
05439 SDK_RPRINT(test, "TSMgmtStringGet", "TestCase1.4", TC_FAIL,
05440 "got incorrect value of param %s, should have been \"%s\", found \"%s\"", CONFIG_PARAM_STRING_NAME,
05441 CONFIG_PARAM_STRING_VALUE, svalue);
05442 err = 1;
05443 } else {
05444 SDK_RPRINT(test, "TSMgmtStringGet", "TestCase1.4", TC_PASS, "ok");
05445 }
05446
05447 if (err) {
05448 *pstatus = REGRESSION_TEST_FAILED;
05449 return;
05450 }
05451
05452 *pstatus = REGRESSION_TEST_PASSED;
05453 SDK_RPRINT(test, "TSMgmtGet", "TestCase1", TC_PASS, "ok");
05454 return;
05455 }
05456
05457
05458
05459
05460
05461
05462
05463
05464
05465 #define PRINT_DIFF( _x ) \
05466 { \
05467 if ( _x - ORIG_##_x != 0) { \
05468 test_passed = false; \
05469 SDK_RPRINT (test, "##_x", "TestCase1", TC_FAIL, \
05470 "%s:Original Value = %d; New Value = %d \n", #_x,_x, ORIG_##_x); \
05471 } \
05472 }
05473
05474
05475 typedef enum
05476 {
05477 ORIG_TS_PARSE_ERROR = -1,
05478 ORIG_TS_PARSE_DONE = 0,
05479 ORIG_TS_PARSE_OK = 1,
05480 ORIG_TS_PARSE_CONT = 2
05481 } ORIG_TSParseResult;
05482
05483 typedef enum
05484 {
05485 ORIG_TS_HTTP_TYPE_UNKNOWN,
05486 ORIG_TS_HTTP_TYPE_REQUEST,
05487 ORIG_TS_HTTP_TYPE_RESPONSE
05488 } ORIG_TSHttpType;
05489
05490 typedef enum
05491 {
05492 ORIG_TS_HTTP_STATUS_NONE = 0,
05493
05494 ORIG_TS_HTTP_STATUS_CONTINUE = 100,
05495 ORIG_TS_HTTP_STATUS_SWITCHING_PROTOCOL = 101,
05496
05497 ORIG_TS_HTTP_STATUS_OK = 200,
05498 ORIG_TS_HTTP_STATUS_CREATED = 201,
05499 ORIG_TS_HTTP_STATUS_ACCEPTED = 202,
05500 ORIG_TS_HTTP_STATUS_NON_AUTHORITATIVE_INFORMATION = 203,
05501 ORIG_TS_HTTP_STATUS_NO_CONTENT = 204,
05502 ORIG_TS_HTTP_STATUS_RESET_CONTENT = 205,
05503 ORIG_TS_HTTP_STATUS_PARTIAL_CONTENT = 206,
05504
05505 ORIG_TS_HTTP_STATUS_MULTIPLE_CHOICES = 300,
05506 ORIG_TS_HTTP_STATUS_MOVED_PERMANENTLY = 301,
05507 ORIG_TS_HTTP_STATUS_MOVED_TEMPORARILY = 302,
05508 ORIG_TS_HTTP_STATUS_SEE_OTHER = 303,
05509 ORIG_TS_HTTP_STATUS_NOT_MODIFIED = 304,
05510 ORIG_TS_HTTP_STATUS_USE_PROXY = 305,
05511
05512 ORIG_TS_HTTP_STATUS_BAD_REQUEST = 400,
05513 ORIG_TS_HTTP_STATUS_UNAUTHORIZED = 401,
05514 ORIG_TS_HTTP_STATUS_PAYMENT_REQUIRED = 402,
05515 ORIG_TS_HTTP_STATUS_FORBIDDEN = 403,
05516 ORIG_TS_HTTP_STATUS_NOT_FOUND = 404,
05517 ORIG_TS_HTTP_STATUS_METHOD_NOT_ALLOWED = 405,
05518 ORIG_TS_HTTP_STATUS_NOT_ACCEPTABLE = 406,
05519 ORIG_TS_HTTP_STATUS_PROXY_AUTHENTICATION_REQUIRED = 407,
05520 ORIG_TS_HTTP_STATUS_REQUEST_TIMEOUT = 408,
05521 ORIG_TS_HTTP_STATUS_CONFLICT = 409,
05522 ORIG_TS_HTTP_STATUS_GONE = 410,
05523 ORIG_TS_HTTP_STATUS_LENGTH_REQUIRED = 411,
05524 ORIG_TS_HTTP_STATUS_PRECONDITION_FAILED = 412,
05525 ORIG_TS_HTTP_STATUS_REQUEST_ENTITY_TOO_LARGE = 413,
05526 ORIG_TS_HTTP_STATUS_REQUEST_URI_TOO_LONG = 414,
05527 ORIG_TS_HTTP_STATUS_UNSUPPORTED_MEDIA_TYPE = 415,
05528
05529 ORIG_TS_HTTP_STATUS_INTERNAL_SERVER_ERROR = 500,
05530 ORIG_TS_HTTP_STATUS_NOT_IMPLEMENTED = 501,
05531 ORIG_TS_HTTP_STATUS_BAD_GATEWAY = 502,
05532 ORIG_TS_HTTP_STATUS_SERVICE_UNAVAILABLE = 503,
05533 ORIG_TS_HTTP_STATUS_GATEWAY_TIMEOUT = 504,
05534 ORIG_TS_HTTP_STATUS_HTTPVER_NOT_SUPPORTED = 505
05535 } ORIG_TSHttpStatus;
05536
05537 typedef enum
05538 {
05539 ORIG_TS_HTTP_READ_REQUEST_HDR_HOOK,
05540 ORIG_TS_HTTP_OS_DNS_HOOK,
05541 ORIG_TS_HTTP_SEND_REQUEST_HDR_HOOK,
05542 ORIG_TS_HTTP_READ_CACHE_HDR_HOOK,
05543 ORIG_TS_HTTP_READ_RESPONSE_HDR_HOOK,
05544 ORIG_TS_HTTP_SEND_RESPONSE_HDR_HOOK,
05545 ORIG_TS_HTTP_REQUEST_TRANSFORM_HOOK,
05546 ORIG_TS_HTTP_RESPONSE_TRANSFORM_HOOK,
05547 ORIG_TS_HTTP_SELECT_ALT_HOOK,
05548 ORIG_TS_HTTP_TXN_START_HOOK,
05549 ORIG_TS_HTTP_TXN_CLOSE_HOOK,
05550 ORIG_TS_HTTP_SSN_START_HOOK,
05551 ORIG_TS_HTTP_SSN_CLOSE_HOOK,
05552 ORIG_TS_HTTP_CACHE_LOOKUP_COMPLETE_HOOK,
05553 ORIG_TS_HTTP_PRE_REMAP_HOOK,
05554 ORIG_TS_HTTP_POST_REMAP_HOOK,
05555 ORIG_TS_HTTP_RESPONSE_CLIENT_HOOK,
05556 ORIG_TS_HTTP_LAST_HOOK
05557 } ORIG_TSHttpHookID;
05558
05559 typedef enum
05560 {
05561 ORIG_TS_EVENT_NONE = 0,
05562 ORIG_TS_EVENT_IMMEDIATE = 1,
05563 ORIG_TS_EVENT_TIMEOUT = 2,
05564 ORIG_TS_EVENT_ERROR = 3,
05565 ORIG_TS_EVENT_CONTINUE = 4,
05566
05567 ORIG_TS_EVENT_VCONN_READ_READY = 100,
05568 ORIG_TS_EVENT_VCONN_WRITE_READY = 101,
05569 ORIG_TS_EVENT_VCONN_READ_COMPLETE = 102,
05570 ORIG_TS_EVENT_VCONN_WRITE_COMPLETE = 103,
05571 ORIG_TS_EVENT_VCONN_EOS = 104,
05572
05573 ORIG_TS_EVENT_NET_CONNECT = 200,
05574 ORIG_TS_EVENT_NET_CONNECT_FAILED = 201,
05575 ORIG_TS_EVENT_NET_ACCEPT = 202,
05576 ORIG_TS_EVENT_NET_ACCEPT_FAILED = 204,
05577
05578 ORIG_TS_EVENT_HOST_LOOKUP = 500,
05579
05580 ORIG_TS_EVENT_CACHE_OPEN_READ = 1102,
05581 ORIG_TS_EVENT_CACHE_OPEN_READ_FAILED = 1103,
05582 ORIG_TS_EVENT_CACHE_OPEN_WRITE = 1108,
05583 ORIG_TS_EVENT_CACHE_OPEN_WRITE_FAILED = 1109,
05584 ORIG_TS_EVENT_CACHE_REMOVE = 1112,
05585 ORIG_TS_EVENT_CACHE_REMOVE_FAILED = 1113,
05586 ORIG_TS_EVENT_CACHE_SCAN = 1120,
05587 ORIG_TS_EVENT_CACHE_SCAN_FAILED = 1121,
05588 ORIG_TS_EVENT_CACHE_SCAN_OBJECT = 1122,
05589 ORIG_TS_EVENT_CACHE_SCAN_OPERATION_BLOCKED = 1123,
05590 ORIG_TS_EVENT_CACHE_SCAN_OPERATION_FAILED = 1124,
05591 ORIG_TS_EVENT_CACHE_SCAN_DONE = 1125,
05592
05593 ORIG_TS_EVENT_HTTP_CONTINUE = 60000,
05594 ORIG_TS_EVENT_HTTP_ERROR = 60001,
05595 ORIG_TS_EVENT_HTTP_READ_REQUEST_HDR = 60002,
05596 ORIG_TS_EVENT_HTTP_OS_DNS = 60003,
05597 ORIG_TS_EVENT_HTTP_SEND_REQUEST_HDR = 60004,
05598 ORIG_TS_EVENT_HTTP_READ_CACHE_HDR = 60005,
05599 ORIG_TS_EVENT_HTTP_READ_RESPONSE_HDR = 60006,
05600 ORIG_TS_EVENT_HTTP_SEND_RESPONSE_HDR = 60007,
05601 ORIG_TS_EVENT_HTTP_REQUEST_TRANSFORM = 60008,
05602 ORIG_TS_EVENT_HTTP_RESPONSE_TRANSFORM = 60009,
05603 ORIG_TS_EVENT_HTTP_SELECT_ALT = 60010,
05604 ORIG_TS_EVENT_HTTP_TXN_START = 60011,
05605 ORIG_TS_EVENT_HTTP_TXN_CLOSE = 60012,
05606 ORIG_TS_EVENT_HTTP_SSN_START = 60013,
05607 ORIG_TS_EVENT_HTTP_SSN_CLOSE = 60014,
05608 ORIG_TS_EVENT_HTTP_CACHE_LOOKUP_COMPLETE = 60015,
05609
05610 ORIG_TS_EVENT_MGMT_UPDATE = 60100
05611 } ORIG_TSEvent;
05612
05613 typedef enum
05614 {
05615 ORIG_TS_CACHE_LOOKUP_MISS,
05616 ORIG_TS_CACHE_LOOKUP_HIT_STALE,
05617 ORIG_TS_CACHE_LOOKUP_HIT_FRESH
05618 } ORIG_TSCacheLookupResult;
05619
05620 typedef enum
05621 {
05622 ORIG_TS_CACHE_DATA_TYPE_NONE,
05623 ORIG_TS_CACHE_DATA_TYPE_HTTP,
05624 ORIG_TS_CACHE_DATA_TYPE_OTHER
05625 } ORIG_TSCacheDataType;
05626
05627 typedef enum
05628 {
05629 ORIG_TS_CACHE_ERROR_NO_DOC = -20400,
05630 ORIG_TS_CACHE_ERROR_DOC_BUSY = -20401,
05631 ORIG_TS_CACHE_ERROR_NOT_READY = -20407
05632 } ORIG_TSCacheError;
05633
05634 typedef enum
05635 {
05636 ORIG_TS_CACHE_SCAN_RESULT_DONE = 0,
05637 ORIG_TS_CACHE_SCAN_RESULT_CONTINUE = 1,
05638 ORIG_TS_CACHE_SCAN_RESULT_DELETE = 10,
05639 ORIG_TS_CACHE_SCAN_RESULT_DELETE_ALL_ALTERNATES,
05640 ORIG_TS_CACHE_SCAN_RESULT_UPDATE,
05641 ORIG_TS_CACHE_SCAN_RESULT_RETRY
05642 } ORIG_TSCacheScanResult;
05643
05644 typedef enum
05645 {
05646 ORIG_TS_VC_CLOSE_ABORT = -1,
05647 ORIG_TS_VC_CLOSE_NORMAL = 1
05648 } ORIG_TSVConnCloseFlags;
05649
05650 typedef enum
05651 {
05652 ORIG_TS_SDK_VERSION_2_0 = 0,
05653 ORIG_TS_SDK_VERSION_3_0
05654 } ORIG_TSSDKVersion;
05655
05656 typedef enum
05657 {
05658 ORIG_TS_ERROR = -1,
05659 ORIG_TS_SUCCESS = 0
05660 } ORIG_TSReturnCode;
05661
05662
05663 REGRESSION_TEST(SDK_API_TSConstant) (RegressionTest * test, int , int *pstatus)
05664 {
05665 *pstatus = REGRESSION_TEST_INPROGRESS;
05666 bool test_passed = true;
05667
05668 PRINT_DIFF(TS_PARSE_ERROR);
05669 PRINT_DIFF(TS_PARSE_DONE);
05670 PRINT_DIFF(TS_PARSE_OK);
05671 PRINT_DIFF(TS_PARSE_CONT);
05672
05673 PRINT_DIFF(TS_HTTP_STATUS_NONE);
05674 PRINT_DIFF(TS_HTTP_STATUS_CONTINUE);
05675 PRINT_DIFF(TS_HTTP_STATUS_SWITCHING_PROTOCOL);
05676 PRINT_DIFF(TS_HTTP_STATUS_OK);
05677 PRINT_DIFF(TS_HTTP_STATUS_CREATED);
05678
05679
05680 PRINT_DIFF(TS_HTTP_STATUS_ACCEPTED);
05681 PRINT_DIFF(TS_HTTP_STATUS_NON_AUTHORITATIVE_INFORMATION);
05682 PRINT_DIFF(TS_HTTP_STATUS_NO_CONTENT);
05683 PRINT_DIFF(TS_HTTP_STATUS_RESET_CONTENT);
05684 PRINT_DIFF(TS_HTTP_STATUS_PARTIAL_CONTENT);
05685
05686 PRINT_DIFF(TS_HTTP_STATUS_MULTIPLE_CHOICES);
05687 PRINT_DIFF(TS_HTTP_STATUS_MOVED_PERMANENTLY);
05688 PRINT_DIFF(TS_HTTP_STATUS_MOVED_TEMPORARILY);
05689 PRINT_DIFF(TS_HTTP_STATUS_SEE_OTHER);
05690 PRINT_DIFF(TS_HTTP_STATUS_NOT_MODIFIED);
05691 PRINT_DIFF(TS_HTTP_STATUS_USE_PROXY);
05692 PRINT_DIFF(TS_HTTP_STATUS_BAD_REQUEST);
05693 PRINT_DIFF(TS_HTTP_STATUS_UNAUTHORIZED);
05694 PRINT_DIFF(TS_HTTP_STATUS_FORBIDDEN);
05695 PRINT_DIFF(TS_HTTP_STATUS_NOT_FOUND);
05696 PRINT_DIFF(TS_HTTP_STATUS_METHOD_NOT_ALLOWED);
05697 PRINT_DIFF(TS_HTTP_STATUS_NOT_ACCEPTABLE);
05698 PRINT_DIFF(TS_HTTP_STATUS_PROXY_AUTHENTICATION_REQUIRED);
05699 PRINT_DIFF(TS_HTTP_STATUS_REQUEST_TIMEOUT);
05700 PRINT_DIFF(TS_HTTP_STATUS_CONFLICT);
05701 PRINT_DIFF(TS_HTTP_STATUS_GONE);
05702 PRINT_DIFF(TS_HTTP_STATUS_PRECONDITION_FAILED);
05703 PRINT_DIFF(TS_HTTP_STATUS_REQUEST_ENTITY_TOO_LARGE);
05704 PRINT_DIFF(TS_HTTP_STATUS_REQUEST_URI_TOO_LONG);
05705 PRINT_DIFF(TS_HTTP_STATUS_UNSUPPORTED_MEDIA_TYPE);
05706 PRINT_DIFF(TS_HTTP_STATUS_INTERNAL_SERVER_ERROR);
05707 PRINT_DIFF(TS_HTTP_STATUS_NOT_IMPLEMENTED);
05708 PRINT_DIFF(TS_HTTP_STATUS_BAD_GATEWAY);
05709 PRINT_DIFF(TS_HTTP_STATUS_GATEWAY_TIMEOUT);
05710 PRINT_DIFF(TS_HTTP_STATUS_HTTPVER_NOT_SUPPORTED);
05711
05712 PRINT_DIFF(TS_HTTP_READ_REQUEST_HDR_HOOK);
05713 PRINT_DIFF(TS_HTTP_OS_DNS_HOOK);
05714 PRINT_DIFF(TS_HTTP_SEND_REQUEST_HDR_HOOK);
05715 PRINT_DIFF(TS_HTTP_READ_RESPONSE_HDR_HOOK);
05716 PRINT_DIFF(TS_HTTP_SEND_RESPONSE_HDR_HOOK);
05717 PRINT_DIFF(TS_HTTP_REQUEST_TRANSFORM_HOOK);
05718 PRINT_DIFF(TS_HTTP_RESPONSE_TRANSFORM_HOOK);
05719 PRINT_DIFF(TS_HTTP_SELECT_ALT_HOOK);
05720 PRINT_DIFF(TS_HTTP_TXN_START_HOOK);
05721 PRINT_DIFF(TS_HTTP_TXN_CLOSE_HOOK);
05722 PRINT_DIFF(TS_HTTP_SSN_START_HOOK);
05723 PRINT_DIFF(TS_HTTP_SSN_CLOSE_HOOK);
05724 PRINT_DIFF(TS_HTTP_CACHE_LOOKUP_COMPLETE_HOOK);
05725 PRINT_DIFF(TS_HTTP_LAST_HOOK);
05726
05727 PRINT_DIFF(TS_EVENT_NONE);
05728 PRINT_DIFF(TS_EVENT_IMMEDIATE);
05729 PRINT_DIFF(TS_EVENT_TIMEOUT);
05730 PRINT_DIFF(TS_EVENT_ERROR);
05731
05732 PRINT_DIFF(TS_EVENT_CONTINUE);
05733 PRINT_DIFF(TS_EVENT_VCONN_READ_READY);
05734 PRINT_DIFF(TS_EVENT_VCONN_WRITE_READY);
05735 PRINT_DIFF(TS_EVENT_VCONN_READ_COMPLETE);
05736 PRINT_DIFF(TS_EVENT_VCONN_WRITE_COMPLETE);
05737 PRINT_DIFF(TS_EVENT_VCONN_EOS);
05738
05739 PRINT_DIFF(TS_EVENT_NET_CONNECT);
05740 PRINT_DIFF(TS_EVENT_NET_CONNECT_FAILED);
05741 PRINT_DIFF(TS_EVENT_NET_ACCEPT);
05742 PRINT_DIFF(TS_EVENT_NET_ACCEPT_FAILED);
05743
05744 PRINT_DIFF(TS_EVENT_HOST_LOOKUP);
05745
05746 PRINT_DIFF(TS_EVENT_CACHE_OPEN_READ);
05747 PRINT_DIFF(TS_EVENT_CACHE_OPEN_READ_FAILED);
05748 PRINT_DIFF(TS_EVENT_CACHE_OPEN_WRITE);
05749 PRINT_DIFF(TS_EVENT_CACHE_OPEN_WRITE_FAILED);
05750 PRINT_DIFF(TS_EVENT_CACHE_REMOVE);
05751 PRINT_DIFF(TS_EVENT_CACHE_REMOVE_FAILED);
05752 PRINT_DIFF(TS_EVENT_CACHE_SCAN);
05753 PRINT_DIFF(TS_EVENT_CACHE_SCAN_FAILED);
05754 PRINT_DIFF(TS_EVENT_CACHE_SCAN_OBJECT);
05755 PRINT_DIFF(TS_EVENT_CACHE_SCAN_OPERATION_BLOCKED);
05756 PRINT_DIFF(TS_EVENT_CACHE_SCAN_OPERATION_FAILED);
05757 PRINT_DIFF(TS_EVENT_CACHE_SCAN_DONE);
05758
05759 PRINT_DIFF(TS_EVENT_HTTP_CONTINUE);
05760 PRINT_DIFF(TS_EVENT_HTTP_ERROR);
05761 PRINT_DIFF(TS_EVENT_HTTP_READ_REQUEST_HDR);
05762 PRINT_DIFF(TS_EVENT_HTTP_OS_DNS);
05763 PRINT_DIFF(TS_EVENT_HTTP_SEND_REQUEST_HDR);
05764 PRINT_DIFF(TS_EVENT_HTTP_READ_CACHE_HDR);
05765 PRINT_DIFF(TS_EVENT_HTTP_READ_RESPONSE_HDR);
05766 PRINT_DIFF(TS_EVENT_HTTP_SEND_RESPONSE_HDR);
05767 PRINT_DIFF(TS_EVENT_HTTP_REQUEST_TRANSFORM);
05768 PRINT_DIFF(TS_EVENT_HTTP_RESPONSE_TRANSFORM);
05769 PRINT_DIFF(TS_EVENT_HTTP_SELECT_ALT);
05770 PRINT_DIFF(TS_EVENT_HTTP_TXN_START);
05771 PRINT_DIFF(TS_EVENT_HTTP_TXN_CLOSE);
05772 PRINT_DIFF(TS_EVENT_HTTP_SSN_START);
05773 PRINT_DIFF(TS_EVENT_HTTP_SSN_CLOSE);
05774 PRINT_DIFF(TS_EVENT_HTTP_CACHE_LOOKUP_COMPLETE);
05775
05776 PRINT_DIFF(TS_EVENT_MGMT_UPDATE);
05777
05778 PRINT_DIFF(TS_CACHE_LOOKUP_MISS);
05779 PRINT_DIFF(TS_CACHE_LOOKUP_HIT_STALE);
05780 PRINT_DIFF(TS_CACHE_LOOKUP_HIT_FRESH);
05781
05782 PRINT_DIFF(TS_CACHE_DATA_TYPE_NONE);
05783 PRINT_DIFF(TS_CACHE_DATA_TYPE_HTTP);
05784 PRINT_DIFF(TS_CACHE_DATA_TYPE_OTHER);
05785
05786 PRINT_DIFF(TS_CACHE_ERROR_NO_DOC);
05787 PRINT_DIFF(TS_CACHE_ERROR_DOC_BUSY);
05788 PRINT_DIFF(TS_CACHE_ERROR_NOT_READY);
05789
05790 PRINT_DIFF(TS_CACHE_SCAN_RESULT_DONE);
05791 PRINT_DIFF(TS_CACHE_SCAN_RESULT_CONTINUE);
05792 PRINT_DIFF(TS_CACHE_SCAN_RESULT_DELETE);
05793 PRINT_DIFF(TS_CACHE_SCAN_RESULT_DELETE_ALL_ALTERNATES);
05794 PRINT_DIFF(TS_CACHE_SCAN_RESULT_UPDATE);
05795 PRINT_DIFF(TS_CACHE_SCAN_RESULT_RETRY);
05796
05797 PRINT_DIFF(TS_VC_CLOSE_ABORT);
05798 PRINT_DIFF(TS_VC_CLOSE_NORMAL);
05799
05800 PRINT_DIFF(TS_SDK_VERSION_2_0);
05801 PRINT_DIFF(TS_SDK_VERSION_3_0);
05802
05803 PRINT_DIFF(TS_ERROR);
05804 PRINT_DIFF(TS_SUCCESS);
05805
05806
05807 if (test_passed) {
05808 *pstatus = REGRESSION_TEST_PASSED;
05809 } else {
05810 *pstatus = REGRESSION_TEST_FAILED;
05811 }
05812
05813 }
05814
05815
05816
05817
05818
05819
05820
05821
05822
05823
05824
05825
05826
05827 typedef struct
05828 {
05829 RegressionTest *test;
05830 int *pstatus;
05831 SocketServer *os;
05832 ClientTxn *browser;
05833 TSHttpSsn ssnp;
05834 int test_passed_ssn_hook_add;
05835 int test_passed_ssn_reenable;
05836 int test_passed_txn_ssn_get;
05837 int test_passed_txn_hook_add;
05838 int test_passed_txn_error_body_set;
05839 bool test_passed_Parent_Proxy;
05840 int magic;
05841 } ContData;
05842
05843 static int
05844 checkHttpTxnParentProxy(ContData * data, TSHttpTxn txnp)
05845 {
05846
05847 const char *hostname = "txnpp.example.com";
05848 int port = 10180;
05849 char *hostnameget = NULL;
05850 int portget = 0;
05851
05852 TSHttpTxnParentProxySet(txnp, (char*)hostname, port);
05853 if (TSHttpTxnParentProxyGet(txnp, &hostnameget, &portget) != TS_SUCCESS) {
05854 SDK_RPRINT(data->test, "TSHttpTxnParentProxySet", "TestCase1", TC_FAIL, "TSHttpTxnParentProxyGet doesn't return TS_SUCCESS");
05855 SDK_RPRINT(data->test, "TSHttpTxnParentProxyGet", "TestCase1", TC_FAIL, "TSHttpTxnParentProxyGet doesn't return TS_SUCCESS");
05856 return TS_EVENT_CONTINUE;
05857 }
05858
05859 if ((strcmp(hostname, hostnameget) == 0) && (port == portget)) {
05860 SDK_RPRINT(data->test, "TSHttpTxnParentProxySet", "TestCase1", TC_PASS, "ok");
05861 SDK_RPRINT(data->test, "TSHttpTxnParentProxyGet", "TestCase1", TC_PASS, "ok");
05862 data->test_passed_Parent_Proxy = true;
05863 } else {
05864 SDK_RPRINT(data->test, "TSHttpTxnParentProxySet", "TestCase1", TC_FAIL, "Value's Mismatch");
05865 SDK_RPRINT(data->test, "TSHttpTxnParentProxyGet", "TestCase1", TC_FAIL, "Value's Mismatch");
05866 }
05867
05868 return TS_EVENT_CONTINUE;
05869 }
05870
05871
05872 static int
05873 ssn_handler(TSCont contp, TSEvent event, void *edata)
05874 {
05875
05876 TSHttpTxn txnp = NULL;
05877 ContData *data = NULL;
05878 data = (ContData *)TSContDataGet(contp);
05879 if (data == NULL) {
05880 switch (event) {
05881 case TS_EVENT_HTTP_SSN_START:
05882 TSHttpSsnReenable((TSHttpSsn) edata, TS_EVENT_HTTP_CONTINUE);
05883 break;
05884 case TS_EVENT_IMMEDIATE:
05885 case TS_EVENT_TIMEOUT:
05886 break;
05887 case TS_EVENT_HTTP_TXN_START:
05888 default:
05889 TSHttpTxnReenable((TSHttpTxn) edata, TS_EVENT_HTTP_CONTINUE);
05890 break;
05891 }
05892 return 0;
05893 }
05894
05895 switch (event) {
05896 case TS_EVENT_HTTP_SSN_START:
05897 data->ssnp = (TSHttpSsn) edata;
05898 TSHttpSsnHookAdd(data->ssnp, TS_HTTP_TXN_START_HOOK, contp);
05899 TSHttpSsnReenable(data->ssnp, TS_EVENT_HTTP_CONTINUE);
05900 break;
05901
05902 case TS_EVENT_HTTP_TXN_START:
05903 TSSkipRemappingSet((TSHttpTxn) edata,1);
05904 SDK_RPRINT(data->test, "TSHttpSsnReenable", "TestCase", TC_PASS, "ok");
05905 data->test_passed_ssn_reenable++;
05906 {
05907 txnp = (TSHttpTxn) edata;
05908 TSHttpSsn ssnp = TSHttpTxnSsnGet(txnp);
05909 if (ssnp != data->ssnp) {
05910 SDK_RPRINT(data->test, "TSHttpSsnHookAdd", "TestCase", TC_FAIL, "Value's mismatch");
05911 data->test_passed_ssn_hook_add--;
05912 SDK_RPRINT(data->test, "TSHttpTxnSsnGet", "TestCase", TC_FAIL, "Session doesn't match");
05913 data->test_passed_txn_ssn_get--;
05914 } else {
05915 SDK_RPRINT(data->test, "TSHttpSsnHookAdd", "TestCase1", TC_PASS, "ok");
05916 data->test_passed_ssn_hook_add++;
05917 SDK_RPRINT(data->test, "TSHttpTxnSsnGet", "TestCase1", TC_PASS, "ok");
05918 data->test_passed_txn_ssn_get++;
05919 }
05920 TSHttpTxnHookAdd(txnp, TS_HTTP_OS_DNS_HOOK, contp);
05921 TSHttpTxnReenable(txnp, TS_EVENT_HTTP_CONTINUE);
05922 }
05923 break;
05924
05925 case TS_EVENT_HTTP_OS_DNS:
05926 SDK_RPRINT(data->test, "TSHttpTxnHookAdd", "TestCase1", TC_PASS, "ok");
05927 data->test_passed_txn_hook_add++;
05928 txnp = (TSHttpTxn) edata;
05929
05930 TSHttpTxnHookAdd(txnp, TS_HTTP_SEND_RESPONSE_HDR_HOOK, contp);
05931 checkHttpTxnParentProxy(data, txnp);
05932
05933 TSHttpTxnReenable(txnp, TS_EVENT_HTTP_ERROR);
05934 break;
05935
05936 case TS_EVENT_HTTP_SEND_RESPONSE_HDR:
05937 SDK_RPRINT(data->test, "TSHttpTxnHookAdd", "TestCase2", TC_PASS, "ok");
05938 data->test_passed_txn_hook_add++;
05939 txnp = (TSHttpTxn) edata;
05940 if (1) {
05941 char *temp = TSstrdup(ERROR_BODY);
05942 TSHttpTxnErrorBodySet(txnp, temp, strlen(temp), NULL);
05943 }
05944 TSHttpTxnReenable(txnp, TS_EVENT_HTTP_CONTINUE);
05945 break;
05946
05947 case TS_EVENT_IMMEDIATE:
05948 case TS_EVENT_TIMEOUT:
05949
05950 if (data->browser->status == REQUEST_INPROGRESS) {
05951 TSContSchedule(contp, 25, TS_THREAD_POOL_DEFAULT);
05952 }
05953
05954 else {
05955
05956 char *temp = data->browser->response;
05957 temp = strstr(temp, "\r\n\r\n");
05958 if (temp != NULL) {
05959 temp += strlen("\r\n\r\n");
05960 if ((temp[0] == '\0') || (strncmp(temp, "\r\n\r\n", 4) == 0)) {
05961 SDK_RPRINT(data->test, "TSHttpTxnErrorBodySet", "TestCase1", TC_FAIL, "No Error Body found");
05962 data->test_passed_txn_error_body_set--;
05963 }
05964 if (strncmp(temp, ERROR_BODY, strlen(ERROR_BODY)) == 0) {
05965 SDK_RPRINT(data->test, "TSHttpTxnErrorBodySet", "TestCase1", TC_PASS, "ok");
05966 data->test_passed_txn_error_body_set++;
05967 }
05968 } else {
05969 SDK_RPRINT(data->test, "TSHttpTxnErrorBodySet", "TestCase1", TC_FAIL, "strstr returns NULL. Didn't find end of headers.");
05970 data->test_passed_txn_error_body_set--;
05971 }
05972
05973
05974 if ((data->browser->status == REQUEST_SUCCESS) &&
05975 (data->test_passed_ssn_hook_add == 1) &&
05976 (data->test_passed_ssn_reenable == 1) &&
05977 (data->test_passed_txn_ssn_get == 1) &&
05978 (data->test_passed_txn_hook_add == 2) && (data->test_passed_txn_error_body_set == 1)
05979 && (data->test_passed_Parent_Proxy == true)) {
05980 *(data->pstatus) = REGRESSION_TEST_PASSED;
05981 } else {
05982 *(data->pstatus) = REGRESSION_TEST_FAILED;
05983 }
05984
05985
05986 synclient_txn_delete(data->browser);
05987
05988
05989
05990 data->magic = MAGIC_DEAD;
05991 TSfree(data);
05992 TSContDataSet(contp, NULL);
05993 }
05994 break;
05995
05996 default:
05997 *(data->pstatus) = REGRESSION_TEST_FAILED;
05998 SDK_RPRINT(data->test, "TSHttpSsn", "TestCase1", TC_FAIL, "Unexpected event %d", event);
05999 break;
06000 }
06001 return 0;
06002 }
06003
06004
06005 EXCLUSIVE_REGRESSION_TEST(SDK_API_HttpSsn) (RegressionTest * test, int , int *pstatus)
06006 {
06007 *pstatus = REGRESSION_TEST_INPROGRESS;
06008
06009 TSCont cont = TSContCreate(ssn_handler, TSMutexCreate());
06010 if (cont == NULL) {
06011 SDK_RPRINT(test, "TSHttpSsn", "TestCase1", TC_FAIL, "Unable to create Continuation.");
06012 *pstatus = REGRESSION_TEST_FAILED;
06013 return;
06014 }
06015
06016 ContData *socktest = (ContData *) TSmalloc(sizeof(ContData));
06017 socktest->test = test;
06018 socktest->pstatus = pstatus;
06019 socktest->test_passed_ssn_hook_add = 0;
06020 socktest->test_passed_ssn_reenable = 0;
06021 socktest->test_passed_txn_ssn_get = 0;
06022 socktest->test_passed_txn_hook_add = 0;
06023 socktest->test_passed_txn_error_body_set = 0;
06024 socktest->test_passed_Parent_Proxy = false;
06025 socktest->magic = MAGIC_ALIVE;
06026 TSContDataSet(cont, socktest);
06027
06028
06029 TSHttpHookAdd(TS_HTTP_SSN_START_HOOK, cont);
06030
06031
06032 socktest->browser = synclient_txn_create();
06033 char *request = generate_request(3);
06034 synclient_txn_send_request(socktest->browser, request);
06035 TSfree(request);
06036
06037
06038 if (socktest->browser->status == REQUEST_INPROGRESS) {
06039 TSContSchedule(cont, 25, TS_THREAD_POOL_DEFAULT);
06040 }
06041
06042 return;
06043 }
06044
06045
06046
06047
06048
06049
06050
06051
06052
06053 typedef struct
06054 {
06055 RegressionTest *test;
06056 int *pstatus;
06057 SocketServer *os;
06058 ClientTxn *browser1;
06059 ClientTxn *browser2;
06060 char *request;
06061 bool test_passed_txn_cached_req_get;
06062 bool test_passed_txn_cached_resp_get;
06063 bool test_passed_txn_cache_lookup_status;
06064 bool first_time;
06065 int magic;
06066 } CacheTestData;
06067
06068 static int
06069 cache_hook_handler(TSCont contp, TSEvent event, void *edata)
06070 {
06071
06072 TSHttpTxn txnp = NULL;
06073 CacheTestData *data = (CacheTestData *)TSContDataGet(contp);
06074
06075 if (data == NULL) {
06076 switch (event) {
06077 case TS_EVENT_IMMEDIATE:
06078 case TS_EVENT_TIMEOUT:
06079 break;
06080 case TS_EVENT_HTTP_READ_CACHE_HDR:
06081 default:
06082 TSHttpTxnReenable((TSHttpTxn) edata, TS_EVENT_HTTP_CONTINUE);
06083 break;
06084 }
06085 return 0;
06086 }
06087
06088 switch (event) {
06089 case TS_EVENT_HTTP_READ_REQUEST_HDR:
06090 txnp = (TSHttpTxn) edata;
06091 TSSkipRemappingSet(txnp,1);
06092 TSHttpTxnReenable(txnp, TS_EVENT_HTTP_CONTINUE);
06093 break;
06094
06095 case TS_EVENT_HTTP_CACHE_LOOKUP_COMPLETE:
06096 {
06097 int lookup_status;
06098 if (data->first_time == true) {
06099 txnp = (TSHttpTxn) edata;
06100 if (TSHttpTxnCacheLookupStatusGet(txnp, &lookup_status) != TS_SUCCESS) {
06101 SDK_RPRINT(data->test, "TSHttpTxnCacheLookupStatusGet", "TestCase1", TC_FAIL,
06102 "TSHttpTxnCacheLookupStatus doesn't return TS_SUCCESS");
06103 } else {
06104 if (lookup_status == TS_CACHE_LOOKUP_MISS) {
06105 SDK_RPRINT(data->test, "TSHttpTxnCacheLookupStatusGet", "TestCase1", TC_PASS, "ok");
06106 data->test_passed_txn_cache_lookup_status = true;
06107 } else {
06108 SDK_RPRINT(data->test, "TSHttpTxnCacheLookupStatusGet", "TestCase1", TC_FAIL,
06109 "Incorrect Value returned by TSHttpTxnCacheLookupStatusGet");
06110 }
06111 }
06112 } else {
06113 txnp = (TSHttpTxn) edata;
06114 if (TSHttpTxnCacheLookupStatusGet(txnp, &lookup_status) != TS_SUCCESS) {
06115 SDK_RPRINT(data->test, "TSHttpTxnCacheLookupStatusGet", "TestCase2", TC_FAIL,
06116 "TSHttpTxnCacheLookupStatus doesn't return TS_SUCCESS");
06117 data->test_passed_txn_cache_lookup_status = false;
06118 } else {
06119 if (lookup_status == TS_CACHE_LOOKUP_HIT_FRESH) {
06120 SDK_RPRINT(data->test, "TSHttpTxnCacheLookupStatusGet", "TestCase2", TC_PASS, "ok");
06121 } else {
06122 SDK_RPRINT(data->test, "TSHttpTxnCacheLookupStatusGet", "TestCase2", TC_FAIL,
06123 "Incorrect Value returned by TSHttpTxnCacheLookupStatusGet");
06124 data->test_passed_txn_cache_lookup_status = false;
06125 }
06126 }
06127 }
06128 TSHttpTxnReenable(txnp, TS_EVENT_HTTP_CONTINUE);
06129 }
06130 break;
06131 case TS_EVENT_HTTP_READ_CACHE_HDR:
06132 {
06133 TSMBuffer reqbuf;
06134 TSMBuffer respbuf;
06135
06136 TSMLoc reqhdr;
06137 TSMLoc resphdr;
06138
06139 txnp = (TSHttpTxn) edata;
06140
06141 if (TSHttpTxnCachedReqGet(txnp, &reqbuf, &reqhdr) != TS_SUCCESS) {
06142 SDK_RPRINT(data->test, "TSHttpTxnCachedReqGet", "TestCase1", TC_FAIL, "TSHttpTxnCachedReqGet returns 0");
06143 } else {
06144 if ((reqbuf == reinterpret_cast<TSMBuffer>(((HttpSM *) txnp)->t_state.cache_req_hdr_heap_handle)) &&
06145 (reqhdr == reinterpret_cast<TSMLoc>((((HttpSM *) txnp)->t_state.cache_info.object_read->request_get())->m_http))) {
06146 SDK_RPRINT(data->test, "TSHttpTxnCachedReqGet", "TestCase1", TC_PASS, "ok");
06147 data->test_passed_txn_cached_req_get = true;
06148 } else {
06149 SDK_RPRINT(data->test, "TSHttpTxnCachedReqGet", "TestCase1", TC_FAIL, "Value's Mismatch");
06150 }
06151 }
06152
06153 if (TSHttpTxnCachedRespGet(txnp, &respbuf, &resphdr) != TS_SUCCESS) {
06154 SDK_RPRINT(data->test, "TSHttpTxnCachedRespGet", "TestCase1", TC_FAIL, "TSHttpTxnCachedRespGet returns 0");
06155 } else {
06156 if ((respbuf == reinterpret_cast<TSMBuffer>(((HttpSM *) txnp)->t_state.cache_resp_hdr_heap_handle)) &&
06157 (resphdr == reinterpret_cast<TSMLoc>((((HttpSM *) txnp)->t_state.cache_info.object_read->response_get())->m_http))) {
06158 SDK_RPRINT(data->test, "TSHttpTxnCachedRespGet", "TestCase1", TC_PASS, "ok");
06159 data->test_passed_txn_cached_resp_get = true;
06160 } else {
06161 SDK_RPRINT(data->test, "TSHttpTxnCachedRespGet", "TestCase1", TC_FAIL, "Value's Mismatch");
06162 }
06163 }
06164
06165 if ((TSHandleMLocRelease(reqbuf, TS_NULL_MLOC, reqhdr) != TS_SUCCESS) ||
06166 (TSHandleMLocRelease(respbuf, TS_NULL_MLOC, resphdr) != TS_SUCCESS)) {
06167 SDK_RPRINT(data->test, "TSHttpTxnCache", "", TC_FAIL, "Unable to release handle to headers.");
06168 }
06169
06170 TSHttpTxnReenable(txnp, TS_EVENT_HTTP_CONTINUE);
06171 }
06172
06173 break;
06174
06175 case TS_EVENT_IMMEDIATE:
06176 case TS_EVENT_TIMEOUT:
06177
06178 if (data->first_time == true) {
06179 if (data->browser1->status == REQUEST_INPROGRESS) {
06180 TSContSchedule(contp, 25, TS_THREAD_POOL_DEFAULT);
06181 return 0;
06182 }
06183 } else {
06184 if (data->browser2->status == REQUEST_INPROGRESS) {
06185 TSContSchedule(contp, 25, TS_THREAD_POOL_DEFAULT);
06186 return 0;
06187 }
06188 }
06189
06190
06191 {
06192
06193
06194 if (data->first_time == true) {
06195 data->first_time = false;
06196
06197 synserver_delete(data->os);
06198
06199
06200 synclient_txn_send_request(data->browser2, data->request);
06201 ink_assert(REQUEST_INPROGRESS == data->browser2->status);
06202 TSContSchedule(contp, 25, TS_THREAD_POOL_DEFAULT);
06203 return 0;
06204 }
06205
06206
06207 if ((data->browser1->status == REQUEST_SUCCESS) &&
06208 (data->browser2->status == REQUEST_SUCCESS) &&
06209 (data->test_passed_txn_cached_req_get == true) &&
06210 (data->test_passed_txn_cached_resp_get == true) && (data->test_passed_txn_cache_lookup_status == true)) {
06211 *(data->pstatus) = REGRESSION_TEST_PASSED;
06212 } else {
06213 *(data->pstatus) = REGRESSION_TEST_FAILED;
06214 }
06215
06216
06217 synclient_txn_delete(data->browser1);
06218 synclient_txn_delete(data->browser2);
06219
06220 data->magic = MAGIC_DEAD;
06221 TSfree(data->request);
06222 TSfree(data);
06223 TSContDataSet(contp, NULL);
06224 }
06225 break;
06226
06227 default:
06228 *(data->pstatus) = REGRESSION_TEST_FAILED;
06229 SDK_RPRINT(data->test, "TSHttpTxnCache", "TestCase1", TC_FAIL, "Unexpected event %d", event);
06230 break;
06231 }
06232 return 0;
06233 }
06234
06235
06236 EXCLUSIVE_REGRESSION_TEST(SDK_API_HttpTxnCache) (RegressionTest * test, int , int *pstatus)
06237 {
06238 *pstatus = REGRESSION_TEST_INPROGRESS;
06239
06240 TSCont cont = TSContCreate(cache_hook_handler, TSMutexCreate());
06241
06242 if (cont == NULL) {
06243 SDK_RPRINT(test, "TSHttpSsn", "TestCase1", TC_FAIL, "Unable to create Continuation.");
06244 *pstatus = REGRESSION_TEST_FAILED;
06245 return;
06246 }
06247
06248 CacheTestData *socktest = (CacheTestData *) TSmalloc(sizeof(CacheTestData));
06249 socktest->test = test;
06250 socktest->pstatus = pstatus;
06251 socktest->test_passed_txn_cached_req_get = false;
06252 socktest->test_passed_txn_cached_resp_get = false;
06253 socktest->first_time = true;
06254 socktest->magic = MAGIC_ALIVE;
06255 TSContDataSet(cont, socktest);
06256
06257 TSHttpHookAdd(TS_HTTP_READ_REQUEST_HDR_HOOK, cont);
06258
06259 TSHttpHookAdd(TS_HTTP_READ_CACHE_HDR_HOOK, cont);
06260 TSHttpHookAdd(TS_HTTP_CACHE_LOOKUP_COMPLETE_HOOK, cont);
06261
06262
06263 socktest->os = synserver_create(SYNSERVER_LISTEN_PORT);
06264 synserver_start(socktest->os);
06265
06266
06267 socktest->browser1 = synclient_txn_create();
06268 socktest->browser2 = synclient_txn_create();
06269 socktest->request = generate_request(2);
06270 synclient_txn_send_request(socktest->browser1, socktest->request);
06271
06272
06273 TSContSchedule(cont, 25, TS_THREAD_POOL_DEFAULT);
06274
06275 return;
06276 }
06277
06278
06279
06280
06281
06282
06283
06284
06285
06286
06287 typedef struct
06288 {
06289 TSVIO output_vio;
06290 TSIOBuffer output_buffer;
06291 TSIOBufferReader output_reader;
06292 int append_needed;
06293 } MyTransformData;
06294
06295
06296 typedef struct
06297 {
06298 RegressionTest *test;
06299 int *pstatus;
06300 SocketServer *os;
06301 ClientTxn *browser1;
06302 ClientTxn *browser2;
06303 ClientTxn *browser3;
06304 ClientTxn *browser4;
06305 char *request1;
06306 char *request2;
06307 bool test_passed_txn_transform_resp_get;
06308 bool test_passed_txn_transformed_resp_cache;
06309 bool test_passed_txn_untransformed_resp_cache;
06310 bool test_passed_transform_create;
06311 int req_no;
06312 MyTransformData *transformData;
06313 int magic;
06314 } TransformTestData;
06315
06316
06317
06318 static TSIOBuffer append_buffer;
06319 static TSIOBufferReader append_buffer_reader;
06320 static int64_t append_buffer_length;
06321
06322 static MyTransformData *
06323 my_data_alloc()
06324 {
06325 MyTransformData *data;
06326
06327 data = (MyTransformData *) TSmalloc(sizeof(MyTransformData));
06328 data->output_vio = NULL;
06329 data->output_buffer = NULL;
06330 data->output_reader = NULL;
06331 data->append_needed = 1;
06332
06333 return data;
06334 }
06335
06336 static void
06337 my_data_destroy(MyTransformData * data)
06338 {
06339 if (data) {
06340 if (data->output_buffer) {
06341 TSIOBufferDestroy(data->output_buffer);
06342 }
06343 TSfree(data);
06344 }
06345 }
06346
06347 static void
06348 handle_transform(TSCont contp)
06349 {
06350 TSVConn output_conn;
06351 TSVIO write_vio;
06352 TransformTestData *contData;
06353 MyTransformData *data;
06354 int64_t towrite;
06355 int64_t avail;
06356
06357
06358 output_conn = TSTransformOutputVConnGet(contp);
06359
06360
06361
06362
06363
06364 write_vio = TSVConnWriteVIOGet(contp);
06365
06366
06367
06368
06369
06370 contData = (TransformTestData *) TSContDataGet(contp);
06371 data = contData->transformData;
06372 if (!data) {
06373 towrite = TSVIONBytesGet(write_vio);
06374 if (towrite != INT64_MAX) {
06375 towrite += append_buffer_length;
06376 }
06377 contData->transformData = my_data_alloc();
06378 data = contData->transformData;
06379 data->output_buffer = TSIOBufferCreate();
06380 data->output_reader = TSIOBufferReaderAlloc(data->output_buffer);
06381 data->output_vio = TSVConnWrite(output_conn, contp, data->output_reader, towrite);
06382
06383
06384
06385 }
06386
06387
06388
06389
06390
06391
06392
06393
06394 if (!TSVIOBufferGet(write_vio)) {
06395 if (data->append_needed) {
06396 data->append_needed = 0;
06397 TSIOBufferCopy(TSVIOBufferGet(data->output_vio), append_buffer_reader, append_buffer_length, 0);
06398 }
06399
06400 TSVIONBytesSet(data->output_vio, TSVIONDoneGet(write_vio) + append_buffer_length);
06401 TSVIOReenable(data->output_vio);
06402 return;
06403 }
06404
06405
06406
06407
06408 towrite = TSVIONTodoGet(write_vio);
06409 if (towrite > 0) {
06410
06411
06412 avail = TSIOBufferReaderAvail(TSVIOReaderGet(write_vio));
06413 if (towrite > avail) {
06414 towrite = avail;
06415 }
06416
06417 if (towrite > 0) {
06418
06419 TSIOBufferCopy(TSVIOBufferGet(data->output_vio), TSVIOReaderGet(write_vio), towrite, 0);
06420
06421
06422
06423 TSIOBufferReaderConsume(TSVIOReaderGet(write_vio), towrite);
06424
06425
06426
06427 TSVIONDoneSet(write_vio, TSVIONDoneGet(write_vio) + towrite);
06428 }
06429 }
06430
06431
06432
06433 if (TSVIONTodoGet(write_vio) > 0) {
06434 if (towrite > 0) {
06435
06436
06437
06438
06439 TSVIOReenable(data->output_vio);
06440
06441
06442
06443 TSContCall(TSVIOContGet(write_vio), TS_EVENT_VCONN_WRITE_READY, write_vio);
06444 }
06445 } else {
06446 if (data->append_needed) {
06447 data->append_needed = 0;
06448 TSIOBufferCopy(TSVIOBufferGet(data->output_vio), append_buffer_reader, append_buffer_length, 0);
06449 }
06450
06451
06452
06453
06454
06455
06456 TSVIONBytesSet(data->output_vio, TSVIONDoneGet(write_vio) + append_buffer_length);
06457 TSVIOReenable(data->output_vio);
06458
06459
06460
06461 TSContCall(TSVIOContGet(write_vio), TS_EVENT_VCONN_WRITE_COMPLETE, write_vio);
06462 }
06463 }
06464
06465 static int
06466 transformtest_transform(TSCont contp, TSEvent event, void * )
06467 {
06468 TransformTestData *contData = (TransformTestData *) TSContDataGet(contp);
06469 if (contData->test_passed_transform_create == false) {
06470 contData->test_passed_transform_create = true;
06471 SDK_RPRINT(contData->test, "TSTransformCreate", "TestCase1", TC_PASS, "ok");
06472 }
06473
06474
06475 if (TSVConnClosedGet(contp)) {
06476 my_data_destroy(contData->transformData);
06477 contData->transformData = NULL;
06478 TSContDestroy(contp);
06479 return 0;
06480 } else {
06481 switch (event) {
06482 case TS_EVENT_ERROR:
06483 {
06484 TSVIO write_vio;
06485
06486
06487
06488
06489 write_vio = TSVConnWriteVIOGet(contp);
06490
06491
06492
06493 TSContCall(TSVIOContGet(write_vio), TS_EVENT_ERROR, write_vio);
06494 }
06495 break;
06496 case TS_EVENT_VCONN_WRITE_COMPLETE:
06497
06498
06499
06500
06501 TSVConnShutdown(TSTransformOutputVConnGet(contp), 0, 1);
06502 break;
06503 case TS_EVENT_VCONN_WRITE_READY:
06504 default:
06505
06506
06507
06508 handle_transform(contp);
06509 break;
06510 }
06511 }
06512
06513 return 0;
06514 }
06515
06516 static int
06517 transformable(TSHttpTxn txnp, TransformTestData * data)
06518 {
06519 TSMBuffer bufp;
06520 TSMLoc hdr_loc;
06521
06522 if (TSHttpTxnServerRespGet(txnp, &bufp, &hdr_loc) != TS_SUCCESS) {
06523 SDK_RPRINT(data->test, "TSHttpTxnTransform", "", TC_FAIL, "[transformable]: TSHttpTxnServerRespGet return 0");
06524 }
06525
06526
06527
06528
06529
06530 if (TS_HTTP_STATUS_OK == TSHttpHdrStatusGet(bufp, hdr_loc)) {
06531 return 1;
06532 }
06533
06534
06535
06536
06537
06538
06539 return 0;
06540 }
06541
06542 static void
06543 transform_add(TSHttpTxn txnp, TransformTestData * data)
06544 {
06545 TSVConn connp;
06546
06547 connp = TSTransformCreate(transformtest_transform, txnp);
06548 TSContDataSet(connp, data);
06549 if (connp == NULL) {
06550 SDK_RPRINT(data->test, "TSHttpTxnTransform", "", TC_FAIL, "Unable to create Transformation.");
06551 return;
06552 }
06553
06554 TSHttpTxnHookAdd(txnp, TS_HTTP_RESPONSE_TRANSFORM_HOOK, connp);
06555 return;
06556 }
06557
06558 static int
06559 load(const char *append_string)
06560 {
06561 TSIOBufferBlock blk;
06562 char *p;
06563 int64_t avail;
06564
06565 append_buffer = TSIOBufferCreate();
06566 append_buffer_reader = TSIOBufferReaderAlloc(append_buffer);
06567
06568 blk = TSIOBufferStart(append_buffer);
06569 p = TSIOBufferBlockWriteStart(blk, &avail);
06570
06571 ink_strlcpy(p, append_string, avail);
06572 if (append_string != NULL) {
06573 TSIOBufferProduce(append_buffer, strlen(append_string));
06574 }
06575
06576 append_buffer_length = TSIOBufferReaderAvail(append_buffer_reader);
06577
06578 return 1;
06579 }
06580
06581
06582
06583 static int
06584 transform_hook_handler(TSCont contp, TSEvent event, void *edata)
06585 {
06586 TSHttpTxn txnp = NULL;
06587 TransformTestData *data = NULL;
06588 data = (TransformTestData *) TSContDataGet(contp);
06589 if (data == NULL) {
06590 switch (event) {
06591 case TS_EVENT_IMMEDIATE:
06592 case TS_EVENT_TIMEOUT:
06593 break;
06594 case TS_EVENT_HTTP_READ_RESPONSE_HDR:
06595 default:
06596 TSHttpTxnReenable((TSHttpTxn) edata, TS_EVENT_HTTP_CONTINUE);
06597 break;
06598 }
06599 return 0;
06600 }
06601
06602 switch (event) {
06603 case TS_EVENT_HTTP_READ_REQUEST_HDR:
06604 txnp = (TSHttpTxn) edata;
06605 TSSkipRemappingSet(txnp,1);
06606 TSHttpTxnReenable(txnp, TS_EVENT_HTTP_CONTINUE);
06607 break;
06608 case TS_EVENT_HTTP_READ_RESPONSE_HDR:
06609 txnp = (TSHttpTxn) edata;
06610
06611 if (transformable(txnp, data)) {
06612 transform_add(txnp, data);
06613 }
06614
06615 {
06616 TSMBuffer bufp;
06617 TSMLoc hdr;
06618 TSMLoc field;
06619
06620 if (TSHttpTxnClientReqGet(txnp, &bufp, &hdr) != TS_SUCCESS) {
06621 SDK_RPRINT(data->test, "TSHttpTxnTransform", "TestCase", TC_FAIL, "TSHttpTxnClientReqGet returns 0");
06622 } else {
06623 if (TS_NULL_MLOC == (field = TSMimeHdrFieldFind(bufp, hdr, "Request", -1))) {
06624 SDK_RPRINT(data->test, "TSHttpTxnTransform", "TestCase", TC_FAIL, "Didn't find field request");
06625 } else {
06626 int reqid =TSMimeHdrFieldValueIntGet(bufp, hdr, field, 0);
06627 if (reqid == 1) {
06628 TSHttpTxnTransformedRespCache(txnp, 0);
06629 TSHttpTxnUntransformedRespCache(txnp, 1);
06630 }
06631 if (reqid == 2) {
06632 TSHttpTxnTransformedRespCache(txnp, 1);
06633 TSHttpTxnUntransformedRespCache(txnp, 0);
06634 }
06635 if (TSHandleMLocRelease(bufp, hdr, field) != TS_SUCCESS) {
06636 SDK_RPRINT(data->test, "TSHttpTxnTransform", "TestCase", TC_FAIL, "Unable to release handle to field in Client request");
06637 }
06638 }
06639 if (TSHandleMLocRelease(bufp, TS_NULL_MLOC, hdr) != TS_SUCCESS) {
06640 SDK_RPRINT(data->test, "TSHttpTxnTransform", "TestCase", TC_FAIL, "Unable to release handle to Client request");
06641 }
06642 }
06643 }
06644
06645
06646 TSHttpTxnHookAdd(txnp, TS_HTTP_SEND_RESPONSE_HDR_HOOK, contp);
06647
06648 TSHttpTxnReenable(txnp, TS_EVENT_HTTP_CONTINUE);
06649 break;
06650
06651 case TS_EVENT_HTTP_SEND_RESPONSE_HDR:
06652 {
06653 TSMBuffer bufp;
06654 TSMLoc hdr;
06655 txnp = (TSHttpTxn) edata;
06656 if (TSHttpTxnTransformRespGet(txnp, &bufp, &hdr) != TS_SUCCESS) {
06657 SDK_RPRINT(data->test, "TSHttpTxnTransformRespGet", "TestCase", TC_FAIL, "TSHttpTxnTransformRespGet returns 0");
06658 data->test_passed_txn_transform_resp_get = false;
06659 } else {
06660 if ((bufp == reinterpret_cast<TSMBuffer>(&(((HttpSM *) txnp)->t_state.hdr_info.transform_response))) &&
06661 (hdr == reinterpret_cast<TSMLoc>((&(((HttpSM *) txnp)->t_state.hdr_info.transform_response))->m_http))) {
06662 SDK_RPRINT(data->test, "TSHttpTxnTransformRespGet", "TestCase", TC_PASS, "ok");
06663 } else {
06664 SDK_RPRINT(data->test, "TSHttpTxnTransformRespGet", "TestCase", TC_FAIL, "Value's Mismatch");
06665 data->test_passed_txn_transform_resp_get = false;
06666 }
06667 if (TSHandleMLocRelease(bufp, TS_NULL_MLOC, hdr) != TS_SUCCESS) {
06668 SDK_RPRINT(data->test, "TSHttpTxnTransformRespGet", "TestCase", TC_FAIL,
06669 "Unable to release handle to Transform header handle");
06670 }
06671
06672 }
06673 }
06674 TSHttpTxnReenable(txnp, TS_EVENT_HTTP_CONTINUE);
06675 break;
06676
06677 case TS_EVENT_IMMEDIATE:
06678 case TS_EVENT_TIMEOUT:
06679
06680 switch (data->req_no) {
06681 case 1:
06682 if (data->browser1->status == REQUEST_INPROGRESS) {
06683 TSContSchedule(contp, 25, TS_THREAD_POOL_DEFAULT);
06684 return 0;
06685 }
06686 data->req_no++;
06687 Debug(UTDBG_TAG "_transform", "Running Browser 2");
06688 synclient_txn_send_request(data->browser2, data->request2);
06689 TSContSchedule(contp, 25, TS_THREAD_POOL_DEFAULT);
06690 return 0;
06691 case 2:
06692 if (data->browser2->status == REQUEST_INPROGRESS) {
06693 TSContSchedule(contp, 25, TS_THREAD_POOL_DEFAULT);
06694 return 0;
06695 }
06696 data->req_no++;
06697 Debug(UTDBG_TAG "_transform", "Running Browser 3");
06698 synclient_txn_send_request(data->browser3, data->request1);
06699 TSContSchedule(contp, 25, TS_THREAD_POOL_DEFAULT);
06700 return 0;
06701 case 3:
06702 if (data->browser3->status == REQUEST_INPROGRESS) {
06703 TSContSchedule(contp, 25, TS_THREAD_POOL_DEFAULT);
06704 return 0;
06705 }
06706 data->req_no++;
06707 Debug(UTDBG_TAG "_transform", "Running Browser 4");
06708 synclient_txn_send_request(data->browser4, data->request2);
06709 TSContSchedule(contp, 25, TS_THREAD_POOL_DEFAULT);
06710 return 0;
06711 case 4:
06712 if (data->browser4->status == REQUEST_INPROGRESS) {
06713 TSContSchedule(contp, 25, TS_THREAD_POOL_DEFAULT);
06714 return 0;
06715 }
06716 synserver_delete(data->os);
06717 data->req_no++;
06718 TSfree(data->request1);
06719 TSfree(data->request2);
06720
06721
06722
06723
06724
06725 break;
06726 default:
06727 SDK_RPRINT(data->test, "TSHttpTxnTransform", "TestCase", TC_FAIL, "Something terribly wrong with the test");
06728 exit(0);
06729
06730 }
06731
06732 {
06733
06734 if ((strstr(data->browser1->response, TRANSFORM_APPEND_STRING) != NULL) &&
06735 (strstr(data->browser3->response, TRANSFORM_APPEND_STRING) == NULL)) {
06736 SDK_RPRINT(data->test, "TSHttpTxnUntransformedResponseCache", "TestCase1", TC_PASS, "ok");
06737 data->test_passed_txn_untransformed_resp_cache = true;
06738 } else {
06739 SDK_RPRINT(data->test, "TSHttpTxnUntransformedResponseCache", "TestCase1", TC_FAIL, "Value's Mismatch");
06740 }
06741
06742 if ((strstr(data->browser2->response, TRANSFORM_APPEND_STRING) != NULL) &&
06743 (strstr(data->browser4->response, TRANSFORM_APPEND_STRING) != NULL)) {
06744 SDK_RPRINT(data->test, "TSHttpTxnTransformedResponseCache", "TestCase1", TC_PASS, "ok");
06745 data->test_passed_txn_transformed_resp_cache = true;
06746 } else {
06747 SDK_RPRINT(data->test, "TSHttpTxnTransformedResponseCache", "TestCase1", TC_FAIL, "Value's Mismatch");
06748 }
06749
06750
06751 *(data->pstatus) = REGRESSION_TEST_PASSED;
06752 if (data->browser1->status != REQUEST_SUCCESS) {
06753 SDK_RPRINT(data->test, "TSTransformCreate", "TestCase1", TC_FAIL, "Browser 1 status was not REQUEST_SUCCESS");
06754 *(data->pstatus) = REGRESSION_TEST_FAILED;
06755 }
06756 if (data->browser2->status != REQUEST_SUCCESS) {
06757 SDK_RPRINT(data->test, "TSTransformCreate", "TestCase1", TC_FAIL, "Browser 2 status was not REQUEST_SUCCESS");
06758 *(data->pstatus) = REGRESSION_TEST_FAILED;
06759 }
06760 if (data->browser3->status != REQUEST_SUCCESS) {
06761 SDK_RPRINT(data->test, "TSTransformCreate", "TestCase1", TC_FAIL, "Browser 3 status was not REQUEST_SUCCESS");
06762 *(data->pstatus) = REGRESSION_TEST_FAILED;
06763 }
06764 if (data->browser4->status != REQUEST_SUCCESS) {
06765 SDK_RPRINT(data->test, "TSTransformCreate", "TestCase1", TC_FAIL, "Browser 4 status was not REQUEST_SUCCESS");
06766 *(data->pstatus) = REGRESSION_TEST_FAILED;
06767 }
06768 if (data->test_passed_txn_transform_resp_get != true) {
06769 SDK_RPRINT(data->test, "TSTransformCreate", "TestCase1", TC_FAIL, "did not pass transform_resp_get");
06770 *(data->pstatus) = REGRESSION_TEST_FAILED;
06771 }
06772 if (data->test_passed_txn_transformed_resp_cache != true) {
06773 SDK_RPRINT(data->test, "TSTransformCreate", "TestCase1", TC_FAIL, "did not pass transformed_resp_cache");
06774 *(data->pstatus) = REGRESSION_TEST_FAILED;
06775 }
06776 if (data->test_passed_txn_untransformed_resp_cache != true) {
06777 SDK_RPRINT(data->test, "TSTransformCreate", "TestCase1", TC_FAIL, "did not pass untransformed_resp_cache");
06778 *(data->pstatus) = REGRESSION_TEST_FAILED;
06779 }
06780 if (data->test_passed_transform_create != true) {
06781 SDK_RPRINT(data->test, "TSTransformCreate", "TestCase1", TC_FAIL, "did not pass transform_create");
06782 *(data->pstatus) = REGRESSION_TEST_FAILED;
06783 }
06784
06785 synclient_txn_delete(data->browser1);
06786 synclient_txn_delete(data->browser2);
06787 synclient_txn_delete(data->browser3);
06788 synclient_txn_delete(data->browser4);
06789
06790 data->magic = MAGIC_DEAD;
06791 TSfree(data);
06792 TSContDataSet(contp, NULL);
06793 }
06794 break;
06795
06796 default:
06797 *(data->pstatus) = REGRESSION_TEST_FAILED;
06798 SDK_RPRINT(data->test, "TSHttpTxnTransform", "TestCase1", TC_FAIL, "Unexpected event %d", event);
06799 break;
06800 }
06801 return 0;
06802 }
06803
06804
06805 EXCLUSIVE_REGRESSION_TEST(SDK_API_HttpTxnTransform) (RegressionTest * test, int , int *pstatus)
06806 {
06807 *pstatus = REGRESSION_TEST_INPROGRESS;
06808
06809 Debug(UTDBG_TAG "_transform", "Starting test");
06810
06811 TSCont cont = TSContCreate(transform_hook_handler, TSMutexCreate());
06812 if (cont == NULL) {
06813 SDK_RPRINT(test, "TSHttpSsn", "TestCase1", TC_FAIL, "Unable to create Continuation.");
06814 *pstatus = REGRESSION_TEST_FAILED;
06815 return;
06816 }
06817
06818 TransformTestData *socktest = (TransformTestData *) TSmalloc(sizeof(TransformTestData));
06819 socktest->test = test;
06820 socktest->pstatus = pstatus;
06821 socktest->test_passed_txn_transform_resp_get = true;
06822 socktest->test_passed_txn_transformed_resp_cache = false;
06823 socktest->test_passed_txn_transformed_resp_cache = false;
06824 socktest->test_passed_transform_create = false;
06825 socktest->transformData = NULL;
06826 socktest->req_no = 1;
06827 socktest->magic = MAGIC_ALIVE;
06828 TSContDataSet(cont, socktest);
06829
06830
06831 load(TRANSFORM_APPEND_STRING);
06832
06833 TSHttpHookAdd(TS_HTTP_READ_REQUEST_HDR_HOOK, cont);
06834
06835
06836 TSHttpHookAdd(TS_HTTP_READ_RESPONSE_HDR_HOOK, cont);
06837
06838
06839 socktest->os = synserver_create(SYNSERVER_LISTEN_PORT);
06840 synserver_start(socktest->os);
06841
06842
06843 socktest->browser1 = synclient_txn_create();
06844 socktest->browser2 = synclient_txn_create();
06845 socktest->browser3 = synclient_txn_create();
06846 socktest->browser4 = synclient_txn_create();
06847 socktest->request1 = generate_request(4);
06848 socktest->request2 = generate_request(5);
06849 Debug(UTDBG_TAG "_transform", "Running Browser 1");
06850 synclient_txn_send_request(socktest->browser1, socktest->request1);
06851
06852
06853
06854 TSContSchedule(cont, 25, TS_THREAD_POOL_DEFAULT);
06855
06856 return;
06857 }
06858
06859
06860
06861
06862
06863
06864
06865
06866 typedef struct
06867 {
06868 RegressionTest *test;
06869 int *pstatus;
06870 SocketServer *os;
06871 ClientTxn *browser1;
06872 ClientTxn *browser2;
06873 ClientTxn *browser3;
06874 char *request1;
06875 char *request2;
06876 char *request3;
06877 bool test_passed_txn_alt_info_client_req_get;
06878 bool test_passed_txn_alt_info_cached_req_get;
06879 bool test_passed_txn_alt_info_cached_resp_get;
06880 bool test_passed_txn_alt_info_quality_set;
06881 bool run_at_least_once;
06882 bool first_time;
06883 int magic;
06884 } AltInfoTestData;
06885
06886 static int
06887 altinfo_hook_handler(TSCont contp, TSEvent event, void *edata)
06888 {
06889 AltInfoTestData *data = NULL;
06890 TSHttpTxn txnp = NULL;
06891
06892 data = (AltInfoTestData *) TSContDataGet(contp);
06893 if (data == NULL) {
06894 switch (event) {
06895 case TS_EVENT_IMMEDIATE:
06896 case TS_EVENT_TIMEOUT:
06897 break;
06898 case TS_EVENT_HTTP_SELECT_ALT:
06899 break;
06900 default:
06901 TSHttpTxnReenable((TSHttpTxn) edata, TS_EVENT_HTTP_CONTINUE);
06902 break;
06903 }
06904 return 0;
06905 }
06906
06907 switch (event) {
06908 case TS_EVENT_HTTP_READ_REQUEST_HDR:
06909 txnp = (TSHttpTxn) edata;
06910 TSSkipRemappingSet(txnp,1);
06911 TSHttpTxnReenable(txnp, TS_EVENT_HTTP_CONTINUE);
06912 break;
06913
06914 case TS_EVENT_HTTP_SELECT_ALT:
06915 {
06916 TSMBuffer clientreqbuf;
06917 TSMBuffer cachereqbuf;
06918 TSMBuffer cacherespbuf;
06919
06920 TSMLoc clientreqhdr;
06921 TSMLoc cachereqhdr;
06922 TSMLoc cacheresphdr;
06923
06924 TSHttpAltInfo infop = (TSHttpAltInfo) edata;
06925
06926 data->run_at_least_once = true;
06927 if (TSHttpAltInfoClientReqGet(infop, &clientreqbuf, &clientreqhdr) != TS_SUCCESS) {
06928 SDK_RPRINT(data->test, "TSHttpAltInfoClientReqGet", "TestCase", TC_FAIL,
06929 "TSHttpAltInfoClientReqGet doesn't return TS_SUCCESS");
06930 data->test_passed_txn_alt_info_client_req_get = false;
06931 } else {
06932 if ((clientreqbuf == reinterpret_cast<TSMBuffer>(&(((HttpAltInfo *)infop)->m_client_req))) &&
06933 (clientreqhdr == reinterpret_cast<TSMLoc>(((HttpAltInfo *)infop)->m_client_req.m_http))) {
06934 SDK_RPRINT(data->test, "TSHttpAltInfoClientReqGet", "TestCase", TC_PASS, "ok");
06935 } else {
06936 SDK_RPRINT(data->test, "TSHttpAltInfoClientReqGet", "TestCase", TC_FAIL, "Value's Mismatch");
06937 data->test_passed_txn_alt_info_client_req_get = false;
06938 }
06939 }
06940
06941 if (TSHttpAltInfoCachedReqGet(infop, &cachereqbuf, &cachereqhdr) != TS_SUCCESS) {
06942 SDK_RPRINT(data->test, "TSHttpAltInfoCachedReqGet", "TestCase", TC_FAIL,
06943 "TSHttpAltInfoCachedReqGet doesn't return TS_SUCCESS");
06944 data->test_passed_txn_alt_info_cached_req_get = false;
06945 } else {
06946 if ((cachereqbuf == reinterpret_cast<TSMBuffer>(&(((HttpAltInfo *) infop)->m_cached_req))) &&
06947 (cachereqhdr == reinterpret_cast<TSMLoc>(((HttpAltInfo *) infop)->m_cached_req.m_http))) {
06948 SDK_RPRINT(data->test, "TSHttpAltInfoCachedReqGet", "TestCase", TC_PASS, "ok");
06949 } else {
06950 SDK_RPRINT(data->test, "TSHttpAltInfoCachedReqGet", "TestCase", TC_FAIL, "Value's Mismatch");
06951 data->test_passed_txn_alt_info_cached_req_get = false;
06952 }
06953 }
06954
06955 if (TSHttpAltInfoCachedRespGet(infop, &cacherespbuf, &cacheresphdr) != TS_SUCCESS) {
06956 SDK_RPRINT(data->test, "TSHttpAltInfoCachedRespGet", "TestCase", TC_FAIL,
06957 "TSHttpAltInfoCachedRespGet doesn't return TS_SUCCESS");
06958 data->test_passed_txn_alt_info_cached_resp_get = false;
06959 } else {
06960 if ((cacherespbuf == reinterpret_cast<TSMBuffer>(&(((HttpAltInfo *) infop)->m_cached_resp))) &&
06961 (cacheresphdr == reinterpret_cast<TSMLoc>(((HttpAltInfo *) infop)->m_cached_resp.m_http))) {
06962 SDK_RPRINT(data->test, "TSHttpAltInfoCachedRespGet", "TestCase", TC_PASS, "ok");
06963 } else {
06964 SDK_RPRINT(data->test, "TSHttpAltInfoCachedRespGet", "TestCase", TC_FAIL, "Value's Mismatch");
06965 data->test_passed_txn_alt_info_cached_resp_get = false;
06966 }
06967 }
06968
06969 TSHttpAltInfoQualitySet(infop, 0.5);
06970 SDK_RPRINT(data->test, "TSHttpAltInfoQualitySet", "TestCase", TC_PASS, "ok");
06971 }
06972
06973 break;
06974
06975 case TS_EVENT_IMMEDIATE:
06976 case TS_EVENT_TIMEOUT:
06977
06978 if (data->first_time == true) {
06979 if ((data->browser1->status == REQUEST_INPROGRESS) || (data->browser2->status == REQUEST_INPROGRESS)) {
06980 TSContSchedule(contp, 25, TS_THREAD_POOL_DEFAULT);
06981 return 0;
06982 }
06983 } else {
06984 if (data->browser3->status == REQUEST_INPROGRESS) {
06985 TSContSchedule(contp, 25, TS_THREAD_POOL_DEFAULT);
06986 return 0;
06987 }
06988 }
06989
06990
06991 {
06992
06993
06994 if (data->first_time == true) {
06995 data->first_time = false;
06996
06997 synserver_delete(data->os);
06998
06999
07000 synclient_txn_send_request(data->browser3, data->request3);
07001
07002
07003 TSHttpHookAdd(TS_HTTP_SELECT_ALT_HOOK, contp);
07004 TSContSchedule(contp, 25, TS_THREAD_POOL_DEFAULT);
07005 return 0;
07006 }
07007
07008
07009 if ((data->browser3->status == REQUEST_SUCCESS) &&
07010 (data->test_passed_txn_alt_info_client_req_get == true) &&
07011 (data->test_passed_txn_alt_info_cached_req_get == true) &&
07012 (data->test_passed_txn_alt_info_cached_resp_get == true) &&
07013 (data->test_passed_txn_alt_info_quality_set == true) && (data->run_at_least_once == true)) {
07014 *(data->pstatus) = REGRESSION_TEST_PASSED;
07015 } else {
07016 if (data->run_at_least_once == false) {
07017 SDK_RPRINT(data->test, "TSHttpAltInfo", "All", TC_FAIL, "Test not executed even once");
07018 }
07019 *(data->pstatus) = REGRESSION_TEST_FAILED;
07020 }
07021
07022
07023 synclient_txn_delete(data->browser1);
07024 synclient_txn_delete(data->browser2);
07025 synclient_txn_delete(data->browser3);
07026
07027 TSfree(data->request1);
07028 TSfree(data->request2);
07029 TSfree(data->request3);
07030
07031 data->magic = MAGIC_DEAD;
07032 TSfree(data);
07033 TSContDataSet(contp, NULL);
07034 }
07035 break;
07036
07037 default:
07038 *(data->pstatus) = REGRESSION_TEST_FAILED;
07039 SDK_RPRINT(data->test, "TSHttpTxnCache", "TestCase1", TC_FAIL, "Unexpected event %d", event);
07040 break;
07041 }
07042 return 0;
07043 }
07044
07045
07046
07047 EXCLUSIVE_REGRESSION_TEST(SDK_API_HttpAltInfo) (RegressionTest * test, int , int *pstatus)
07048 {
07049 *pstatus = REGRESSION_TEST_INPROGRESS;
07050
07051 TSCont cont = TSContCreate(altinfo_hook_handler, TSMutexCreate());
07052 if (cont == NULL) {
07053 SDK_RPRINT(test, "TSHttpSsn", "TestCase1", TC_FAIL, "Unable to create Continuation.");
07054 *pstatus = REGRESSION_TEST_FAILED;
07055 return;
07056 }
07057
07058 TSHttpHookAdd(TS_HTTP_READ_REQUEST_HDR_HOOK, cont);
07059
07060 AltInfoTestData *socktest = (AltInfoTestData *) TSmalloc(sizeof(AltInfoTestData));
07061 socktest->test = test;
07062 socktest->pstatus = pstatus;
07063 socktest->test_passed_txn_alt_info_client_req_get = true;
07064 socktest->test_passed_txn_alt_info_cached_req_get = true;
07065 socktest->test_passed_txn_alt_info_cached_resp_get = true;
07066 socktest->test_passed_txn_alt_info_quality_set = true;
07067 socktest->run_at_least_once = false;
07068 socktest->first_time = true;
07069 socktest->magic = MAGIC_ALIVE;
07070 TSContDataSet(cont, socktest);
07071
07072
07073 socktest->os = synserver_create(SYNSERVER_LISTEN_PORT);
07074 synserver_start(socktest->os);
07075
07076
07077 socktest->browser1 = synclient_txn_create();
07078 socktest->browser2 = synclient_txn_create();
07079 socktest->browser3 = synclient_txn_create();
07080 socktest->request1 = generate_request(6);
07081 socktest->request2 = generate_request(7);
07082 socktest->request3 = generate_request(8);
07083 synclient_txn_send_request(socktest->browser1, socktest->request1);
07084 synclient_txn_send_request(socktest->browser2, socktest->request2);
07085
07086
07087 TSContSchedule(cont, 25, TS_THREAD_POOL_DEFAULT);
07088
07089 return;
07090 }
07091
07092
07093
07094
07095
07096
07097
07098
07099
07100
07101
07102
07103
07104
07105
07106
07107
07108
07109
07110
07111
07112
07113
07114
07115
07116 #define TEST_CASE_CONNECT_ID1 9 //TSHttpTxnIntercept
07117 #define TEST_CASE_CONNECT_ID2 10 //TSHttpTxnServerIntercept
07118
07119 #define SYNSERVER_DUMMY_PORT -1
07120
07121 typedef struct
07122 {
07123 RegressionTest *test;
07124 int *pstatus;
07125 int test_case;
07126 TSVConn vc;
07127 SocketServer *os;
07128 ClientTxn *browser;
07129 char *request;
07130 unsigned long magic;
07131 } ConnectTestData;
07132
07133
07134 static int
07135 cont_test_handler(TSCont contp, TSEvent event, void *edata)
07136 {
07137 TSHttpTxn txnp = (TSHttpTxn) edata;
07138 ConnectTestData *data = (ConnectTestData *) TSContDataGet(contp);
07139 int request_id = -1;
07140
07141 TSReleaseAssert(data->magic == MAGIC_ALIVE);
07142 TSReleaseAssert((data->test_case == TEST_CASE_CONNECT_ID1) || (data->test_case == TEST_CASE_CONNECT_ID2));
07143
07144 TSDebug(UTDBG_TAG, "Calling cont_test_handler with event %d", event);
07145
07146 switch (event) {
07147 case TS_EVENT_HTTP_READ_REQUEST_HDR:
07148 TSDebug(UTDBG_TAG, "cont_test_handler: event READ_REQUEST");
07149
07150
07151
07152 request_id = get_request_id(txnp);
07153 TSReleaseAssert(request_id != -1);
07154
07155 TSDebug(UTDBG_TAG, "cont_test_handler: Request id = %d", request_id);
07156
07157 if ((request_id != TEST_CASE_CONNECT_ID1) && (request_id != TEST_CASE_CONNECT_ID2)) {
07158 TSDebug(UTDBG_TAG, "This is not an event for this test !");
07159 TSHttpTxnReenable(txnp, TS_EVENT_HTTP_CONTINUE);
07160 goto done;
07161 }
07162
07163 if ((request_id == TEST_CASE_CONNECT_ID1) && (data->test_case == TEST_CASE_CONNECT_ID1)) {
07164 TSDebug(UTDBG_TAG, "Calling TSHttpTxnIntercept");
07165 TSHttpTxnIntercept(data->os->accept_cont, txnp);
07166 } else if ((request_id == TEST_CASE_CONNECT_ID2) && (data->test_case == TEST_CASE_CONNECT_ID2)) {
07167 TSDebug(UTDBG_TAG, "Calling TSHttpTxnServerIntercept");
07168 TSHttpTxnServerIntercept(data->os->accept_cont, txnp);
07169 }
07170
07171 TSHttpTxnReenable(txnp, TS_EVENT_HTTP_CONTINUE);
07172 break;
07173
07174 case TS_EVENT_TIMEOUT:
07175
07176 if (data->browser->status == REQUEST_INPROGRESS) {
07177 TSDebug(UTDBG_TAG, "Browser still waiting response...");
07178 TSContSchedule(contp, 25, TS_THREAD_POOL_DEFAULT);
07179 }
07180
07181 else {
07182
07183 char *body_response = get_body_ptr(data->browser->response);
07184 const char *body_expected;
07185 if (data->test_case == TEST_CASE_CONNECT_ID1) {
07186 body_expected = "Body for response 9";
07187 } else {
07188 body_expected = "Body for response 10";
07189 }
07190 TSDebug(UTDBG_TAG, "Body Response = \n|%s|\nBody Expected = \n|%s|", body_response ? body_response : "*NULL*", body_expected);
07191
07192 if (!body_response
07193 || strncmp(body_response, body_expected, strlen(body_expected)) != 0
07194 ) {
07195 if (data->test_case == TEST_CASE_CONNECT_ID1) {
07196 SDK_RPRINT(data->test, "TSHttpConnect", "TestCase1", TC_FAIL, "Unexpected response");
07197 SDK_RPRINT(data->test, "TSHttpTxnIntercept", "TestCase1", TC_FAIL, "Unexpected response");
07198 } else {
07199 SDK_RPRINT(data->test, "TSHttpConnect", "TestCase2", TC_FAIL, "Unexpected response");
07200 SDK_RPRINT(data->test, "TSHttpTxnServerIntercept", "TestCase2", TC_FAIL, "Unexpected response");
07201 }
07202 *(data->pstatus) = REGRESSION_TEST_FAILED;
07203
07204 } else {
07205 if (data->test_case == TEST_CASE_CONNECT_ID1) {
07206 SDK_RPRINT(data->test, "TSHttpConnect", "TestCase1", TC_PASS, "ok");
07207 SDK_RPRINT(data->test, "TSHttpTxnIntercept", "TestCase1", TC_PASS, "ok");
07208 } else {
07209 SDK_RPRINT(data->test, "TSHttpConnect", "TestCase2", TC_PASS, "ok");
07210 SDK_RPRINT(data->test, "TSHttpTxnServerIntercept", "TestCase2", TC_PASS, "ok");
07211 }
07212 *(data->pstatus) = REGRESSION_TEST_PASSED;
07213 }
07214
07215
07216 synclient_txn_delete(data->browser);
07217 synserver_delete(data->os);
07218
07219
07220
07221
07222
07223
07224 }
07225 break;
07226
07227 default:
07228 *(data->pstatus) = REGRESSION_TEST_FAILED;
07229 SDK_RPRINT(data->test, "TSHttpConnect", "TestCase1 or 2", TC_FAIL, "Unexpected event %d", event);
07230 break;
07231 }
07232
07233 done:
07234 return TS_EVENT_IMMEDIATE;
07235 }
07236
07237
07238 EXCLUSIVE_REGRESSION_TEST(SDK_API_TSHttpConnectIntercept) (RegressionTest * test, int , int *pstatus)
07239 {
07240 *pstatus = REGRESSION_TEST_INPROGRESS;
07241
07242 TSDebug(UTDBG_TAG, "Starting test TSHttpConnectIntercept");
07243
07244 TSCont cont_test = TSContCreate(cont_test_handler, TSMutexCreate());
07245 ConnectTestData *data = (ConnectTestData *) TSmalloc(sizeof(ConnectTestData));
07246 TSContDataSet(cont_test, data);
07247
07248 data->test = test;
07249 data->pstatus = pstatus;
07250 data->magic = MAGIC_ALIVE;
07251 data->test_case = TEST_CASE_CONNECT_ID1;
07252
07253
07254 TSHttpHookAdd(TS_HTTP_READ_REQUEST_HDR_HOOK, cont_test);
07255
07256
07257
07258 data->os = synserver_create(SYNSERVER_DUMMY_PORT);
07259
07260 data->browser = synclient_txn_create();
07261 data->request = generate_request(9);
07262
07263
07264
07265
07266 sockaddr_in addr;
07267 ats_ip4_set(&addr, 1, 1);
07268 data->vc = TSHttpConnect(ats_ip_sa_cast(&addr));
07269 synclient_txn_send_request_to_vc(data->browser, data->request, data->vc);
07270
07271
07272 TSContSchedule(cont_test, 25, TS_THREAD_POOL_DEFAULT);
07273
07274 return;
07275 }
07276
07277
07278 EXCLUSIVE_REGRESSION_TEST(SDK_API_TSHttpConnectServerIntercept) (RegressionTest * test, int ,
07279 int *pstatus)
07280 {
07281 *pstatus = REGRESSION_TEST_INPROGRESS;
07282
07283 TSDebug(UTDBG_TAG, "Starting test TSHttpConnectServerintercept");
07284
07285 TSCont cont_test = TSContCreate(cont_test_handler, TSMutexCreate());
07286 ConnectTestData *data = (ConnectTestData *) TSmalloc(sizeof(ConnectTestData));
07287 TSContDataSet(cont_test, data);
07288
07289 data->test = test;
07290 data->pstatus = pstatus;
07291 data->magic = MAGIC_ALIVE;
07292 data->test_case = TEST_CASE_CONNECT_ID2;
07293
07294
07295 TSHttpHookAdd(TS_HTTP_READ_REQUEST_HDR_HOOK, cont_test);
07296
07297
07298 data->os = synserver_create(SYNSERVER_DUMMY_PORT);
07299
07300 data->browser = synclient_txn_create();
07301 data->request = generate_request(10);
07302
07303
07304
07305
07306 sockaddr_in addr;
07307 ats_ip4_set(&addr, 2, 2);
07308 data->vc = TSHttpConnect(ats_ip_sa_cast(&addr));
07309
07310 synclient_txn_send_request_to_vc(data->browser, data->request, data->vc);
07311
07312
07313 TSContSchedule(cont_test, 25, TS_THREAD_POOL_DEFAULT);
07314
07315 return;
07316 }
07317
07318
07319
07320
07321
07322
07323
07324
07325
07326
07327
07328
07329
07330
07331
07332 const char *SDK_Overridable_Configs[TS_CONFIG_LAST_ENTRY] = {
07333 "proxy.config.url_remap.pristine_host_hdr",
07334 "proxy.config.http.chunking_enabled",
07335 "proxy.config.http.negative_caching_enabled",
07336 "proxy.config.http.negative_caching_lifetime",
07337 "proxy.config.http.cache.when_to_revalidate",
07338 "proxy.config.http.keep_alive_enabled_in",
07339 "proxy.config.http.keep_alive_enabled_out",
07340 "proxy.config.http.keep_alive_post_out",
07341 "proxy.config.http.share_server_sessions",
07342 "proxy.config.http.server_session_sharing.pool",
07343 "proxy.config.http.server_session_sharing.match",
07344 "proxy.config.net.sock_recv_buffer_size_out",
07345 "proxy.config.net.sock_send_buffer_size_out",
07346 "proxy.config.net.sock_option_flag_out",
07347 "proxy.config.http.forward.proxy_auth_to_parent",
07348 "proxy.config.http.anonymize_remove_from",
07349 "proxy.config.http.anonymize_remove_referer",
07350 "proxy.config.http.anonymize_remove_user_agent",
07351 "proxy.config.http.anonymize_remove_cookie",
07352 "proxy.config.http.anonymize_remove_client_ip",
07353 "proxy.config.http.anonymize_insert_client_ip",
07354 "proxy.config.http.response_server_enabled",
07355 "proxy.config.http.insert_squid_x_forwarded_for",
07356 "proxy.config.http.server_tcp_init_cwnd",
07357 "proxy.config.http.send_http11_requests",
07358 "proxy.config.http.cache.http",
07359 "proxy.config.http.cache.cluster_cache_local",
07360 "proxy.config.http.cache.ignore_client_no_cache",
07361 "proxy.config.http.cache.ignore_client_cc_max_age",
07362 "proxy.config.http.cache.ims_on_client_no_cache",
07363 "proxy.config.http.cache.ignore_server_no_cache",
07364 "proxy.config.http.cache.cache_responses_to_cookies",
07365 "proxy.config.http.cache.ignore_authentication",
07366 "proxy.config.http.cache.cache_urls_that_look_dynamic",
07367 "proxy.config.http.cache.required_headers",
07368 "proxy.config.http.insert_request_via_str",
07369 "proxy.config.http.insert_response_via_str",
07370 "proxy.config.http.cache.heuristic_min_lifetime",
07371 "proxy.config.http.cache.heuristic_max_lifetime",
07372 "proxy.config.http.cache.guaranteed_min_lifetime",
07373 "proxy.config.http.cache.guaranteed_max_lifetime",
07374 "proxy.config.http.cache.max_stale_age",
07375 "proxy.config.http.keep_alive_no_activity_timeout_in",
07376 "proxy.config.http.keep_alive_no_activity_timeout_out",
07377 "proxy.config.http.transaction_no_activity_timeout_in",
07378 "proxy.config.http.transaction_no_activity_timeout_out",
07379 "proxy.config.http.transaction_active_timeout_out",
07380 "proxy.config.http.origin_max_connections",
07381 "proxy.config.http.connect_attempts_max_retries",
07382 "proxy.config.http.connect_attempts_max_retries_dead_server",
07383 "proxy.config.http.connect_attempts_rr_retries",
07384 "proxy.config.http.connect_attempts_timeout",
07385 "proxy.config.http.post_connect_attempts_timeout",
07386 "proxy.config.http.down_server.cache_time",
07387 "proxy.config.http.down_server.abort_threshold",
07388 "proxy.config.http.cache.fuzz.time",
07389 "proxy.config.http.cache.fuzz.min_time",
07390 "proxy.config.http.doc_in_cache_skip_dns",
07391 "proxy.config.http.background_fill_active_timeout",
07392 "proxy.config.http.response_server_str",
07393 "proxy.config.http.cache.heuristic_lm_factor",
07394 "proxy.config.http.cache.fuzz.probability",
07395 "proxy.config.http.background_fill_completed_threshold",
07396 "proxy.config.net.sock_packet_mark_out",
07397 "proxy.config.net.sock_packet_tos_out",
07398 "proxy.config.http.insert_age_in_response",
07399 "proxy.config.http.chunking.size",
07400 "proxy.config.http.flow_control.enabled",
07401 "proxy.config.http.flow_control.low_water",
07402 "proxy.config.http.flow_control.high_water",
07403 "proxy.config.http.cache.range.lookup",
07404 "proxy.config.http.normalize_ae_gzip",
07405 "proxy.config.http.default_buffer_size",
07406 "proxy.config.http.default_buffer_water_mark",
07407 "proxy.config.http.request_header_max_size",
07408 "proxy.config.http.response_header_max_size",
07409 "proxy.config.http.negative_revalidating_enabled",
07410 "proxy.config.http.negative_revalidating_lifetime",
07411 "proxy.config.http.accept_encoding_filter_enabled",
07412 "proxy.config.ssl.hsts_max_age",
07413 "proxy.config.ssl.hsts_include_subdomains",
07414 "proxy.config.http.cache.open_read_retry_time",
07415 "proxy.config.http.cache.max_open_read_retries",
07416 "proxy.config.http.cache.range.write",
07417 "proxy.config.http.post.check.content_length.enabled",
07418 "proxy.config.http.global_user_agent_header",
07419 };
07420
07421 REGRESSION_TEST(SDK_API_OVERRIDABLE_CONFIGS) (RegressionTest * test, int , int *pstatus)
07422 {
07423 const char *conf;
07424 TSOverridableConfigKey key;
07425 TSRecordDataType type;
07426 HttpSM* s = HttpSM::allocate();
07427 bool success = true;
07428 TSHttpTxn txnp = reinterpret_cast<TSHttpTxn>(s);
07429 InkRand generator(17);
07430 TSMgmtInt ival_read, ival_rand;
07431 TSMgmtFloat fval_read, fval_rand;
07432 const char *sval_read;
07433 const char *test_string = "The Apache Traffic Server";
07434 int len;
07435
07436
07437 s->init();
07438
07439 *pstatus = REGRESSION_TEST_INPROGRESS;
07440 for (int i=TS_CONFIG_NULL + 1; i < TS_CONFIG_LAST_ENTRY; ++i) {
07441 conf = SDK_Overridable_Configs[i];
07442
07443 if (TS_SUCCESS == TSHttpTxnConfigFind(conf, -1, &key, &type)) {
07444 if (key != i) {
07445 SDK_RPRINT(test, "TSHttpTxnConfigFind", "TestCase1", TC_FAIL, "Failed on %s, expected %d, got %d", conf, i, key);
07446 success = false;
07447 continue;
07448 }
07449 } else {
07450 SDK_RPRINT(test, "TSHttpTxnConfigFind", "TestCase1", TC_FAIL, "Call returned unexpected TS_ERROR for %s",conf);
07451 success = false;
07452 continue;
07453 }
07454
07455
07456 switch (type) {
07457 case TS_RECORDDATATYPE_INT:
07458 ival_rand = generator.random() % 126;
07459
07460 if (TS_CONFIG_HTTP_SHARE_SERVER_SESSIONS == key) ival_rand %= 2;
07461
07462 TSHttpTxnConfigIntSet(txnp, key, ival_rand);
07463 TSHttpTxnConfigIntGet(txnp, key, &ival_read);
07464 if (ival_rand != ival_read) {
07465 SDK_RPRINT(test, "TSHttpTxnConfigIntSet", "TestCase1", TC_FAIL, "Failed on %s, %d != %d", conf,
07466 ival_read, ival_rand);
07467 success = false;
07468 continue;
07469 }
07470 break;
07471
07472 case TS_RECORDDATATYPE_FLOAT:
07473 fval_rand = generator.random();
07474 TSHttpTxnConfigFloatSet(txnp, key, fval_rand);
07475 TSHttpTxnConfigFloatGet(txnp, key, &fval_read);
07476 if (fval_rand != fval_read) {
07477 SDK_RPRINT(test, "TSHttpTxnConfigFloatSet", "TestCase1", TC_FAIL, "Failed on %s, %f != %f", conf,
07478 fval_read, fval_rand);
07479 success = false;
07480 continue;
07481 }
07482 break;
07483
07484 case TS_RECORDDATATYPE_STRING:
07485 TSHttpTxnConfigStringSet(txnp, key, test_string, -1);
07486 TSHttpTxnConfigStringGet(txnp, key, &sval_read, &len);
07487 if (test_string != sval_read) {
07488 SDK_RPRINT(test, "TSHttpTxnConfigStringSet", "TestCase1", TC_FAIL, "Failed on %s, %s != %s", conf,
07489 sval_read, test_string);
07490 success = false;
07491 continue;
07492 }
07493 break;
07494
07495 default:
07496 break;
07497 }
07498 }
07499
07500 s->destroy();
07501 if (success) {
07502 *pstatus = REGRESSION_TEST_PASSED;
07503 SDK_RPRINT(test, "TSHttpTxnConfigFind", "TestCase1", TC_PASS, "ok");
07504 SDK_RPRINT(test, "TSHttpTxnConfigIntSet", "TestCase1", TC_PASS, "ok");
07505 SDK_RPRINT(test, "TSHttpTxnConfigFloatSet", "TestCase1", TC_PASS, "ok");
07506 SDK_RPRINT(test, "TSHttpTxnConfigStringSet", "TestCase1", TC_PASS, "ok");
07507 } else {
07508 *pstatus = REGRESSION_TEST_FAILED;
07509 }
07510
07511 return;
07512 }
07513
07514
07515
07516
07517
07518
07519
07520
07521
07522 REGRESSION_TEST(SDK_API_ENCODING) (RegressionTest * test, int , int *pstatus)
07523 {
07524 const char *url = "http://www.example.com/foo?fie= \"#%<>[]\\^`{}~&bar={test}&fum=Apache Traffic Server";
07525 const char *url_encoded =
07526 "http://www.example.com/foo?fie=%20%22%23%25%3C%3E%5B%5D%5C%5E%60%7B%7D%7E&bar=%7Btest%7D&fum=Apache%20Traffic%20Server";
07527 const char *url_base64 = "aHR0cDovL3d3dy5leGFtcGxlLmNvbS9mb28/ZmllPSAiIyU8PltdXF5ge31+JmJhcj17dGVzdH0mZnVtPUFwYWNoZSBUcmFmZmljIFNlcnZlcg==";
07528 const char *url2 = "http://www.example.com/";
07529 char buf[1024];
07530 size_t length;
07531 bool success = true;
07532
07533 if (TS_SUCCESS != TSStringPercentEncode(url, strlen(url), buf, sizeof(buf), &length, NULL)) {
07534 SDK_RPRINT(test, "TSStringPercentEncode", "TestCase1", TC_FAIL, "Failed on %s", url);
07535 success = false;
07536 } else {
07537 if (strcmp(buf, url_encoded)) {
07538 SDK_RPRINT(test, "TSStringPercentEncode", "TestCase1", TC_FAIL, "Failed on %s != %s", buf, url_encoded);
07539 success = false;
07540 } else {
07541 SDK_RPRINT(test, "TSStringPercentEncode", "TestCase1", TC_PASS, "ok");
07542 }
07543 }
07544
07545 if (TS_SUCCESS != TSStringPercentEncode(url2, strlen(url2), buf, sizeof(buf), &length, NULL)) {
07546 SDK_RPRINT(test, "TSStringPercentEncode", "TestCase2", TC_FAIL, "Failed on %s", url2);
07547 success = false;
07548 } else {
07549 if (strcmp(buf, url2)) {
07550 SDK_RPRINT(test, "TSStringPercentEncode", "TestCase2", TC_FAIL, "Failed on %s != %s", buf, url2);
07551 success = false;
07552 } else {
07553 SDK_RPRINT(test, "TSStringPercentEncode", "TestCase2", TC_PASS, "ok");
07554 }
07555 }
07556
07557 if (TS_SUCCESS != TSStringPercentDecode(url_encoded, strlen(url_encoded), buf, sizeof(buf), &length)) {
07558 SDK_RPRINT(test, "TSStringPercentDecode", "TestCase1", TC_FAIL, "Failed on %s", url_encoded);
07559 success = false;
07560 } else {
07561 if (length != strlen(url) || strcmp(buf, url)) {
07562 SDK_RPRINT(test, "TSStringPercentDecode", "TestCase1", TC_FAIL, "Failed on %s != %s", buf, url);
07563 success = false;
07564 } else {
07565 SDK_RPRINT(test, "TSStringPercentDecode", "TestCase1", TC_PASS, "ok");
07566 }
07567 }
07568
07569 if (TS_SUCCESS != TSStringPercentDecode(url2, strlen(url2), buf, sizeof(buf), &length)) {
07570 SDK_RPRINT(test, "TSStringPercentDecode", "TestCase2", TC_FAIL, "Failed on %s", url2);
07571 success = false;
07572 } else {
07573 if (length != strlen(url2) || strcmp(buf, url2)) {
07574 SDK_RPRINT(test, "TSStringPercentDecode", "TestCase1", TC_FAIL, "Failed on %s != %s", buf, url2);
07575 success = false;
07576 } else {
07577 SDK_RPRINT(test, "TSStringPercentDecode", "TestCase1", TC_PASS, "ok");
07578 }
07579 }
07580
07581 if (TS_SUCCESS != TSBase64Encode(url, strlen(url), buf, sizeof(buf), &length)) {
07582 SDK_RPRINT(test, "TSBase64Encode", "TestCase1", TC_FAIL, "Failed on %s", url);
07583 success = false;
07584 } else {
07585 if (length != strlen(url_base64) || strcmp(buf, url_base64)) {
07586 SDK_RPRINT(test, "TSBase64Encode", "TestCase1", TC_FAIL, "Failed on %s != %s", buf, url_base64);
07587 success = false;
07588 } else {
07589 SDK_RPRINT(test, "TSBase64Encode", "TestCase1", TC_PASS, "ok");
07590 }
07591 }
07592
07593 if (TS_SUCCESS != TSBase64Decode(url_base64, strlen(url_base64), (unsigned char*)buf, sizeof(buf), &length)) {
07594 SDK_RPRINT(test, "TSBase64Decode", "TestCase1", TC_FAIL, "Failed on %s", url_base64);
07595 success = false;
07596 } else {
07597 if (length != strlen(url) || strcmp(buf, url)) {
07598 SDK_RPRINT(test, "TSBase64Decode", "TestCase1", TC_FAIL, "Failed on %s != %s", buf, url);
07599 success = false;
07600 } else {
07601 SDK_RPRINT(test, "TSBase64Decode", "TestCase1", TC_PASS, "ok");
07602 }
07603 }
07604
07605 *pstatus = success ? REGRESSION_TEST_PASSED : REGRESSION_TEST_FAILED;
07606
07607 return;
07608 }
07609
07610
07611
07612
07613
07614
07615
07616
07617
07618
07619
07620 REGRESSION_TEST(SDK_API_DEBUG_NAME_LOOKUPS) (RegressionTest * test, int , int *pstatus)
07621 {
07622 bool success = true;
07623 const char state_name[] = "INACTIVE_TIMEOUT";
07624 const char hook_name[] = "TS_HTTP_READ_RESPONSE_HDR_HOOK";
07625 const char event_name[] = "VC_EVENT_IMMEDIATE";
07626 const char* str;
07627
07628 *pstatus = REGRESSION_TEST_INPROGRESS;
07629
07630 str = TSHttpServerStateNameLookup(TS_SRVSTATE_INACTIVE_TIMEOUT);
07631 if ((strlen(str) != strlen(state_name) || strcmp(str, state_name))) {
07632 SDK_RPRINT(test, "TSHttpServerStateNameLookup", "TestCase1", TC_FAIL, "Failed on %d, expected %s, got %s",
07633 TS_SRVSTATE_INACTIVE_TIMEOUT, state_name, str);
07634 success = false;
07635 } else {
07636 SDK_RPRINT(test, "TSHttpServerStateNameLookup", "TestCase1", TC_PASS, "ok");
07637 }
07638
07639
07640 str = TSHttpHookNameLookup(TS_HTTP_READ_RESPONSE_HDR_HOOK);
07641 if ((strlen(str) != strlen(hook_name) || strcmp(str, hook_name))) {
07642 SDK_RPRINT(test, "TSHttpHookNameLookup", "TestCase1", TC_FAIL, "Failed on %d, expected %s, got %s",
07643 TS_HTTP_READ_RESPONSE_HDR_HOOK, hook_name, str);
07644 success = false;
07645 } else {
07646 SDK_RPRINT(test, "TSHttpHookNameLookup", "TestCase1", TC_PASS, "ok");
07647 }
07648
07649
07650 str = TSHttpEventNameLookup(TS_EVENT_IMMEDIATE);
07651 if ((strlen(str) != strlen(event_name) || strcmp(str, event_name))) {
07652 SDK_RPRINT(test, "TSHttpEventNameLookup", "TestCase1", TC_FAIL, "Failed on %d, expected %s, got %s",
07653 TS_EVENT_IMMEDIATE, hook_name, str);
07654 success = false;
07655 } else {
07656 SDK_RPRINT(test, "TSHttpEventNameLookup", "TestCase1", TC_PASS, "ok");
07657 }
07658
07659
07660 *pstatus = success ? REGRESSION_TEST_PASSED : REGRESSION_TEST_FAILED;
07661
07662 return;
07663 }