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 }