• Main Page
  • Related Pages
  • Namespaces
  • Data Structures
  • Files
  • File List
  • Globals

InkAPITest.cc

Go to the documentation of this file.
00001 /** @file
00002 
00003   Implements unit test for SDK APIs
00004 
00005   @section license License
00006 
00007   Licensed to the Apache Software Foundation (ASF) under one
00008   or more contributor license agreements.  See the NOTICE file
00009   distributed with this work for additional information
00010   regarding copyright ownership.  The ASF licenses this file
00011   to you under the Apache License, Version 2.0 (the
00012   "License"); you may not use this file except in compliance
00013   with the License.  You may obtain a copy of the License at
00014 
00015       http://www.apache.org/licenses/LICENSE-2.0
00016 
00017   Unless required by applicable law or agreed to in writing, software
00018   distributed under the License is distributed on an "AS IS" BASIS,
00019   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
00020   See the License for the specific language governing permissions and
00021   limitations under the License.
00022  */
00023 
00024 // Turn off -Wdeprecated so that we can still test our own deprecated APIs.
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 //extern int errno;
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 /* Use SDK_RPRINT to report failure or success for each test case */
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   REGRESSION_TEST(SDK_<test_name>)(RegressionTest *t, int atype, int *pstatus)
00078 
00079   RegressionTest *test is a pointer on object that will run the test.
00080    Do not modify.
00081 
00082   int atype is one of:
00083    REGRESSION_TEST_NONE
00084    REGRESSION_TEST_QUICK
00085    REGRESSION_TEST_NIGHTLY
00086    REGRESSION_TEST_EXTENDED
00087 
00088   int *pstatus should be set to one of:
00089    REGRESSION_TEST_PASSED
00090    REGRESSION_TEST_INPROGRESS
00091    REGRESSION_TEST_FAILED
00092    REGRESSION_TEST_NOT_RUN
00093   Note: pstatus is polled and can be used for asynchroneous tests.
00094 
00095 */
00096 
00097 /* Misc */
00098 ////////////////////////////////////////////////
00099 //       SDK_API_TSTrafficServerVersionGet
00100 //
00101 // Unit Test for API: TSTrafficServerVersionGet
00102 ////////////////////////////////////////////////
00103 REGRESSION_TEST(SDK_API_TSTrafficServerVersionGet) (RegressionTest * test, int /* atype ATS_UNUSED */, int *pstatus)
00104 {
00105   *pstatus = REGRESSION_TEST_INPROGRESS;
00106 
00107   /* Assume the UT runs on TS5.0 and higher */
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   // coverity[secure_coding]
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 //       SDK_API_TSPluginDirGet
00139 //
00140 // Unit Test for API: TSPluginDirGet
00141 //                    TSInstallDirGet
00142 ////////////////////////////////////////////////
00143 REGRESSION_TEST(SDK_API_TSPluginDirGet) (RegressionTest * test, int /* atype ATS_UNUSED */, 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 /* TSConfig */
00184 ////////////////////////////////////////////////
00185 //       SDK_API_TSConfig
00186 //
00187 // Unit Test for API: TSConfigSet
00188 //                    TSConfigGet
00189 //                    TSConfigRelease
00190 //                    TSConfigDataGet
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 /* atype ATS_UNUSED */, 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 /* TSNetVConn */
00244 //////////////////////////////////////////////
00245 //       SDK_API_TSNetVConn
00246 //
00247 // Unit Test for API: TSNetVConnRemoteIPGet
00248 //                    TSNetVConnRemotePortGet
00249 //                    TSNetAccept
00250 //                    TSNetConnect
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     // Kick off a read so that we can receive an EOS event.
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     // The server end of the test passes if it receives an EOF event. This means that it must have
00289     // connected to the endpoint. Since this always happens *after* the accept, we know that it is
00290     // safe to delete the params.
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     // no need to continue, return
00316     // Fix me: how to deal with server side cont?
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); // XXX this sleep ensures the server end gets the accept event.
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       // Fix me: how to deal with server side cont?
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       // Fix me: how to deal with server side cont?
00349       *params->pstatus = REGRESSION_TEST_FAILED;
00350       return 1;
00351     }
00352 
00353     SDK_RPRINT(params->test, params->api, "TSNetConnect", TC_PASS, "ok");
00354 
00355     // XXX We really ought to do a write/read exchange with the server. The sleep above works around this.
00356 
00357     // Looks good from the client end. Next we disconnect so that the server end can set the final test status.
00358     TSVConnClose((TSVConn) data);
00359   }
00360 
00361   TSContDestroy(contp);
00362 
00363   return 1;
00364 }
00365 
00366 REGRESSION_TEST(SDK_API_TSNetVConn) (RegressionTest * test, int /* atype ATS_UNUSED */, 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 /* atype ATS_UNUSED */, 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 /* TSCache, TSVConn, TSVIO */
00426 //////////////////////////////////////////////
00427 //       SDK_API_TSCache
00428 //
00429 // Unit Test for API: TSCacheReady
00430 //                    TSCacheWrite
00431 //                    TSCacheRead
00432 //                    TSCacheKeyCreate
00433 //                    TSCacheKeyDigestSet
00434 //                    TSVConnCacheObjectSizeGet
00435 //                    TSVConnClose
00436 //                    TSVConnClosedGet
00437 //                    TSVConnRead
00438 //                    TSVConnReadVIOGet
00439 //                    TSVConnWrite
00440 //                    TSVConnWriteVIOGet
00441 //                    TSVIOBufferGet
00442 //                    TSVIOContGet
00443 //                    TSVIOMutexGet
00444 //                    TSVIONBytesGet
00445 //                    TSVIONBytesSet
00446 //                    TSVIONDoneGet
00447 //                    TSVIONDoneSet
00448 //                    TSVIONTodoGet
00449 //                    TSVIOReaderGet
00450 //                    TSVIOReenable
00451 //                    TSVIOVConnGet
00452 //////////////////////////////////////////////
00453 
00454 // TSVConnAbort can't be tested
00455 // Fix me: test TSVConnShutdown, TSCacheKeyDataTypeSet,
00456 //         TSCacheKeyHostNameSet, TSCacheKeyPinnedSet
00457 
00458 // Logic of the test:
00459 //  - write OBJECT_SIZE bytes in the cache in 3 shots
00460 //    (OBJECT_SIZE/2, then OBJECT_SIZE-100 and finally OBJECT_SIZE)
00461 //  - read object from the cache
00462 //  - remove it from the cache
00463 //  - try to read it (should faild)
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     // data is write_vc
00506     cache_vconn->write_vconnp = (TSVConn) data;
00507 
00508     // Create buffers/readers to write and read data into the cache
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     // Write content into upstream IOBuffer
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     // first write half of the data. To test TSVIOReenable
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     // no need to continue, return
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       // no need to continue, return
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       // no need to continue, return
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       // no need to continue, return
00573       *SDK_Cache_pstatus = REGRESSION_TEST_FAILED;
00574       return 1;
00575     }
00576     SDK_RPRINT(SDK_Cache_test, "TSCacheRead", "TestCase2", TC_PASS, "ok");
00577 
00578     // ok, all tests passed!
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     // read the data which has been removed
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     // no need to continue, return
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     // VConn/VIO APIs
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       // no need to continue, return
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       // no need to continue, return
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     // tests for write is done, close write_vconnp
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     // start to read data out of cache
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       // no need to continue, return
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       // no need to continue, return
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         // no need to continue, return
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       // now waiting for 100ms to make sure the key is
00754       // written in directory remove the content
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       // no need to continue, return
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       // no need to continue, return
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     // Fix for bug INKqa12276: Must consume data from iobuffer
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     // do remove cached doc
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   // destroy the data structure
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 /* atype ATS_UNUSED */, 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   // Check if Cache is ready
00829   TSCacheReady(&is_ready);
00830   if (!is_ready) {
00831     SDK_RPRINT(test, "TSCacheReady", "TestCase1", TC_FAIL, "cache is not ready");
00832 
00833     // no need to continue, return
00834     *pstatus = REGRESSION_TEST_FAILED;
00835     return;
00836   } else {
00837     SDK_RPRINT(test, "TSCacheReady", "TestCase1", TC_PASS, "ok");
00838   }
00839 
00840   // Create CacheKey
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   // TODO: This comparison makes no sense, since TSCacheKey is an opaque struct
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     // no need to continue, return
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   // prepare caching content
00865   // string, null-terminated.
00866   for (int i = 0; i < (OBJECT_SIZE - 1); i++) {
00867     content[i] = 'a';
00868   }
00869   content[OBJECT_SIZE - 1] = '\0';
00870 
00871   //Write data to cache.
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 /* TSfopen */
00881 
00882 //////////////////////////////////////////////
00883 //       SDK_API_TSfopen
00884 //
00885 // Unit Test for API: TSfopen
00886 //                    TSclose
00887 //                    TSfflush
00888 //                    TSfgets
00889 //                    TSfread
00890 //                    TSfwrite
00891 //////////////////////////////////////////////
00892 
00893 // Used to create tmp file
00894 //#define TMP_DIR "/var/tmp"
00895 #define PFX     "plugin.config"
00896 
00897 REGRESSION_TEST(SDK_API_TSfopen) (RegressionTest * test, int /* atype ATS_UNUSED */, int *pstatus)
00898 {
00899   *pstatus = REGRESSION_TEST_INPROGRESS;
00900 
00901   char write_file_name[PATH_NAME_MAX + 1];
00902 
00903   TSFile source_read_file;     // existing file
00904   TSFile write_file;           // to be created
00905   TSFile cmp_read_file;        // read & compare
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   // Set full path to file at run time.
00919   // TODO: This can never fail since we are
00920   //       returning the char[]
00921   //       Better check the dir itself.
00922   //
00923   if (TSInstallDirGet() == NULL) {
00924     error_counter++;
00925     *pstatus = REGRESSION_TEST_FAILED;
00926     return;
00927   }
00928   // Add "etc/trafficserver" to point to config directory
00929   ink_filepath_make(input_file_full_path, sizeof(input_file_full_path), TSConfigDirGet(), INPUT_TEXT_FILE);
00930 
00931   // open existing file for reading
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     // no need to continue, return
00937     *pstatus = REGRESSION_TEST_FAILED;
00938     return;
00939   } else
00940     SDK_RPRINT(test, "TSfopen", "TestCase1", TC_PASS, "ok");
00941 
00942   // Create unique tmp _file_name_, do not use any TS file_name
00943   snprintf(write_file_name, PATH_NAME_MAX, "/tmp/%sXXXXXX", PFX);
00944   int write_file_fd;            // this file will be reopened below
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     // no need to continue, return
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   // open file for writing, the file doesn't have to exist.
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     // no need to continue, return
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   // source_read_file and input_file_full_path are the same file
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     // no need to continue, return
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   // TSfgets
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     // no need to continue, return
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       // no need to continue, return
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   // TSfwrite
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     // no need to continue, return
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   // TSfflush
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     // no need to continue, return
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);        // write_file should point to write_file_name
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     // no need to continue, return
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     // no need to continue, return
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   // TSfread
01080   // open again for reading
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     // no need to continue, return
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   // TSfread on read file
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     // no need to continue, return
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   // compare input_buffer and cmp_buffer buffers
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     // no need to continue, return
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   // remove the tmp file
01133   if (unlink(write_file_name) != 0) {
01134     SDK_RPRINT(test, "unlink", "std func", TC_FAIL, "can't remove temp file");
01135   }
01136   // TSfclose on read file
01137   TSfclose(source_read_file);
01138   SDK_RPRINT(test, "TSfclose", "TestCase1", TC_PASS, "ok");
01139 
01140   // TSfclose on write file
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 /* TSThread */
01154 
01155 //////////////////////////////////////////////
01156 //       SDK_API_TSThread
01157 //
01158 // Unit Test for API: TSThread
01159 //                    TSThreadCreate
01160 //                    TSThreadSelf
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 * /* arg ATS_UNUSED */)
01169 {
01170   TSThread athread;
01171   //Fix me: do more useful work
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 // Fix me: Solaris threads/Win2K threads tests
01191 
01192 // Argument data passed to thread init functions
01193 //  cannot be allocated on the stack.
01194 
01195 REGRESSION_TEST(SDK_API_TSThread) (RegressionTest * test, int /* atype ATS_UNUSED */, 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 //    TSThread created_thread = 0;
01203   pthread_t curr_tid;
01204 
01205   curr_tid = pthread_self();
01206 
01207   // TSThreadSelf
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   // TSThreadCreate
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 //       SDK_API_TSThread
01229 //
01230 // Unit Test for API: TSThreadInit
01231 //                    TSThreadDestroy
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 * /* arg ATS_UNUSED */)
01240 {
01241   TSThread temp_thread = 0;
01242 
01243   // TSThreadInit
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   // Clean up this thread
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 /* atype ATS_UNUSED */, 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 /* Action */
01286 
01287 //////////////////////////////////////////////
01288 //       SDK_API_TSAction
01289 //
01290 // Unit Test for API: TSActionCancel
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 * /* edata ATS_UNUSED */)
01298 {
01299   if (event == TS_EVENT_IMMEDIATE) {     // called from schedule_imm OK
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) {       //called from schedule_in Not OK.
01303     SDK_RPRINT(SDK_ActionCancel_test, "TSActionCancel", "TestCase1", TC_FAIL, "bad action");
01304     *SDK_ActionCancel_pstatus = REGRESSION_TEST_FAILED;
01305   } else {                        // there is sth wrong
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 /* atype ATS_UNUSED */, 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 //       SDK_API_TSAction
01340 //
01341 // Unit Test for API: TSActionDone
01342 //////////////////////////////////////////////
01343 /* Currently, don't know how to test it because TSAction
01344    is at "done" status only "shortly" after finish
01345    executing action_done_handler. Another possibility is
01346    to use reentrant call. But in both cases it's not
01347    guaranteed to get ActionDone.
01348    */
01349 
01350 /* Continuations */
01351 
01352 //////////////////////////////////////////////
01353 //       SDK_API_TSCont
01354 //
01355 // Unit Test for API: TSContCreate
01356 //                    TSContCall
01357 //////////////////////////////////////////////
01358 
01359 // this is needed for asynchronous APIs
01360 static RegressionTest *SDK_ContCreate_test;
01361 static int *SDK_ContCreate_pstatus;
01362 
01363 int
01364 cont_handler(TSCont /* contp ATS_UNUSED */, TSEvent /* event ATS_UNUSED */, void * /* edata ATS_UNUSED */)
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 /* atype ATS_UNUSED */, int *pstatus)
01376 {
01377   *pstatus = REGRESSION_TEST_INPROGRESS;
01378 
01379   // For asynchronous APIs, use static vars to store test and pstatus
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)) { // Mutex is grabbed successfully
01387     TSContCall(contp, (TSEvent) 0, NULL);
01388     TSMutexUnlock(mutexp);
01389   } else {                       //mutex has problems
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 //       SDK_API_TSCont
01402 //
01403 // Unit Test for API: TSContDataGet
01404 //                    TSContDataSet
01405 //////////////////////////////////////////////
01406 
01407 // this is needed for asynchronous APIs
01408 static RegressionTest *SDK_ContData_test;
01409 static int *SDK_ContData_pstatus;
01410 
01411 // this is specific for this test
01412 typedef struct
01413 {
01414   int data1;
01415   int data2;
01416 } MyData;
01417 
01418 int
01419 cont_data_handler(TSCont contp, TSEvent /* event ATS_UNUSED */, void * /* edata ATS_UNUSED */)
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     // If we get bad data, it's a failure
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 /* atype ATS_UNUSED */, int *pstatus)
01443 {
01444   *pstatus = REGRESSION_TEST_INPROGRESS;
01445 
01446   // For asynchronous APIs, use static vars to store test and pstatus
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 //       SDK_API_TSCont
01465 //
01466 // Unit Test for API: TSContMutexGet
01467 //////////////////////////////////////////////
01468 
01469 REGRESSION_TEST(SDK_API_TSContMutexGet) (RegressionTest * test, int /* atype ATS_UNUSED */, 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   // Status of the whole test
01490   *pstatus = ((test_passed == true) ? REGRESSION_TEST_PASSED : REGRESSION_TEST_FAILED);
01491 
01492   TSContDestroy(contp);
01493 }
01494 
01495 //////////////////////////////////////////////
01496 //       SDK_API_TSCont
01497 //
01498 // Unit Test for API: TSContSchedule
01499 //////////////////////////////////////////////
01500 
01501 // this is needed for asynchronous APIs
01502 static RegressionTest *SDK_ContSchedule_test;
01503 static int *SDK_ContSchedule_pstatus;
01504 
01505 // this is specific for this test
01506 static int tc1_count = 0;
01507 static int tc2_count = 0;
01508 
01509 int
01510 cont_schedule_handler(TSCont contp, TSEvent event, void * /* edata ATS_UNUSED */)
01511 {
01512   if (event == TS_EVENT_IMMEDIATE) {
01513     // Test Case 1
01514     SDK_RPRINT(SDK_ContSchedule_test, "TSContSchedule", "TestCase1", TC_PASS, "ok");
01515     tc1_count++;
01516   } else if (event == TS_EVENT_TIMEOUT) {
01517     // Test Case 2
01518     SDK_RPRINT(SDK_ContSchedule_test, "TSContSchedule", "TestCase2", TC_PASS, "ok");
01519     tc2_count++;
01520   } else {
01521     // If we receive a bad event, it's a failure
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   // We expect to be called once for TC1 and once for TC2
01528   if ((tc1_count == 1) && (tc2_count == 1)) {
01529     *SDK_ContSchedule_pstatus = REGRESSION_TEST_PASSED;
01530   }
01531   // If TC1 or TC2 executed more than once, something is fishy..
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 /* Mutex */
01541 
01542 /*
01543    Fix me: test for grabbing the mutex from two
01544    different threads.
01545    */
01546 
01547 //////////////////////////////////////////////
01548 //       SDK_API_TSMutex
01549 //
01550 // Unit Test for API: TSMutexCreate
01551 //                    TSMutexLock
01552 //                    TSMutexUnLock
01553 //////////////////////////////////////////////
01554 
01555 REGRESSION_TEST(SDK_API_TSMutexCreate) (RegressionTest * test, int /* atype ATS_UNUSED */, int *pstatus)
01556 {
01557   bool test_passed = false;
01558   *pstatus = REGRESSION_TEST_INPROGRESS;
01559 
01560   TSMutex mutexp = TSMutexCreate();
01561 
01562   TSMutexLock(mutexp);
01563 
01564   /* This is normal because all locking is from the same thread */
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 /* IOBuffer */
01594 
01595 //////////////////////////////////////////////
01596 //       SDK_API_TSIOBuffer
01597 //
01598 // Unit Test for API: TSIOBufferCreate
01599 //                    TSIOBufferWaterMarkGet
01600 //                    TSIOBufferWaterMarkSet
01601 //////////////////////////////////////////////
01602 
01603 REGRESSION_TEST(SDK_API_TSIOBufferCreate) (RegressionTest * test, int /* atype ATS_UNUSED */, 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   // Status of the whole test
01629   *pstatus = ((test_passed == true) ? REGRESSION_TEST_PASSED : REGRESSION_TEST_FAILED);
01630   return;
01631 
01632 }
01633 
01634 
01635 //////////////////////////////////////////////
01636 //       SDK_API_TSIOBuffer
01637 //
01638 // Unit Test for API: TSIOBufferSizedCreate
01639 //                    TSIOBufferProduce
01640 //                    TSIOBufferReaderAlloc
01641 //                    TSIOBufferReaderAvail
01642 //////////////////////////////////////////////
01643 
01644 REGRESSION_TEST(SDK_API_TSIOBufferProduce) (RegressionTest * test, int /* atype ATS_UNUSED */, int *pstatus)
01645 {
01646   bool test_passed = false;
01647   *pstatus = REGRESSION_TEST_INPROGRESS;
01648 
01649   TSIOBuffer bufp = TSIOBufferSizedCreate(TS_IOBUFFER_SIZE_INDEX_4K);        //size is 4096
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   // Status of the whole test
01668   *pstatus = ((test_passed == true) ? REGRESSION_TEST_PASSED : REGRESSION_TEST_FAILED);
01669   return;
01670 }
01671 
01672 
01673 //////////////////////////////////////////////
01674 //       SDK_API_TSIOBuffer
01675 //
01676 // Unit Test for API: TSIOBufferReaderConsume
01677 //////////////////////////////////////////////
01678 
01679 REGRESSION_TEST(SDK_API_TSIOBufferReaderConsume) (RegressionTest * test, int /* atype ATS_UNUSED */, 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   // Status of the whole test
01700   *pstatus = ((test_passed == true) ? REGRESSION_TEST_PASSED : REGRESSION_TEST_FAILED);
01701   return;
01702 }
01703 
01704 //////////////////////////////////////////////
01705 //       SDK_API_TSIOBuffer
01706 //
01707 // Unit Test for API: TSIOBufferReaderClone
01708 //////////////////////////////////////////////
01709 
01710 REGRESSION_TEST(SDK_API_TSIOBufferReaderClone) (RegressionTest * test, int /* atype ATS_UNUSED */, 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   // Status of the whole test
01732   *pstatus = ((test_passed == true) ? REGRESSION_TEST_PASSED : REGRESSION_TEST_FAILED);
01733   return;
01734 }
01735 
01736 //////////////////////////////////////////////
01737 //       SDK_API_TSIOBuffer
01738 //
01739 // Unit Test for API: TSIOBufferStart
01740 //                    TSIOBufferReaderStart
01741 //////////////////////////////////////////////
01742 
01743 REGRESSION_TEST(SDK_API_TSIOBufferStart) (RegressionTest * test, int /* atype ATS_UNUSED */, 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   // Status of the whole test
01762   *pstatus = ((test_passed == true) ? REGRESSION_TEST_PASSED : REGRESSION_TEST_FAILED);
01763   return;
01764 }
01765 
01766 
01767 //////////////////////////////////////////////
01768 //       SDK_API_TSIOBuffer
01769 //
01770 // Unit Test for API: TSIOBufferCopy
01771 //                    TSIOBufferWrite
01772 //                    TSIOBufferReaderCopy
01773 //////////////////////////////////////////////
01774 
01775 REGRESSION_TEST(SDK_API_TSIOBufferCopy) (RegressionTest * test, int /* atype ATS_UNUSED */, 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   // Status of the whole test
01802   *pstatus = ((test_passed == true) ? REGRESSION_TEST_PASSED : REGRESSION_TEST_FAILED);
01803   return;
01804 }
01805 
01806 //////////////////////////////////////////////
01807 //       SDK_API_TSIOBuffer
01808 //
01809 // Unit Test for API: TSIOBuffer
01810 //                    TSIOBufferWrite
01811 //                    TSIOBufferReaderCopy
01812 //////////////////////////////////////////////
01813 
01814 REGRESSION_TEST(SDK_API_TSIOBufferBlockReadAvail) (RegressionTest * test, int /* atype ATS_UNUSED */, 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   // TODO: This is probably not correct any more.
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 //       SDK_API_TSIOBuffer
01860 //
01861 // Unit Test for API: TSIOBufferBlockNext
01862 //////////////////////////////////////////////////
01863 
01864 REGRESSION_TEST(SDK_API_TSIOBufferBlockNext) (RegressionTest * test, int /* atype ATS_UNUSED */, 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   // TODO: This is probaby not the best of regression tests right now ...
01877   // Note that this assumes block size is > sizeof(int) bytes.
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 /* atype ATS_UNUSED */, int *pstatus)
01896 {
01897   *pstatus = REGRESSION_TEST_INPROGRESS;
01898 
01899   // For asynchronous APIs, use static vars to store test and pstatus
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   // Test Case 1: schedule immediate
01907   TSContSchedule(contp, 0, TS_THREAD_POOL_DEFAULT);
01908 
01909   // Test Case 2: schedule in 10ms
01910   TSContSchedule(contp2, 10, TS_THREAD_POOL_DEFAULT);
01911 }
01912 
01913 //////////////////////////////////////////////////////////////////////////////
01914 //     SDK_API_HttpHookAdd
01915 //
01916 // Unit Test for API: TSHttpHookAdd
01917 //                    TSHttpTxnReenable
01918 //                    TSHttpTxnClientIPGet
01919 //                    TSHttpTxnServerIPGet
01920 //                    TSHttpTxnIncomingAddrGet
01921 //                    TSHttpTxnClientAddrGet
01922 //                    TSHttpTxnClientReqGet
01923 //                    TSHttpTxnClientRespGet
01924 //                    TSHttpTxnServerReqGet
01925 //                    TSHttpTxnServerRespGet
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 //This func is called by us from mytest_handler to test TSHttpTxnClientIPGet
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);     /* 127.0.0.1 is expected because the client is on the same machine */
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 //This func is called by us from mytest_handler to check for TSHttpTxnNextHopIPGet
01981 static int
01982 checkHttpTxnNextHopIPGet(SocketTest * test, void *data)
01983 {
01984   TSHttpTxn txnp = (TSHttpTxn) data;
01985   in_addr_t actual_ip = htonl(INADDR_LOOPBACK);     /* 127.0.0.1 is expected because the client is on the same machine */
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 //This func is called by us from mytest_handler to test TSHttpTxnServerIPGet
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);      /* 127.0.0.1 is expected because the client is on the same machine */
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 //This func is called by us from mytest_handler to test TSHttpTxnIncomingAddrGet
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 //This func is called by us from mytest_handler to test TSHttpTxnClientAddrGet
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 // This func is called by us from mytest_handler to test TSHttpTxnClientReqGet
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 // This func is called by us from mytest_handler to test TSHttpTxnClientRespGet
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 // This func is called by us from mytest_handler to test TSHttpTxnServerReqGet
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 // This func is called by us from mytest_handler to test TSHttpTxnServerRespGet
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 // This func is called both by us when scheduling EVENT_IMMEDIATE
02217 // And by HTTP SM for registered hooks
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     /* Browser still waiting the response ? */
02321     if (test->browser->status == REQUEST_INPROGRESS) {
02322       TSContSchedule(contp, 25, TS_THREAD_POOL_DEFAULT);
02323     }
02324     /* Browser got the response. test is over. clean up */
02325     else {
02326       /* Note: response is available using test->browser->response pointer */
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       // transaction is over. clean up.
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 /* atype ATS_UNUSED */, 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   /* Register to HTTP hooks that are called in case of a cache MISS */
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   /* Create a new synthetic server */
02410   socktest->os = synserver_create(SYNSERVER_LISTEN_PORT);
02411   synserver_start(socktest->os);
02412 
02413   /* Create a client transaction */
02414   socktest->browser = synclient_txn_create();
02415   char *request = generate_request(HTTP_HOOK_TEST_REQUEST_ID);  // this request has a no-cache that prevents caching
02416   synclient_txn_send_request(socktest->browser, request);
02417   TSfree(request);
02418 
02419   /* Wait until transaction is done */
02420   if (socktest->browser->status == REQUEST_INPROGRESS) {
02421     TSContSchedule(cont, 25, TS_THREAD_POOL_DEFAULT);
02422   }
02423 
02424   return;
02425 }
02426 
02427 
02428 //////////////////////////////////////////////
02429 //       SDK_API_TSUrl
02430 //
02431 // Unit Test for API: TSUrlCreate
02432 //                    TSUrlSchemeGet
02433 //                    TSUrlSchemeSet
02434 //                    TSUrlUserGet
02435 //                    TSUrlUserSet
02436 //                    TSUrlPasswordGet
02437 //                    TSUrlPasswordSet
02438 //                    TSUrlHostGet
02439 //                    TSUrlHostSet
02440 //                    TSUrlPortGet
02441 //                    TSUrlPortSet
02442 //                    TSUrlPathGet
02443 //                    TSUrlPathSet
02444 //                    TSUrlHttpParamsGet
02445 //                    TSUrlHttpParamsSet
02446 //                    TSUrlHttpQueryGet
02447 //                    TSUrlHttpQuerySet
02448 //                    TSUrlHttpFragmentGet
02449 //                    TSUrlHttpFragmentSet
02450 //                    TSUrlCopy
02451 //                    TSUrlClone
02452 //                    TSUrlStringGet
02453 //                    TSUrlPrint
02454 //                    TSUrlLengthGet
02455 //                    TSUrlFtpTypeGet
02456 //                    TSUrlFtpTypeSet
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   /* This will print  just MIMEFields and not
02482      the http request line */
02483   TSUrlPrint(bufp, hdr_loc, output_buffer);
02484 
02485   /* Find out how the big the complete header is by
02486      seeing the total bytes in the buffer.  We need to
02487      look at the buffer rather than the first block to
02488      see the size of the entire header */
02489   total_avail = TSIOBufferReaderAvail(reader);
02490 
02491   /* Allocate the string with an extra byte for the string
02492      terminator */
02493   output_string = (char *) TSmalloc(total_avail + 1);
02494   output_len = 0;
02495 
02496   /* We need to loop over all the buffer blocks to make
02497      sure we get the complete header since the header can
02498      be in multiple blocks */
02499   block = TSIOBufferReaderStart(reader);
02500   while (block) {
02501 
02502     block_start = TSIOBufferBlockReadStart(block, reader, &block_avail);
02503 
02504     /* We'll get a block pointer back even if there is no data
02505        left to read so check for this condition and break out of
02506        the loop. A block with no data to read means we've exhausted
02507        buffer of data since if there was more data on a later
02508        block in the chain, this block would have been skipped over */
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     /* Consume the data so that we get to the next block */
02517     TSIOBufferReaderConsume(reader, block_avail);
02518 
02519     /* Get the next block now that we've consumed the
02520        data off the last block */
02521     block = TSIOBufferReaderStart(reader);
02522   }
02523 
02524   /* Terminate the string */
02525   output_string[output_len] = '\0';
02526   output_len++;
02527 
02528   /* Free up the TSIOBuffer that we used to print out the header */
02529   TSIOBufferReaderFree(reader);
02530   TSIOBufferDestroy(output_buffer);
02531 
02532   return output_string;
02533 }
02534 
02535 REGRESSION_TEST(SDK_API_TSUrl) (RegressionTest * test, int /* atype ATS_UNUSED */, 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   //Initialization
02598   memset(port_char, 0, 10);
02599   snprintf(port_char, sizeof(port_char), "%d", port);
02600 
02601   // HTTP URL
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   // Set Functions
02633 
02634   bufp1 = TSMBufferCreate();
02635   if (TSUrlCreate(bufp1, &url_loc1) != TS_SUCCESS) {
02636     // Cannot proceed with tests.
02637     SDK_RPRINT(test, "TSUrlCreate", "TestCase1", TC_FAIL, "unable to create URL within buffer.");
02638     goto print_results;
02639   }
02640   //Scheme
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   //User
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   // Password
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   //Host
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   //Port
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   //Path
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   //Params
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   //Query
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   //Fragments
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   //Length
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   //String
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   //Copy
02776   bufp2 = TSMBufferCreate();
02777   if (TSUrlCreate(bufp2, &url_loc2) != TS_SUCCESS) {
02778     // Cannot proceed with tests.
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     //Length Test Case 2
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     //String Test Case 2
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     // Copy Test Case
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   //Clone
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     //String Test Case 2
02819     url_string_from_3 = TSUrlStringGet(bufp3, url_loc3, &tmp_len);
02820     // Copy Test Case
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   //UrlPrint
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         /*** Debugging the test itself....
02898         (test_passed_create == false)?printf("test_passed_create is false\n"):printf("");
02899         (test_passed_destroy == false)?printf("test_passed_destroy is false\n"):printf("");
02900         (test_passed_user == false)?printf("test_passed_user is false\n"):printf("");
02901         (test_passed_password == false)?printf("test_passed_password is false\n"):printf("");
02902         (test_passed_host == false)?printf("test_passed_host is false\n"):printf("");
02903         (test_passed_port == false)?printf("test_passed_port is false\n"):printf("");
02904         (test_passed_path == false)?printf("test_passed_path is false\n"):printf("");
02905         (test_passed_params == false)?printf("test_passed_params is false\n"):printf("");
02906         (test_passed_query == false)?printf("test_passed_query is false\n"):printf("");
02907         (test_passed_fragment == false)?printf("test_passed_fragment is false\n"):printf("");
02908         (test_passed_copy == false)?printf("test_passed_copy is false\n"):printf("");
02909         (test_passed_string1 == false)?printf("test_passed_string1 is false\n"):printf("");
02910         (test_passed_string2 == false)?printf("test_passed_string2 is false\n"):printf("");
02911         (test_passed_length1 == false)?printf("test_passed_length1 is false\n"):printf("");
02912         (test_passed_length2 == false)?printf("test_passed_length2 is false\n"):printf("");
02913         (test_passed_type == false)?printf("test_passed_type is false\n"):printf("");
02914         .....***********/
02915     *pstatus = REGRESSION_TEST_FAILED;
02916   } else {
02917     *pstatus = REGRESSION_TEST_PASSED;
02918   }
02919 }
02920 
02921 //////////////////////////////////////////////
02922 //       SDK_API_TSHttpHdr
02923 //
02924 // Unit Test for API: TSHttpHdrCreate
02925 //                    TSHttpHdrCopy
02926 //                    TSHttpHdrClone
02927 //                    TSHttpHdrDestroy
02928 //                    TSHttpHdrLengthGet
02929 //                    TSHttpHdrMethodGet
02930 //                    TSHttpHdrMethodSet
02931 //                    TSHttpHdrPrint
02932 //                    TSHttpHdrReasonGet
02933 //                    TSHttpHdrReasonLookup
02934 //                    TSHttpHdrReasonSet
02935 //                    TSHttpHdrStatusGet
02936 //                    TSHttpHdrStatusSet
02937 //                    TSHttpHdrTypeGet
02938 //                    TSHttpHdrUrlGet
02939 //                    TSHttpHdrUrlSet
02940 //////////////////////////////////////////////
02941 
02942 /**
02943  * If you change value of any constant in this function then reflect that change in variable expected_iobuf.
02944  */
02945 REGRESSION_TEST(SDK_API_TSHttpHdr) (RegressionTest * test, int /* atype ATS_UNUSED */, 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   /* TSHttpType type1; unused: lv */
02978   /* TSHttpType type2; unused: lv */
02979   const char *method1;
02980   const char *method2;
02981   int length1;
02982   int length2;
02983   TSMLoc url_loc1;
02984   TSMLoc url_loc2;
02985   /* int version1; unused: lv */
02986   /* int version2; unused: lv */
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   // Create
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   // Type
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   // Method
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   // Url
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       // Fill up the URL for Copy Test Case.
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   // Reason
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   // Status
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   //Version
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   //Reason Lookup
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   // Copy
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       // Check the type
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       // Check the Version
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       // Check the Method
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       // Check the URL
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           // URL Scheme
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           // URL Host
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           // URL Port
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           // URL Path
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   // Clone
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       // Check the type
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       // Check the Version
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       // Check the Method
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       // Check the URL
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           // URL Scheme
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           // URL Host
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           // URL Port
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           // URL Path
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   //LengthGet
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     // Print.
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   // Destroy
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 //       SDK_API_TSMimeHdrField
03575 //
03576 // Unit Test for API: TSMBufferCreate
03577 //                    TSMBufferDestroy
03578 //                    TSMimeHdrCreate
03579 //                    TSMimeHdrDestroy
03580 //                    TSMimeHdrFieldCreate
03581 //                    TSMimeHdrFieldDestroy
03582 //                    TSMimeHdrFieldFind
03583 //                    TSMimeHdrFieldGet
03584 //                    TSMimeHdrFieldAppend
03585 //                    TSMimeHdrFieldNameGet
03586 //                    TSMimeHdrFieldNameSet
03587 //                    TSMimeHdrFieldNext
03588 //                    TSMimeHdrFieldsClear
03589 //                    TSMimeHdrFieldsCount
03590 //                    TSMimeHdrFieldValueAppend
03591 //                    TSMimeHdrFieldValueDelete
03592 //                    TSMimeHdrFieldValueStringGet
03593 //                    TSMimeHdrFieldValueDateGet
03594 //                    TSMimeHdrFieldValueIntGet
03595 //                    TSMimeHdrFieldValueUintGet
03596 //                    TSMimeHdrFieldValueStringInsert
03597 //                    TSMimeHdrFieldValueDateInsert
03598 //                    TSMimeHdrFieldValueIntInsert
03599 //                    TSMimeHdrFieldValueUintInsert
03600 //                    TSMimeHdrFieldValuesClear
03601 //                    TSMimeHdrFieldValuesCount
03602 //                    TSMimeHdrFieldValueStringSet
03603 //                    TSMimeHdrFieldValueDateSet
03604 //                    TSMimeHdrFieldValueIntSet
03605 //                    TSMimeHdrFieldValueUintSet
03606 //                    TSMimeHdrLengthGet
03607 //                    TSMimeHdrPrint
03608 //////////////////////////////////////////////
03609 
03610 TSReturnCode
03611 compare_field_names(RegressionTest * /* test ATS_UNUSED */, 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 /* atype ATS_UNUSED */, 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   /* int field5_length; unused: lv */
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   // TSMBufferCreate
03777   bufp1 = TSMBufferCreate();
03778   SDK_RPRINT(test, "TSMBufferCreate", "TestCase1", TC_PASS, "ok");
03779   test_passed_MBuffer_Create = true;
03780 
03781   // TSMimeHdrCreate
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   // TSMimeHdrFieldCreate
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   //TSMimeHdrFieldNameGet&Set
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   // TSMimeHdrFieldAppend, TSMimeHdrFieldGet, TSMimeHdrFieldNext
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   //TSMimeHdrFieldsCount
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   // TSMimeHdrFieldValueStringInsert, TSMimeHdrFieldValueStringGet, TSMimeHdrFieldValueStringSet
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   // TSMimeHdrFieldValueDateInsert, TSMimeHdrFieldValueDateGet, TSMimeHdrFieldValueDateSet
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   // TSMimeHdrFieldValueIntInsert, TSMimeHdrFieldValueIntGet, TSMimeHdrFieldValueIntSet
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   // TSMimeHdrFieldValueUintInsert, TSMimeHdrFieldValueUintGet, TSMimeHdrFieldValueUintSet
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   // TSMimeHdrFieldLengthGet
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   // TSMimeHdrFieldValueAppend, TSMimeHdrFieldValueDelete, TSMimeHdrFieldValuesCount, TSMimeHdrFieldValuesClear
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     // TSMimeHdrFieldDestroy
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   // Mime Hdr Fields Clear
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   // Mime Hdr Destroy
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       /** Commented out as Traffic Server was crashing. Will have to look into it. */
04319     /*
04320        if (TSHandleMLocRelease(bufp1,TS_NULL_MLOC,mime_loc1)==TS_ERROR) {
04321        SDK_RPRINT(test,"TSHandleMLocRelease","TSMimeHdrDestroy",TC_FAIL,"unable to release handle using TSHandleMLocRelease");
04322        }
04323      */
04324   } else {
04325     SDK_RPRINT(test, "TSMimeHdrDestroy", "TestCase1", TC_FAIL, "Cannot run test as TSMimeHdrCreate failed");
04326   }
04327 
04328   // MBuffer Destroy
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 //       SDK_API_TSHttpHdrParse
04381 //
04382 // Unit Test for API: TSHttpParserCreate
04383 //                    TSHttpParserDestroy
04384 //                    TSHttpParserClear
04385 //                    TSHttpHdrParseReq
04386 //                    TSHttpHdrParseResp
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   /* This will print  just MIMEFields and not
04412      the http request line */
04413   TSHttpHdrPrint(bufp, hdr_loc, output_buffer);
04414 
04415   /* Find out how the big the complete header is by
04416      seeing the total bytes in the buffer.  We need to
04417      look at the buffer rather than the first block to
04418      see the size of the entire header */
04419   total_avail = TSIOBufferReaderAvail(reader);
04420 
04421   /* Allocate the string with an extra byte for the string
04422      terminator */
04423   output_string = (char *) TSmalloc(total_avail + 1);
04424   output_len = 0;
04425 
04426   /* We need to loop over all the buffer blocks to make
04427      sure we get the complete header since the header can
04428      be in multiple blocks */
04429   block = TSIOBufferReaderStart(reader);
04430   while (block) {
04431 
04432     block_start = TSIOBufferBlockReadStart(block, reader, &block_avail);
04433 
04434     /* We'll get a block pointer back even if there is no data
04435        left to read so check for this condition and break out of
04436        the loop. A block with no data to read means we've exhausted
04437        buffer of data since if there was more data on a later
04438        block in the chain, this block would have been skipped over */
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     /* Consume the data so that we get to the next block */
04447     TSIOBufferReaderConsume(reader, block_avail);
04448 
04449     /* Get the next block now that we've consumed the
04450        data off the last block */
04451     block = TSIOBufferReaderStart(reader);
04452   }
04453 
04454   /* Terminate the string */
04455   output_string[output_len] = '\0';
04456   output_len++;
04457 
04458   /* Free up the TSIOBuffer that we used to print out the header */
04459   TSIOBufferReaderFree(reader);
04460   TSIOBufferDestroy(output_buffer);
04461 
04462   return output_string;
04463 }
04464 
04465 REGRESSION_TEST(SDK_API_TSHttpHdrParse) (RegressionTest * test, int /* atype ATS_UNUSED */, 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   //Create Parser
04491   parser = TSHttpParserCreate();
04492   SDK_RPRINT(test, "TSHttpParserCreate", "TestCase1", TC_PASS, "ok");
04493 
04494   // Request
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   // Response
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 //       SDK_API_TSMimeHdrParse
04584 //
04585 // Unit Test for API: TSMimeHdrCopy
04586 //                    TSMimeHdrClone
04587 //                    TSMimeHdrFieldCopy
04588 //                    TSMimeHdrFieldClone
04589 //                    TSMimeHdrFieldCopyValues
04590 //                    TSMimeHdrFieldNextDup
04591 //                    TSMimeHdrFieldRemove
04592 //                    TSMimeHdrLengthGet
04593 //                    TSMimeHdrParse
04594 //                    TSMimeHdrPrint
04595 //                    TSMimeParserClear
04596 //                    TSMimeParserCreate
04597 //                    TSMimeParserDestroy
04598 //                    TSHandleMLocRelease
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   /* This will print  just MIMEFields and not
04624      the http request line */
04625   TSMimeHdrPrint(bufp, hdr_loc, output_buffer);
04626 
04627   /* Find out how the big the complete header is by
04628      seeing the total bytes in the buffer.  We need to
04629      look at the buffer rather than the first block to
04630      see the size of the entire header */
04631   total_avail = TSIOBufferReaderAvail(reader);
04632 
04633   /* Allocate the string with an extra byte for the string
04634      terminator */
04635   output_string = (char *) TSmalloc(total_avail + 1);
04636   output_len = 0;
04637 
04638   /* We need to loop over all the buffer blocks to make
04639      sure we get the complete header since the header can
04640      be in multiple blocks */
04641   block = TSIOBufferReaderStart(reader);
04642   while (block) {
04643 
04644     block_start = TSIOBufferBlockReadStart(block, reader, &block_avail);
04645 
04646     /* We'll get a block pointer back even if there is no data
04647        left to read so check for this condition and break out of
04648        the loop. A block with no data to read means we've exhausted
04649        buffer of data since if there was more data on a later
04650        block in the chain, this block would have been skipped over */
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     /* Consume the data so that we get to the next block */
04659     TSIOBufferReaderConsume(reader, block_avail);
04660 
04661     /* Get the next block now that we've consumed the
04662        data off the last block */
04663     block = TSIOBufferReaderStart(reader);
04664   }
04665 
04666   /* Terminate the string */
04667   output_string[output_len] = '\0';
04668   output_len++;
04669 
04670   /* Free up the TSIOBuffer that we used to print out the header */
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 /* atype ATS_UNUSED */, 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   //Create Parser
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     // Parsing
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);    // Implements TSMimeHdrPrint.
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             // TSMimeHdrLengthGet
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   // HOW DO I CHECK FOR PARSER CLEAR????
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   //TSMimeHdrFieldNextDup
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       // TSHandleMLocRelease
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   //TSMimeHdrCopy
04880   if (test_passed_parse == true) {
04881     // Parsing
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);      // Implements TSMimeHdrPrint.
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   // TSMimeHdrFieldRemove
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         // Make sure the remove actually took effect
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       // TSHandleMLocRelease
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   // TSMimeHdrFieldCopy
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   // TSMimeHdrFieldClone
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   // TSMimeHdrFieldCopyValues
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 //       SDK_API_TSUrlParse
05131 //
05132 // Unit Test for API: TSUrlParse
05133 //////////////////////////////////////////////
05134 
05135 REGRESSION_TEST(SDK_API_TSUrlParse) (RegressionTest * test, int /* atype ATS_UNUSED */, 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", // Note: file://c: is malformed URL because no host is present.
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" // https://issues.apache.org/jira/browse/TS-1635
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 //       SDK_API_TSTextLog
05223 //
05224 // Unit Test for APIs: TSTextLogObjectCreate
05225 //                     TSTextLogObjectWrite
05226 //                     TSTextLogObjectDestroy
05227 //                     TSTextLogObjectFlush
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 * /* edata ATS_UNUSED */)
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   // Verify content was correctly written into log file
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     // The logfile is created
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   // figure out the matainfo file for cleanup.
05291   // code from MetaInfo::_build_name(const char *filename)
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   // 7 = 1 (dot at beginning) + 5 (".meta") + 1 (null terminating)
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 /* atype ATS_UNUSED */, 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   /* Generate a random log file name, so if we run the test several times, we won't use the
05337      same log file name. */
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 //       SDK_API_TSMgmtGet
05380 //
05381 // Unit Test for APIs: TSMgmtCounterGet
05382 //                     TSMgmtFloatGet
05383 //                     TSMgmtIntGet
05384 //                     TSMgmtStringGet
05385 //////////////////////////////////////////////
05386 
05387 REGRESSION_TEST(SDK_API_TSMgmtGet) (RegressionTest * test, int /* atype ATS_UNUSED */, 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 //       SDK_API_TSConstant
05460 //
05461 // Unit Test for APIs: All TS_XXX constants
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 /* atype ATS_UNUSED */, 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 //       SDK_API_TSHttpSsn
05817 //
05818 // Unit Test for API: TSHttpSsnHookAdd
05819 //                    TSHttpSsnReenable
05820 //                    TSHttpTxnHookAdd
05821 //                    TSHttpTxnErrorBodySet
05822 //                    TSHttpTxnParentProxyGet
05823 //                    TSHttpTxnParentProxySet
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     /* Browser still waiting the response ? */
05950     if (data->browser->status == REQUEST_INPROGRESS) {
05951       TSContSchedule(contp, 25, TS_THREAD_POOL_DEFAULT);
05952     }
05953     /* Browser got the response. test is over. clean up */
05954     else {
05955       /* Check if browser response body is the one we expected */
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       /* Note: response is available using test->browser->response pointer */
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       // transaction is over. clean up.
05986       synclient_txn_delete(data->browser);
05987       /* Don't need it as didn't initialize the server
05988          synserver_delete(data->os);
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 /* atype ATS_UNUSED */, 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   /* Register to HTTP hooks that are called in case of a cache MISS */
06029   TSHttpHookAdd(TS_HTTP_SSN_START_HOOK, cont);
06030 
06031   /* Create a client transaction */
06032   socktest->browser = synclient_txn_create();
06033   char *request = generate_request(3);  // response is expected to be error case
06034   synclient_txn_send_request(socktest->browser, request);
06035   TSfree(request);
06036 
06037   /* Wait until transaction is done */
06038   if (socktest->browser->status == REQUEST_INPROGRESS) {
06039     TSContSchedule(cont, 25, TS_THREAD_POOL_DEFAULT);
06040   }
06041 
06042   return;
06043 }
06044 
06045 /////////////////////////////////////////////////////
06046 //       SDK_API_TSHttpTxnCache
06047 //
06048 // Unit Test for API: TSHttpTxnCachedReqGet
06049 //                    TSHttpTxnCachedRespGet
06050 //                    TSHttpTxnCacheLookupStatusGet
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     /* Browser still waiting the response ? */
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     /* Browser got the response. test is over. clean up */
06191     {
06192       /* If this is the first time, then the response is in cache and we should make */
06193       /* another request to get cache hit */
06194       if (data->first_time == true) {
06195         data->first_time = false;
06196         /* Kill the origin server */
06197         synserver_delete(data->os);
06198 
06199         /* Send another similar client request */
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       /* Note: response is available using test->browser->response pointer */
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       // transaction is over. clean up.
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 /* atype ATS_UNUSED */, 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   /* Register to HTTP hooks that are called in case of a cache MISS */
06259   TSHttpHookAdd(TS_HTTP_READ_CACHE_HDR_HOOK, cont);
06260   TSHttpHookAdd(TS_HTTP_CACHE_LOOKUP_COMPLETE_HOOK, cont);
06261 
06262   /* Create a new synthetic server */
06263   socktest->os = synserver_create(SYNSERVER_LISTEN_PORT);
06264   synserver_start(socktest->os);
06265 
06266   /* Create a client transaction */
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   /* Wait until transaction is done */
06273   TSContSchedule(cont, 25, TS_THREAD_POOL_DEFAULT);
06274 
06275   return;
06276 }
06277 
06278 ///////////////////////////////////////////////////////
06279 //       SDK_API_TSHttpTxnTransform
06280 //
06281 // Unit Test for API: TSHttpTxnTransformRespGet
06282 //                    TSHttpTxnTransformedRespCache
06283 //                    TSHttpTxnUntransformedRespCache
06284 ///////////////////////////////////////////////////////
06285 
06286 /** Append Transform Data Structure **/
06287 typedef struct
06288 {
06289   TSVIO output_vio;
06290   TSIOBuffer output_buffer;
06291   TSIOBufferReader output_reader;
06292   int append_needed;
06293 } MyTransformData;
06294 /** Append Transform Data Structure Ends **/
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 /**** Append Transform Code (Tailored to needs)****/
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   /* Get the output connection where we'll write data to. */
06358   output_conn = TSTransformOutputVConnGet(contp);
06359 
06360   /* Get the write VIO for the write operation that was performed on
06361      ourself. This VIO contains the buffer that we are to read from
06362      as well as the continuation we are to call when the buffer is
06363      empty. */
06364   write_vio = TSVConnWriteVIOGet(contp);
06365 
06366   /* Get our data structure for this operation. The private data
06367      structure contains the output VIO and output buffer. If the
06368      private data structure pointer is NULL, then we'll create it
06369      and initialize its internals. */
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     // Don't need this as the structure is encapsulated in another structure
06383     // which is set to be Continuation's Data.
06384     // TSContDataSet (contp, data);
06385   }
06386 
06387   /* We also check to see if the write VIO's buffer is non-NULL. A
06388      NULL buffer indicates that the write operation has been
06389      shutdown and that the continuation does not want us to send any
06390      more WRITE_READY or WRITE_COMPLETE events. For this simplistic
06391      transformation that means we're done. In a more complex
06392      transformation we might have to finish writing the transformed
06393      data to our output connection. */
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   /* Determine how much data we have left to read. For this append
06406      transform plugin this is also the amount of data we have left
06407      to write to the output connection. */
06408   towrite = TSVIONTodoGet(write_vio);
06409   if (towrite > 0) {
06410     /* The amount of data left to read needs to be truncated by
06411        the amount of data actually in the read buffer. */
06412     avail = TSIOBufferReaderAvail(TSVIOReaderGet(write_vio));
06413     if (towrite > avail) {
06414       towrite = avail;
06415     }
06416 
06417     if (towrite > 0) {
06418       /* Copy the data from the read buffer to the output buffer. */
06419       TSIOBufferCopy(TSVIOBufferGet(data->output_vio), TSVIOReaderGet(write_vio), towrite, 0);
06420 
06421       /* Tell the read buffer that we have read the data and are no
06422          longer interested in it. */
06423       TSIOBufferReaderConsume(TSVIOReaderGet(write_vio), towrite);
06424 
06425       /* Modify the write VIO to reflect how much data we've
06426          completed. */
06427       TSVIONDoneSet(write_vio, TSVIONDoneGet(write_vio) + towrite);
06428     }
06429   }
06430 
06431   /* Now we check the write VIO to see if there is data left to
06432      read. */
06433   if (TSVIONTodoGet(write_vio) > 0) {
06434     if (towrite > 0) {
06435       /* If there is data left to read, then we reenable the output
06436          connection by reenabling the output VIO. This will wakeup
06437          the output connection and allow it to consume data from the
06438          output buffer. */
06439       TSVIOReenable(data->output_vio);
06440 
06441       /* Call back the write VIO continuation to let it know that we
06442          are ready for more data. */
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     /* If there is no data left to read, then we modify the output
06452        VIO to reflect how much data the output connection should
06453        expect. This allows the output connection to know when it
06454        is done reading. We then reenable the output connection so
06455        that it can consume the data we just gave it. */
06456     TSVIONBytesSet(data->output_vio, TSVIONDoneGet(write_vio) + append_buffer_length);
06457     TSVIOReenable(data->output_vio);
06458 
06459     /* Call back the write VIO continuation to let it know that we
06460        have completed the write operation. */
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 * /* edata ATS_UNUSED */)
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   /* Check to see if the transformation has been closed by a call to
06474      TSVConnClose. */
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         /* Get the write VIO for the write operation that was
06487            performed on ourself. This VIO contains the continuation of
06488            our parent transformation. */
06489         write_vio = TSVConnWriteVIOGet(contp);
06490 
06491         /* Call back the write VIO continuation to let it know that we
06492            have completed the write operation. */
06493         TSContCall(TSVIOContGet(write_vio), TS_EVENT_ERROR, write_vio);
06494       }
06495       break;
06496     case TS_EVENT_VCONN_WRITE_COMPLETE:
06497       /* When our output connection says that it has finished
06498          reading all the data we've written to it then we should
06499          shutdown the write portion of its connection to
06500          indicate that we don't want to hear about it anymore. */
06501       TSVConnShutdown(TSTransformOutputVConnGet(contp), 0, 1);
06502       break;
06503     case TS_EVENT_VCONN_WRITE_READY:
06504     default:
06505       /* If we get a WRITE_READY event or any other type of
06506          event (sent, perhaps, because we were reenabled) then
06507          we'll attempt to transform more data. */
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    *  We are only interested in "200 OK" responses.
06528    */
06529 
06530   if (TS_HTTP_STATUS_OK == TSHttpHdrStatusGet(bufp, hdr_loc)) {
06531     return 1;
06532   }
06533 // XXX - Can't return TS_ERROR because that is a different type
06534 // -bcall 7/24/07
06535 //     if (resp_status == TS_ERROR) {
06536 //      SDK_RPRINT(data->test,"TSHttpTxnTransform","",TC_FAIL,"[transformable]: TSHttpHdrStatusGet returns TS_ERROR");
06537 //     }
06538 
06539   return 0;                     /* not a 200 */
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 /**** Append Transform Code Ends ****/
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     /* Setup hooks for Transformation */
06611     if (transformable(txnp, data)) {
06612       transform_add(txnp, data);
06613     }
06614     /* Call TransformedRespCache or UntransformedRespCache depending on request */
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     /* Add the transaction hook to SEND_RESPONSE_HDR_HOOK */
06646     TSHttpTxnHookAdd(txnp, TS_HTTP_SEND_RESPONSE_HDR_HOOK, contp);
06647     /* Reenable the transaction */
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       // for squid log: if this is the last (or only) test in your
06721       // regression run you will not see any log entries in squid
06722       // (because logging is buffered and not flushed before
06723       // termination when running regressions)
06724       // sleep(10);
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     /* Browser got the response. test is over */
06732     {
06733       /* Check if we got the response we were expecting or not */
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       /* Note: response is available using test->browser->response pointer */
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       // transaction is over. clean up.
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 /* atype ATS_UNUSED */, 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   /* Prepare the buffer to be appended to responses */
06831   load(TRANSFORM_APPEND_STRING);
06832 
06833   TSHttpHookAdd(TS_HTTP_READ_REQUEST_HDR_HOOK, cont); //so we can skip remapping
06834 
06835   /* Register to HTTP hooks that are called in case of a cache MISS */
06836   TSHttpHookAdd(TS_HTTP_READ_RESPONSE_HDR_HOOK, cont);
06837 
06838   /* Create a new synthetic server */
06839   socktest->os = synserver_create(SYNSERVER_LISTEN_PORT);
06840   synserver_start(socktest->os);
06841 
06842   /* Create a client transaction */
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   // synclient_txn_send_request(socktest->browser2, socktest->request2);
06852 
06853   /* Wait until transaction is done */
06854   TSContSchedule(cont, 25, TS_THREAD_POOL_DEFAULT);
06855 
06856   return;
06857 }
06858 
06859 //////////////////////////////////////////////
06860 //       SDK_API_TSHttpTxnAltInfo
06861 //
06862 // Unit Test for API: TSHttpTxnCachedReqGet
06863 //                    TSHttpTxnCachedRespGet
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     /* Browser still waiting the response ? */
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     /* Browser got the response. test is over. clean up */
06991     {
06992       /* If this is the first time, then both the responses are in cache and we should make */
06993       /* another request to get cache hit */
06994       if (data->first_time == true) {
06995         data->first_time = false;
06996         /* Kill the origin server */
06997         synserver_delete(data->os);
06998 // ink_release_assert(0);
06999         /* Send another similar client request */
07000         synclient_txn_send_request(data->browser3, data->request3);
07001 
07002         /* Register to HTTP hooks that are called in case of alternate selection */
07003         TSHttpHookAdd(TS_HTTP_SELECT_ALT_HOOK, contp);
07004         TSContSchedule(contp, 25, TS_THREAD_POOL_DEFAULT);
07005         return 0;
07006       }
07007 
07008       /* Note: response is available using test->browser->response pointer */
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       // transaction is over. clean up.
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 /* atype ATS_UNUSED */, 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); //so we can skip remapping
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   /* Create a new synthetic server */
07073   socktest->os = synserver_create(SYNSERVER_LISTEN_PORT);
07074   synserver_start(socktest->os);
07075 
07076   /* Create a client transaction */
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   /* Wait until transaction is done */
07087   TSContSchedule(cont, 25, TS_THREAD_POOL_DEFAULT);
07088 
07089   return;
07090 }
07091 
07092 
07093 //////////////////////////////////////////////
07094 //       SDK_API_TSHttpConnect
07095 //
07096 // Unit Test for APIs:
07097 //      - TSHttpConnect
07098 //      - TSHttpTxnIntercept
07099 //      - TSHttpTxnInterceptServer
07100 //
07101 //
07102 // 2 Test cases.
07103 //
07104 // Same test strategy:
07105 //  - create a synthetic server listening on port A
07106 //  - use HttpConnect to send a request to TS for an url on a remote host H, port B
07107 //  - use TxnIntercept or TxnServerIntercept to forward the request
07108 //    to the synthetic server on local host, port A
07109 //  - make sure response is correct
07110 //
07111 //////////////////////////////////////////////
07112 
07113 // Important: we create servers listening on different port than the default one
07114 // to make sure our synthetix servers are called
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     // First make sure we're getting called for either request 9 or txn 10
07151     // Otherwise, this is a request sent by another test. do nothing.
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     /* Browser still waiting the response ? */
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     /* Browser got the response */
07181     else {
07182       /* Check if browser response body is the one we expected */
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       // transaction is over. clean it up.
07216       synclient_txn_delete(data->browser);
07217       synserver_delete(data->os);
07218 
07219       // As we registered to a global hook, we may be called back again.
07220       // Do not destroy the continuation...
07221       // data->magic = MAGIC_DEAD;
07222       // TSfree(data);
07223       // TSContDataSet(contp, NULL);
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 /* atype */, 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   /* Register to hook READ_REQUEST */
07254   TSHttpHookAdd(TS_HTTP_READ_REQUEST_HDR_HOOK, cont_test);
07255 
07256   // Create a synthetic server which won't really listen on a socket port
07257   // It will be called by the Http SM with a VC
07258   data->os = synserver_create(SYNSERVER_DUMMY_PORT);
07259 
07260   data->browser = synclient_txn_create();
07261   data->request = generate_request(9);
07262 
07263   /* Now send a request to the OS via TS using TSHttpConnect */
07264 
07265   /* ip and log do not matter as it is used for logging only */
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   /* Wait until transaction is done */
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 /* atype ATS_UNUSED */,
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   /* Register to hook READ_REQUEST */
07295   TSHttpHookAdd(TS_HTTP_READ_REQUEST_HDR_HOOK, cont_test);
07296 
07297   /* This is cool ! we can use the code written for the synthetic server and client in InkAPITest.cc */
07298   data->os = synserver_create(SYNSERVER_DUMMY_PORT);
07299 
07300   data->browser = synclient_txn_create();
07301   data->request = generate_request(10);
07302 
07303   /* Now send a request to the OS via TS using TSHttpConnect */
07304 
07305   /* ip and log do not matter as it is used for logging only */
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   /* Wait until transaction is done */
07313   TSContSchedule(cont_test, 25, TS_THREAD_POOL_DEFAULT);
07314 
07315   return;
07316 }
07317 
07318 
07319 ////////////////////////////////////////////////
07320 // SDK_API_OVERRIDABLE_CONFIGS
07321 //
07322 // Unit Test for API: TSHttpTxnConfigFind
07323 //                    TSHttpTxnConfigIntSet
07324 //                    TSHttpTxnConfigIntGet
07325 //                    TSHttpTxnConfigFloatSet
07326 //                    TSHttpTxnConfigFloatGet
07327 //                    TSHttpTxnConfigStringSet
07328 //                    TSHttpTxnConfigStringGet
07329 ////////////////////////////////////////////////
07330 
07331 // The order of these should be the same as TSOverridableConfigKey
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 /* atype ATS_UNUSED */, 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     // Now check the getters / setters
07456     switch (type) {
07457     case TS_RECORDDATATYPE_INT:
07458       ival_rand = generator.random() % 126; // to fit in a signed byte
07459       // 4.1 backwards compatibility - remove for 5.0
07460       if (TS_CONFIG_HTTP_SHARE_SERVER_SESSIONS == key) ival_rand %= 2;
07461       // end BC
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 // SDK_API_ENCODING
07516 //
07517 // Unit Test for API: TSStringPercentEncode
07518 //                    TSUrlPercentEncode
07519 //                    TSStringPercentDecode
07520 ////////////////////////////////////////////////
07521 
07522 REGRESSION_TEST(SDK_API_ENCODING) (RegressionTest * test, int /* atype ATS_UNUSED */, 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/"; // No Percent encoding necessary
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 // SDK_API_DEBUG_NAME_LOOKUPS
07614 //
07615 // Unit Test for API: TSHttpServerStateNameLookup
07616 //                    TSHttpHookNameLookup
07617 //                    TSHttpEventNameLookup
07618 ////////////////////////////////////////////////
07619 
07620 REGRESSION_TEST(SDK_API_DEBUG_NAME_LOOKUPS) (RegressionTest * test, int /* atype ATS_UNUSED */, 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 }

Generated by  doxygen 1.7.1