| /** @file |
| |
| Implements unit test for SDK APIs |
| |
| @section license License |
| |
| Licensed to the Apache Software Foundation (ASF) under one |
| or more contributor license agreements. See the NOTICE file |
| distributed with this work for additional information |
| regarding copyright ownership. The ASF licenses this file |
| to you under the Apache License, Version 2.0 (the |
| "License"); you may not use this file except in compliance |
| with the License. You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| */ |
| |
| #include "ink_config.h" |
| #include <sys/types.h> |
| |
| #include <errno.h> |
| //extern int errno; |
| |
| #include <pthread.h> |
| #include <unistd.h> |
| #include <stdio.h> |
| #include <string.h> |
| |
| #include "Regression.h" |
| #include "api/ts/ts.h" |
| #include "api/ts/ts_private_frozen.h" |
| #include "api/ts/ts_private.h" |
| #include "I_RecCore.h" |
| #include "I_Layout.h" |
| |
| #include "InkAPITestTool.cc" |
| #include "http2/HttpSM.h" |
| |
| #define TC_PASS 1 |
| #define TC_FAIL 0 |
| |
| #define UTDBG_TAG "sdk_ut" |
| |
| #define LOCAL_IP 0x7f000001 // 127.0.0.1 |
| |
| /******************************************************************************/ |
| |
| |
| |
| /* Use SDK_RPRINT to report failure or success for each test case */ |
| int |
| SDK_RPRINT(RegressionTest * t, const char *api_name, const char *testcase_name, int status, const char *err_details_format, ...) |
| { |
| int l; |
| char buffer[8192]; |
| char format2[8192]; |
| snprintf(format2, sizeof(format2), "[%s] %s : [%s] <<%s>> { %s }\n", t->name, |
| api_name, testcase_name, status == TC_PASS ? "PASS" : "FAIL", err_details_format); |
| va_list ap; |
| va_start(ap, err_details_format); |
| l = ink_bvsprintf(buffer, format2, ap); |
| va_end(ap); |
| fputs(buffer, stderr); |
| return (l); |
| } |
| |
| |
| /* |
| REGRESSION_TEST(SDK_<test_name>)(RegressionTest *t, int atype, int *pstatus) |
| |
| RegressionTest *test is a pointer on object that will run the test. |
| Do not modify. |
| |
| int atype is one of: |
| REGRESSION_TEST_NONE |
| REGRESSION_TEST_QUICK |
| REGRESSION_TEST_NIGHTLY |
| REGRESSION_TEST_EXTENDED |
| |
| int *pstatus should be set to one of: |
| REGRESSION_TEST_PASSED |
| REGRESSION_TEST_INPROGRESS |
| REGRESSION_TEST_FAILED |
| REGRESSION_TEST_NOT_RUN |
| Note: pstatus is polled and can be used for asynchroneous tests. |
| |
| */ |
| |
| /* Misc */ |
| //////////////////////////////////////////////// |
| // SDK_API_INKTrafficServerVersionGet |
| // |
| // Unit Test for API: INKTrafficServerVersionGet |
| //////////////////////////////////////////////// |
| REGRESSION_TEST(SDK_API_INKTrafficServerVersionGet) (RegressionTest * test, int atype, int *pstatus) |
| { |
| NOWARN_UNUSED(atype); |
| *pstatus = REGRESSION_TEST_INPROGRESS; |
| |
| /* Assume the UT runs on TS5.0 and higher */ |
| const char *ts_version = INKTrafficServerVersionGet(); |
| if (!ts_version) { |
| SDK_RPRINT(test, "INKTrafficServerVersionGet", "TestCase1", TC_FAIL, "can't get traffic server version"); |
| *pstatus = REGRESSION_TEST_FAILED; |
| return; |
| } |
| |
| int major_ts_version = 0; |
| int minor_ts_version = 0; |
| int patch_ts_version = 0; |
| // coverity[secure_coding] |
| if (sscanf(ts_version, "%d.%d.%d", &major_ts_version, &minor_ts_version, &patch_ts_version) != 3) { |
| SDK_RPRINT(test, "INKTrafficServerVersionGet", "TestCase2", TC_FAIL, "traffic server version format is incorrect"); |
| *pstatus = REGRESSION_TEST_FAILED; |
| return; |
| } |
| |
| if (major_ts_version < 2) { |
| SDK_RPRINT(test, "INKTrafficServerVersionGet", "TestCase3", TC_FAIL, "traffic server major version is incorrect"); |
| *pstatus = REGRESSION_TEST_FAILED; |
| return; |
| } |
| |
| SDK_RPRINT(test, "INKTrafficServerVersionGet", "TestCase1", TC_PASS, "ok"); |
| *pstatus = REGRESSION_TEST_PASSED; |
| return; |
| } |
| |
| |
| //////////////////////////////////////////////// |
| // SDK_API_INKPluginDirGet |
| // |
| // Unit Test for API: INKPluginDirGet |
| // INKInstallDirGet |
| //////////////////////////////////////////////// |
| REGRESSION_TEST(SDK_API_INKPluginDirGet) (RegressionTest * test, int atype, int *pstatus) |
| { |
| NOWARN_UNUSED(atype); |
| *pstatus = REGRESSION_TEST_INPROGRESS; |
| |
| const char *plugin_dir = INKPluginDirGet(); |
| const char *install_dir = INKInstallDirGet(); |
| |
| if (!plugin_dir) { |
| SDK_RPRINT(test, "INKPluginDirGet", "TestCase1", TC_FAIL, "can't get plugin dir"); |
| *pstatus = REGRESSION_TEST_FAILED; |
| return; |
| } |
| |
| if (!install_dir) { |
| SDK_RPRINT(test, "INKInstallDirGet", "TestCase1", TC_FAIL, "can't get installation dir"); |
| *pstatus = REGRESSION_TEST_FAILED; |
| return; |
| } |
| |
| // XXX: This doesn't have to be true |
| // since the location can be anywhere |
| // |
| if (strstr(plugin_dir, "libexec/trafficserver") == NULL) { |
| SDK_RPRINT(test, "INKPluginDirGet", "TestCase2", TC_FAIL, "plugin dir(%s) is incorrect, expected (%s) in path",plugin_dir,"libexec/trafficserver"); |
| *pstatus = REGRESSION_TEST_FAILED; |
| return; |
| } |
| |
| if (strstr(plugin_dir, install_dir) == NULL) { |
| SDK_RPRINT(test, "INKInstallDirGet", "TestCase2", TC_FAIL, "install dir is incorrect"); |
| *pstatus = REGRESSION_TEST_FAILED; |
| return; |
| } |
| |
| SDK_RPRINT(test, "INKPluginDirGet", "TestCase1", TC_PASS, "ok"); |
| SDK_RPRINT(test, "INKInstallDirGet", "TestCase1", TC_PASS, "ok"); |
| *pstatus = REGRESSION_TEST_PASSED; |
| return; |
| } |
| |
| |
| /* INKConfig */ |
| //////////////////////////////////////////////// |
| // SDK_API_INKConfig |
| // |
| // Unit Test for API: INKConfigSet |
| // INKConfigGet |
| // INKConfigRelease |
| // INKConfigDataGet |
| //////////////////////////////////////////////// |
| static int my_config_id = -1; |
| typedef struct |
| { |
| const char *a; |
| const char *b; |
| } ConfigData; |
| |
| static void |
| config_destroy_func(void *data) |
| { |
| ConfigData *config = (ConfigData *) data; |
| INKfree(config); |
| return; |
| } |
| |
| REGRESSION_TEST(SDK_API_INKConfig) (RegressionTest * test, int atype, int *pstatus) |
| { |
| NOWARN_UNUSED(atype); |
| *pstatus = REGRESSION_TEST_INPROGRESS; |
| ConfigData *config = (ConfigData *) INKmalloc(sizeof(ConfigData)); |
| config->a = "unit"; |
| config->b = "test"; |
| |
| my_config_id = INKConfigSet(0, config, config_destroy_func); |
| |
| INKConfig test_config = NULL; |
| test_config = INKConfigGet(my_config_id); |
| |
| if (!test_config) { |
| SDK_RPRINT(test, "INKConfigSet", "TestCase1", TC_FAIL, "can't correctly set global config structure"); |
| SDK_RPRINT(test, "INKConfigGet", "TestCase1", TC_FAIL, "can't correctly get global config structure"); |
| INKConfigRelease(my_config_id, config); |
| *pstatus = REGRESSION_TEST_FAILED; |
| return; |
| } |
| |
| if (INKConfigDataGet(test_config) != config) { |
| SDK_RPRINT(test, "INKConfigDataGet", "TestCase1", TC_FAIL, "failed to get config data"); |
| INKConfigRelease(my_config_id, config); |
| *pstatus = REGRESSION_TEST_FAILED; |
| return; |
| } |
| |
| SDK_RPRINT(test, "INKConfigGet", "TestCase1", TC_PASS, "ok"); |
| SDK_RPRINT(test, "INKConfigSet", "TestCase1", TC_PASS, "ok"); |
| SDK_RPRINT(test, "INKConfigDataGet", "TestCase1", TC_PASS, "ok"); |
| |
| INKConfigRelease(my_config_id, config); |
| *pstatus = REGRESSION_TEST_PASSED; |
| return; |
| } |
| |
| /* INKNetVConn */ |
| ////////////////////////////////////////////// |
| // SDK_API_INKNetVConn |
| // |
| // Unit Test for API: INKNetVConnRemoteIPGet |
| // INKNetVConnRemotePortGet |
| // INKNetAccept |
| // INKNetConnect |
| ////////////////////////////////////////////// |
| #define IP(a,b,c,d) htonl((a) << 24 | (b) << 16 | (c) << 8 | (d)) |
| const unsigned short server_port = 12345; |
| RegressionTest *SDK_NetVConn_test; |
| int *SDK_NetVConn_pstatus; |
| |
| int |
| server_handler(INKCont contp, INKEvent event, void *data) |
| { |
| NOWARN_UNUSED(data); |
| if (event == INK_EVENT_VCONN_EOS) |
| INKContDestroy(contp); |
| |
| return 1; |
| } |
| |
| int |
| client_handler(INKCont contp, INKEvent event, void *data) |
| { |
| if (event == INK_EVENT_NET_CONNECT_FAILED) { |
| SDK_RPRINT(SDK_NetVConn_test, "INKNetAccept", "TestCase1", TC_FAIL, "can't connect to server"); |
| SDK_RPRINT(SDK_NetVConn_test, "INKNetConnect", "TestCase1", TC_FAIL, "can't connect to server"); |
| |
| // no need to continue, return |
| INKContDestroy(contp); |
| // Fix me: how to deal with server side cont? |
| *SDK_NetVConn_pstatus = REGRESSION_TEST_FAILED; |
| |
| return 1; |
| } else { |
| SDK_RPRINT(SDK_NetVConn_test, "INKNetAccept", "TestCase1", TC_PASS, "ok"); |
| SDK_RPRINT(SDK_NetVConn_test, "INKNetConnect", "TestCase1", TC_PASS, "ok"); |
| |
| unsigned int input_server_ip = 0; |
| int input_server_port = 0; |
| INKNetVConnRemoteIPGet((INKVConn) data, &input_server_ip); |
| INKNetVConnRemotePortGet((INKVConn) data, &input_server_port); |
| |
| if (input_server_ip != htonl(LOCAL_IP)) { |
| SDK_RPRINT(SDK_NetVConn_test, "INKNetVConnRemoteIPGet", "TestCase1", TC_FAIL, "server ip is incorrect"); |
| |
| INKContDestroy(contp); |
| // Fix me: how to deal with server side cont? |
| *SDK_NetVConn_pstatus = REGRESSION_TEST_FAILED; |
| return 1; |
| } else |
| SDK_RPRINT(SDK_NetVConn_test, "INKNetVConnRemoteIPGet", "TestCase1", TC_PASS, "ok"); |
| |
| if (input_server_port != server_port) { |
| SDK_RPRINT(SDK_NetVConn_test, "INKNetVConnRemotePortGet", "TestCase1", TC_FAIL, "server port is incorrect"); |
| |
| INKContDestroy(contp); |
| // Fix me: how to deal with server side cont? |
| *SDK_NetVConn_pstatus = REGRESSION_TEST_FAILED; |
| return 1; |
| } else |
| SDK_RPRINT(SDK_NetVConn_test, "INKNetVConnRemotePortGet", "TestCase1", TC_PASS, "ok"); |
| |
| INKVConnClose((INKVConn) data); |
| } |
| |
| INKContDestroy(contp); |
| |
| *SDK_NetVConn_pstatus = REGRESSION_TEST_PASSED; |
| return 1; |
| } |
| |
| REGRESSION_TEST(SDK_API_INKNetVConn) (RegressionTest * test, int atype, int *pstatus) |
| { |
| NOWARN_UNUSED(atype); |
| *pstatus = REGRESSION_TEST_INPROGRESS; |
| SDK_NetVConn_test = test; |
| SDK_NetVConn_pstatus = pstatus; |
| |
| INKMutex server_mutex = INKMutexCreate(); |
| INKMutex client_mutex = INKMutexCreate(); |
| |
| INKCont server_cont = INKContCreate(server_handler, server_mutex); |
| INKCont client_cont = INKContCreate(client_handler, client_mutex); |
| |
| INKNetAccept(server_cont, server_port); |
| |
| unsigned int server_ip = IP(127, 0, 0, 1); |
| INKNetConnect(client_cont, server_ip, server_port); |
| } |
| |
| /* INKCache, INKVConn, INKVIO */ |
| ////////////////////////////////////////////// |
| // SDK_API_INKCache |
| // |
| // Unit Test for API: INKCacheReady |
| // INKCacheWrite |
| // INKCacheRead |
| // INKCacheKeyCreate |
| // INKCacheKeyDigestSet |
| // INKVConnCacheObjectSizeGet |
| // INKVConnClose |
| // INKVConnClosedGet |
| // INKVConnRead |
| // INKVConnReadVIOGet |
| // INKVConnWrite |
| // INKVConnWriteVIOGet |
| // INKVIOBufferGet |
| // INKVIOContGet |
| // INKVIOMutexGet |
| // INKVIONBytesGet |
| // INKVIONBytesSet |
| // INKVIONDoneGet |
| // INKVIONDoneSet |
| // INKVIONTodoGet |
| // INKVIOReaderGet |
| // INKVIOReenable |
| // INKVIOVConnGet |
| ////////////////////////////////////////////// |
| |
| // INKVConnAbort can't be tested |
| // Fix me: test INKVConnShutdown, INKCacheKeyDataTypeSet, |
| // INKCacheKeyHostNameSet, INKCacheKeyPinnedSet |
| |
| // Logic of the test: |
| // - write OBJECT_SIZE bytes in the cache in 3 shots |
| // (OBJECT_SIZE/2, then OBJECT_SIZE-100 and finally OBJECT_SIZE) |
| // - read object from the cache |
| // - remove it from the cache |
| // - try to read it (should faild) |
| |
| |
| #define OBJECT_SIZE 100000 // size of the object we'll write/read/remove in cache |
| |
| |
| RegressionTest *SDK_Cache_test; |
| int *SDK_Cache_pstatus; |
| static char content[OBJECT_SIZE]; |
| static int read_counter = 0; |
| |
| typedef struct |
| { |
| INKIOBuffer bufp; |
| INKIOBuffer out_bufp; |
| INKIOBufferReader readerp; |
| INKIOBufferReader out_readerp; |
| |
| INKVConn write_vconnp; |
| INKVConn read_vconnp; |
| INKVIO read_vio; |
| INKVIO write_vio; |
| |
| INKCacheKey key; |
| } CacheVConnStruct; |
| |
| int |
| cache_handler(INKCont contp, INKEvent event, void *data) |
| { |
| Debug("sdk_ut_cache_write", "Event %d data %p", event, data); |
| |
| CacheVConnStruct *cache_vconn = (CacheVConnStruct *) INKContDataGet(contp); |
| |
| INKIOBufferBlock blockp; |
| char *ptr_block; |
| int64 ntodo, ndone, nbytes, towrite, avail, content_length; |
| |
| switch (event) { |
| case INK_EVENT_CACHE_OPEN_WRITE: |
| Debug(UTDBG_TAG "_cache_event", "INK_EVENT_CACHE_OPEN_WRITE %d %p", event, data); |
| SDK_RPRINT(SDK_Cache_test, "INKCacheWrite", "TestCase1", TC_PASS, "ok"); |
| |
| // data is write_vc |
| cache_vconn->write_vconnp = (INKVConn) data; |
| |
| // Create buffers/readers to write and read data into the cache |
| cache_vconn->bufp = INKIOBufferCreate(); |
| cache_vconn->readerp = INKIOBufferReaderAlloc(cache_vconn->bufp); |
| cache_vconn->out_bufp = INKIOBufferCreate(); |
| cache_vconn->out_readerp = INKIOBufferReaderAlloc(cache_vconn->out_bufp); |
| |
| // Write content into upstream IOBuffer |
| ntodo = OBJECT_SIZE; |
| ndone = 0; |
| while (ntodo > 0) { |
| blockp = INKIOBufferStart(cache_vconn->bufp); |
| ptr_block = INKIOBufferBlockWriteStart(blockp, &avail); |
| towrite = ((ntodo < avail) ? ntodo : avail); |
| memcpy(ptr_block, content + ndone, towrite); |
| INKIOBufferProduce(cache_vconn->bufp, towrite); |
| ntodo -= towrite; |
| ndone += towrite; |
| } |
| |
| // first write half of the data. To test INKVIOReenable |
| cache_vconn->write_vio = INKVConnWrite((INKVConn) data, contp, cache_vconn->readerp, OBJECT_SIZE / 2); |
| return 1; |
| |
| case INK_EVENT_CACHE_OPEN_WRITE_FAILED: |
| Debug(UTDBG_TAG "_cache_event", "INK_EVENT_CACHE_OPEN_WRITE_FAILED %d %p", event, data); |
| SDK_RPRINT(SDK_Cache_test, "INKCacheWrite", "TestCase1", TC_FAIL, "can't open cache vc, edtata = %p", data); |
| INKReleaseAssert(!"cache"); |
| |
| // no need to continue, return |
| *SDK_Cache_pstatus = REGRESSION_TEST_FAILED; |
| return 1; |
| |
| case INK_EVENT_CACHE_OPEN_READ: |
| Debug(UTDBG_TAG "_cache_event", "INK_EVENT_CACHE_OPEN_READ %d %p", event, data); |
| if (read_counter == 2) { |
| SDK_RPRINT(SDK_Cache_test, "INKCacheRead", "TestCase2", TC_FAIL, "shouldn't open cache vc"); |
| |
| // no need to continue, return |
| *SDK_Cache_pstatus = REGRESSION_TEST_FAILED; |
| return 1; |
| } |
| |
| SDK_RPRINT(SDK_Cache_test, "INKCacheRead", "TestCase1", TC_PASS, "ok"); |
| |
| cache_vconn->read_vconnp = (INKVConn) data; |
| INKVConnCacheObjectSizeGet(cache_vconn->read_vconnp, &content_length); |
| Debug(UTDBG_TAG "_cache_read", "In cache open read [Content-Length: %d]", content_length); |
| if (content_length != OBJECT_SIZE) { |
| SDK_RPRINT(SDK_Cache_test, "INKVConnCacheObjectSizeGet", "TestCase1", TC_FAIL, "cached data size is incorrect"); |
| |
| // no need to continue, return |
| *SDK_Cache_pstatus = REGRESSION_TEST_FAILED; |
| return 1; |
| } else { |
| SDK_RPRINT(SDK_Cache_test, "INKVConnCacheObjectSizeGet", "TestCase1", TC_PASS, "ok"); |
| cache_vconn->read_vio = INKVConnRead((INKVConn) data, contp, cache_vconn->out_bufp, content_length); |
| } |
| return 1; |
| |
| case INK_EVENT_CACHE_OPEN_READ_FAILED: |
| Debug(UTDBG_TAG "_cache_event", "INK_EVENT_CACHE_OPEN_READ_FAILED %d %p", event, data); |
| if (read_counter == 1) { |
| SDK_RPRINT(SDK_Cache_test, "INKCacheRead", "TestCase1", TC_FAIL, "can't open cache vc"); |
| |
| // no need to continue, return |
| *SDK_Cache_pstatus = REGRESSION_TEST_FAILED; |
| return 1; |
| } |
| SDK_RPRINT(SDK_Cache_test, "INKCacheRead", "TestCase2", TC_PASS, "ok"); |
| |
| // ok, all tests passed! |
| break; |
| |
| case INK_EVENT_CACHE_REMOVE: |
| Debug(UTDBG_TAG "_cache_event", "INK_EVENT_CACHE_REMOVE %d %p", event, data); |
| SDK_RPRINT(SDK_Cache_test, "INKCacheRemove", "TestCase1", TC_PASS, "ok"); |
| |
| // read the data which has been removed |
| read_counter++; |
| INKCacheRead(contp, cache_vconn->key); |
| return 1; |
| |
| case INK_EVENT_CACHE_REMOVE_FAILED: |
| Debug(UTDBG_TAG "_cache_event", "INK_EVENT_CACHE_REMOVE_FAILED %d %p", event, data); |
| SDK_RPRINT(SDK_Cache_test, "INKCacheRemove", "TestCase1", TC_FAIL, "can't remove cached item"); |
| |
| // no need to continue, return |
| *SDK_Cache_pstatus = REGRESSION_TEST_FAILED; |
| return 1; |
| |
| case INK_EVENT_VCONN_WRITE_COMPLETE: |
| Debug(UTDBG_TAG "_cache_event", "INK_EVENT_VCONN_WRITE_COMPLETE %d %p", event, data); |
| |
| // VConn/VIO APIs |
| nbytes = INKVIONBytesGet(cache_vconn->write_vio); |
| ndone = INKVIONDoneGet(cache_vconn->write_vio); |
| ntodo = INKVIONTodoGet(cache_vconn->write_vio); |
| Debug(UTDBG_TAG "_cache_write", "Nbytes=%d Ndone=%d Ntodo=%d", nbytes, ndone, ntodo); |
| |
| if (ndone == (OBJECT_SIZE / 2)) { |
| INKVIONBytesSet(cache_vconn->write_vio, (OBJECT_SIZE - 100)); |
| INKVIOReenable(cache_vconn->write_vio); |
| Debug(UTDBG_TAG "_cache_write", "Increment write_counter in write_complete [a]"); |
| return 1; |
| } else if (ndone == (OBJECT_SIZE - 100)) { |
| INKVIONBytesSet(cache_vconn->write_vio, OBJECT_SIZE); |
| INKVIOReenable(cache_vconn->write_vio); |
| Debug(UTDBG_TAG "_cache_write", "Increment write_counter in write_complete [b]"); |
| return 1; |
| } else if (ndone == OBJECT_SIZE) { |
| Debug(UTDBG_TAG "_cache_write", "finishing up [c]"); |
| |
| SDK_RPRINT(SDK_Cache_test, "INKVIOReenable", "TestCase2", TC_PASS, "ok"); |
| SDK_RPRINT(SDK_Cache_test, "INKVIONBytesSet", "TestCase1", TC_PASS, "ok"); |
| SDK_RPRINT(SDK_Cache_test, "INKVConnWrite", "TestCase1", TC_PASS, "ok"); |
| } else { |
| SDK_RPRINT(SDK_Cache_test, "INKCacheWrite", "TestCase1", TC_FAIL, "Did not write expected # of bytes"); |
| // no need to continue, return |
| *SDK_Cache_pstatus = REGRESSION_TEST_FAILED; |
| return 1; |
| } |
| |
| if ((INKVIO) data != cache_vconn->write_vio) { |
| SDK_RPRINT(SDK_Cache_test, "INKVConnWrite", "TestCase1", TC_FAIL, "write_vio corrupted"); |
| // no need to continue, return |
| *SDK_Cache_pstatus = REGRESSION_TEST_FAILED; |
| return 1; |
| } |
| Debug(UTDBG_TAG "_cache_write", "finishing up [d]"); |
| |
| |
| if (INKVIOBufferGet(cache_vconn->write_vio) != cache_vconn->bufp) { |
| SDK_RPRINT(SDK_Cache_test, "INKVIOBufferGet", "TestCase1", TC_FAIL, "write_vio corrupted"); |
| *SDK_Cache_pstatus = REGRESSION_TEST_FAILED; |
| return 1; |
| } else { |
| SDK_RPRINT(SDK_Cache_test, "INKVIOBufferGet", "TestCase1", TC_PASS, "ok"); |
| } |
| |
| if (INKVIOContGet(cache_vconn->write_vio) != contp) { |
| SDK_RPRINT(SDK_Cache_test, "INKVIOContGet", "TestCase1", TC_FAIL, "write_vio corrupted"); |
| *SDK_Cache_pstatus = REGRESSION_TEST_FAILED; |
| return 1; |
| } else { |
| SDK_RPRINT(SDK_Cache_test, "INKVIOContGet", "TestCase1", TC_PASS, "ok"); |
| } |
| |
| Debug(UTDBG_TAG "_cache_write", "finishing up [f]"); |
| |
| if (INKVIOMutexGet(cache_vconn->write_vio) != INKContMutexGet(contp)) { |
| SDK_RPRINT(SDK_Cache_test, "INKVIOMutexGet", "TestCase1", TC_FAIL, "write_vio corrupted"); |
| *SDK_Cache_pstatus = REGRESSION_TEST_FAILED; |
| return 1; |
| } else { |
| SDK_RPRINT(SDK_Cache_test, "INKVIOMutexGet", "TestCase1", TC_PASS, "ok"); |
| } |
| |
| if (INKVIOVConnGet(cache_vconn->write_vio) != cache_vconn->write_vconnp) { |
| SDK_RPRINT(SDK_Cache_test, "INKVIOVConnGet", "TestCase1", TC_FAIL, "write_vio corrupted"); |
| *SDK_Cache_pstatus = REGRESSION_TEST_FAILED; |
| return 1; |
| } else { |
| SDK_RPRINT(SDK_Cache_test, "INKVIOVConnGet", "TestCase1", TC_PASS, "ok"); |
| } |
| |
| Debug(UTDBG_TAG "_cache_write", "finishing up [g]"); |
| |
| if (INKVIOReaderGet(cache_vconn->write_vio) != cache_vconn->readerp) { |
| SDK_RPRINT(SDK_Cache_test, "INKVIOReaderGet", "TestCase1", TC_FAIL, "write_vio corrupted"); |
| *SDK_Cache_pstatus = REGRESSION_TEST_FAILED; |
| return 1; |
| } else { |
| SDK_RPRINT(SDK_Cache_test, "INKVIOReaderGet", "TestCase1", TC_PASS, "ok"); |
| } |
| |
| // tests for write is done, close write_vconnp |
| INKVConnClose(cache_vconn->write_vconnp); |
| cache_vconn->write_vconnp = NULL; |
| |
| Debug(UTDBG_TAG "_cache_write", "finishing up [h]"); |
| |
| |
| // start to read data out of cache |
| read_counter++; |
| INKCacheRead(contp, cache_vconn->key); |
| Debug(UTDBG_TAG "_cache_read", "starting read [i]"); |
| return 1; |
| |
| |
| case INK_EVENT_VCONN_WRITE_READY: |
| Debug(UTDBG_TAG "_cache_event", "INK_EVENT_VCONN_WRITE_READY %d %p", event, data); |
| if ((INKVIO) data != cache_vconn->write_vio) { |
| SDK_RPRINT(SDK_Cache_test, "INKVConnWrite", "TestCase1", TC_FAIL, "write_vio corrupted"); |
| *SDK_Cache_pstatus = REGRESSION_TEST_FAILED; |
| return 1; |
| } |
| |
| nbytes = INKVIONBytesGet(cache_vconn->write_vio); |
| ndone = INKVIONDoneGet(cache_vconn->write_vio); |
| ntodo = INKVIONTodoGet(cache_vconn->write_vio); |
| Debug(UTDBG_TAG "_cache_write", "Nbytes=%d Ndone=%d Ntodo=%d", nbytes, ndone, ntodo); |
| |
| INKVIOReenable(cache_vconn->write_vio); |
| return 1; |
| |
| case INK_EVENT_VCONN_READ_COMPLETE: |
| Debug(UTDBG_TAG "_cache_event", "INK_EVENT_VCONN_READ_COMPLETE %d %p", event, data); |
| if ((INKVIO) data != cache_vconn->read_vio) { |
| SDK_RPRINT(SDK_Cache_test, "INKVConnRead", "TestCase1", TC_FAIL, "read_vio corrupted"); |
| |
| // no need to continue, return |
| *SDK_Cache_pstatus = REGRESSION_TEST_FAILED; |
| return 1; |
| } |
| |
| nbytes = INKVIONBytesGet(cache_vconn->read_vio); |
| ntodo = INKVIONTodoGet(cache_vconn->read_vio); |
| ndone = INKVIONDoneGet(cache_vconn->read_vio); |
| Debug(UTDBG_TAG "_cache_read", "Nbytes=%d Ndone=%d Ntodo=%d", nbytes, ndone, ntodo); |
| |
| if (nbytes != (ndone + ntodo)) { |
| SDK_RPRINT(SDK_Cache_test, "INKVIONBytesGet", "TestCase1", TC_FAIL, "read_vio corrupted"); |
| SDK_RPRINT(SDK_Cache_test, "INKVIONTodoGet", "TestCase1", TC_FAIL, "read_vio corrupted"); |
| SDK_RPRINT(SDK_Cache_test, "INKVIONDoneGet", "TestCase1", TC_FAIL, "read_vio corrupted"); |
| |
| // no need to continue, return |
| *SDK_Cache_pstatus = REGRESSION_TEST_FAILED; |
| return 1; |
| } else { |
| SDK_RPRINT(SDK_Cache_test, "INKVIONBytesGet", "TestCase1", TC_PASS, "ok"); |
| SDK_RPRINT(SDK_Cache_test, "INKVIONTodoGet", "TestCase1", TC_PASS, "ok"); |
| SDK_RPRINT(SDK_Cache_test, "INKVIONDoneGet", "TestCase1", TC_PASS, "ok"); |
| |
| INKVIONDoneSet(cache_vconn->read_vio, 0); |
| if (INKVIONDoneGet(cache_vconn->read_vio) != 0) { |
| SDK_RPRINT(SDK_Cache_test, "INKVIONDoneSet", "TestCase1", TC_FAIL, "fail to set"); |
| |
| // no need to continue, return |
| *SDK_Cache_pstatus = REGRESSION_TEST_FAILED; |
| return 1; |
| } else |
| SDK_RPRINT(SDK_Cache_test, "INKVIONDoneSet", "TestCase1", TC_PASS, "ok"); |
| |
| Debug(UTDBG_TAG "_cache_write", "finishing up [i]"); |
| |
| // now waiting for 100ms to make sure the key is |
| // written in directory remove the content |
| INKContSchedule(contp, 100); |
| } |
| |
| return 1; |
| |
| case INK_EVENT_VCONN_READ_READY: |
| Debug(UTDBG_TAG "_cache_event", "INK_EVENT_VCONN_READ_READY %d %p", event, data); |
| if ((INKVIO) data != cache_vconn->read_vio) { |
| SDK_RPRINT(SDK_Cache_test, "INKVConnRead", "TestCase1", TC_FAIL, "read_vio corrupted"); |
| |
| // no need to continue, return |
| *SDK_Cache_pstatus = REGRESSION_TEST_FAILED; |
| return 1; |
| } |
| |
| nbytes = INKVIONBytesGet(cache_vconn->read_vio); |
| ntodo = INKVIONTodoGet(cache_vconn->read_vio); |
| ndone = INKVIONDoneGet(cache_vconn->read_vio); |
| Debug(UTDBG_TAG "_cache_read", "Nbytes=%d Ndone=%d Ntodo=%d", nbytes, ndone, ntodo); |
| |
| if (nbytes != (ndone + ntodo)) { |
| SDK_RPRINT(SDK_Cache_test, "INKVIONBytesGet", "TestCase1", TC_FAIL, "read_vio corrupted"); |
| SDK_RPRINT(SDK_Cache_test, "INKVIONTodoGet", "TestCase1", TC_FAIL, "read_vio corrupted"); |
| SDK_RPRINT(SDK_Cache_test, "INKVIONDoneGet", "TestCase1", TC_FAIL, "read_vio corrupted"); |
| |
| // no need to continue, return |
| *SDK_Cache_pstatus = REGRESSION_TEST_FAILED; |
| return 1; |
| } else { |
| SDK_RPRINT(SDK_Cache_test, "INKVIONBytesGet", "TestCase1", TC_PASS, "ok"); |
| SDK_RPRINT(SDK_Cache_test, "INKVIONTodoGet", "TestCase1", TC_PASS, "ok"); |
| SDK_RPRINT(SDK_Cache_test, "INKVIONDoneGet", "TestCase1", TC_PASS, "ok"); |
| } |
| |
| // Fix for bug INKqa12276: Must consume data from iobuffer |
| nbytes = INKIOBufferReaderAvail(cache_vconn->out_readerp); |
| INKIOBufferReaderConsume(cache_vconn->out_readerp, nbytes); |
| INKDebug(UTDBG_TAG "_cache_read", "Consuming %d bytes from cache read VC", nbytes); |
| |
| INKVIOReenable(cache_vconn->read_vio); |
| Debug(UTDBG_TAG "_cache_read", "finishing up [j]"); |
| return 1; |
| |
| case INK_EVENT_TIMEOUT: |
| Debug(UTDBG_TAG "_cache_event", "INK_EVENT_TIMEOUT %d %p", event, data); |
| // do remove cached doc |
| INKCacheRemove(contp, cache_vconn->key); |
| return 1; |
| |
| default: |
| INKReleaseAssert(!"Test SDK_API_INKCache: unexpected event"); |
| } |
| |
| Debug(UTDBG_TAG "_cache_event", "DONE DONE DONE"); |
| |
| // destroy the data structure |
| Debug(UTDBG_TAG "_cache_write", "all tests passed [z]"); |
| INKIOBufferDestroy(cache_vconn->bufp); |
| INKIOBufferDestroy(cache_vconn->out_bufp); |
| INKCacheKeyDestroy(cache_vconn->key); |
| INKfree(cache_vconn); |
| *SDK_Cache_pstatus = REGRESSION_TEST_PASSED; |
| |
| return 1; |
| } |
| |
| REGRESSION_TEST(SDK_API_INKCache) (RegressionTest * test, int atype, int *pstatus) |
| { |
| NOWARN_UNUSED(atype); |
| *pstatus = REGRESSION_TEST_INPROGRESS; |
| SDK_Cache_test = test; |
| SDK_Cache_pstatus = pstatus; |
| int is_ready = 0; |
| |
| // Check if Cache is ready |
| INKCacheReady(&is_ready); |
| if (!is_ready) { |
| SDK_RPRINT(test, "INKCacheReady", "TestCase1", TC_FAIL, "cache is not ready"); |
| |
| // no need to continue, return |
| *pstatus = REGRESSION_TEST_FAILED; |
| return; |
| } else { |
| SDK_RPRINT(test, "INKCacheReady", "TestCase1", TC_PASS, "ok"); |
| } |
| |
| // Create CacheKey |
| char key_name[] = "key_for_regression_test"; |
| INKCacheKey key, key_cmp; |
| INKCacheKeyCreate(&key); |
| INKCacheKeyCreate(&key_cmp); |
| if (key == NULL) { |
| SDK_RPRINT(test, "INKCacheKeyCreate", "TestCase1", TC_FAIL, "can't malloc memory for key"); |
| |
| // no need to continue, return |
| *pstatus = REGRESSION_TEST_FAILED; |
| if (key_cmp != NULL) |
| INKCacheKeyDestroy(key_cmp); |
| return; |
| } else { |
| SDK_RPRINT(test, "INKCacheKeyCreate", "TestCase1", TC_PASS, "ok"); |
| } |
| INKCacheKeyDigestSet(key, (unsigned char *) key_name, strlen(key_name)); |
| INKCacheKeyDigestSet(key_cmp, (unsigned char *) key_name, strlen(key_name)); |
| |
| if (memcmp(key, key_cmp, sizeof(INKCacheKey)) != 0) { |
| SDK_RPRINT(test, "INKCacheKeySetDigest", "TestCase1", TC_FAIL, "digest is wrong"); |
| |
| // no need to continue, return |
| *pstatus = REGRESSION_TEST_FAILED; |
| INKCacheKeyDestroy(key); |
| INKCacheKeyDestroy(key_cmp); |
| return; |
| } else { |
| SDK_RPRINT(test, "INKCacheKeySetDigest", "TestCase1", TC_PASS, "ok"); |
| INKCacheKeyDestroy(key_cmp); |
| } |
| |
| // prepare caching content |
| // string, null-terminated. |
| for (int i = 0; i < (OBJECT_SIZE - 1); i++) { |
| content[i] = 'a'; |
| } |
| content[OBJECT_SIZE - 1] = '\0'; |
| |
| //Write data to cache. |
| INKCont contp = INKContCreate(cache_handler, INKMutexCreate()); |
| CacheVConnStruct *cache_vconn = (CacheVConnStruct *) INKmalloc(sizeof(CacheVConnStruct)); |
| cache_vconn->key = key; |
| INKContDataSet(contp, cache_vconn); |
| |
| INKCacheWrite(contp, key); |
| } |
| |
| /* INKfopen */ |
| |
| ////////////////////////////////////////////// |
| // SDK_API_INKfopen |
| // |
| // Unit Test for API: INKfopen |
| // INKclose |
| // INKfflush |
| // INKfgets |
| // INKfread |
| // INKfwrite |
| ////////////////////////////////////////////// |
| |
| // Used to create tmp file |
| //#define TMP_DIR "/var/tmp" |
| #define PFX "plugin.config" |
| |
| REGRESSION_TEST(SDK_API_INKfopen) (RegressionTest * test, int atype, int *pstatus) |
| { |
| NOWARN_UNUSED(atype); |
| *pstatus = REGRESSION_TEST_INPROGRESS; |
| |
| char write_file_name[PATH_NAME_MAX + 1]; |
| |
| INKFile source_read_file; // existing file |
| INKFile write_file; // to be created |
| INKFile cmp_read_file; // read & compare |
| |
| char input_buffer[BUFSIZ]; |
| char cmp_buffer[BUFSIZ]; |
| struct stat stat_buffer_pre, stat_buffer_post, stat_buffer_input; |
| char *ret_val; |
| int error_counter = 0, read = 0, wrote = 0; |
| int64 read_amount = 0; |
| char INPUT_TEXT_FILE[] = "plugin.config"; |
| char input_file_full_path[BUFSIZ]; |
| |
| |
| |
| // Set full path to file at run time. |
| // TODO: This can never fail since we are |
| // returning the char[] |
| // Better check the dir itself. |
| // |
| if (INKInstallDirGet() == NULL) { |
| error_counter++; |
| *pstatus = REGRESSION_TEST_FAILED; |
| return; |
| } |
| // Add "etc/trafficserver" to point to config directory |
| ink_filepath_make(input_file_full_path, sizeof(input_file_full_path), |
| INKConfigDirGet(), INPUT_TEXT_FILE); |
| |
| // open existing file for reading |
| if (!(source_read_file = INKfopen(input_file_full_path, "r"))) { |
| SDK_RPRINT(test, "INKfopen", "TestCase1", TC_FAIL, "can't open file for reading"); |
| error_counter++; |
| |
| // no need to continue, return |
| *pstatus = REGRESSION_TEST_FAILED; |
| return; |
| } else |
| SDK_RPRINT(test, "INKfopen", "TestCase1", TC_PASS, "ok"); |
| |
| // Create unique tmp _file_name_, do not use any TS file_name |
| snprintf(write_file_name, PATH_NAME_MAX, "/tmp/%sXXXXXX", PFX); |
| int write_file_fd; // this file will be reopened below |
| if ((write_file_fd = mkstemp(write_file_name)) <= 0) { |
| SDK_RPRINT(test, "mkstemp", "std func", TC_FAIL, "can't create file for writing"); |
| error_counter++; |
| |
| // no need to continue, return |
| *pstatus = REGRESSION_TEST_FAILED; |
| if (source_read_file != NULL) |
| INKfclose(source_read_file); |
| return; |
| } |
| close(write_file_fd); |
| |
| // open file for writing, the file doesn't have to exist. |
| if (!(write_file = INKfopen(write_file_name, "w"))) { |
| SDK_RPRINT(test, "INKfopen", "TestCase2", TC_FAIL, "can't open file for writing"); |
| error_counter++; |
| |
| // no need to continue, return |
| *pstatus = REGRESSION_TEST_FAILED; |
| if (source_read_file != NULL) |
| INKfclose(source_read_file); |
| return; |
| } |
| SDK_RPRINT(test, "INKfopen", "TestCase2", TC_PASS, "ok"); |
| |
| memset(input_buffer, '\0', BUFSIZ); |
| |
| // source_read_file and input_file_full_path are the same file |
| if (stat(input_file_full_path, &stat_buffer_input) != 0) { |
| SDK_RPRINT(test, "stat", "std func", TC_FAIL, "source file and input file messed up"); |
| error_counter++; |
| |
| // no need to continue, return |
| *pstatus = REGRESSION_TEST_FAILED; |
| if (source_read_file != NULL) |
| INKfclose(source_read_file); |
| if (write_file != NULL) |
| INKfclose(write_file); |
| return; |
| } |
| |
| read_amount = (stat_buffer_input.st_size <= (off_t)sizeof(input_buffer)) ? |
| (stat_buffer_input.st_size) : (sizeof(input_buffer)); |
| |
| // INKfgets |
| if ((ret_val = INKfgets(source_read_file, input_buffer, read_amount)) |
| == NULL) { |
| SDK_RPRINT(test, "INKfgets", "TestCase1", TC_FAIL, "can't read from file"); |
| error_counter++; |
| |
| // no need to continue, return |
| *pstatus = REGRESSION_TEST_FAILED; |
| if (source_read_file != NULL) |
| INKfclose(source_read_file); |
| if (write_file != NULL) |
| INKfclose(write_file); |
| return; |
| } else { |
| if (ret_val != input_buffer) { |
| SDK_RPRINT(test, "INKfgets", "TestCase2", TC_FAIL, "reading error"); |
| error_counter++; |
| |
| // no need to continue, return |
| *pstatus = REGRESSION_TEST_FAILED; |
| if (source_read_file != NULL) |
| INKfclose(source_read_file); |
| if (write_file != NULL) |
| INKfclose(write_file); |
| return; |
| } else |
| SDK_RPRINT(test, "INKfgets", "TestCase1", TC_PASS, "ok"); |
| } |
| |
| // INKfwrite |
| wrote = INKfwrite(write_file, input_buffer, read_amount); |
| if (wrote != read_amount) { |
| SDK_RPRINT(test, "INKfwrite", "TestCase1", TC_FAIL, "writing error"); |
| error_counter++; |
| |
| // no need to continue, return |
| *pstatus = REGRESSION_TEST_FAILED; |
| if (source_read_file != NULL) |
| INKfclose(source_read_file); |
| if (write_file != NULL) |
| INKfclose(write_file); |
| return; |
| } |
| |
| SDK_RPRINT(test, "INKfwrite", "TestCase1", TC_PASS, "ok"); |
| |
| // INKfflush |
| if (stat(write_file_name, &stat_buffer_pre) != 0) { |
| SDK_RPRINT(test, "stat", "std func", TC_FAIL, "INKfwrite error"); |
| error_counter++; |
| |
| // no need to continue, return |
| *pstatus = REGRESSION_TEST_FAILED; |
| if (source_read_file != NULL) |
| INKfclose(source_read_file); |
| if (write_file != NULL) |
| INKfclose(write_file); |
| return; |
| } |
| |
| INKfflush(write_file); // write_file should point to write_file_name |
| |
| if (stat(write_file_name, &stat_buffer_post) != 0) { |
| SDK_RPRINT(test, "stat", "std func", TC_FAIL, "INKfflush error"); |
| error_counter++; |
| |
| // no need to continue, return |
| *pstatus = REGRESSION_TEST_FAILED; |
| if (source_read_file != NULL) |
| INKfclose(source_read_file); |
| if (write_file != NULL) |
| INKfclose(write_file); |
| return; |
| } |
| |
| if ((stat_buffer_pre.st_size == 0) && (stat_buffer_post.st_size == read_amount)) { |
| SDK_RPRINT(test, "INKfflush", "TestCase1", TC_PASS, "ok"); |
| } else { |
| SDK_RPRINT(test, "INKfflush", "TestCase1", TC_FAIL, "INKfflush error"); |
| error_counter++; |
| |
| // no need to continue, return |
| *pstatus = REGRESSION_TEST_FAILED; |
| if (source_read_file != NULL) |
| INKfclose(source_read_file); |
| if (write_file != NULL) |
| INKfclose(write_file); |
| return; |
| } |
| |
| // INKfread |
| // open again for reading |
| cmp_read_file = INKfopen(write_file_name, "r"); |
| if (cmp_read_file == NULL) { |
| SDK_RPRINT(test, "INKfopen", "TestCase3", TC_FAIL, "can't open file for reading"); |
| error_counter++; |
| |
| // no need to continue, return |
| *pstatus = REGRESSION_TEST_FAILED; |
| if (source_read_file != NULL) |
| INKfclose(source_read_file); |
| if (write_file != NULL) |
| INKfclose(write_file); |
| return; |
| } |
| |
| read_amount = (stat_buffer_input.st_size <= (off_t)sizeof(cmp_buffer)) ? (stat_buffer_input.st_size) : (sizeof(cmp_buffer)); |
| |
| // INKfread on read file |
| read = INKfread(cmp_read_file, cmp_buffer, read_amount); |
| if (read != read_amount) { |
| SDK_RPRINT(test, "INKfread", "TestCase1", TC_FAIL, "can't reading"); |
| error_counter++; |
| |
| // no need to continue, return |
| *pstatus = REGRESSION_TEST_FAILED; |
| if (source_read_file != NULL) |
| INKfclose(source_read_file); |
| if (write_file != NULL) |
| INKfclose(write_file); |
| if (cmp_read_file != NULL) |
| INKfclose(cmp_read_file); |
| return; |
| } else |
| SDK_RPRINT(test, "INKfread", "TestCase1", TC_PASS, "ok"); |
| |
| // compare input_buffer and cmp_buffer buffers |
| if (memcmp(input_buffer, cmp_buffer, read_amount) != 0) { |
| SDK_RPRINT(test, "INKfread", "TestCase2", TC_FAIL, "reading error"); |
| error_counter++; |
| |
| // no need to continue, return |
| *pstatus = REGRESSION_TEST_FAILED; |
| if (source_read_file != NULL) |
| INKfclose(source_read_file); |
| if (write_file != NULL) |
| INKfclose(write_file); |
| if (cmp_read_file != NULL) |
| INKfclose(cmp_read_file); |
| return; |
| } else |
| SDK_RPRINT(test, "INKfread", "TestCase2", TC_PASS, "ok"); |
| |
| // remove the tmp file |
| if (unlink(write_file_name) != 0) { |
| SDK_RPRINT(test, "unlink", "std func", TC_FAIL, "can't remove temp file"); |
| } |
| // INKfclose on read file |
| INKfclose(source_read_file); |
| SDK_RPRINT(test, "INKfclose", "TestCase1", TC_PASS, "ok"); |
| |
| // INKfclose on write file |
| INKfclose(write_file); |
| SDK_RPRINT(test, "INKfclose", "TestCase2", TC_PASS, "ok"); |
| |
| if (error_counter == 0) { |
| *pstatus = REGRESSION_TEST_PASSED; |
| } else { |
| *pstatus = REGRESSION_TEST_FAILED; |
| } |
| if (cmp_read_file != NULL) |
| INKfclose(cmp_read_file); |
| } |
| |
| /* INKThread */ |
| |
| ////////////////////////////////////////////// |
| // SDK_API_INKThread |
| // |
| // Unit Test for API: INKThread |
| // INKThreadCreate |
| // INKThreadSelf |
| ////////////////////////////////////////////// |
| static int thread_err_count = 0; |
| static RegressionTest *SDK_Thread_test; |
| static int *SDK_Thread_pstatus; |
| static void *thread_create_handler(void *arg); |
| |
| static void * |
| thread_create_handler(void *arg) |
| { |
| NOWARN_UNUSED(arg); |
| INKThread INKthread; |
| //Fix me: do more useful work |
| sleep(10); |
| |
| INKthread = INKThreadSelf(); |
| if (INKthread == 0) { |
| thread_err_count++; |
| SDK_RPRINT(SDK_Thread_test, "INKThreadCreate", "TestCase2", TC_FAIL, "can't get thread"); |
| } else { |
| SDK_RPRINT(SDK_Thread_test, "INKThreadCreate", "TestCase2", TC_PASS, "ok"); |
| } |
| |
| if (thread_err_count > 0) |
| *SDK_Thread_pstatus = REGRESSION_TEST_FAILED; |
| else |
| *SDK_Thread_pstatus = REGRESSION_TEST_PASSED; |
| |
| return NULL; |
| } |
| |
| // Fix me: Solaris threads/Win2K threads tests |
| |
| // Argument data passed to thread init functions |
| // cannot be allocated on the stack. |
| |
| REGRESSION_TEST(SDK_API_INKThread) (RegressionTest * test, int atype, int *pstatus) |
| { |
| NOWARN_UNUSED(atype); |
| *pstatus = REGRESSION_TEST_INPROGRESS; |
| SDK_Thread_test = test; |
| SDK_Thread_pstatus = pstatus; |
| |
| INKThread curr_thread = 0; |
| // INKThread created_thread = 0; |
| pthread_t curr_tid; |
| |
| curr_tid = pthread_self(); |
| |
| // INKThreadSelf |
| curr_thread = INKThreadSelf(); |
| if (curr_thread == 0) { |
| SDK_RPRINT(test, "INKThreadSelf", "TestCase1", TC_FAIL, "can't get the current thread"); |
| thread_err_count++; |
| } else { |
| SDK_RPRINT(test, "INKThreadSelf", "TestCase1", TC_PASS, "ok"); |
| } |
| |
| // INKThreadCreate |
| INKThread created_thread = INKThreadCreate(thread_create_handler, (void *) curr_tid); |
| if (created_thread == NULL) { |
| thread_err_count++; |
| SDK_RPRINT(test, "INKThreadCreate", "TestCase1", TC_FAIL, "can't create thread"); |
| } else { |
| SDK_RPRINT(test, "INKThreadCreate", "TestCase1", TC_PASS, "ok"); |
| } |
| } |
| |
| |
| ////////////////////////////////////////////// |
| // SDK_API_INKThread |
| // |
| // Unit Test for API: INKThreadInit |
| // INKThreadDestroy |
| ////////////////////////////////////////////// |
| static int thread_init_err_count = 0; |
| static RegressionTest *SDK_ThreadInit_test; |
| static int *SDK_ThreadInit_pstatus; |
| static void *pthread_start_func(void *arg); |
| |
| static void * |
| pthread_start_func(void *arg) |
| { |
| NOWARN_UNUSED(arg); |
| INKThread temp_thread = 0; |
| |
| // INKThreadInit |
| temp_thread = INKThreadInit(); |
| |
| if (!temp_thread) { |
| SDK_RPRINT(SDK_ThreadInit_test, "INKThreadInit", "TestCase2", TC_FAIL, "can't init thread"); |
| thread_init_err_count++; |
| } else |
| SDK_RPRINT(SDK_ThreadInit_test, "INKThreadInit", "TestCase2", TC_PASS, "ok"); |
| |
| // Clean up this thread |
| if (temp_thread) |
| INKThreadDestroy(temp_thread); |
| |
| if (thread_init_err_count > 0) |
| *SDK_ThreadInit_pstatus = REGRESSION_TEST_FAILED; |
| else |
| *SDK_ThreadInit_pstatus = REGRESSION_TEST_PASSED; |
| |
| return NULL; |
| } |
| |
| REGRESSION_TEST(SDK_API_INKThreadInit) (RegressionTest * test, int atype, int *pstatus) |
| { |
| NOWARN_UNUSED(atype); |
| *pstatus = REGRESSION_TEST_INPROGRESS; |
| SDK_ThreadInit_test = test; |
| SDK_ThreadInit_pstatus = pstatus; |
| |
| pthread_t curr_tid, new_tid; |
| |
| curr_tid = pthread_self(); |
| |
| int ret; |
| errno = 0; |
| ret = pthread_create(&new_tid, NULL, pthread_start_func, (void *) curr_tid); |
| if (ret != 0) { |
| thread_init_err_count++; |
| SDK_RPRINT(test, "INKThreadInit", "TestCase1", TC_FAIL, "can't create pthread"); |
| } else |
| SDK_RPRINT(test, "INKThreadInit", "TestCase1", TC_PASS, "ok"); |
| |
| } |
| |
| /* Action */ |
| |
| ////////////////////////////////////////////// |
| // SDK_API_INKAction |
| // |
| // Unit Test for API: INKActionCancel |
| ////////////////////////////////////////////// |
| |
| static RegressionTest *SDK_ActionCancel_test; |
| static int *SDK_ActionCancel_pstatus; |
| |
| int |
| action_cancel_handler(INKCont contp, INKEvent event, void *edata) |
| { |
| NOWARN_UNUSED(edata); |
| if (event == INK_EVENT_IMMEDIATE) // called from schedule_imm OK |
| { |
| SDK_RPRINT(SDK_ActionCancel_test, "INKActionCancel", "TestCase1", TC_PASS, "ok"); |
| *SDK_ActionCancel_pstatus = REGRESSION_TEST_PASSED; |
| } else if (event == INK_EVENT_TIMEOUT) //called from schedule_in Not OK. |
| { |
| SDK_RPRINT(SDK_ActionCancel_test, "INKActionCancel", "TestCase1", TC_FAIL, "bad action"); |
| *SDK_ActionCancel_pstatus = REGRESSION_TEST_FAILED; |
| } else // there is sth wrong |
| { |
| SDK_RPRINT(SDK_ActionCancel_test, "INKActionCancel", "TestCase1", TC_FAIL, "bad event"); |
| *SDK_ActionCancel_pstatus = REGRESSION_TEST_FAILED; |
| } |
| |
| INKContDestroy(contp); |
| return 0; |
| } |
| |
| REGRESSION_TEST(SDK_API_INKActionCancel) (RegressionTest * test, int atype, int *pstatus) |
| { |
| NOWARN_UNUSED(atype); |
| *pstatus = REGRESSION_TEST_INPROGRESS; |
| |
| SDK_ActionCancel_test = test; |
| SDK_ActionCancel_pstatus = pstatus; |
| |
| INKMutex cont_mutex = INKMutexCreate(); |
| INKCont contp = INKContCreate(action_cancel_handler, cont_mutex); |
| INKAction actionp = INKContSchedule(contp, 10000); |
| |
| INKMutexLock(cont_mutex); |
| if (INKActionDone(actionp)) { |
| *pstatus = REGRESSION_TEST_FAILED; |
| INKMutexUnlock(cont_mutex); |
| return; |
| } else { |
| INKActionCancel(actionp); |
| } |
| INKMutexUnlock(cont_mutex); |
| |
| INKContSchedule(contp, 0); |
| } |
| |
| ////////////////////////////////////////////// |
| // SDK_API_INKAction |
| // |
| // Unit Test for API: INKActionDone |
| ////////////////////////////////////////////// |
| /* Currently, don't know how to test it because INKAction |
| is at "done" status only "shortly" after finish |
| executing action_done_handler. Another possibility is |
| to use reentrant call. But in both cases it's not |
| guaranteed to get ActionDone. |
| */ |
| |
| /* Continuations */ |
| |
| ////////////////////////////////////////////// |
| // SDK_API_INKCont |
| // |
| // Unit Test for API: INKContCreate |
| // INKContCall |
| ////////////////////////////////////////////// |
| |
| // this is needed for asynchronous APIs |
| static RegressionTest *SDK_ContCreate_test; |
| static int *SDK_ContCreate_pstatus; |
| |
| int |
| cont_handler(INKCont contp, INKEvent event, void *edata) |
| { |
| NOWARN_UNUSED(contp); |
| NOWARN_UNUSED(event); |
| NOWARN_UNUSED(edata); |
| SDK_RPRINT(SDK_ContCreate_test, "INKContCreate", "TestCase1", TC_PASS, "ok"); |
| SDK_RPRINT(SDK_ContCreate_test, "INKContCall", "TestCase1", TC_PASS, "ok"); |
| |
| *SDK_ContCreate_pstatus = REGRESSION_TEST_PASSED; |
| |
| return 0; |
| } |
| |
| |
| REGRESSION_TEST(SDK_API_INKContCreate) (RegressionTest * test, int atype, int *pstatus) |
| { |
| NOWARN_UNUSED(atype); |
| *pstatus = REGRESSION_TEST_INPROGRESS; |
| |
| // For asynchronous APIs, use static vars to store test and pstatus |
| SDK_ContCreate_test = test; |
| SDK_ContCreate_pstatus = pstatus; |
| |
| INKMutex mutexp = INKMutexCreate(); |
| INKCont contp = INKContCreate(cont_handler, mutexp); |
| int lock = 0; |
| |
| INKMutexLockTry(mutexp, &lock); |
| if (lock) //mutex is grabbed |
| { |
| INKContCall(contp, (INKEvent) 0, NULL); |
| INKMutexUnlock(mutexp); |
| } else //mutex has problems |
| { |
| |
| SDK_RPRINT(SDK_ContCreate_test, "INKContCreate", "TestCase1", TC_FAIL, "continuation creation has problems"); |
| SDK_RPRINT(SDK_ContCreate_test, "INKContCall", "TestCase1", TC_FAIL, "continuation has problems"); |
| |
| *pstatus = REGRESSION_TEST_FAILED; |
| } |
| |
| INKContDestroy(contp); |
| } |
| |
| |
| ////////////////////////////////////////////// |
| // SDK_API_INKCont |
| // |
| // Unit Test for API: INKContDataGet |
| // INKContDataSet |
| ////////////////////////////////////////////// |
| |
| // this is needed for asynchronous APIs |
| static RegressionTest *SDK_ContData_test; |
| static int *SDK_ContData_pstatus; |
| |
| // this is specific for this test |
| typedef struct |
| { |
| int data1; |
| int data2; |
| } MyData; |
| |
| int |
| cont_data_handler(INKCont contp, INKEvent event, void *edata) |
| { |
| NOWARN_UNUSED(event); |
| NOWARN_UNUSED(edata); |
| MyData *my_data = (MyData *) INKContDataGet(contp); |
| |
| if (my_data->data1 == 1 && my_data->data2 == 2) { |
| SDK_RPRINT(SDK_ContData_test, "INKContDataSet", "TestCase1", TC_PASS, "ok"); |
| SDK_RPRINT(SDK_ContData_test, "INKContDataGet", "TestCase1", TC_PASS, "ok"); |
| |
| *SDK_ContData_pstatus = REGRESSION_TEST_PASSED; |
| } else { |
| // If we get bad data, it's a failure |
| SDK_RPRINT(SDK_ContData_test, "INKContDataSet", "TestCase1", TC_FAIL, "bad data"); |
| SDK_RPRINT(SDK_ContData_test, "INKContDataGet", "TestCase1", TC_FAIL, "bad data"); |
| |
| *SDK_ContData_pstatus = REGRESSION_TEST_FAILED; |
| } |
| |
| INKfree(my_data); |
| INKContDestroy(contp); |
| return 0; |
| } |
| |
| |
| REGRESSION_TEST(SDK_API_INKContDataGet) (RegressionTest * test, int atype, int *pstatus) |
| { |
| NOWARN_UNUSED(atype); |
| *pstatus = REGRESSION_TEST_INPROGRESS; |
| |
| // For asynchronous APIs, use static vars to store test and pstatus |
| SDK_ContData_test = test; |
| SDK_ContData_pstatus = pstatus; |
| |
| INKCont contp = INKContCreate(cont_data_handler, INKMutexCreate()); |
| |
| MyData *my_data = (MyData *) INKmalloc(sizeof(MyData)); |
| my_data->data1 = 1; |
| my_data->data2 = 2; |
| |
| INKContDataSet(contp, (void *) my_data); |
| |
| INKContSchedule(contp, 0); |
| } |
| |
| |
| |
| ////////////////////////////////////////////// |
| // SDK_API_INKCont |
| // |
| // Unit Test for API: INKContMutexGet |
| ////////////////////////////////////////////// |
| |
| REGRESSION_TEST(SDK_API_INKContMutexGet) (RegressionTest * test, int atype, int *pstatus) |
| { |
| NOWARN_UNUSED(atype); |
| bool test_passed = false; |
| *pstatus = REGRESSION_TEST_INPROGRESS; |
| |
| INKMutex mutexp_input; |
| INKMutex mutexp_output; |
| INKCont contp; |
| |
| mutexp_input = INKMutexCreate(); |
| contp = INKContCreate(cont_handler, mutexp_input); |
| |
| mutexp_output = INKContMutexGet(contp); |
| |
| if (mutexp_input == mutexp_output) { |
| SDK_RPRINT(test, "INKContMutexGet", "TestCase1", TC_PASS, "ok"); |
| test_passed = true; |
| } else |
| SDK_RPRINT(test, "INKContMutexGet", "TestCase1", TC_FAIL, "Continutation's mutex corrupted"); |
| |
| // Status of the whole test |
| *pstatus = ((test_passed == true) ? REGRESSION_TEST_PASSED : REGRESSION_TEST_FAILED); |
| |
| INKContDestroy(contp); |
| |
| } |
| |
| ////////////////////////////////////////////// |
| // SDK_API_INKCont |
| // |
| // Unit Test for API: INKContSchedule |
| ////////////////////////////////////////////// |
| |
| // this is needed for asynchronous APIs |
| static RegressionTest *SDK_ContSchedule_test; |
| static int *SDK_ContSchedule_pstatus; |
| |
| // this is specific for this test |
| static int tc1_count = 0; |
| static int tc2_count = 0; |
| |
| int |
| cont_schedule_handler(INKCont contp, INKEvent event, void *edata) |
| { |
| NOWARN_UNUSED(edata); |
| if (event == INK_EVENT_IMMEDIATE) { |
| // Test Case 1 |
| SDK_RPRINT(SDK_ContSchedule_test, "INKContSchedule", "TestCase1", TC_PASS, "ok"); |
| tc1_count++; |
| } else if (event == INK_EVENT_TIMEOUT) { |
| // Test Case 2 |
| SDK_RPRINT(SDK_ContSchedule_test, "INKContSchedule", "TestCase2", TC_PASS, "ok"); |
| tc2_count++; |
| } else { |
| // If we receive a bad event, it's a failure |
| SDK_RPRINT(SDK_ContSchedule_test, "INKContSchedule", "TestCase1|2", |
| TC_FAIL, "received unexpected event number %d", event); |
| *SDK_ContSchedule_pstatus = REGRESSION_TEST_FAILED; |
| return 0; |
| } |
| |
| // We expect to be called once for TC1 and once for TC2 |
| if ((tc1_count == 1) && (tc2_count == 1)) { |
| *SDK_ContSchedule_pstatus = REGRESSION_TEST_PASSED; |
| } |
| // If TC1 or TC2 executed more than once, something is fishy.. |
| else if (tc1_count + tc2_count >= 2) { |
| *SDK_ContSchedule_pstatus = REGRESSION_TEST_FAILED; |
| } |
| |
| INKContDestroy(contp); |
| return 0; |
| } |
| |
| /* Mutex */ |
| |
| /* |
| Fix me: test for grabbing the mutex from two |
| different threads. |
| */ |
| |
| ////////////////////////////////////////////// |
| // SDK_API_INKMutex |
| // |
| // Unit Test for API: INKMutexCreate |
| // INKMutexLock |
| // INKMutexTryLock |
| // INKMutexUnLock |
| ////////////////////////////////////////////// |
| |
| REGRESSION_TEST(SDK_API_INKMutexCreate) (RegressionTest * test, int atype, int *pstatus) |
| { |
| NOWARN_UNUSED(atype); |
| bool test_passed = false; |
| *pstatus = REGRESSION_TEST_INPROGRESS; |
| |
| INKMutex mutexp = INKMutexCreate(); |
| |
| INKMutexLock(mutexp); |
| |
| /* This is normal because all locking is from the same thread */ |
| int lock = 0; |
| |
| INKMutexLockTry(mutexp, &lock); |
| INKMutexLockTry(mutexp, &lock); |
| |
| if (lock) { |
| SDK_RPRINT(test, "INKMutexCreate", "TestCase1", TC_PASS, "ok"); |
| SDK_RPRINT(test, "INKMutexLock", "TestCase1", TC_PASS, "ok"); |
| SDK_RPRINT(test, "INKMutexLockTry", "TestCase1", TC_PASS, "ok"); |
| test_passed = true; |
| } else { |
| SDK_RPRINT(test, "INKMutexCreate", "TestCase1", TC_FAIL, "mutex can't be grabbed twice from the same thread"); |
| SDK_RPRINT(test, "INKMutexLock", "TestCase1", TC_FAIL, "mutex can't be grabbed twice from the same thread"); |
| SDK_RPRINT(test, "INKMutexLockTry", "TestCase1", TC_FAIL, "mutex can't be grabbed twice from the same thread"); |
| |
| } |
| |
| INKMutexUnlock(mutexp); |
| SDK_RPRINT(test, "INKMutexUnLock", "TestCase1", TC_PASS, "ok"); |
| |
| if (test_passed) { |
| *pstatus = REGRESSION_TEST_PASSED; |
| } else { |
| *pstatus = REGRESSION_TEST_FAILED; |
| } |
| |
| } |
| |
| /* IOBuffer */ |
| |
| ////////////////////////////////////////////// |
| // SDK_API_INKIOBuffer |
| // |
| // Unit Test for API: INKIOBufferCreate |
| // INKIOBufferWaterMarkGet |
| // INKIOBufferWaterMarkSet |
| ////////////////////////////////////////////// |
| |
| REGRESSION_TEST(SDK_API_INKIOBufferCreate) (RegressionTest * test, int atype, int *pstatus) |
| { |
| NOWARN_UNUSED(atype); |
| bool test_passed = false; |
| *pstatus = REGRESSION_TEST_INPROGRESS; |
| |
| int64 watermark = 1000; |
| |
| INKIOBuffer bufp = INKIOBufferCreate(); |
| |
| INKIOBufferWaterMarkSet(bufp, watermark); |
| |
| watermark = 0; |
| INKIOBufferWaterMarkGet(bufp, &watermark); |
| |
| if (watermark == 1000) { |
| SDK_RPRINT(test, "INKIOBufferCreate", "TestCase1", TC_PASS, "ok"); |
| SDK_RPRINT(test, "INKIOBufferWaterMarkGet", "TestCase1", TC_PASS, "ok"); |
| SDK_RPRINT(test, "INKIOBufferWaterMarkSet", "TestCase1", TC_PASS, "ok"); |
| test_passed = true; |
| } else { |
| SDK_RPRINT(test, "INKIOBufferCreate", "TestCase1", TC_FAIL, "watermark failed"); |
| SDK_RPRINT(test, "INKIOBufferWaterMarkGet", "TestCase1", TC_FAIL, "watermark failed"); |
| SDK_RPRINT(test, "INKIOBufferWaterMarkSet", "TestCase1", TC_FAIL, "watermark failed"); |
| } |
| |
| INKIOBufferDestroy(bufp); |
| |
| // Status of the whole test |
| *pstatus = ((test_passed == true) ? REGRESSION_TEST_PASSED : REGRESSION_TEST_FAILED); |
| return; |
| |
| } |
| |
| |
| ////////////////////////////////////////////// |
| // SDK_API_INKIOBuffer |
| // |
| // Unit Test for API: INKIOBufferSizedCreate |
| // INKIOBufferProduce |
| // INKIOBufferReaderAlloc |
| // INKIOBufferReaderAvail |
| ////////////////////////////////////////////// |
| |
| REGRESSION_TEST(SDK_API_INKIOBufferProduce) (RegressionTest * test, int atype, int *pstatus) |
| { |
| NOWARN_UNUSED(atype); |
| bool test_passed = false; |
| *pstatus = REGRESSION_TEST_INPROGRESS; |
| |
| INKIOBuffer bufp = INKIOBufferSizedCreate(INK_IOBUFFER_SIZE_INDEX_4K); //size is 4096 |
| |
| INKIOBufferReader readerp = INKIOBufferReaderAlloc(bufp); |
| |
| INKIOBufferProduce(bufp, 10); |
| |
| int reader_avail = INKIOBufferReaderAvail(readerp); |
| if (reader_avail == 10) { |
| SDK_RPRINT(test, "INKIOBufferProduce", "TestCase1", TC_PASS, "ok"); |
| SDK_RPRINT(test, "INKIOBufferReaderAlloc", "TestCase1", TC_PASS, "ok"); |
| SDK_RPRINT(test, "INKIOBufferReaderAvail", "TestCase1", TC_PASS, "ok"); |
| test_passed = true; |
| } else { |
| SDK_RPRINT(test, "INKIOBufferProduce", "TestCase1", TC_FAIL, "failed"); |
| SDK_RPRINT(test, "INKIOBufferReaderAlloc", "TestCase1", TC_FAIL, "failed"); |
| SDK_RPRINT(test, "INKIOBufferReaderAvail", "TestCase1", TC_FAIL, "failed"); |
| } |
| |
| // Status of the whole test |
| *pstatus = ((test_passed == true) ? REGRESSION_TEST_PASSED : REGRESSION_TEST_FAILED); |
| return; |
| } |
| |
| |
| ////////////////////////////////////////////// |
| // SDK_API_INKIOBuffer |
| // |
| // Unit Test for API: INKIOBufferReaderConsume |
| ////////////////////////////////////////////// |
| |
| REGRESSION_TEST(SDK_API_INKIOBufferReaderConsume) (RegressionTest * test, int atype, int *pstatus) |
| { |
| NOWARN_UNUSED(atype); |
| bool test_passed = false; |
| *pstatus = REGRESSION_TEST_INPROGRESS; |
| |
| INKIOBuffer bufp = INKIOBufferSizedCreate(INK_IOBUFFER_SIZE_INDEX_4K); |
| |
| INKIOBufferReader readerp = INKIOBufferReaderAlloc(bufp); |
| |
| INKIOBufferProduce(bufp, 10); |
| INKIOBufferReaderConsume(readerp, 10); |
| |
| int reader_avail = INKIOBufferReaderAvail(readerp); |
| if (reader_avail == 0) { |
| SDK_RPRINT(test, "INKIOBufferReaderConsume", "TestCase1", TC_PASS, "ok"); |
| test_passed = true; |
| } else { |
| SDK_RPRINT(test, "INKIOBufferReaderConsume", "TestCase1", TC_FAIL, "failed"); |
| } |
| |
| // Status of the whole test |
| *pstatus = ((test_passed == true) ? REGRESSION_TEST_PASSED : REGRESSION_TEST_FAILED); |
| return; |
| } |
| |
| ////////////////////////////////////////////// |
| // SDK_API_INKIOBuffer |
| // |
| // Unit Test for API: INKIOBufferReaderClone |
| ////////////////////////////////////////////// |
| |
| REGRESSION_TEST(SDK_API_INKIOBufferReaderClone) (RegressionTest * test, int atype, int *pstatus) |
| { |
| NOWARN_UNUSED(atype); |
| bool test_passed = false; |
| *pstatus = REGRESSION_TEST_INPROGRESS; |
| |
| INKIOBuffer bufp = INKIOBufferSizedCreate(INK_IOBUFFER_SIZE_INDEX_4K); |
| |
| INKIOBufferReader readerp = INKIOBufferReaderAlloc(bufp); |
| |
| INKIOBufferProduce(bufp, 10); |
| INKIOBufferReaderConsume(readerp, 5); |
| |
| INKIOBufferReader readerp2 = INKIOBufferReaderClone(readerp); |
| |
| int reader_avail = INKIOBufferReaderAvail(readerp2); |
| if (reader_avail == 5) { |
| SDK_RPRINT(test, "INKIOBufferReaderClone", "TestCase1", TC_PASS, "ok"); |
| test_passed = true; |
| } else { |
| SDK_RPRINT(test, "INKIOBufferReaderClone", "TestCase1", TC_FAIL, "failed"); |
| } |
| |
| // Status of the whole test |
| *pstatus = ((test_passed == true) ? REGRESSION_TEST_PASSED : REGRESSION_TEST_FAILED); |
| return; |
| } |
| |
| ////////////////////////////////////////////// |
| // SDK_API_INKIOBuffer |
| // |
| // Unit Test for API: INKIOBufferStart |
| // INKIOBufferReaderStart |
| ////////////////////////////////////////////// |
| |
| REGRESSION_TEST(SDK_API_INKIOBufferStart) (RegressionTest * test, int atype, int *pstatus) |
| { |
| NOWARN_UNUSED(atype); |
| bool test_passed = false; |
| *pstatus = REGRESSION_TEST_INPROGRESS; |
| |
| INKIOBuffer bufp = INKIOBufferSizedCreate(INK_IOBUFFER_SIZE_INDEX_4K); |
| |
| INKIOBufferReader readerp = INKIOBufferReaderAlloc(bufp); |
| |
| if (INKIOBufferStart(bufp) == INKIOBufferReaderStart(readerp)) { |
| SDK_RPRINT(test, "INKIOBufferStart", "TestCase1", TC_PASS, "ok"); |
| SDK_RPRINT(test, "INKIOBufferReaderStart", "TestCase1", TC_PASS, "ok"); |
| test_passed = true; |
| } else { |
| SDK_RPRINT(test, "INKIOBufferStart", "TestCase1", TC_FAIL, "failed"); |
| SDK_RPRINT(test, "INKIOBufferReaderStart", "TestCase1", TC_FAIL, "failed"); |
| } |
| |
| // Status of the whole test |
| *pstatus = ((test_passed == true) ? REGRESSION_TEST_PASSED : REGRESSION_TEST_FAILED); |
| return; |
| } |
| |
| |
| ////////////////////////////////////////////// |
| // SDK_API_INKIOBuffer |
| // |
| // Unit Test for API: INKIOBufferCopy |
| // INKIOBufferWrite |
| // INKIOBufferReaderCopy |
| ////////////////////////////////////////////// |
| |
| REGRESSION_TEST(SDK_API_INKIOBufferCopy) (RegressionTest * test, int atype, int *pstatus) |
| { |
| NOWARN_UNUSED(atype); |
| bool test_passed = false; |
| *pstatus = REGRESSION_TEST_INPROGRESS; |
| |
| char input_buf[] = "This is the test for INKIOBufferCopy, INKIOBufferWrite, INKIOBufferReaderCopy"; |
| char output_buf[1024]; |
| INKIOBuffer bufp = INKIOBufferSizedCreate(INK_IOBUFFER_SIZE_INDEX_4K); |
| INKIOBuffer bufp2 = INKIOBufferSizedCreate(INK_IOBUFFER_SIZE_INDEX_4K); |
| |
| INKIOBufferReader readerp = INKIOBufferReaderAlloc(bufp); |
| INKIOBufferWrite(bufp, input_buf, (strlen(input_buf) + 1)); |
| INKIOBufferCopy(bufp2, readerp, (strlen(input_buf) + 1), 0); |
| INKIOBufferReaderCopy(readerp, output_buf, (strlen(input_buf) + 1)); |
| |
| if (strcmp(input_buf, output_buf) == 0) { |
| SDK_RPRINT(test, "INKIOBufferWrite", "TestCase1", TC_PASS, "ok"); |
| SDK_RPRINT(test, "INKIOBufferCopy", "TestCase1", TC_PASS, "ok"); |
| SDK_RPRINT(test, "INKIOBufferReaderCopy", "TestCase1", TC_PASS, "ok"); |
| test_passed = true; |
| } else { |
| SDK_RPRINT(test, "INKIOBufferWrite", "TestCase1", TC_FAIL, "failed"); |
| SDK_RPRINT(test, "INKIOBufferCopy", "TestCase1", TC_FAIL, "failed"); |
| SDK_RPRINT(test, "INKIOBufferReaderCopy", "TestCase1", TC_FAIL, "failed"); |
| } |
| |
| // Status of the whole test |
| *pstatus = ((test_passed == true) ? REGRESSION_TEST_PASSED : REGRESSION_TEST_FAILED); |
| return; |
| } |
| |
| ////////////////////////////////////////////// |
| // SDK_API_INKIOBuffer |
| // |
| // Unit Test for API: INKIOBuffer |
| // INKIOBufferWrite |
| // INKIOBufferReaderCopy |
| ////////////////////////////////////////////// |
| |
| REGRESSION_TEST(SDK_API_INKIOBufferBlockReadAvail) (RegressionTest * test, int atype, int *pstatus) |
| { |
| NOWARN_UNUSED(atype); |
| bool test_passed_1 = false; |
| bool test_passed_2 = false; |
| *pstatus = REGRESSION_TEST_INPROGRESS; |
| |
| int i = 10000; |
| INKIOBuffer bufp = INKIOBufferCreate(); |
| INKIOBufferWrite(bufp, (char*)&i, sizeof(int)); |
| INKIOBufferReader readerp = INKIOBufferReaderAlloc(bufp); |
| |
| int64 avail_write, avail_read; |
| |
| // TODO: This is probably not correct any more. |
| INKIOBufferBlock blockp = INKIOBufferStart(bufp); |
| |
| if ((INKIOBufferBlockWriteStart(blockp, &avail_write) - INKIOBufferBlockReadStart(blockp, readerp, &avail_read)) == |
| sizeof(int)) { |
| SDK_RPRINT(test, "INKIOBufferBlockReadStart", "TestCase1", TC_PASS, "ok"); |
| SDK_RPRINT(test, "INKIOBufferBlockWriteStart", "TestCase1", TC_PASS, "ok"); |
| test_passed_1 = true; |
| } else { |
| SDK_RPRINT(test, "INKIOBufferBlockReadStart", "TestCase1", TC_FAIL, "failed"); |
| SDK_RPRINT(test, "INKIOBufferBlockWriteStart", "TestCase1", TC_FAIL, "failed"); |
| } |
| |
| if ((INKIOBufferBlockReadAvail(blockp, readerp) + INKIOBufferBlockWriteAvail(blockp)) == 4096) { |
| SDK_RPRINT(test, "INKIOBufferBlockReadAvail", "TestCase1", TC_PASS, "ok"); |
| SDK_RPRINT(test, "INKIOBufferBlockWriteAvail", "TestCase1", TC_PASS, "ok"); |
| test_passed_2 = true; |
| } else { |
| SDK_RPRINT(test, "INKIOBufferBlockReadAvail", "TestCase1", TC_FAIL, "failed"); |
| SDK_RPRINT(test, "INKIOBufferBlockWriteAvail", "TestCase1", TC_FAIL, "failed"); |
| } |
| |
| if (test_passed_1 && test_passed_2) { |
| *pstatus = REGRESSION_TEST_PASSED; |
| } else { |
| *pstatus = REGRESSION_TEST_FAILED; |
| } |
| |
| return; |
| } |
| |
| ////////////////////////////////////////////////// |
| // SDK_API_INKIOBuffer |
| // |
| // Unit Test for API: INKIOBufferBlockNext |
| ////////////////////////////////////////////////// |
| |
| REGRESSION_TEST(SDK_API_INKIOBufferBlockNext) (RegressionTest * test, int atype, int *pstatus) |
| { |
| NOWARN_UNUSED(atype); |
| bool test_passed = false; |
| *pstatus = REGRESSION_TEST_INPROGRESS; |
| |
| int i = 10000; |
| INKIOBuffer bufp = INKIOBufferCreate(); |
| INKIOBufferWrite(bufp, (char*)&i, sizeof(int)); |
| |
| INKIOBufferReader readerp = INKIOBufferReaderAlloc(bufp); |
| INKIOBufferBlock blockp = INKIOBufferReaderStart(readerp); |
| |
| // TODO: This is probaby not the best of regression tests right now ... |
| // Note that this assumes block size is > sizeof(int) bytes. |
| if (INKIOBufferBlockNext(blockp) == NULL) { |
| SDK_RPRINT(test, "INKIOBufferBlockNext", "TestCase1", TC_PASS, "ok"); |
| test_passed = true; |
| } else { |
| SDK_RPRINT(test, "INKIOBufferBlockNext", "TestCase1", TC_FAIL, "fail"); |
| } |
| |
| if (test_passed) { |
| *pstatus = REGRESSION_TEST_PASSED; |
| } else { |
| *pstatus = REGRESSION_TEST_FAILED; |
| } |
| |
| return; |
| } |
| |
| |
| |
| /* Stats */ |
| |
| ////////////////////////////////////////////// |
| // SDK_API_INKStat |
| // |
| // Unit Test for API: INKStatCreate |
| // INKStatIntSet |
| // INKStatIntRead |
| ////////////////////////////////////////////// |
| |
| REGRESSION_TEST(SDK_API_INKStatIntSet) (RegressionTest * test, int atype, int *pstatus) |
| { |
| NOWARN_UNUSED(atype); |
| bool test_passed = false; |
| *pstatus = REGRESSION_TEST_INPROGRESS; |
| |
| INKStat stat = INKStatCreate("stat_is", INKSTAT_TYPE_INT64); |
| |
| INKStatIntSet(stat, 100); |
| int64 stat_val; |
| |
| INKStatIntGet(stat, &stat_val); |
| |
| if (stat_val == 100) { |
| SDK_RPRINT(test, "INKStatIntSet", "TestCase1", TC_PASS, "ok"); |
| test_passed = true; |
| } else { |
| SDK_RPRINT(test, "INKStatIntSet", "TestCase1", TC_FAIL, "can't set to correct integer value"); |
| } |
| |
| // Status of the whole test |
| *pstatus = ((test_passed == true) ? REGRESSION_TEST_PASSED : REGRESSION_TEST_FAILED); |
| |
| } |
| |
| ////////////////////////////////////////////// |
| // SDK_API_INKStat |
| // |
| // Unit Test for API: INKStatIntAddTo |
| ////////////////////////////////////////////// |
| |
| REGRESSION_TEST(SDK_API_INKStatIntAddTo) (RegressionTest * test, int atype, int *pstatus) |
| { |
| NOWARN_UNUSED(atype); |
| bool test_passed = false; |
| *pstatus = REGRESSION_TEST_INPROGRESS; |
| |
| INKStat stat = INKStatCreate("stat_ia", INKSTAT_TYPE_INT64); |
| |
| INKStatIntAddTo(stat, 100); |
| int64 stat_val; |
| |
| INKStatIntGet(stat, &stat_val); |
| |
| if (stat_val == 100) { |
| SDK_RPRINT(test, "INKStatIntAddTo", "TestCase1", TC_PASS, "ok"); |
| test_passed = true; |
| } else { |
| SDK_RPRINT(test, "INKStatIntAddTo", "TestCase1", TC_FAIL, "can't add to correct integer value"); |
| } |
| |
| // Status of the whole test |
| *pstatus = ((test_passed == true) ? REGRESSION_TEST_PASSED : REGRESSION_TEST_FAILED); |
| |
| } |
| |
| ////////////////////////////////////////////// |
| // SDK_API_INKStat |
| // |
| // Unit Test for API: INKStatFloatAddTo |
| // INKStatFloatRead |
| ////////////////////////////////////////////// |
| |
| REGRESSION_TEST(SDK_API_INKStatFloatAddTo) (RegressionTest * test, int atype, int *pstatus) |
| { |
| NOWARN_UNUSED(atype); |
| bool test_passed = false; |
| *pstatus = REGRESSION_TEST_INPROGRESS; |
| |
| INKStat stat = INKStatCreate("stat_fa", INKSTAT_TYPE_FLOAT); |
| |
| INKStatFloatAddTo(stat, 100.0); |
| float stat_val; |
| INKStatFloatGet(stat, &stat_val); |
| |
| if (stat_val == 100.0) { |
| SDK_RPRINT(test, "INKStatFloatAddTo", "TestCase1", TC_PASS, "ok"); |
| test_passed = true; |
| } else { |
| SDK_RPRINT(test, "INKStatFloatAddTo", "TestCase1", TC_FAIL, "can't add to correct float value"); |
| } |
| |
| // Status of the whole test |
| *pstatus = ((test_passed == true) ? REGRESSION_TEST_PASSED : REGRESSION_TEST_FAILED); |
| |
| } |
| |
| ////////////////////////////////////////////// |
| // SDK_API_INKStat |
| // |
| // Unit Test for API: INKStatFloatSet |
| ////////////////////////////////////////////// |
| |
| REGRESSION_TEST(SDK_API_INKStatFloatSet) (RegressionTest * test, int atype, int *pstatus) |
| { |
| NOWARN_UNUSED(atype); |
| bool test_passed = false; |
| *pstatus = REGRESSION_TEST_INPROGRESS; |
| |
| INKStat stat = INKStatCreate("stat_fs", INKSTAT_TYPE_FLOAT); |
| |
| INKStatFloatSet(stat, 100.0); |
| float stat_val; |
| INKStatFloatGet(stat, &stat_val); |
| |
| if (stat_val == 100.0) { |
| SDK_RPRINT(test, "INKStatFloatSet", "TestCase1", TC_PASS, "ok"); |
| test_passed = true; |
| } else { |
| SDK_RPRINT(test, "INKStatFloatSet", "TestCase1", TC_FAIL, "can't set to correct float value"); |
| } |
| |
| // Status of the whole test |
| *pstatus = ((test_passed == true) ? REGRESSION_TEST_PASSED : REGRESSION_TEST_FAILED); |
| |
| } |
| |
| ////////////////////////////////////////////// |
| // SDK_API_INKStat |
| // |
| // Unit Test for API: INKStatIncrement |
| // INKStatDecrement |
| ////////////////////////////////////////////// |
| |
| REGRESSION_TEST(SDK_API_INKStatIncrement) (RegressionTest * test, int atype, int *pstatus) |
| { |
| NOWARN_UNUSED(atype); |
| bool test_passed_int_increase = false; |
| bool test_passed_int_decrease = false; |
| bool test_passed_float_increase = false; |
| bool test_passed_float_decrease = false; |
| *pstatus = REGRESSION_TEST_INPROGRESS; |
| |
| INKStat stat_1 = INKStatCreate("stat_1", INKSTAT_TYPE_INT64); |
| INKStat stat_2 = INKStatCreate("stat_2", INKSTAT_TYPE_FLOAT); |
| |
| INKStatIncrement(stat_1); |
| int64 stat1_val; |
| INKStatIntGet(stat_1, &stat1_val); |
| |
| if (stat1_val == 1) { |
| SDK_RPRINT(test, "INKStatIncrement", "TestCase1", TC_PASS, "ok for int stat"); |
| test_passed_int_increase = true; |
| } else { |
| SDK_RPRINT(test, "INKStatIncrement", "TestCase1", TC_FAIL, "can't increase to correct integer value"); |
| } |
| |
| INKStatDecrement(stat_1); |
| INKStatIntGet(stat_1, &stat1_val); |
| |
| if (stat1_val == 0) { |
| SDK_RPRINT(test, "INKStatDecrement", "TestCase1", TC_PASS, "ok for int stat"); |
| test_passed_int_decrease = true; |
| } else { |
| SDK_RPRINT(test, "INKStatDecrement", "TestCase1", TC_FAIL, "can't decrease to correct integer value"); |
| } |
| |
| INKStatIncrement(stat_2); |
| float stat2_val; |
| INKStatFloatGet(stat_2, &stat2_val); |
| |
| if (stat2_val == 1.0) { |
| SDK_RPRINT(test, "INKStatIncrement", "TestCase2", TC_PASS, "ok for float stat"); |
| test_passed_float_increase = true; |
| } else { |
| char message[80]; |
| snprintf(message, sizeof(message), "can't increase to correct float value (1.0 != %.3f)", stat2_val); |
| SDK_RPRINT(test, "INKStatIncrement", "TestCase2", TC_FAIL, &message[0]); |
| } |
| |
| INKStatDecrement(stat_2); |
| INKStatFloatGet(stat_2, &stat2_val); |
| |
| if (stat2_val == 0.0) { |
| SDK_RPRINT(test, "INKStatDecrement", "TestCase2", TC_PASS, "ok for float stat"); |
| test_passed_float_decrease = true; |
| } else { |
| SDK_RPRINT(test, "INKStatDecrement", "TestCase2", TC_FAIL, "can't decrease to correct float value"); |
| } |
| |
| // Status of the whole test |
| if (test_passed_int_increase && test_passed_int_decrease && test_passed_float_increase && test_passed_float_decrease) |
| *pstatus = REGRESSION_TEST_PASSED; |
| else |
| *pstatus = REGRESSION_TEST_FAILED; |
| |
| } |
| |
| //////////////////////////////////////////////////// |
| // SDK_API_INKCoupledStat |
| // |
| // Unit Test for API: INKStatCoupledGlobalCategoryCreate |
| // INKStatCoupledLoacalCopyCreate |
| // INKStatCoupledLoacalCopyDestroy |
| // INKStatCoupledGlobalAdd |
| // INKStatCoupledLocalAdd |
| // INKStatsCoupledUpdate |
| //////////////////////////////////////////////////// |
| |
| REGRESSION_TEST(SDK_API_INKStatCoupled) (RegressionTest * test, int atype, int *pstatus) |
| { |
| NOWARN_UNUSED(atype); |
| *pstatus = REGRESSION_TEST_INPROGRESS; |
| |
| /* Create global category and its stats */ |
| INKCoupledStat stat_global_category = INKStatCoupledGlobalCategoryCreate("global.category"); |
| |
| INKStat global_stat_sum = INKStatCoupledGlobalAdd(stat_global_category, |
| "global.statsum", |
| INKSTAT_TYPE_FLOAT); |
| |
| INKStat global_stat_1 = INKStatCoupledGlobalAdd(stat_global_category, |
| "global.stat1", |
| INKSTAT_TYPE_INT64); |
| |
| INKStat global_stat_2 = INKStatCoupledGlobalAdd(stat_global_category, |
| "global.stat2", |
| INKSTAT_TYPE_INT64); |
| |
| /* Create local category and its stats */ |
| INKCoupledStat stat_local_copy = INKStatCoupledLocalCopyCreate("local.copy", |
| stat_global_category); |
| |
| INKStat local_stat_sum = INKStatCoupledLocalAdd(stat_local_copy, |
| "local.statsum", |
| INKSTAT_TYPE_FLOAT); |
| |
| INKStat local_stat_1 = INKStatCoupledLocalAdd(stat_local_copy, |
| "local.stat1", |
| INKSTAT_TYPE_INT64); |
| |
| INKStat local_stat_2 = INKStatCoupledLocalAdd(stat_local_copy, |
| "local.stat2", |
| INKSTAT_TYPE_INT64); |
| |
| /* stat operation */ |
| INKStatIntSet(local_stat_1, 100); |
| INKStatIntSet(local_stat_2, 100); |
| float local_val_1; |
| INKStatFloatGet(local_stat_1, &local_val_1); |
| float local_val_2; |
| INKStatFloatGet(local_stat_2, &local_val_2); |
| |
| INKStatFloatAddTo(local_stat_sum, local_val_1); |
| INKStatFloatAddTo(local_stat_sum, local_val_2); |
| float local_val_sum; |
| INKStatFloatGet(local_stat_sum, &local_val_sum); |
| |
| INKStatsCoupledUpdate(stat_local_copy); |
| INKStatCoupledLocalCopyDestroy(stat_local_copy); |
| |
| float global_val_sum; |
| INKStatFloatGet(global_stat_sum, &global_val_sum); |
| int64 global_val_1; |
| INKStatIntGet(global_stat_1, &global_val_1); |
| int64 global_val_2; |
| INKStatIntGet(global_stat_2, &global_val_2); |
| |
| if (local_val_1 == global_val_1 && local_val_2 == global_val_2 && local_val_sum == global_val_sum) { |
| SDK_RPRINT(test, "INKStatCoupledGlobalCategoryCreate", "TestCase1", TC_PASS, "ok"); |
| SDK_RPRINT(test, "INKStatCoupledGlobalAdd", "TestCase1", TC_PASS, "ok"); |
| SDK_RPRINT(test, "INKStatCoupledLocalCopyCreate", "TestCase1", TC_PASS, "ok"); |
| SDK_RPRINT(test, "INKStatCoupledLocalAdd", "TestCase1", TC_PASS, "ok"); |
| SDK_RPRINT(test, "INKStatCoupledLocalCopyDestroy", "TestCase1", TC_PASS, "ok"); |
| SDK_RPRINT(test, "INKStatCoupledUpdate", "TestCase1", TC_PASS, "ok"); |
| *pstatus = REGRESSION_TEST_PASSED; |
| } else { |
| SDK_RPRINT(test, "INKStatCoupledGlobalCategoryCreate", "TestCase1", TC_FAIL, |
| "global stats' value is not equal to local one"); |
| SDK_RPRINT(test, "INKStatCoupledGlobalAdd", "TestCase1", TC_FAIL, "global stats' value is not equal to local one"); |
| SDK_RPRINT(test, "INKStatCoupledLocalCopyCreate", "TestCase1", TC_FAIL, |
| "global stats' value is not equal to local one"); |
| SDK_RPRINT(test, "INKStatCoupledLocalAdd", "TestCase1", TC_FAIL, "global stats' value is not equal to local one"); |
| SDK_RPRINT(test, "INKStatCoupledLocalCopyDestroy", "TestCase1", TC_FAIL, |
| "global stats' value is not equal to local one"); |
| SDK_RPRINT(test, "INKStatCoupledUpdate", "TestCase1", TC_FAIL, "global stats' value is not equal to local one"); |
| |
| *pstatus = REGRESSION_TEST_FAILED; |
| } |
| } |
| |
| |
| REGRESSION_TEST(SDK_API_INKContSchedule) (RegressionTest * test, int atype, int *pstatus) |
| { |
| NOWARN_UNUSED(atype); |
| *pstatus = REGRESSION_TEST_INPROGRESS; |
| |
| // For asynchronous APIs, use static vars to store test and pstatus |
| SDK_ContSchedule_test = test; |
| SDK_ContSchedule_pstatus = pstatus; |
| |
| INKCont contp = INKContCreate(cont_schedule_handler, INKMutexCreate()); |
| INKCont contp2 = INKContCreate(cont_schedule_handler, INKMutexCreate()); |
| |
| // Test Case 1: schedule immediate |
| INKContSchedule(contp, 0); |
| |
| // Test Case 2: schedule in 10ms |
| INKContSchedule(contp2, 10); |
| } |
| |
| ////////////////////////////////////////////////////////////////////////////// |
| // SDK_API_HttpHookAdd |
| // |
| // Unit Test for API: INKHttpHookAdd |
| // INKHttpTxnReenable |
| // INKHttpTxnClientIPGet |
| // INKHttpTxnServerIPGet |
| // INKHttpTxnClientIncomingPortGet |
| // INKHttpTxnClientRemotePortGet |
| // INKHttpTxnClientReqGet |
| // INKHttpTxnClientRespGet |
| // INKHttpTxnServerReqGet |
| // INKHttpTxnServerRespGet |
| ////////////////////////////////////////////////////////////////////////////// |
| |
| #define HTTP_HOOK_TEST_REQUEST_ID 1 |
| |
| typedef struct |
| { |
| RegressionTest *regtest; |
| int *pstatus; |
| SocketServer *os; |
| ClientTxn *browser; |
| int hook_mask; |
| int reenable_mask; |
| bool test_client_ip_get; |
| bool test_client_incoming_port_get; |
| bool test_client_remote_port_get; |
| bool test_client_req_get; |
| bool test_client_resp_get; |
| bool test_server_ip_get; |
| bool test_server_req_get; |
| bool test_server_resp_get; |
| bool test_next_hop_ip_get; |
| |
| unsigned int magic; |
| } SocketTest; |
| |
| |
| //This func is called by us from mytest_handler to test INKHttpTxnClientIPGet |
| static int |
| checkHttpTxnClientIPGet(SocketTest * test, void *data) |
| { |
| |
| int ip; |
| INKHttpTxn txnp = (INKHttpTxn) data; |
| int actual_ip = LOCAL_IP; /* 127.0.0.1 is expected because the client is on the same machine */ |
| |
| ip = INKHttpTxnClientIPGet(txnp); |
| if (ip == 0) { |
| test->test_client_ip_get = false; |
| SDK_RPRINT(test->regtest, "INKHttpTxnClientIPGet", "TestCase1", TC_FAIL, "INKHttpTxnClientIPGet returns 0"); |
| return INK_EVENT_CONTINUE; |
| } |
| |
| if (ntohl(ip) == (uint32_t) actual_ip) { |
| test->test_client_ip_get = true; |
| SDK_RPRINT(test->regtest, "INKHttpTxnClientIPGet", "TestCase1", TC_PASS, "ok"); |
| } else { |
| test->test_client_ip_get = false; |
| SDK_RPRINT(test->regtest, "INKHttpTxnClientIPGet", "TestCase1", TC_FAIL, "Value's Mismatch"); |
| } |
| return INK_EVENT_CONTINUE; |
| |
| } |
| |
| //This func is called by us from mytest_handler to check for INKHttpTxnNextHopIPGet |
| static int |
| checkHttpTxnNextHopIPGet(SocketTest * test, void *data) |
| { |
| INKHttpTxn txnp = (INKHttpTxn) data; |
| int actual_ip = LOCAL_IP; /* 127.0.0.1 is expected because the client is on the same machine */ |
| int nexthopip; |
| |
| nexthopip = INKHttpTxnNextHopIPGet(txnp); |
| if (nexthopip == 0) { |
| test->test_next_hop_ip_get = false; |
| SDK_RPRINT(test->regtest, "INKHttpTxnNextHopIPGet", "TestCase1", TC_FAIL, "INKHttpTxnNextHopIPGet returns 0"); |
| return INK_EVENT_CONTINUE; |
| } |
| |
| if (ntohl(nexthopip) == (uint32_t) actual_ip) { |
| test->test_next_hop_ip_get = true; |
| SDK_RPRINT(test->regtest, "INKHttpTxnNextHopIPGet", "TestCase1", TC_PASS, "ok"); |
| } else { |
| test->test_next_hop_ip_get = false; |
| SDK_RPRINT(test->regtest, "INKHttpTxnNextHopIPGet", "TestCase1", TC_FAIL, "Value's Mismatch"); |
| } |
| |
| return INK_EVENT_CONTINUE; |
| } |
| |
| |
| |
| //This func is called by us from mytest_handler to test INKHttpTxnServerIPGet |
| static int |
| checkHttpTxnServerIPGet(SocketTest * test, void *data) |
| { |
| |
| int ip; |
| INKHttpTxn txnp = (INKHttpTxn) data; |
| int actual_ip = ntohl(LOCAL_IP); /* 127.0.0.1 is expected because the client is on the same machine */ |
| |
| ip = INKHttpTxnServerIPGet(txnp); |
| if (ip == 0) { |
| test->test_server_ip_get = false; |
| SDK_RPRINT(test->regtest, "INKHttpTxnServerIPGet", "TestCase1", TC_FAIL, "INKHttpTxnServerIPGet returns 0"); |
| return INK_EVENT_CONTINUE; |
| } |
| |
| if (ip == actual_ip) { |
| test->test_server_ip_get = true; |
| SDK_RPRINT(test->regtest, "INKHttpTxnServerIPGet", "TestCase1", TC_PASS, "ok"); |
| } else { |
| test->test_server_ip_get = false; |
| SDK_RPRINT(test->regtest, "INKHttpTxnServerIPGet", "TestCase1", TC_FAIL, "Value's Mismatch"); |
| } |
| |
| |
| return INK_EVENT_CONTINUE; |
| |
| } |
| |
| //This func is called by us from mytest_handler to test INKHttpTxnClientIncomingPortGet |
| static int |
| checkHttpTxnClientIncomingPortGet(SocketTest * test, void *data) |
| { |
| |
| int port = -1; |
| INKMgmtInt port_from_config_file = -1; |
| INKHttpTxn txnp = (INKHttpTxn) data; |
| |
| if ((port = INKHttpTxnClientIncomingPortGet(txnp)) < 0) { |
| SDK_RPRINT(test->regtest, "INKHttpTxnClientIncomingPortGet", "TestCase1", TC_FAIL, |
| "INKHttpTxnClientIncomingPortGet returns INK_ERROR"); |
| test->test_client_incoming_port_get = false; |
| return INK_EVENT_CONTINUE; |
| } |
| |
| if (INKMgmtIntGet("proxy.config.http.server_port", &port_from_config_file) == 0) { |
| port_from_config_file = 8080; |
| } |
| |
| INKDebug(UTDBG_TAG, "TS HTTP port = %x, Txn incoming client port %x", (int) port_from_config_file, port); |
| |
| if (port == (int) port_from_config_file) { |
| SDK_RPRINT(test->regtest, "INKHttpTxnClientIncomingPortGet", "TestCase1", TC_PASS, "ok"); |
| test->test_client_incoming_port_get = true; |
| } else { |
| SDK_RPRINT(test->regtest, "INKHttpTxnClientIncomingPortGet", "TestCase1", TC_FAIL, |
| "Value's Mismatch. From Funtion: %d Expected value: %d", port, port_from_config_file); |
| test->test_client_incoming_port_get = false; |
| } |
| return INK_EVENT_CONTINUE; |
| } |
| |
| //This func is called by us from mytest_handler to test INKHttpTxnClientRemotePortGet |
| static int |
| checkHttpTxnClientRemotePortGet(SocketTest * test, void *data) |
| { |
| |
| int port = -1; |
| int browser_port = -1; |
| INKHttpTxn txnp = (INKHttpTxn) data; |
| |
| browser_port = test->browser->local_port; |
| |
| if (INKHttpTxnClientRemotePortGet(txnp, &port) != INK_SUCCESS) { |
| SDK_RPRINT(test->regtest, "INKHttpTxnClientRemotePortGet", "TestCase1", TC_FAIL, |
| "INKHttpTxnClientRemotePortGet doesn't return INK_SUCCESS"); |
| test->test_client_remote_port_get = false; |
| return INK_EVENT_CONTINUE; |
| } |
| |
| INKDebug(UTDBG_TAG, "Browser port = %x, Txn remote port = %x", browser_port, port); |
| |
| if (ntohs(port) == browser_port) { |
| SDK_RPRINT(test->regtest, "INKHttpTxnClientRemotePortGet", "TestCase1", TC_PASS, "ok"); |
| test->test_client_remote_port_get = true; |
| } else { |
| SDK_RPRINT(test->regtest, "INKHttpTxnClientRemotePortGet", "TestCase1", TC_FAIL, |
| "Value's Mismatch. From Function: %d Expected Value: %d", ntohs(port), browser_port); |
| test->test_client_remote_port_get = false; |
| } |
| return INK_EVENT_CONTINUE; |
| } |
| |
| // This func is called by us from mytest_handler to test INKHttpTxnClientReqGet |
| static int |
| checkHttpTxnClientReqGet(SocketTest * test, void *data) |
| { |
| |
| INKMBuffer bufp; |
| INKMLoc mloc; |
| INKHttpTxn txnp = (INKHttpTxn) data; |
| |
| if (!INKHttpTxnClientReqGet(txnp, &bufp, &mloc)) { |
| test->test_client_req_get = false; |
| SDK_RPRINT(test->regtest, "INKHttpTxnClientReqGet", "TestCase1", TC_FAIL, "Unable to get handle to client request"); |
| return INK_EVENT_CONTINUE; |
| } |
| |
| |
| if ((bufp == (&((HttpSM *) txnp)->t_state.hdr_info.client_request)) && |
| (mloc == (((HttpSM *) txnp)->t_state.hdr_info.client_request.m_http)) |
| ) { |
| test->test_client_req_get = true; |
| SDK_RPRINT(test->regtest, "INKHttpTxnClientReqGet", "TestCase1", TC_PASS, "ok"); |
| } else { |
| test->test_client_req_get = false; |
| SDK_RPRINT(test->regtest, "INKHttpTxnClientReqGet", "TestCase1", TC_FAIL, "Value's Mismatch"); |
| } |
| |
| return INK_EVENT_CONTINUE; |
| } |
| |
| // This func is called by us from mytest_handler to test INKHttpTxnClientRespGet |
| static int |
| checkHttpTxnClientRespGet(SocketTest * test, void *data) |
| { |
| |
| INKMBuffer bufp; |
| INKMLoc mloc; |
| INKHttpTxn txnp = (INKHttpTxn) data; |
| |
| if (!INKHttpTxnClientRespGet(txnp, &bufp, &mloc)) { |
| test->test_client_resp_get = false; |
| SDK_RPRINT(test->regtest, "INKHttpTxnClientRespGet", "TestCase1", TC_FAIL, |
| "Unable to get handle to client response"); |
| return INK_EVENT_CONTINUE; |
| } |
| |
| if ((bufp == (&((HttpSM *) txnp)->t_state.hdr_info.client_response)) && |
| (mloc == (((HttpSM *) txnp)->t_state.hdr_info.client_response.m_http)) |
| ) { |
| test->test_client_resp_get = true; |
| SDK_RPRINT(test->regtest, "INKHttpTxnClientRespGet", "TestCase1", TC_PASS, "ok"); |
| } else { |
| test->test_client_resp_get = false; |
| SDK_RPRINT(test->regtest, "INKHttpTxnClientRespGet", "TestCase1", TC_FAIL, "Value's Mismatch"); |
| } |
| |
| return INK_EVENT_CONTINUE; |
| } |
| |
| // This func is called by us from mytest_handler to test INKHttpTxnServerReqGet |
| static int |
| checkHttpTxnServerReqGet(SocketTest * test, void *data) |
| { |
| |
| INKMBuffer bufp; |
| INKMLoc mloc; |
| INKHttpTxn txnp = (INKHttpTxn) data; |
| |
| if (!INKHttpTxnServerReqGet(txnp, &bufp, &mloc)) { |
| test->test_server_req_get = false; |
| SDK_RPRINT(test->regtest, "INKHttpTxnServerReqGet", "TestCase1", TC_FAIL, "Unable to get handle to server request"); |
| return INK_EVENT_CONTINUE; |
| } |
| |
| if ((bufp == (&((HttpSM *) txnp)->t_state.hdr_info.server_request)) && |
| (mloc == (((HttpSM *) txnp)->t_state.hdr_info.server_request.m_http)) |
| ) { |
| test->test_server_req_get = true; |
| SDK_RPRINT(test->regtest, "INKHttpTxnServerReqGet", "TestCase1", TC_PASS, "ok"); |
| } else { |
| test->test_server_req_get = false; |
| SDK_RPRINT(test->regtest, "INKHttpTxnServerReqGet", "TestCase1", TC_FAIL, "Value's Mismatch"); |
| } |
| |
| return INK_EVENT_CONTINUE; |
| } |
| |
| // This func is called by us from mytest_handler to test INKHttpTxnServerRespGet |
| static int |
| checkHttpTxnServerRespGet(SocketTest * test, void *data) |
| { |
| |
| INKMBuffer bufp; |
| INKMLoc mloc; |
| INKHttpTxn txnp = (INKHttpTxn) data; |
| |
| if (!INKHttpTxnServerRespGet(txnp, &bufp, &mloc)) { |
| test->test_server_resp_get = false; |
| SDK_RPRINT(test->regtest, "INKHttpTxnServerRespGet", "TestCase1", TC_FAIL, |
| "Unable to get handle to server response"); |
| return INK_EVENT_CONTINUE; |
| } |
| |
| if ((bufp == (&((HttpSM *) txnp)->t_state.hdr_info.server_response)) && |
| (mloc == (((HttpSM *) txnp)->t_state.hdr_info.server_response.m_http)) |
| ) { |
| test->test_server_resp_get = true; |
| SDK_RPRINT(test->regtest, "INKHttpTxnServerRespGet", "TestCase1", TC_PASS, "ok"); |
| } else { |
| test->test_server_resp_get = false; |
| SDK_RPRINT(test->regtest, "INKHttpTxnServerRespGet", "TestCase1", TC_FAIL, "Value's Mismatch"); |
| } |
| |
| return INK_EVENT_CONTINUE; |
| } |
| |
| |
| // This func is called both by us when scheduling EVENT_IMMEDIATE |
| // And by HTTP SM for registered hooks |
| static int |
| mytest_handler(INKCont contp, INKEvent event, void *data) |
| { |
| SocketTest *test = (SocketTest *) INKContDataGet(contp); |
| if (test == NULL) { |
| if ((event == INK_EVENT_IMMEDIATE) || (event == INK_EVENT_TIMEOUT)) { |
| return 0; |
| } |
| INKHttpTxnReenable((INKHttpTxn) data, INK_EVENT_HTTP_CONTINUE); |
| return 0; |
| } |
| INKAssert(test->magic == MAGIC_ALIVE); |
| INKAssert(test->browser->magic == MAGIC_ALIVE); |
| |
| switch (event) { |
| case INK_EVENT_HTTP_TXN_START: |
| if (test->hook_mask == 0) { |
| test->hook_mask |= 1; |
| } |
| |
| if (INKHttpTxnReenable((INKHttpTxn) data, INK_EVENT_HTTP_CONTINUE) != INK_SUCCESS) { |
| SDK_RPRINT(test->regtest, "INKHttpTxnReenable", "TestCase1", TC_FAIL, |
| "INKHttpTxnReenable doesn't return INK_SUCCESS"); |
| } else { |
| test->reenable_mask |= 1; |
| } |
| break; |
| |
| case INK_EVENT_HTTP_READ_REQUEST_HDR: |
| if (test->hook_mask == 1) { |
| test->hook_mask |= 2; |
| } |
| |
| checkHttpTxnClientReqGet(test, data); |
| |
| if (INKHttpTxnReenable((INKHttpTxn) data, INK_EVENT_HTTP_CONTINUE) != INK_SUCCESS) { |
| SDK_RPRINT(test->regtest, "INKHttpTxnReenable", "TestCase1", TC_FAIL, |
| "INKHttpTxnReenable doesn't return INK_SUCCESS"); |
| } else { |
| test->reenable_mask |= 2; |
| } |
| |
| break; |
| |
| case INK_EVENT_HTTP_OS_DNS: |
| if (test->hook_mask == 3) { |
| test->hook_mask |= 4; |
| } |
| |
| checkHttpTxnClientIncomingPortGet(test, data); |
| checkHttpTxnClientRemotePortGet(test, data); |
| |
| checkHttpTxnClientIPGet(test, data); |
| checkHttpTxnServerIPGet(test, data); |
| |
| if (INKHttpTxnReenable((INKHttpTxn) data, INK_EVENT_HTTP_CONTINUE) != INK_SUCCESS) { |
| SDK_RPRINT(test->regtest, "INKHttpTxnReenable", "TestCase1", TC_FAIL, |
| "INKHttpTxnReenable doesn't return INK_SUCCESS"); |
| } else { |
| test->reenable_mask |= 4; |
| } |
| break; |
| |
| case INK_EVENT_HTTP_CACHE_LOOKUP_COMPLETE: |
| if (test->hook_mask == 7) { |
| test->hook_mask |= 8; |
| } |
| if (INKHttpTxnReenable((INKHttpTxn) data, INK_EVENT_HTTP_CONTINUE) != INK_SUCCESS) { |
| SDK_RPRINT(test->regtest, "INKHttpTxnReenable", "TestCase1", TC_FAIL, |
| "INKHttpTxnReenable doesn't return INK_SUCCESS"); |
| } else { |
| test->reenable_mask |= 8; |
| } |
| break; |
| |
| case INK_EVENT_HTTP_SEND_REQUEST_HDR: |
| if (test->hook_mask == 15) { |
| test->hook_mask |= 16; |
| } |
| |
| checkHttpTxnServerReqGet(test, data); |
| checkHttpTxnNextHopIPGet(test, data); |
| |
| if (INKHttpTxnReenable((INKHttpTxn) data, INK_EVENT_HTTP_CONTINUE) != INK_SUCCESS) { |
| SDK_RPRINT(test->regtest, "INKHttpTxnReenable", "TestCase1", TC_FAIL, |
| "INKHttpTxnReenable doesn't return INK_SUCCESS"); |
| } else { |
| test->reenable_mask |= 16; |
| } |
| |
| |
| break; |
| |
| case INK_EVENT_HTTP_READ_RESPONSE_HDR: |
| if (test->hook_mask == 31) { |
| test->hook_mask |= 32; |
| } |
| checkHttpTxnServerRespGet(test, data); |
| |
| if (INKHttpTxnReenable((INKHttpTxn) data, INK_EVENT_HTTP_CONTINUE) != INK_SUCCESS) { |
| SDK_RPRINT(test->regtest, "INKHttpTxnReenable", "TestCase1", TC_FAIL, |
| "INKHttpTxnReenable doesn't return INK_SUCCESS"); |
| } else { |
| test->reenable_mask |= 32; |
| } |
| |
| break; |
| |
| case INK_EVENT_HTTP_SEND_RESPONSE_HDR: |
| if (test->hook_mask == 63) { |
| test->hook_mask |= 64; |
| } |
| |
| checkHttpTxnClientRespGet(test, data); |
| |
| if (INKHttpTxnReenable((INKHttpTxn) data, INK_EVENT_HTTP_CONTINUE) != INK_SUCCESS) { |
| SDK_RPRINT(test->regtest, "INKHttpTxnReenable", "TestCase1", TC_FAIL, |
| "INKHttpTxnReenable doesn't return INK_SUCCESS"); |
| } else { |
| test->reenable_mask |= 64; |
| } |
| |
| break; |
| |
| case INK_EVENT_HTTP_TXN_CLOSE: |
| if (test->hook_mask == 127) { |
| test->hook_mask |= 128; |
| } |
| |
| if (INKHttpTxnReenable((INKHttpTxn) data, INK_EVENT_HTTP_CONTINUE) != INK_SUCCESS) { |
| SDK_RPRINT(test->regtest, "INKHttpTxnReenable", "TestCase1", TC_FAIL, |
| "INKHttpTxnReenable doesn't return INK_SUCCESS"); |
| } else { |
| test->reenable_mask |= 128; |
| } |
| break; |
| |
| case INK_EVENT_IMMEDIATE: |
| case INK_EVENT_TIMEOUT: |
| /* Browser still waiting the response ? */ |
| if (test->browser->status == REQUEST_INPROGRESS) { |
| INKContSchedule(contp, 25); |
| } |
| /* Browser got the response. test is over. clean up */ |
| else { |
| /* Note: response is available using test->browser->response pointer */ |
| if ((test->browser->status == REQUEST_SUCCESS) && (test->hook_mask == 255)) { |
| *(test->pstatus) = REGRESSION_TEST_PASSED; |
| SDK_RPRINT(test->regtest, "INKHttpHookAdd", "TestCase1", TC_PASS, "ok"); |
| |
| } else { |
| *(test->pstatus) = REGRESSION_TEST_FAILED; |
| SDK_RPRINT(test->regtest, "INKHttpHookAdd", "TestCase1", TC_FAIL, |
| "Hooks not called or request failure. Hook mask = %d", test->hook_mask); |
| } |
| |
| if (test->reenable_mask == 255) { |
| SDK_RPRINT(test->regtest, "INKHttpTxnReenable", "TestCase1", TC_PASS, "ok"); |
| |
| } else { |
| *(test->pstatus) = REGRESSION_TEST_FAILED; |
| SDK_RPRINT(test->regtest, "INKHttpTxnReenable", "TestCase1", TC_FAIL, "Txn not reenabled properly"); |
| |
| } |
| |
| if ((test->test_client_ip_get != true) || |
| (test->test_client_incoming_port_get != true) || |
| (test->test_client_remote_port_get != true) || |
| (test->test_client_req_get != true) || |
| (test->test_client_resp_get != true) || |
| (test->test_server_ip_get != true) || |
| (test->test_server_req_get != true) || |
| (test->test_server_resp_get != true) || (test->test_next_hop_ip_get != true) |
| ) { |
| *(test->pstatus) = REGRESSION_TEST_FAILED; |
| } |
| // transaction is over. clean up. |
| synclient_txn_delete(test->browser); |
| synserver_delete(test->os); |
| |
| test->magic = MAGIC_DEAD; |
| INKfree(test); |
| INKContDataSet(contp, NULL); |
| } |
| break; |
| |
| default: |
| *(test->pstatus) = REGRESSION_TEST_FAILED; |
| SDK_RPRINT(test->regtest, "INKHttpHookAdd", "TestCase1", TC_FAIL, "Unexpected event %d", event); |
| break; |
| } |
| |
| return INK_EVENT_IMMEDIATE; |
| } |
| |
| |
| |
| EXCLUSIVE_REGRESSION_TEST(SDK_API_HttpHookAdd) (RegressionTest * test, int atype, int *pstatus) |
| { |
| NOWARN_UNUSED(atype); |
| *pstatus = REGRESSION_TEST_INPROGRESS; |
| |
| INKCont cont = INKContCreate(mytest_handler, INKMutexCreate()); |
| SocketTest *socktest = (SocketTest *) INKmalloc(sizeof(SocketTest)); |
| |
| socktest->regtest = test; |
| socktest->pstatus = pstatus; |
| socktest->hook_mask = 0; |
| socktest->reenable_mask = 0; |
| socktest->test_client_ip_get = false; |
| socktest->test_client_incoming_port_get = false; |
| socktest->test_client_req_get = false; |
| socktest->test_client_resp_get = false; |
| socktest->test_server_ip_get = false; |
| socktest->test_server_req_get = false; |
| socktest->test_server_resp_get = false; |
| socktest->test_next_hop_ip_get = false; |
| socktest->magic = MAGIC_ALIVE; |
| INKContDataSet(cont, socktest); |
| |
| /* Register to HTTP hooks that are called in case of a cache MISS */ |
| INKHttpHookAdd(INK_HTTP_TXN_START_HOOK, cont); |
| INKHttpHookAdd(INK_HTTP_READ_REQUEST_HDR_HOOK, cont); |
| INKHttpHookAdd(INK_HTTP_OS_DNS_HOOK, cont); |
| INKHttpHookAdd(INK_HTTP_CACHE_LOOKUP_COMPLETE_HOOK, cont); |
| INKHttpHookAdd(INK_HTTP_SEND_REQUEST_HDR_HOOK, cont); |
| INKHttpHookAdd(INK_HTTP_READ_RESPONSE_HDR_HOOK, cont); |
| INKHttpHookAdd(INK_HTTP_SEND_RESPONSE_HDR_HOOK, cont); |
| INKHttpHookAdd(INK_HTTP_TXN_CLOSE_HOOK, cont); |
| |
| /* Create a new synthetic server */ |
| socktest->os = synserver_create(SYNSERVER_LISTEN_PORT); |
| synserver_start(socktest->os); |
| |
| /* Create a client transaction */ |
| socktest->browser = synclient_txn_create(); |
| char *request = generate_request(HTTP_HOOK_TEST_REQUEST_ID); // this request has a no-cache that prevents caching |
| synclient_txn_send_request(socktest->browser, request); |
| INKfree(request); |
| |
| /* Wait until transaction is done */ |
| if (socktest->browser->status == REQUEST_INPROGRESS) { |
| INKContSchedule(cont, 25); |
| } |
| |
| return; |
| } |
| |
| |
| ////////////////////////////////////////////// |
| // SDK_API_INKUrl |
| // |
| // Unit Test for API: INKUrlCreate |
| // INKUrlDestroy |
| // INKUrlSchemeGet |
| // INKUrlSchemeSet |
| // INKUrlUserGet |
| // INKUrlUserSet |
| // INKUrlPasswordGet |
| // INKUrlPasswordSet |
| // INKUrlHostGet |
| // INKUrlHostSet |
| // INKUrlPortGet |
| // INKUrlPortSet |
| // INKUrlPathGet |
| // INKUrlPathSet |
| // INKUrlHttpParamsGet |
| // INKUrlHttpParamsSet |
| // INKUrlHttpQueryGet |
| // INKUrlHttpQuerySet |
| // INKUrlHttpFragmentGet |
| // INKUrlHttpFragmentSet |
| // INKUrlCopy |
| // INKUrlClone |
| // INKUrlStringGet |
| // INKUrlPrint |
| // INKUrlLengthGet |
| // INKUrlFtpTypeGet |
| // INKUrlFtpTypeSet |
| ////////////////////////////////////////////// |
| |
| char * |
| test_url_print(INKMBuffer bufp, INKMLoc hdr_loc) |
| { |
| INKIOBuffer output_buffer; |
| INKIOBufferReader reader; |
| int total_avail; |
| |
| INKIOBufferBlock block; |
| const char *block_start; |
| int64 block_avail; |
| |
| char *output_string; |
| int output_len; |
| |
| output_buffer = INKIOBufferCreate(); |
| |
| if (!output_buffer) { |
| INKError("couldn't allocate IOBuffer\n"); |
| } |
| |
| reader = INKIOBufferReaderAlloc(output_buffer); |
| |
| /* This will print just MIMEFields and not |
| the http request line */ |
| if (INKUrlPrint(bufp, hdr_loc, output_buffer) != INK_SUCCESS) { |
| return NULL; |
| } |
| |
| /* Find out how the big the complete header is by |
| seeing the total bytes in the buffer. We need to |
| look at the buffer rather than the first block to |
| see the size of the entire header */ |
| total_avail = INKIOBufferReaderAvail(reader); |
| |
| /* Allocate the string with an extra byte for the string |
| terminator */ |
| output_string = (char *) INKmalloc(total_avail + 1); |
| output_len = 0; |
| |
| /* We need to loop over all the buffer blocks to make |
| sure we get the complete header since the header can |
| be in multiple blocks */ |
| block = INKIOBufferReaderStart(reader); |
| while (block) { |
| |
| block_start = INKIOBufferBlockReadStart(block, reader, &block_avail); |
| |
| /* We'll get a block pointer back even if there is no data |
| left to read so check for this condition and break out of |
| the loop. A block with no data to read means we've exhausted |
| buffer of data since if there was more data on a later |
| block in the chain, this block would have been skipped over */ |
| if (block_avail == 0) { |
| break; |
| } |
| |
| memcpy(output_string + output_len, block_start, block_avail); |
| output_len += block_avail; |
| |
| /* Consume the data so that we get to the next block */ |
| INKIOBufferReaderConsume(reader, block_avail); |
| |
| /* Get the next block now that we've consumed the |
| data off the last block */ |
| block = INKIOBufferReaderStart(reader); |
| } |
| |
| /* Terminate the string */ |
| output_string[output_len] = '\0'; |
| output_len++; |
| |
| /* Free up the INKIOBuffer that we used to print out the header */ |
| INKIOBufferReaderFree(reader); |
| INKIOBufferDestroy(output_buffer); |
| |
| return output_string; |
| } |
| |
| REGRESSION_TEST(SDK_API_INKUrl) (RegressionTest * test, int atype, int *pstatus) |
| { |
| NOWARN_UNUSED(atype); |
| INKMBuffer bufp1 = (INKMBuffer) INK_ERROR_PTR; |
| INKMBuffer bufp2 = (INKMBuffer) INK_ERROR_PTR; |
| INKMBuffer bufp3 = (INKMBuffer) INK_ERROR_PTR; |
| INKMLoc url_loc1; |
| INKMLoc url_loc2; |
| INKMLoc url_loc3; |
| const char *scheme = INK_URL_SCHEME_HTTP; |
| const char *scheme_get; |
| const char *user = "yyy"; |
| const char *user_get; |
| const char *password = "xxx"; |
| const char *password_get; |
| const char *host = "www.example.com"; |
| const char *host_get; |
| int port = 2021; |
| char port_char[10]; |
| int port_get = 80; |
| const char *path = "about/overview.html"; |
| const char *path_get; |
| const char *params = "abcdef"; |
| const char *params_get; |
| const char *query = "name=xxx"; |
| const char *query_get; |
| const char *fragment = "yyy"; |
| const char *fragment_get; |
| char *url_expected_string; |
| char *url_string_from_1 = (char *) INK_ERROR_PTR; |
| char *url_string_from_2 = (char *) INK_ERROR_PTR; |
| char *url_string_from_3 = (char *) INK_ERROR_PTR; |
| char *url_string_from_print = (char *) INK_ERROR_PTR; |
| int url_expected_length; |
| int url_length_from_1; |
| int url_length_from_2; |
| int type = 'a'; |
| int type_get; |
| |
| bool test_passed_create = false; |
| bool test_passed_destroy = false; |
| bool test_passed_scheme = false; |
| bool test_passed_user = false; |
| bool test_passed_password = false; |
| bool test_passed_host = false; |
| bool test_passed_port = false; |
| bool test_passed_path = false; |
| bool test_passed_params = false; |
| bool test_passed_query = false; |
| bool test_passed_fragment = false; |
| bool test_passed_copy = false; |
| bool test_passed_clone = false; |
| bool test_passed_string1 = false; |
| bool test_passed_string2 = false; |
| bool test_passed_print = false; |
| bool test_passed_length1 = false; |
| bool test_passed_length2 = false; |
| bool test_passed_type = false; |
| |
| int length; |
| |
| *pstatus = REGRESSION_TEST_INPROGRESS; |
| |
| //Initialization |
| memset(port_char, 0, 10); |
| snprintf(port_char, sizeof(port_char), "%d", port); |
| |
| // HTTP URL |
| |
| url_expected_length = strlen(scheme) + strlen("://") + |
| ((user == NULL) ? 0 : strlen(user)) + |
| ((password == NULL) ? ((user == NULL) ? 0 : strlen("@")) : strlen(":") + strlen(password) + strlen("@")) + |
| strlen(host) + |
| ((port == 80) ? 0 : strlen(port_char) + strlen(":")) + |
| strlen("/") + strlen(path) + |
| ((params == NULL) ? 0 : strlen(";") + strlen(params)) + |
| ((query == NULL) ? 0 : strlen("?") + strlen(query)) + ((fragment == NULL) ? 0 : strlen("#") + strlen(fragment)); |
| |
| size_t len = url_expected_length + 1; |
| url_expected_string = (char *) INKmalloc(len * sizeof(char)); |
| memset(url_expected_string, 0, url_expected_length + 1); |
| snprintf(url_expected_string, len, "%s://%s%s%s%s%s%s%s/%s%s%s%s%s%s%s", |
| scheme, |
| ((user == NULL) ? "" : user), |
| ((password == NULL) ? "" : ":"), |
| ((password == NULL) ? "" : password), |
| (((user == NULL) && (password == NULL)) ? "" : "@"), |
| host, |
| ((port == 80) ? "" : ":"), |
| ((port == 80) ? "" : port_char), |
| ((path == NULL) ? "" : path), |
| ((params == NULL) ? "" : ";"), |
| ((params == NULL) ? "" : params), |
| ((query == NULL) ? "" : "?"), |
| ((query == NULL) ? "" : query), ((fragment == NULL) ? "" : "#"), ((fragment == NULL) ? "" : fragment) |
| ); |
| |
| |
| // Set Functions |
| |
| if ((bufp1 = INKMBufferCreate()) == INK_ERROR_PTR) { |
| // Cannot proceed with tests. |
| SDK_RPRINT(test, "INKMBufferCreate", "TestCase1", TC_FAIL, "unable to allocate MBuffer."); |
| goto print_results; |
| }; |
| if ((url_loc1 = INKUrlCreate(bufp1)) == INK_ERROR_PTR) { |
| // Cannot proceed with tests. |
| SDK_RPRINT(test, "INKUrlCreate", "TestCase1", TC_FAIL, "unable to create URL within buffer."); |
| goto print_results; |
| } |
| //Scheme |
| if (INKUrlSchemeSet(bufp1, url_loc1, scheme, -1) != INK_SUCCESS) { |
| SDK_RPRINT(test, "INKUrlSchemeSet", "TestCase1", TC_FAIL, "INKUrlSchemeSet Returned INK_ERROR"); |
| } else { |
| if ((scheme_get = INKUrlSchemeGet(bufp1, url_loc1, &length)) == INK_ERROR_PTR) { |
| SDK_RPRINT(test, "INKUrlSchemeSet|Get", "TestCase1", TC_FAIL, "INKUrlSchemeGet Returned INK_ERROR_PTR"); |
| } else { |
| if (strcmp(scheme_get, scheme) == 0) { |
| SDK_RPRINT(test, "INKUrlSchemeSet&Get", "TestCase1", TC_PASS, "ok"); |
| test_passed_scheme = true; |
| } else { |
| SDK_RPRINT(test, "INKUrlSchemeSet&Get", "TestCase1", TC_FAIL, "Values don't match"); |
| } |
| if (INKHandleStringRelease(bufp1, url_loc1, scheme_get) != INK_SUCCESS) { |
| SDK_RPRINT(test, "INKHandleStringRelease", "", TC_FAIL, |
| "Unable to relase handle to string acquired using INKUrlSchemeGet"); |
| } |
| } |
| } |
| |
| //User |
| if (INKUrlUserSet(bufp1, url_loc1, user, -1) != INK_SUCCESS) { |
| SDK_RPRINT(test, "INKUrlUserSet", "TestCase1", TC_FAIL, "Returned INK_ERROR"); |
| } else { |
| if ((user_get = INKUrlUserGet(bufp1, url_loc1, &length)) == INK_ERROR_PTR) { |
| SDK_RPRINT(test, "INKUrlUserSet|Get", "TestCase1", TC_FAIL, "INKUrlUserGet Returned INK_ERROR_PTR"); |
| } else { |
| if (((user_get == NULL) && (user == NULL)) || (strcmp(user_get, user) == 0)) { |
| SDK_RPRINT(test, "INKUrlUserSet&Get", "TestCase1", TC_PASS, "ok"); |
| test_passed_user = true; |
| } else { |
| SDK_RPRINT(test, "INKUrlUserSet&Get", "TestCase1", TC_FAIL, "Values don't match"); |
| } |
| if (INKHandleStringRelease(bufp1, url_loc1, user_get) != INK_SUCCESS) { |
| SDK_RPRINT(test, "INKHandleStringRelease", "", TC_FAIL, |
| "Unable to relase handle to string acquired by INKUrlUserGet"); |
| } |
| } |
| } |
| |
| // Password |
| if (INKUrlPasswordSet(bufp1, url_loc1, password, -1) != INK_SUCCESS) { |
| SDK_RPRINT(test, "INKUrlPasswordSet", "TestCase1", TC_FAIL, "Returned INK_ERROR"); |
| } else { |
| if ((password_get = INKUrlPasswordGet(bufp1, url_loc1, &length)) == INK_ERROR_PTR) { |
| SDK_RPRINT(test, "INKUrlPasswordSet|Get", "TestCase1", TC_FAIL, "INKUrlPasswordGet Returned INK_ERROR_PTR"); |
| } else { |
| if (((password_get == NULL) && (password == NULL)) || (strcmp(password_get, password) == 0)) { |
| SDK_RPRINT(test, "INKUrlPasswordSet&Get", "TestCase1", TC_PASS, "ok"); |
| test_passed_password = true; |
| } else { |
| SDK_RPRINT(test, "INKUrlPasswordSet&Get", "TestCase1", TC_FAIL, "Values don't match"); |
| } |
| if (INKHandleStringRelease(bufp1, url_loc1, password_get) != INK_SUCCESS) { |
| SDK_RPRINT(test, "INKHandleStringRelease", "", TC_FAIL, |
| "Unable to release handle to string acquired by INKUrlPasswordGet"); |
| } |
| } |
| } |
| |
| //Host |
| if (INKUrlHostSet(bufp1, url_loc1, host, -1) != INK_SUCCESS) { |
| SDK_RPRINT(test, "INKUrlHostSet", "TestCase1", TC_FAIL, "Returned INK_ERROR"); |
| } else { |
| if ((host_get = INKUrlHostGet(bufp1, url_loc1, &length)) == INK_ERROR_PTR) { |
| SDK_RPRINT(test, "INKUrlHostSet|Get", "TestCase1", TC_FAIL, "INKUrlHostGet Returned INK_ERROR_PTR"); |
| } else { |
| if (strcmp(host_get, host) == 0) { |
| SDK_RPRINT(test, "INKUrlHostSet&Get", "TestCase1", TC_PASS, "ok"); |
| test_passed_host = true; |
| } else { |
| SDK_RPRINT(test, "INKUrlHostSet&Get", "TestCase1", TC_FAIL, "Values don't match"); |
| } |
| if (INKHandleStringRelease(bufp1, url_loc1, host_get) != INK_SUCCESS) { |
| SDK_RPRINT(test, "INKHandleStringRelease", "", TC_FAIL, |
| "Unable to relase handle to string acquired by INKUrlHostGet"); |
| } |
| } |
| } |
| |
| //Port |
| if (INKUrlPortSet(bufp1, url_loc1, port) != INK_SUCCESS) { |
| SDK_RPRINT(test, "INKUrlPortSet", "TestCase1", TC_FAIL, "Returned INK_ERROR"); |
| } else { |
| port_get = 80; |
| if ((port_get = INKUrlPortGet(bufp1, url_loc1)) == INK_ERROR) { |
| SDK_RPRINT(test, "INKUrlPortSet|Get", "TestCase1", TC_FAIL, "INKUrlPortGet Returned INK_ERROR"); |
| } else { |
| if (port_get == port) { |
| SDK_RPRINT(test, "INKUrlPortSet&Get", "TestCase1", TC_PASS, "ok"); |
| test_passed_port = true; |
| } else { |
| SDK_RPRINT(test, "INKUrlPortSet&Get", "TestCase1", TC_FAIL, "Values don't match"); |
| } |
| } |
| } |
| |
| //Path |
| if (INKUrlPathSet(bufp1, url_loc1, path, -1) != INK_SUCCESS) { |
| SDK_RPRINT(test, "INKUrlPathSet", "TestCase1", TC_FAIL, "Returned INK_ERROR"); |
| } else { |
| if ((path_get = INKUrlPathGet(bufp1, url_loc1, &length)) == INK_ERROR_PTR) { |
| SDK_RPRINT(test, "INKUrlPathSet|Get", "TestCase1", TC_FAIL, "INKUrlPathGet Returned INK_ERROR_PTR"); |
| } else { |
| if (((path == NULL) && (path_get == NULL)) || (strcmp(path, path_get) == 0)) { |
| SDK_RPRINT(test, "INKUrlPathSet&Get", "TestCase1", TC_PASS, "ok"); |
| test_passed_path = true; |
| } else { |
| SDK_RPRINT(test, "INKUrlPathSet&Get", "TestCase1", TC_FAIL, "Values don't match"); |
| } |
| if (INKHandleStringRelease(bufp1, url_loc1, path_get) != INK_SUCCESS) { |
| SDK_RPRINT(test, "INKHandleStringRelease", "", TC_FAIL, |
| "Unable to relase handle to string acquired by INKUrlPathGet"); |
| } |
| } |
| } |
| |
| //Params |
| if (INKUrlHttpParamsSet(bufp1, url_loc1, params, -1) != INK_SUCCESS) { |
| SDK_RPRINT(test, "INKUrlHttpParamsSet", "TestCase1", TC_FAIL, "Returned INK_ERROR"); |
| } else { |
| if ((params_get = INKUrlHttpParamsGet(bufp1, url_loc1, &length)) == INK_ERROR_PTR) { |
| SDK_RPRINT(test, "INKUrlHttpParamsSet|Get", "TestCase1", TC_FAIL, "INKUrlHttpParamsGet Returned INK_ERROR_PTR"); |
| } else { |
| if (((params == NULL) && (params_get == NULL)) || (strcmp(params, params_get) == 0)) { |
| SDK_RPRINT(test, "INKUrlHttpParamsSet&Get", "TestCase1", TC_PASS, "ok"); |
| test_passed_params = true; |
| } else { |
| SDK_RPRINT(test, "INKUrlHttpParamsSet&Get", "TestCase1", TC_FAIL, "Values don't match"); |
| } |
| if (INKHandleStringRelease(bufp1, url_loc1, params_get) != INK_SUCCESS) { |
| SDK_RPRINT(test, "INKHandleStringRelease", "", TC_FAIL, |
| "Unable to relase handle to string acquired by INKUrlParamsGet"); |
| } |
| } |
| } |
| |
| //Query |
| if (INKUrlHttpQuerySet(bufp1, url_loc1, query, -1) != INK_SUCCESS) { |
| SDK_RPRINT(test, "INKUrlHttpQuerySet", "TestCase1", TC_FAIL, "Returned INK_ERROR"); |
| } else { |
| if ((query_get = INKUrlHttpQueryGet(bufp1, url_loc1, &length)) == INK_ERROR_PTR) { |
| SDK_RPRINT(test, "INKUrlHttpQuerySet|Get", "TestCase1", TC_FAIL, "INKUrlHttpQueryGet Returned INK_ERROR_PTR"); |
| } else { |
| if (((query == NULL) && (query_get == NULL)) || (strcmp(query, query_get) == 0)) { |
| SDK_RPRINT(test, "INKUrlHttpQuerySet&Get", "TestCase1", TC_PASS, "ok"); |
| test_passed_query = true; |
| } else { |
| SDK_RPRINT(test, "INKUrlHttpQuerySet&Get", "TestCase1", TC_FAIL, "Values don't match"); |
| } |
| if (INKHandleStringRelease(bufp1, url_loc1, query_get) != INK_SUCCESS) { |
| SDK_RPRINT(test, "INKHandleStringRelease", "", TC_FAIL, |
| "Unable to relase handle to string acquired by INKUrlQueryGet"); |
| } |
| } |
| } |
| |
| //Fragments |
| if (INKUrlHttpFragmentSet(bufp1, url_loc1, fragment, -1) != INK_SUCCESS) { |
| SDK_RPRINT(test, "INKUrlHttpFragmentSet", "TestCase1", TC_FAIL, "Returned INK_ERROR"); |
| } else { |
| if ((fragment_get = INKUrlHttpFragmentGet(bufp1, url_loc1, &length)) == INK_ERROR_PTR) { |
| SDK_RPRINT(test, "INKUrlHttpFragmentSet|Get", "TestCase1", TC_FAIL, |
| "INKUrlHttpFragmentGet Returned INK_ERROR_PTR"); |
| } else { |
| if (((fragment == NULL) && (fragment_get == NULL)) || (strcmp(fragment, fragment_get) == 0)) { |
| SDK_RPRINT(test, "INKUrlHttpFragmentSet&Get", "TestCase1", TC_PASS, "ok"); |
| test_passed_fragment = true; |
| } else { |
| SDK_RPRINT(test, "INKUrlHttpFragmentSet&Get", "TestCase1", TC_FAIL, "Values don't match"); |
| } |
| if (INKHandleStringRelease(bufp1, url_loc1, fragment_get) != INK_SUCCESS) { |
| SDK_RPRINT(test, "INKHandleStringRelease", "", TC_FAIL, |
| "Unable to relase handle to string acquired by INKUrlFragmentGet"); |
| } |
| } |
| } |
| |
| //Length |
| if ((url_length_from_1 = INKUrlLengthGet(bufp1, url_loc1)) == INK_ERROR) { |
| SDK_RPRINT(test, "INKUrlLengthGet", "TestCase1", TC_FAIL, "Returns INK_ERROR"); |
| } else { |
| if (url_length_from_1 == url_expected_length) { |
| SDK_RPRINT(test, "INKUrlLengthGet", "TestCase1", TC_PASS, "ok"); |
| test_passed_length1 = true; |
| } else { |
| SDK_RPRINT(test, "INKUrlLengthGet", "TestCase1", TC_FAIL, "Values don't match"); |
| } |
| } |
| |
| |
| //String |
| if ((url_string_from_1 = INKUrlStringGet(bufp1, url_loc1, NULL)) == INK_ERROR_PTR) { |
| SDK_RPRINT(test, "INKUrlStringGet", "TestCase1", TC_FAIL, "Returns INK_ERROR_PTR"); |
| } else { |
| if (strcmp(url_string_from_1, url_expected_string) == 0) { |
| SDK_RPRINT(test, "INKUrlStringGet", "TestCase1", TC_PASS, "ok"); |
| test_passed_string1 = true; |
| } else { |
| SDK_RPRINT(test, "INKUrlStringGet", "TestCase1", TC_FAIL, "Values don't match"); |
| } |
| } |
| |
| |
| //Copy |
| if ((bufp2 = INKMBufferCreate()) == INK_ERROR_PTR) { |
| // Cannot proceed with tests. |
| SDK_RPRINT(test, "INKMBufferCreate", "TestCase2", TC_FAIL, "unable to allocate MBuffer for INKUrlCopy."); |
| goto print_results; |
| }; |
| if ((url_loc2 = INKUrlCreate(bufp2)) == INK_ERROR_PTR) { |
| // Cannot proceed with tests. |
| SDK_RPRINT(test, "INKUrlCreate", "TestCase2", TC_FAIL, "unable to create URL within buffer for INKUrlCopy."); |
| goto print_results; |
| } |
| if (INKUrlCopy(bufp2, url_loc2, bufp1, url_loc1) == INK_ERROR) { |
| SDK_RPRINT(test, "INKUrlCopy", "TestCase1", TC_FAIL, "Returned INK_ERROR"); |
| } else { |
| //Length Test Case 2 |
| if ((url_length_from_2 = INKUrlLengthGet(bufp2, url_loc2)) == INK_ERROR) { |
| SDK_RPRINT(test, "INKUrlLengthGet", "TestCase2", TC_FAIL, "Returns INK_ERROR"); |
| } else { |
| if (url_length_from_2 == url_expected_length) { |
| SDK_RPRINT(test, "INKUrlLengthGet", "TestCase2", TC_PASS, "ok"); |
| test_passed_length2 = true; |
| } else { |
| SDK_RPRINT(test, "INKUrlCopy", "TestCase1", TC_FAIL, "Values don't match"); |
| } |
| } |
| |
| |
| //String Test Case 2 |
| if ((url_string_from_2 = INKUrlStringGet(bufp2, url_loc2, NULL)) == INK_ERROR_PTR) { |
| SDK_RPRINT(test, "INKUrlStringGet", "TestCase2", TC_FAIL, "Returns INK_ERROR_PTR"); |
| } else { |
| if (strcmp(url_string_from_2, url_expected_string) == 0) { |
| SDK_RPRINT(test, "INKUrlStringGet", "TestCase2", TC_PASS, "ok"); |
| test_passed_string2 = true; |
| } else { |
| SDK_RPRINT(test, "INKUrlStringGet", "TestCase2", TC_FAIL, "Values don't match"); |
| } |
| } |
| |
| // Copy Test Case |
| if (strcmp(url_string_from_1, url_string_from_2) == 0) { |
| SDK_RPRINT(test, "INKUrlCopy", "TestCase1", TC_PASS, "ok"); |
| test_passed_copy = true; |
| } else { |
| SDK_RPRINT(test, "INKUrlCopy", "TestCase1", TC_FAIL, "Values Don't Match"); |
| } |
| } |
| |
| //Clone |
| if ((bufp3 = INKMBufferCreate()) == INK_ERROR_PTR) { |
| // Cannot proceed with tests. |
| SDK_RPRINT(test, "INKMBufferCreate", "TestCase2", TC_FAIL, "unable to allocate MBuffer for INKUrlClone."); |
| goto print_results; |
| }; |
| if ((url_loc3 = INKUrlClone(bufp3, bufp1, url_loc1)) == INK_ERROR_PTR) { |
| SDK_RPRINT(test, "INKUrlClone", "TestCase1", TC_FAIL, "Returned INK_ERROR_PTR"); |
| } else { |
| //String Test Case 2 |
| if ((url_string_from_3 = INKUrlStringGet(bufp3, url_loc3, NULL)) == INK_ERROR_PTR) { |
| SDK_RPRINT(test, "INKUrlClone", "TestCase2", TC_FAIL, "INKUrlStringGet Returns INK_ERROR_PTR"); |
| } else { |
| // Copy Test Case |
| if (strcmp(url_string_from_1, url_string_from_3) == 0) { |
| SDK_RPRINT(test, "INKUrlClone", "TestCase1", TC_PASS, "ok"); |
| test_passed_clone = true; |
| } else { |
| SDK_RPRINT(test, "INKUrlClone", "TestCase1", TC_FAIL, "Values Don't Match"); |
| } |
| } |
| } |
| |
| //UrlPrint |
| url_string_from_print = test_url_print(bufp1, url_loc1); |
| if (url_string_from_print == NULL) { |
| SDK_RPRINT(test, "INKUrlPrint", "TestCase1", TC_FAIL, "INKUrlPrint doesn't return INK_SUCCESS"); |
| } else { |
| if (strcmp(url_string_from_print, url_expected_string) == 0) { |
| SDK_RPRINT(test, "INKUrlPrint", "TestCase1", TC_PASS, "ok"); |
| test_passed_print = true; |
| } else { |
| SDK_RPRINT(test, "INKUrlPrint", "TestCase1", TC_FAIL, "INKUrlPrint doesn't return INK_SUCCESS"); |
| } |
| INKfree(url_string_from_print); |
| } |
| |
| if (INKUrlFtpTypeSet(bufp1, url_loc1, type) != INK_SUCCESS) { |
| SDK_RPRINT(test, "INKUrlFtpTypeSet", "TestCase1", TC_FAIL, "INKUrlFtpTypeSet Returned INK_ERROR"); |
| } else { |
| if ((type_get = INKUrlFtpTypeGet(bufp1, url_loc1)) == INK_ERROR) { |
| SDK_RPRINT(test, "INKUrlFtpTypeSet|Get", "TestCase1", TC_FAIL, "INKUrlFtpTypeGet Returned INK_ERROR"); |
| } else { |
| if (type_get == type) { |
| SDK_RPRINT(test, "INKUrlFtpTypeSet&Get", "TestCase1", TC_PASS, "ok"); |
| test_passed_type = true; |
| } else { |
| SDK_RPRINT(test, "INKUrlFtpTypeSet&Get", "TestCase1", TC_FAIL, "Values don't match"); |
| } |
| } |
| } |
| |
| |
| if ((INKUrlDestroy(bufp1, url_loc1) == INK_ERROR) && |
| (INKUrlDestroy(bufp2, url_loc2) == INK_ERROR) && (INKUrlDestroy(bufp3, url_loc3) == INK_ERROR) |
| ) { |
| SDK_RPRINT(test, "INKUrlCreate", "TestCase1&2", TC_PASS, "ok"); |
| SDK_RPRINT(test, "INKUrlDestroy", "TestCase1|2|3", TC_FAIL, "Returns INK_ERROR"); |
| } else { |
| SDK_RPRINT(test, "INKUrlCreate", "TestCase1&2", TC_PASS, "ok"); |
| SDK_RPRINT(test, "INKUrlDestroy", "TestCase1&2&3", TC_PASS, "ok"); |
| INKHandleMLocRelease(bufp1, INK_NULL_MLOC, url_loc1); |
| INKHandleMLocRelease(bufp2, INK_NULL_MLOC, url_loc2); |
| INKHandleMLocRelease(bufp3, INK_NULL_MLOC, url_loc3); |
| test_passed_create = true; |
| test_passed_destroy = true; |
| } |
| |
| print_results: |
| INKfree(url_expected_string); |
| if (url_string_from_1 != INK_ERROR_PTR) { |
| INKfree(url_string_from_1); |
| } |
| if (url_string_from_2 != INK_ERROR_PTR) { |
| INKfree(url_string_from_2); |
| } |
| if (url_string_from_3 != INK_ERROR_PTR) { |
| INKfree(url_string_from_3); |
| } |
| if (bufp1 != INK_ERROR_PTR) { |
| INKMBufferDestroy(bufp1); |
| } |
| if (bufp2 != INK_ERROR_PTR) { |
| INKMBufferDestroy(bufp2); |
| } |
| if (bufp3 != INK_ERROR_PTR) { |
| INKMBufferDestroy(bufp3); |
| } |
| if ((test_passed_create == false) || |
| (test_passed_destroy == false) || |
| (test_passed_scheme == false) || |
| (test_passed_user == false) || |
| (test_passed_password == false) || |
| (test_passed_host == false) || |
| (test_passed_port == false) || |
| (test_passed_path == false) || |
| (test_passed_params == false) || |
| (test_passed_query == false) || |
| (test_passed_fragment == false) || |
| (test_passed_copy == false) || |
| (test_passed_clone == false) || |
| (test_passed_string1 == false) || |
| (test_passed_string2 == false) || |
| (test_passed_print == false) || |
| (test_passed_length1 == false) || (test_passed_length2 == false) || (test_passed_type == false) |
| ) { |
| /*** Debugging the test itself.... |
| (test_passed_create == false)?printf("test_passed_create is false\n"):printf(""); |
| (test_passed_destroy == false)?printf("test_passed_destroy is false\n"):printf(""); |
| (test_passed_scheme == false)?printf("test_passed_scheme is false\n"):printf(""); |
| (test_passed_user == false)?printf("test_passed_user is false\n"):printf(""); |
| (test_passed_password == false)?printf("test_passed_password is false\n"):printf(""); |
| (test_passed_host == false)?printf("test_passed_host is false\n"):printf(""); |
| (test_passed_port == false)?printf("test_passed_port is false\n"):printf(""); |
| (test_passed_path == false)?printf("test_passed_path is false\n"):printf(""); |
| (test_passed_params == false)?printf("test_passed_params is false\n"):printf(""); |
| (test_passed_query == false)?printf("test_passed_query is false\n"):printf(""); |
| (test_passed_fragment == false)?printf("test_passed_fragment is false\n"):printf(""); |
| (test_passed_copy == false)?printf("test_passed_copy is false\n"):printf(""); |
| (test_passed_string1 == false)?printf("test_passed_string1 is false\n"):printf(""); |
| (test_passed_string2 == false)?printf("test_passed_string2 is false\n"):printf(""); |
| (test_passed_length1 == false)?printf("test_passed_length1 is false\n"):printf(""); |
| (test_passed_length2 == false)?printf("test_passed_length2 is false\n"):printf(""); |
| (test_passed_type == false)?printf("test_passed_type is false\n"):printf(""); |
| .....***********/ |
| *pstatus = REGRESSION_TEST_FAILED; |
| } else { |
| *pstatus = REGRESSION_TEST_PASSED; |
| } |
| } |
| |
| ////////////////////////////////////////////// |
| // SDK_API_INKHttpHdr |
| // |
| // Unit Test for API: INKHttpHdrCreate |
| // INKHttpHdrCopy |
| // INKHttpHdrClone |
| // INKHttpHdrDestroy |
| // INKHttpHdrLengthGet |
| // INKHttpHdrMethodGet |
| // INKHttpHdrMethodSet |
| // INKHttpHdrPrint |
| // INKHttpHdrReasonGet |
| // INKHttpHdrReasonLookup |
| // INKHttpHdrReasonSet |
| // INKHttpHdrStatusGet |
| // INKHttpHdrStatusSet |
| // INKHttpHdrTypeGet |
| // INKHttpHdrUrlGet |
| // INKHttpHdrUrlSet |
| ////////////////////////////////////////////// |
| |
| /** |
| * If you change value of any constant in this function then reflect that change in variable expected_iobuf. |
| */ |
| REGRESSION_TEST(SDK_API_INKHttpHdr) (RegressionTest * test, int atype, int *pstatus) |
| { |
| NOWARN_UNUSED(atype); |
| INKMBuffer bufp1 = (INKMBuffer) INK_ERROR_PTR; |
| INKMBuffer bufp2 = (INKMBuffer) INK_ERROR_PTR; |
| INKMBuffer bufp3 = (INKMBuffer) INK_ERROR_PTR; |
| INKMBuffer bufp4 = (INKMBuffer) INK_ERROR_PTR; |
| |
| INKMLoc hdr_loc1 = (INKMLoc) INK_ERROR_PTR; |
| INKMLoc hdr_loc2 = (INKMLoc) INK_ERROR_PTR; |
| INKMLoc hdr_loc3 = (INKMLoc) INK_ERROR_PTR; |
| INKMLoc hdr_loc4 = (INKMLoc) INK_ERROR_PTR; |
| |
| INKHttpType hdr1type; |
| INKHttpType hdr2type; |
| |
| const char *methodGet; |
| |
| INKMLoc url_loc; |
| INKMLoc url_loc_Get; |
| const char *url_host = "www.example.com"; |
| int url_port = 2345; |
| const char *url_path = "abcd/efg/hij.htm"; |
| |
| const char *response_reason = "aefa"; |
| const char *response_reason_get; |
| |
| INKHttpStatus status_get; |
| |
| int version_major = 2; |
| int version_minor = 1; |
| int version_get; |
| |
| /* INKHttpType type1; unused: lv */ |
| /* INKHttpType type2; unused: lv */ |
| const char *method1; |
| const char *method2; |
| int length1; |
| int length2; |
| INKMLoc url_loc1; |
| INKMLoc url_loc2; |
| /* int version1; unused: lv */ |
| /* int version2; unused: lv */ |
| |
| int length; |
| const char *expected_iobuf = "GET http://www.example.com:2345/abcd/efg/hij.htm HTTP/2.1\r\n\r\n"; |
| int actual_length; |
| int expected_length; |
| bool test_passed_Http_Hdr_Create = false; |
| bool test_passed_Http_Hdr_Type = false; |
| bool test_passed_Http_Hdr_Method = false; |
| bool test_passed_Http_Hdr_Url = false; |
| bool test_passed_Http_Hdr_Status = false; |
| bool test_passed_Http_Hdr_Reason = false; |
| bool test_passed_Http_Hdr_Reason_Lookup = false; |
| bool test_passed_Http_Hdr_Version = false; |
| bool test_passed_Http_Hdr_Copy = false; |
| bool test_passed_Http_Hdr_Clone = false; |
| bool test_passed_Http_Hdr_Length = false; |
| bool test_passed_Http_Hdr_Print = false; |
| bool test_passed_Http_Hdr_Destroy = false; |
| bool try_print_function = true; |
| bool test_buffer_created = true; |
| |
| |
| *pstatus = REGRESSION_TEST_INPROGRESS; |
| |
| if (((bufp1 = INKMBufferCreate()) == INK_ERROR_PTR) || |
| ((bufp2 = INKMBufferCreate()) == INK_ERROR_PTR) || |
| ((bufp3 = INKMBufferCreate()) == INK_ERROR_PTR) || ((bufp4 = INKMBufferCreate()) == INK_ERROR_PTR) |
| ) { |
| SDK_RPRINT(test, "INKHttpHdr", "All Test Cases", TC_FAIL, |
| "INKMBufferCreate returns INK_ERROR_PTR. Cannot test the functions"); |
| test_buffer_created = true; |
| } |
| // Create |
| if (test_buffer_created == true) { |
| if (((hdr_loc1 = INKHttpHdrCreate(bufp1)) == INK_ERROR_PTR) || |
| ((hdr_loc2 = INKHttpHdrCreate(bufp2)) == INK_ERROR_PTR) || |
| ((hdr_loc3 = INKHttpHdrCreate(bufp3)) == INK_ERROR_PTR) |
| ) { |
| SDK_RPRINT(test, "INKHttpHdrCreate", "TestCase1|2|3", TC_FAIL, "INKHttpHdrCreate returns INK_ERROR_PTR."); |
| } else { |
| SDK_RPRINT(test, "INKHttpHdrCreate", "TestCase1&2&3", TC_PASS, "ok"); |
| test_passed_Http_Hdr_Create = true; |
| } |
| } else { |
| SDK_RPRINT(test, "INKHttpHdrCreate", "All Test Cases", TC_FAIL, "Cannot run test as unable to allocate MBuffers"); |
| } |
| |
| |
| // Type |
| if (test_passed_Http_Hdr_Create == true) { |
| if ((INKHttpHdrTypeSet(bufp1, hdr_loc1, INK_HTTP_TYPE_REQUEST) == INK_ERROR) || |
| (INKHttpHdrTypeSet(bufp2, hdr_loc2, INK_HTTP_TYPE_RESPONSE) == INK_ERROR) |
| ) { |
| SDK_RPRINT(test, "INKHttpHdrTypeSet", "TestCase1|2", TC_FAIL, "INKHttpHdrTypeSet returns INK_ERROR"); |
| } else { |
| if (((hdr1type = INKHttpHdrTypeGet(bufp1, hdr_loc1)) == (INKHttpType) INK_ERROR) || |
| ((hdr2type = INKHttpHdrTypeGet(bufp2, hdr_loc2)) == (INKHttpType) INK_ERROR) |
| ) { |
| SDK_RPRINT(test, "INKHttpHdrTypeSet&Get", "TestCase1|2", TC_FAIL, "INKHttpHdrTypeGet returns INK_ERROR"); |
| } else { |
| if ((hdr1type == INK_HTTP_TYPE_REQUEST) && (hdr2type == INK_HTTP_TYPE_RESPONSE)) { |
| SDK_RPRINT(test, "INKHttpHdrTypeSet&Get", "TestCase1&2", TC_PASS, "ok"); |
| test_passed_Http_Hdr_Type = true; |
| } else { |
| SDK_RPRINT(test, "INKHttpHdrTypeSet&Get", "TestCase1&2", TC_FAIL, "Values mismatch"); |
| } |
| } |
| } |
| } else { |
| SDK_RPRINT(test, "INKHttpHdrTypeSet&Get", "All Test Case", TC_FAIL, |
| "Cannot run test as Header Creation Test failed"); |
| } |
| |
| // Method |
| if (test_passed_Http_Hdr_Type == true) { |
| if (INKHttpHdrMethodSet(bufp1, hdr_loc1, INK_HTTP_METHOD_GET, -1) == INK_ERROR) { |
| SDK_RPRINT(test, "INKHttpHdrMethodSet&Get", "TestCase1", TC_FAIL, "INKHttpHdrMethodSet returns INK_ERROR"); |
| } else { |
| if ((methodGet = INKHttpHdrMethodGet(bufp1, hdr_loc1, &length)) == INK_ERROR_PTR) { |
| SDK_RPRINT(test, "INKHttpHdrMethodSet&Get", "TestCase1", TC_FAIL, "INKHttpHdrMethodGet retuns INK_ERROR_PTR"); |
| } else { |
| if ((strncmp(methodGet, INK_HTTP_METHOD_GET, length) == 0) && (length == (int) strlen(INK_HTTP_METHOD_GET))) { |
| SDK_RPRINT(test, "INKHttpHdrMethodSet&Get", "TestCase1", TC_PASS, "ok"); |
| test_passed_Http_Hdr_Method = true; |
| } else { |
| SDK_RPRINT(test, "INKHttpHdrMethodSet&Get", "TestCase1", TC_FAIL, "Value's mismatch"); |
| } |
| if (INKHandleStringRelease(bufp1, hdr_loc1, methodGet) == INK_ERROR) { |
| SDK_RPRINT(test, "INKHandleStringRelease", "", TC_FAIL, |
| "Unable to release handle acquired by INKHttpHdrMethodGet"); |
| } |
| } |
| } |
| } else { |
| SDK_RPRINT(test, "INKHttpHdrMethodSet&Get", "All Test Case", TC_FAIL, |
| "Cannot run test as Header's Type cannot be set"); |
| } |
| |
| // Url |
| if (test_passed_Http_Hdr_Type == true) { |
| if ((url_loc = INKUrlCreate(bufp1)) == INK_ERROR_PTR) { |
| SDK_RPRINT(test, "INKHttpHdrUrlSet&Get", "TestCase1", TC_FAIL, |
| "Cannot run test as INKUrlCreate returns INK_ERROR_PTR"); |
| } else { |
| if (INKHttpHdrUrlSet(bufp1, hdr_loc1, url_loc) == INK_ERROR) { |
| SDK_RPRINT(test, "INKHttpHdrUrlSet&Get", "TestCase1", TC_FAIL, "INKHttpHdrUrlSet returns INK_ERROR"); |
| } else { |
| if ((url_loc_Get = INKHttpHdrUrlGet(bufp1, hdr_loc1)) == INK_ERROR_PTR) { |
| SDK_RPRINT(test, "INKHttpHdrUrlSet&Get", "TestCase1", TC_FAIL, "INKHttpHdrUrlGet retuns INK_ERROR_PTR"); |
| } else { |
| if (url_loc == url_loc_Get) { |
| SDK_RPRINT(test, "INKHttpHdrUrlSet&Get", "TestCase1", TC_PASS, "ok"); |
| test_passed_Http_Hdr_Url = true; |
| } else { |
| SDK_RPRINT(test, "INKHttpHdrUrlSet&Get", "TestCase1", TC_FAIL, "Value's mismatch"); |
| } |
| if (INKHandleMLocRelease(bufp1, hdr_loc1, url_loc_Get) == INK_ERROR) { |
| SDK_RPRINT(test, "INKHandleMLocRelease", "", TC_FAIL, "Unable to release handle to URL"); |
| } |
| } |
| } |
| |
| // Fill up the URL for Copy Test Case. |
| if (INKUrlSchemeSet(bufp1, url_loc, INK_URL_SCHEME_HTTP, -1) == INK_ERROR) { |
| SDK_RPRINT(test, "INKUrlSchemeSet", "", TC_FAIL, "Unable to set scheme in URL in the HTTP Header"); |
| try_print_function = false; |
| } |
| if (INKUrlHostSet(bufp1, url_loc, url_host, -1) == INK_ERROR) { |
| SDK_RPRINT(test, "INKUrlHostSet", "", TC_FAIL, "Unable to set host in URL in the HTTP Header"); |
| try_print_function = false; |
| } |
| if (INKUrlPortSet(bufp1, url_loc, url_port) == INK_ERROR) { |
| SDK_RPRINT(test, "INKUrlPortSet", "", TC_FAIL, "Unable to set port in URL in the HTTP Header"); |
| try_print_function = false; |
| } |
| if (INKUrlPathSet(bufp1, url_loc, url_path, -1) == INK_ERROR) { |
| SDK_RPRINT(test, "INKUrlPathSet", "", TC_FAIL, "Unable to set path in URL in the HTTP Header"); |
| try_print_function = false; |
| } |
| if (INKHandleMLocRelease(bufp1, hdr_loc1, url_loc) == INK_ERROR) { |
| SDK_RPRINT(test, "INKHandleMLocRelease", "", TC_FAIL, "Unable to release handle to URL"); |
| } |
| } |
| } else { |
| SDK_RPRINT(test, "INKHttpHdrUrlSet&Get", "All Test Case", TC_FAIL, |
| "Cannot run test as Header's Type cannot be set"); |
| } |
| |
| // Reason |
| if (test_passed_Http_Hdr_Type == true) { |
| if (INKHttpHdrReasonSet(bufp2, hdr_loc2, response_reason, -1) == INK_ERROR) { |
| SDK_RPRINT(test, "INKHttpHdrReasonSet&Get", "TestCase1", TC_FAIL, "INKHttpHdrReasonSet returns INK_ERROR"); |
| } else { |
| if ((response_reason_get = INKHttpHdrReasonGet(bufp2, hdr_loc2, &length)) == INK_ERROR_PTR) { |
| SDK_RPRINT(test, "INKHttpHdrReasonSet&Get", "TestCase1", TC_FAIL, "INKHttpHdrReasonGet returns INK_ERROR_PTR"); |
| } else { |
| if ((strncmp(response_reason_get, response_reason, length) == 0) && (length == (int) strlen(response_reason))) { |
| SDK_RPRINT(test, "INKHttpHdrReasonSet&Get", "TestCase1", TC_PASS, "ok"); |
| test_passed_Http_Hdr_Reason = true; |
| } else { |
| SDK_RPRINT(test, "INKHttpHdrReasonSet&Get", "TestCase1", TC_FAIL, "Value's mismatch"); |
| } |
| if (INKHandleStringRelease(bufp2, hdr_loc2, response_reason_get) == INK_ERROR) { |
| SDK_RPRINT(test, "INKHandleStringRelease", "", TC_FAIL, |
| "Unable to release handle to string acquired by INKHttpHdrReasonGet"); |
| } |
| } |
| } |
| } else { |
| SDK_RPRINT(test, "INKHttpHdrReasonSet&Get", "All Test Case", TC_FAIL, |
| "Cannot run test as Header's Type cannot be set"); |
| } |
| |
| // Status |
| if (test_passed_Http_Hdr_Type == true) { |
| if (INKHttpHdrStatusSet(bufp2, hdr_loc2, INK_HTTP_STATUS_OK) == INK_ERROR) { |
| SDK_RPRINT(test, "INKHttpHdrStatusSet&Get", "TestCase1", TC_FAIL, "INKHttpHdrStatusSet returns INK_ERROR"); |
| } else { |
| if ((status_get = INKHttpHdrStatusGet(bufp2, hdr_loc2)) == (INKHttpStatus) INK_ERROR) { |
| SDK_RPRINT(test, "INKHttpHdrStatusSet&Get", "TestCase1", TC_FAIL, "INKHttpHdrStatusGet returns INK_ERROR"); |
| } else { |
| if (status_get == INK_HTTP_STATUS_OK) { |
| SDK_RPRINT(test, "INKHttpHdrStatusSet&Get", "TestCase1", TC_PASS, "ok"); |
| test_passed_Http_Hdr_Status = true; |
| } else { |
| SDK_RPRINT(test, "INKHttpHdrStatusSet&Get", "TestCase1", TC_FAIL, "Value's mismatch"); |
| } |
| } |
| } |
| } else { |
| SDK_RPRINT(test, "INKHttpHdrStatusSet&Get", "All Test Case", TC_FAIL, |
| "Cannot run test as Header's Type cannot be set"); |
| } |
| |
| //Version |
| if (test_passed_Http_Hdr_Type == true) { |
| if (INKHttpHdrVersionSet(bufp1, hdr_loc1, INK_HTTP_VERSION(version_major, version_minor)) == INK_ERROR) { |
| SDK_RPRINT(test, "INKHttpHdrVersionSet&Get", "TestCase1", TC_FAIL, "INKHttpHdrVersionSet returns INK_ERROR"); |
| } else { |
| if ((version_get = INKHttpHdrVersionGet(bufp1, hdr_loc1)) == INK_ERROR) { |
| SDK_RPRINT(test, "INKHttpHdrVersionSet&Get", "TestCase1", TC_FAIL, "INKHttpHdrVersionGet returns INK_ERROR"); |
| } else { |
| if ((version_major == INK_HTTP_MAJOR(version_get)) && (version_minor == INK_HTTP_MINOR(version_get))) { |
| SDK_RPRINT(test, "INKHttpHdrVersionSet&Get", "TestCase1", TC_PASS, "ok"); |
| test_passed_Http_Hdr_Version = true; |
| } else { |
| SDK_RPRINT(test, "INKHttpHdrVersionSet&Get", "TestCase1", TC_FAIL, "Value's mismatch"); |
| } |
| } |
| } |
| } else { |
| SDK_RPRINT(test, "INKHttpHdrVersionSet&Get", "All Test Case", TC_FAIL, |
| "Cannot run test as Header's Type cannot be set"); |
| } |
| |
| if (test_passed_Http_Hdr_Version == true) { |
| if (INKHttpHdrVersionSet(bufp2, hdr_loc2, INK_HTTP_VERSION(version_major, version_minor)) == INK_ERROR) { |
| SDK_RPRINT(test, "INKHttpHdrVersionSet&Get", "TestCase2", TC_FAIL, "INKHttpHdrVersionSet returns INK_ERROR"); |
| test_passed_Http_Hdr_Version = false; |
| } else { |
| if ((version_get = INKHttpHdrVersionGet(bufp2, hdr_loc2)) == INK_ERROR) { |
| SDK_RPRINT(test, "INKHttpHdrVersionSet&Get", "TestCase2", TC_FAIL, "INKHttpHdrVersionGet returns INK_ERROR"); |
| test_passed_Http_Hdr_Version = false; |
| } else { |
| if ((version_major == INK_HTTP_MAJOR(version_get)) && (version_minor == INK_HTTP_MINOR(version_get))) { |
| SDK_RPRINT(test, "INKHttpHdrVersionSet&Get", "TestCase2", TC_PASS, "ok"); |
| } else { |
| SDK_RPRINT(test, "INKHttpHdrVersionSet&Get", "TestCase2", TC_FAIL, "Value's mismatch"); |
| test_passed_Http_Hdr_Version = false; |
| } |
| } |
| } |
| } |
| //Reason Lookup |
| if (strcmp("None", INKHttpHdrReasonLookup(INK_HTTP_STATUS_NONE)) != 0) { |
| SDK_RPRINT(test, "INKHttpHdrReasonLookup", "TestCase1", TC_FAIL, |
| "INKHttpHdrReasonLookup returns INK_ERROR_PTR or Value's mismatch"); |
| } else { |
| SDK_RPRINT(test, "INKHttpHdrReasonLookup", "TestCase1", TC_PASS, "ok"); |
| test_passed_Http_Hdr_Reason_Lookup = true; |
| } |
| |
| if (strcmp("Ok", INKHttpHdrReasonLookup(INK_HTTP_STATUS_OK)) != 0) { |
| SDK_RPRINT(test, "INKHttpHdrReasonLookup", "TestCase2", TC_FAIL, |
| "INKHttpHdrReasonLookup returns INK_ERROR_PTR or Value's mismatch"); |
| if (test_passed_Http_Hdr_Reason_Lookup == true) { |
| test_passed_Http_Hdr_Reason_Lookup = false; |
| } |
| } else { |
| SDK_RPRINT(test, "INKHttpHdrReasonLookup", "TestCase2", TC_PASS, "ok"); |
| } |
| |
| if (strcmp("Continue", INKHttpHdrReasonLookup(INK_HTTP_STATUS_CONTINUE)) != 0) { |
| SDK_RPRINT(test, "INKHttpHdrReasonLookup", "TestCase3", TC_FAIL, |
| "INKHttpHdrReasonLookup returns INK_ERROR_PTR or Value's mismatch"); |
| if (test_passed_Http_Hdr_Reason_Lookup == true) { |
| test_passed_Http_Hdr_Reason_Lookup = false; |
| } |
| } else { |
| SDK_RPRINT(test, "INKHttpHdrReasonLookup", "TestCase3", TC_PASS, "ok"); |
| } |
| |
| if (strcmp("Not Modified", INKHttpHdrReasonLookup(INK_HTTP_STATUS_NOT_MODIFIED)) != 0) { |
| SDK_RPRINT(test, "INKHttpHdrReasonLookup", "TestCase2", TC_FAIL, |
| "INKHttpHdrReasonLookup returns INK_ERROR_PTR or Value's mismatch"); |
| if (test_passed_Http_Hdr_Reason_Lookup == true) { |
| test_passed_Http_Hdr_Reason_Lookup = false; |
| } |
| } else { |
| SDK_RPRINT(test, "INKHttpHdrReasonLookup", "TestCase4", TC_PASS, "ok"); |
| } |
| |
| // Copy |
| if (test_passed_Http_Hdr_Create == true) { |
| if (INKHttpHdrCopy(bufp3, hdr_loc3, bufp1, hdr_loc1) == INK_ERROR) { |
| SDK_RPRINT(test, "INKHttpHdrCopy", "TestCase1", TC_FAIL, "INKHttpHdrCopy returns INK_ERROR"); |
| } else { |
| |
| bool flag = true; |
| // Check the type |
| if (flag == true) { |
| INKHttpType type1; |
| INKHttpType type2; |
| |
| if (((type1 = INKHttpHdrTypeGet(bufp1, hdr_loc1)) == (INKHttpType) INK_ERROR) || |
| ((type2 = INKHttpHdrTypeGet(bufp3, hdr_loc3)) == (INKHttpType) INK_ERROR) |
| ) { |
| SDK_RPRINT(test, "INKHttpHdrCopy", "TestCase1", TC_FAIL, "INKHttpTypeGet returns INK_ERROR."); |
| flag = false; |
| } else { |
| if (type1 != type2) { |
| SDK_RPRINT(test, "INKHttpHdrCopy", "TestCase1", TC_FAIL, "Type mismatch in both headers"); |
| flag = false; |
| } |
| } |
| } |
| // Check the Version |
| if (flag == true) { |
| int version1; |
| int version2; |
| |
| if (((version1 = INKHttpHdrVersionGet(bufp1, hdr_loc1)) == INK_ERROR) || |
| ((version2 = INKHttpHdrVersionGet(bufp3, hdr_loc3)) == INK_ERROR) |
| ) { |
| SDK_RPRINT(test, "INKHttpHdrCopy", "TestCase1", TC_FAIL, "INKHttpVersionGet returns INK_ERROR"); |
| flag = false; |
| } else { |
| if (version1 != version2) { |
| SDK_RPRINT(test, "INKHttpHdrCopy", "TestCase1", TC_FAIL, "Version mismatch in both headers"); |
| flag = false; |
| } |
| } |
| } |
| // Check the Method |
| if (flag == true) { |
| |
| if (((method1 = INKHttpHdrMethodGet(bufp1, hdr_loc1, &length1)) == INK_ERROR_PTR) || |
| ((method2 = INKHttpHdrMethodGet(bufp3, hdr_loc3, &length2)) == INK_ERROR_PTR) |
| ) { |
| SDK_RPRINT(test, "INKHttpHdrCopy", "TestCase1", TC_FAIL, "INKHttpVersionGet returns INK_ERROR"); |
| flag = false; |
| } else { |
| if ((length1 != length2) || (strncmp(method1, method2, length1) != 0)) { |
| SDK_RPRINT(test, "INKHttpHdrCopy", "TestCase1", TC_FAIL, "Method mismatch in both headers"); |
| flag = false; |
| } |
| if (INKHandleStringRelease(bufp1, hdr_loc1, method1) == INK_ERROR) { |
| SDK_RPRINT(test, "INKHandleStringRelease", "", TC_FAIL, |
| "Error in releasing handle acquired using INKHttpHdrMethodGet"); |
| } |
| if (INKHandleStringRelease(bufp3, hdr_loc3, method2) == INK_ERROR) { |
| SDK_RPRINT(test, "INKHandleStringRelease", "", TC_FAIL, |
| "Error in releasing handle acquired using INKHttpHdrMethodGet"); |
| } |
| } |
| } |
| // Check the URL |
| if (flag == true) { |
| |
| if (((url_loc1 = INKHttpHdrUrlGet(bufp1, hdr_loc1)) == INK_ERROR_PTR) || |
| ((url_loc2 = INKHttpHdrUrlGet(bufp3, hdr_loc3)) == INK_ERROR_PTR) |
| ) { |
| SDK_RPRINT(test, "INKHttpHdrCopy", "TestCase1", TC_FAIL, "INKHttpVersionGet returns INK_ERROR"); |
| flag = false; |
| } else { |
| const char *scheme1; |
| const char *scheme2; |
| |
| const char *host1; |
| const char *host2; |
| |
| int port1; |
| int port2; |
| |
| const char *path1; |
| const char *path2; |
| |
| // URL Scheme |
| if (((scheme1 = INKUrlSchemeGet(bufp1, url_loc1, &length1)) == INK_ERROR_PTR) || |
| ((scheme2 = INKUrlSchemeGet(bufp3, url_loc2, &length2)) == INK_ERROR_PTR) |
| ) { |
| SDK_RPRINT(test, "INKHttpHdrCopy", "TestCase1", TC_FAIL, "INKUrlSchemeGet returns INK_ERROR_PTR"); |
| flag = false; |
| } else { |
| if ((length1 != length2) || (strncmp(scheme1, scheme2, length1) != 0)) { |
| SDK_RPRINT(test, "INKHttpHdrCopy", "TestCase1", TC_FAIL, |
| "Url Scheme has different values in both headers"); |
| flag = false; |
| } |
| if ((INKHandleStringRelease(bufp1, url_loc1, scheme1) == INK_ERROR) || |
| (INKHandleStringRelease(bufp3, url_loc2, scheme2) == INK_ERROR) |
| ) { |
| SDK_RPRINT(test, "INKHandleStringRelease", "", TC_FAIL, |
| "Error in releasing handle acquired using INKUrlSchemeGet."); |
| } |
| } |
| |
| |
| |
| // URL Host |
| if (flag == true) { |
| if (((host1 = INKUrlHostGet(bufp1, url_loc1, &length1)) == INK_ERROR_PTR) || |
| ((host2 = INKUrlHostGet(bufp3, url_loc2, &length2)) == INK_ERROR_PTR) |
| ) { |
| SDK_RPRINT(test, "INKHttpHdrCopy", "TestCase1", TC_FAIL, "INKUrlHostGet returns INK_ERROR_PTR"); |
| flag = false; |
| } else { |
| if ((length1 != length2) || (strncmp(host1, host2, length1) != 0)) { |
| SDK_RPRINT(test, "INKHttpHdrCopy", "TestCase1", TC_FAIL, |
| "Url Host has different values in both headers"); |
| flag = false; |
| } |
| if ((INKHandleStringRelease(bufp1, url_loc1, host1) == INK_ERROR) || |
| (INKHandleStringRelease(bufp3, url_loc2, host2) == INK_ERROR) |
| ) { |
| SDK_RPRINT(test, "INKHandleStringRelease", "", TC_FAIL, |
| "Error in releasing handle acquired using INKUrlHostGet"); |
| } |
| } |
| } |
| // URL Port |
| if (flag == true) { |
| if (((port1 = INKUrlPortGet(bufp1, url_loc1)) == INK_ERROR) || |
| ((port2 = INKUrlPortGet(bufp3, url_loc2)) == INK_ERROR) |
| ) { |
| SDK_RPRINT(test, "INKHttpHdrCopy", "TestCase1", TC_FAIL, "INKUrlPortGet returns INK_ERROR"); |
| flag = false; |
| } else { |
| if (port1 != port2) { |
| SDK_RPRINT(test, "INKHttpHdrCopy", "TestCase1", TC_FAIL, |
| "Url Port has different values in both headers"); |
| flag = false; |
| } |
| } |
| } |
| // URL Path |
| if (flag == true) { |
| if (((path1 = INKUrlPathGet(bufp1, url_loc1, &length1)) == INK_ERROR_PTR) || |
| ((path2 = INKUrlPathGet(bufp3, url_loc2, &length2)) == INK_ERROR_PTR) |
| ) { |
| SDK_RPRINT(test, "INKHttpHdrCopy", "TestCase1", TC_FAIL, "INKUrlPathGet returns INK_ERROR_PTR"); |
| flag = false; |
| } else { |
| if ((path1 != NULL) && (path2 != NULL)) { |
| if ((length1 != length2) || (strncmp(path1, path2, length1) != 0)) { |
| SDK_RPRINT(test, "INKHttpHdrCopy", "TestCase1", TC_FAIL, |
| "Url Path has different values in both headers"); |
| flag = false; |
| } |
| if ((INKHandleStringRelease(bufp1, url_loc1, path1) == INK_ERROR) || |
| (INKHandleStringRelease(bufp3, url_loc2, path2) == INK_ERROR) |
| ) { |
| SDK_RPRINT(test, "INKHandleStringRelease", "", TC_FAIL, |
| "Error in releasing handle acquired using INKUrlPathGet"); |
| } |
| } else { |
| if (path1 != path2) { |
| SDK_RPRINT(test, "INKHttpHdrCopy", "TestCase1", TC_FAIL, |
| "Url Host has different values in both headers"); |
| flag = false; |
| } |
| } |
| } |
| if ((INKHandleMLocRelease(bufp1, hdr_loc1, url_loc1) == INK_ERROR) || |
| (INKHandleMLocRelease(bufp3, hdr_loc3, url_loc2) == INK_ERROR) |
| ) { |
| SDK_RPRINT(test, "INKHandleMLocRelease", "", TC_FAIL, |
| "Unable to release Handle acquired by INKHttpHdrUrlGet"); |
| } |
| } |
| |
| if (flag == true) { |
| SDK_RPRINT(test, "INKHttpHdrCopy", "TestCase1", TC_PASS, "ok"); |
| test_passed_Http_Hdr_Copy = true; |
| } |
| } |
| } |
| } |
| } else { |
| SDK_RPRINT(test, "INKHttpHdrCopy", "All Test Cases", TC_PASS, "Cannot run test as INKHttpHdrCreate has failed"); |
| } |
| |
| // Clone |
| if (test_passed_Http_Hdr_Create == true) { |
| if ((hdr_loc4 = INKHttpHdrClone(bufp4, bufp1, hdr_loc1)) == INK_ERROR_PTR) { |
| SDK_RPRINT(test, "INKHttpHdrClone", "TestCase1", TC_FAIL, "INKHttpHdrClone returns INK_ERROR_PTR"); |
| } else { |
| |
| bool flag = true; |
| // Check the type |
| if (flag == true) { |
| INKHttpType type1; |
| INKHttpType type2; |
| |
| if (((type1 = INKHttpHdrTypeGet(bufp1, hdr_loc1)) == (INKHttpType) INK_ERROR) || |
| ((type2 = INKHttpHdrTypeGet(bufp4, hdr_loc4)) == (INKHttpType) INK_ERROR) |
| ) { |
| SDK_RPRINT(test, "INKHttpHdrClone", "TestCase1", TC_FAIL, "INKHttpTypeGet returns INK_ERROR."); |
| flag = false; |
| } else { |
| if (type1 != type2) { |
| SDK_RPRINT(test, "INKHttpHdrClone", "TestCase1", TC_FAIL, "Type mismatch in both headers"); |
| flag = false; |
| } |
| } |
| } |
| // Check the Version |
| if (flag == true) { |
| int version1; |
| int version2; |
| |
| if (((version1 = INKHttpHdrVersionGet(bufp1, hdr_loc1)) == INK_ERROR) || |
| ((version2 = INKHttpHdrVersionGet(bufp4, hdr_loc4)) == INK_ERROR) |
| ) { |
| SDK_RPRINT(test, "INKHttpHdrClone", "TestCase1", TC_FAIL, "INKHttpVersionGet returns INK_ERROR"); |
| flag = false; |
| } else { |
| if (version1 != version2) { |
| SDK_RPRINT(test, "INKHttpHdrClone", "TestCase1", TC_FAIL, "Version mismatch in both headers"); |
| flag = false; |
| } |
| } |
| } |
| // Check the Method |
| if (flag == true) { |
| |
| if (((method1 = INKHttpHdrMethodGet(bufp1, hdr_loc1, &length1)) == INK_ERROR_PTR) || |
| ((method2 = INKHttpHdrMethodGet(bufp4, hdr_loc4, &length2)) == INK_ERROR_PTR) |
| ) { |
| SDK_RPRINT(test, "INKHttpHdrClone", "TestCase1", TC_FAIL, "INKHttpVersionGet returns INK_ERROR"); |
| flag = false; |
| } else { |
| if ((length1 != length2) || (strncmp(method1, method2, length1) != 0)) { |
| SDK_RPRINT(test, "INKHttpHdrClone", "TestCase1", TC_FAIL, "Method mismatch in both headers"); |
| flag = false; |
| } |
| if (INKHandleStringRelease(bufp1, hdr_loc1, method1) == INK_ERROR) { |
| SDK_RPRINT(test, "INKHandleStringRelease", "", TC_FAIL, |
| "Error in releasing handle acquired using INKHttpHdrMethodGet"); |
| } |
| if (INKHandleStringRelease(bufp4, hdr_loc4, method2) == INK_ERROR) { |
| SDK_RPRINT(test, "INKHandleStringRelease", "", TC_FAIL, |
| "Error in releasing handle acquired using INKHttpHdrMethodGet"); |
| } |
| } |
| } |
| // Check the URL |
| if (flag == true) { |
| |
| if (((url_loc1 = INKHttpHdrUrlGet(bufp1, hdr_loc1)) == INK_ERROR_PTR) || |
| ((url_loc2 = INKHttpHdrUrlGet(bufp4, hdr_loc4)) == INK_ERROR_PTR) |
| ) { |
| SDK_RPRINT(test, "INKHttpHdrClone", "TestCase1", TC_FAIL, "INKHttpVersionGet returns INK_ERROR"); |
| flag = false; |
| } else { |
| const char *scheme1; |
| const char *scheme2; |
| |
| const char *host1; |
| const char *host2; |
| |
| int port1; |
| int port2; |
| |
| const char *path1; |
| const char *path2; |
| |
| // URL Scheme |
| if (((scheme1 = INKUrlSchemeGet(bufp1, url_loc1, &length1)) == INK_ERROR_PTR) || |
| ((scheme2 = INKUrlSchemeGet(bufp4, url_loc2, &length2)) == INK_ERROR_PTR) |
| ) { |
| SDK_RPRINT(test, "INKHttpHdrClone", "TestCase1", TC_FAIL, "INKUrlSchemeGet returns INK_ERROR_PTR"); |
| flag = false; |
| } else { |
| if ((length1 != length2) || (strncmp(scheme1, scheme2, length1) != 0)) { |
| SDK_RPRINT(test, "INKHttpHdrClone", "TestCase1", TC_FAIL, |
| "Url Scheme has different values in both headers"); |
| flag = false; |
| } |
| if ((INKHandleStringRelease(bufp1, url_loc1, scheme1) == INK_ERROR) || |
| (INKHandleStringRelease(bufp4, url_loc2, scheme2) == INK_ERROR) |
| ) { |
| SDK_RPRINT(test, "INKHandleStringRelease", "", TC_FAIL, |
| "Error in releasing handle acquired using INKUrlSchemeGet."); |
| } |
| } |
| |
| |
| |
| // URL Host |
| if (flag == true) { |
| if (((host1 = INKUrlHostGet(bufp1, url_loc1, &length1)) == INK_ERROR_PTR) || |
| ((host2 = INKUrlHostGet(bufp4, url_loc2, &length2)) == INK_ERROR_PTR) |
| ) { |
| SDK_RPRINT(test, "INKHttpHdrClone", "TestCase1", TC_FAIL, "INKUrlHostGet returns INK_ERROR_PTR"); |
| flag = false; |
| } else { |
| if ((length1 != length2) || (strncmp(host1, host2, length1) != 0)) { |
| SDK_RPRINT(test, "INKHttpHdrClone", "TestCase1", TC_FAIL, |
| "Url Host has different values in both headers"); |
| flag = false; |
| } |
| if ((INKHandleStringRelease(bufp1, url_loc1, host1) == INK_ERROR) || |
| (INKHandleStringRelease(bufp4, url_loc2, host2) == INK_ERROR) |
| ) { |
| SDK_RPRINT(test, "INKHandleStringRelease", "", TC_FAIL, |
| "Error in releasing handle acquired using INKUrlHostGet"); |
| } |
| } |
| } |
| // URL Port |
| if (flag == true) { |
| if (((port1 = INKUrlPortGet(bufp1, url_loc1)) == INK_ERROR) || |
| ((port2 = INKUrlPortGet(bufp4, url_loc2)) == INK_ERROR) |
| ) { |
| SDK_RPRINT(test, "INKHttpHdrClone", "TestCase1", TC_FAIL, "INKUrlPortGet returns INK_ERROR"); |
| flag = false; |
| } else { |
| if (port1 != port2) { |
| SDK_RPRINT(test, "INKHttpHdrClone", "TestCase1", TC_FAIL, |
| "Url Port has different values in both headers"); |
| flag = false; |
| } |
| } |
| } |
| // URL Path |
| if (flag == true) { |
| if (((path1 = INKUrlPathGet(bufp1, url_loc1, &length1)) == INK_ERROR_PTR) || |
| ((path2 = INKUrlPathGet(bufp4, url_loc2, &length2)) == INK_ERROR_PTR) |
| ) { |
| SDK_RPRINT(test, "INKHttpHdrClone", "TestCase1", TC_FAIL, "INKUrlPathGet returns INK_ERROR_PTR"); |
| flag = false; |
| } else { |
| if ((path1 != NULL) && (path2 != NULL)) { |
| if ((length1 != length2) || (strncmp(path1, path2, length1) != 0)) { |
| SDK_RPRINT(test, "INKHttpHdrCopy", "TestCase1", TC_FAIL, |
| "Url Path has different values in both headers"); |
| flag = false; |
| } |
| if ((INKHandleStringRelease(bufp1, url_loc1, path1) == INK_ERROR) || |
| (INKHandleStringRelease(bufp4, url_loc2, path2) == INK_ERROR) |
| ) { |
| SDK_RPRINT(test, "INKHandleStringRelease", "", TC_FAIL, |
| "Error in releasing handle acquired using INKUrlPathGet"); |
| } |
| } else { |
| if (path1 != path2) { |
| SDK_RPRINT(test, "INKHttpHdrCopy", "TestCase1", TC_FAIL, |
| "Url Host has different values in both headers"); |
| flag = false; |
| } |
| } |
| } |
| if ((INKHandleMLocRelease(bufp1, hdr_loc1, url_loc1) == INK_ERROR) || |
| (INKHandleMLocRelease(bufp4, hdr_loc4, url_loc2) == INK_ERROR) |
| ) { |
| SDK_RPRINT(test, "INKHandleMLocRelease", "", TC_FAIL, |
| "Unable to release Handle acquired by INKHttpHdrUrlGet"); |
| } |
| } |
| |
| if (flag == true) { |
| SDK_RPRINT(test, "INKHttpHdrClone", "TestCase1", TC_PASS, "ok"); |
| test_passed_Http_Hdr_Clone = true; |
| } |
| } |
| } |
| } |
| } else { |
| SDK_RPRINT(test, "INKHttpHdrClone", "All Test Cases", TC_PASS, "Cannot run test as INKHttpHdrCreate has failed"); |
| } |
| |
| |
| //LengthGet |
| if (test_passed_Http_Hdr_Create == true) { |
| if ((actual_length = INKHttpHdrLengthGet(bufp1, hdr_loc1)) == INK_ERROR) { |
| SDK_RPRINT(test, "INKHttpHdrLengthGet", "TestCase1", TC_FAIL, "INKHttpHdrLengthGet returns INK_ERROR"); |
| } else { |
| INKIOBuffer iobuf; |
| |
| if ((iobuf = INKIOBufferCreate()) == INK_ERROR_PTR) { |
| SDK_RPRINT(test, "INKHttpHdrLengthGet", "TestCase1", TC_FAIL, |
| "Cannot create iobuffer. Cannot continue with test"); |
| } else { |
| if (INKHttpHdrPrint(bufp1, hdr_loc1, iobuf) == INK_ERROR) { |
| SDK_RPRINT(test, "INKHttpHdrLengthGet", "TestCase1", TC_FAIL, "INKHttpHdrPrint returned INK_ERROR"); |
| } else { |
| INKIOBufferReader iobufreader; |
| if ((iobufreader = INKIOBufferReaderAlloc(iobuf)) == INK_ERROR_PTR) { |
| SDK_RPRINT(test, "INKHttpHdrLengthGet", "TestCase1", TC_FAIL, "Cannot allocate a reader to io buffer"); |
| } else { |
| if ((expected_length = INKIOBufferReaderAvail(iobufreader)) == INK_ERROR) { |
| SDK_RPRINT(test, "INKHttpHdrLengthGet", "TestCase1", TC_FAIL, |
| "Cannot calculate the length to be expected."); |
| } else { |
| if (actual_length == expected_length) { |
| SDK_RPRINT(test, "INKHttpHdrLengthGet", "TestCase1", TC_PASS, "ok"); |
| test_passed_Http_Hdr_Length = true; |
| } else { |
| SDK_RPRINT(test, "INKHttpHdrLengthGet", "TestCase1", TC_FAIL, "Incorrect value returned."); |
| } |
| } |
| } |
| |
| // Print. |
| if ((test_passed_Http_Hdr_Method == true) && (test_passed_Http_Hdr_Url == true) && |
| (test_passed_Http_Hdr_Version == true) && (test_passed_Http_Hdr_Length == true) && |
| (try_print_function == true) |
| ) { |
| char *actual_iobuf = NULL; |
| |
| actual_iobuf = (char *) INKmalloc((actual_length + 1) * sizeof(char)); |
| |
| if (actual_iobuf == NULL) { |
| SDK_RPRINT(test, "INKHttpHdrPrint", "TestCase1", TC_FAIL, "Unable to allocate memory"); |
| } else { |
| |
| INKIOBufferBlock iobufblock; |
| int bytes_read; |
| |
| memset(actual_iobuf, 0, (actual_length + 1) * sizeof(char)); |
| bytes_read = 0; |
| |
| iobufblock = INKIOBufferReaderStart(iobufreader); |
| |
| while ((iobufblock != NULL) && (iobufblock != INK_ERROR_PTR)) { |
| const char *block_start; |
| int64 block_size; |
| block_start = INKIOBufferBlockReadStart(iobufblock, iobufreader, &block_size); |
| |
| if ((block_start == INK_ERROR_PTR) || (block_size == 0) || (block_size == INK_ERROR)) { |
| break; |
| } |
| |
| memcpy(actual_iobuf + bytes_read, block_start, block_size); |
| bytes_read += block_size; |
| |
| /* |
| if (INKIOBufferReaderConsume(iobufreader,block_size)==INK_ERROR) { |
| break; |
| } |
| */ |
| INKIOBufferReaderConsume(iobufreader, block_size); |
| iobufblock = INKIOBufferReaderStart(iobufreader); |
| } |
| if (strcmp(actual_iobuf, expected_iobuf) == 0) { |
| SDK_RPRINT(test, "INKHttpHdrPrint", "TestCase1", TC_PASS, "ok"); |
| test_passed_Http_Hdr_Print = true; |
| } else { |
| SDK_RPRINT(test, "INKHttpHdrPrint", "TestCase1", TC_FAIL, "Value's mismatch"); |
| } |
| |
| INKfree(actual_iobuf); |
| /* |
| if ((INKIOBufferReaderFree(iobufreader)==INK_ERROR) || |
| (INKIOBufferDestroy(iobuf)==INK_ERROR) |
| ) { |
| SDK_RPRINT(test,"INKIOBuffer","",TC_FAIL,"Unable to free memory"); |
| } |
| */ |
| INKIOBufferReaderFree(iobufreader); |
| INKIOBufferDestroy(iobuf); |
| } |
| } else { |
| SDK_RPRINT(test, "INKHttpHdrPrint", "TestCase1", TC_FAIL, "Unable to run test for INKHttpHdrPrint"); |
| } |
| |
| } |
| } |
| } |
| } else { |
| SDK_RPRINT(test, "INKHttpHdrLengthGet", "All Test Cases", TC_PASS, |
| "Cannot run test as INKHttpHdrCreate has failed"); |
| } |
| |
| // Destroy |
| if (test_passed_Http_Hdr_Create == true) { |
| if ((INKHttpHdrDestroy(bufp1, hdr_loc1) == INK_ERROR) || |
| (INKHttpHdrDestroy(bufp2, hdr_loc2) == INK_ERROR) || |
| (INKHttpHdrDestroy(bufp3, hdr_loc3) == INK_ERROR) || (INKHttpHdrDestroy(bufp4, hdr_loc4) == INK_ERROR) |
| ) { |
| SDK_RPRINT(test, "INKHttpHdrDestroy", "TestCase1|2|3|4", TC_FAIL, "INKHttpHdrDestroy returns INK_ERROR."); |
| } else { |
| if ((INKHandleMLocRelease(bufp1, INK_NULL_MLOC, hdr_loc1) == INK_ERROR) || |
| (INKHandleMLocRelease(bufp2, INK_NULL_MLOC, hdr_loc2) == INK_ERROR) || |
| (INKHandleMLocRelease(bufp3, INK_NULL_MLOC, hdr_loc3) == INK_ERROR) || |
| (INKHandleMLocRelease(bufp4, INK_NULL_MLOC, hdr_loc4) == INK_ERROR) |
| ) { |
| SDK_RPRINT(test, "INKHandleMLocRelease", "TestCase1|2|3|4", TC_FAIL, "Unable to release the handle to headers"); |
| } |
| SDK_RPRINT(test, "INKHttpHdrDestroy", "TestCase1&2&3&4", TC_PASS, "ok"); |
| test_passed_Http_Hdr_Destroy = true; |
| } |
| } else { |
| SDK_RPRINT(test, "INKHttpHdrDestroy", "All Test Cases", TC_FAIL, "Cannot run test as header was not created"); |
| } |
| |
| if (bufp1 != INK_ERROR_PTR) { |
| if (INKMBufferDestroy(bufp1) == INK_ERROR) { |
| SDK_RPRINT(test, "INKMBufferDestroy", "TestCase1", TC_FAIL, "Unable to destroy MBuffer"); |
| } |
| } |
| |
| if (bufp2 != INK_ERROR_PTR) { |
| if (INKMBufferDestroy(bufp2) == INK_ERROR) { |
| SDK_RPRINT(test, "INKMBufferDestroy", "TestCase2", TC_FAIL, "Unable to destroy MBuffer"); |
| } |
| } |
| |
| if (bufp3 != INK_ERROR_PTR) { |
| if (INKMBufferDestroy(bufp3) == INK_ERROR) { |
| SDK_RPRINT(test, "INKMBufferDestroy", "TestCase3", TC_FAIL, "Unable to destroy MBuffer"); |
| } |
| } |
| |
| if (bufp4 != INK_ERROR_PTR) { |
| if (INKMBufferDestroy(bufp4) == INK_ERROR) { |
| SDK_RPRINT(test, "INKMBufferDestroy", "TestCase4", TC_FAIL, "Unable to destroy MBuffer"); |
| } |
| } |
| |
| if ((test_passed_Http_Hdr_Create == true) && |
| (test_passed_Http_Hdr_Type == true) && |
| (test_passed_Http_Hdr_Method == true) && |
| (test_passed_Http_Hdr_Url == true) && |
| (test_passed_Http_Hdr_Status == true) && |
| (test_passed_Http_Hdr_Reason == true) && |
| (test_passed_Http_Hdr_Reason_Lookup == true) && |
| (test_passed_Http_Hdr_Version == true) && |
| (test_passed_Http_Hdr_Copy == true) && |
| (test_passed_Http_Hdr_Clone == true) && |
| (test_passed_Http_Hdr_Length == true) && |
| (test_passed_Http_Hdr_Print == true) && (test_passed_Http_Hdr_Destroy == true) |
| ) { |
| *pstatus = REGRESSION_TEST_PASSED; |
| } else { |
| *pstatus = REGRESSION_TEST_FAILED; |
| } |
| |
| return; |
| |
| } |
| |
| |
| ////////////////////////////////////////////// |
| // SDK_API_INKMimeHdrField |
| // |
| // Unit Test for API: INKMBufferCreate |
| // INKMBufferDestroy |
| // INKMimeHdrCreate |
| // INKMimeHdrDestroy |
| // INKMimeHdrFieldCreate |
| // INKMimeHdrFieldDestroy |
| // INKMimeHdrFieldFind |
| // INKMimeHdrFieldGet |
| // INKMimeHdrFieldAppend |
| // INKMimeHdrFieldNameGet |
| // INKMimeHdrFieldNameSet |
| // INKMimeHdrFieldNext |
| // INKMimeHdrFieldRetrieve |
| // INKMimeHdrFieldsClear |
| // INKMimeHdrFieldsCount |
| // INKMimeHdrFieldValueAppend |
| // INKMimeHdrFieldValueDelete |
| // INKMimeHdrFieldValueStringGet |
| // INKMimeHdrFieldValueDateGet |
| // INKMimeHdrFieldValueIntGet |
| // INKMimeHdrFieldValueUintGet |
| // INKMimeHdrFieldValueStringInsert |
| // INKMimeHdrFieldValueDateInsert |
| // INKMimeHdrFieldValueIntInsert |
| // INKMimeHdrFieldValueUintInsert |
| // INKMimeHdrFieldValuesClear |
| // INKMimeHdrFieldValuesCount |
| // INKMimeHdrFieldValueStringSet |
| // INKMimeHdrFieldValueDateSet |
| // INKMimeHdrFieldValueIntSet |
| // INKMimeHdrFieldValueUintSet |
| // INKMimeHdrLengthGet |
| // INKMimeHdrPrint |
| ////////////////////////////////////////////// |
| |
| INKReturnCode |
| compare_field_names(RegressionTest * test, INKMBuffer bufp1, INKMLoc mime_loc1, INKMLoc field_loc1, INKMBuffer bufp2, |
| INKMLoc mime_loc2, INKMLoc field_loc2) |
| { |
| const char *name1; |
| const char *name2; |
| int length1; |
| int length2; |
| |
| if ((name1 = INKMimeHdrFieldNameGet(bufp1, mime_loc1, field_loc1, &length1)) == INK_ERROR_PTR) { |
| return INK_ERROR; |
| } |
| |
| if ((name2 = INKMimeHdrFieldNameGet(bufp2, mime_loc2, field_loc2, &length2)) == INK_ERROR_PTR) { |
| if (INKHandleStringRelease(bufp1, field_loc1, name1) == INK_ERROR) { |
| SDK_RPRINT(test, "", "TestCase1", TC_FAIL, "compare_field_names: Unable to release string handle."); |
| } |
| return INK_ERROR; |
| } |
| |
| if ((length1 == length2) && (strncmp(name1, name2, length1) == 0) |
| ) { |
| if ((INKHandleStringRelease(bufp1, field_loc1, name1) == INK_ERROR) || |
| (INKHandleStringRelease(bufp2, field_loc2, name2) == INK_ERROR) |
| ) { |
| SDK_RPRINT(test, "", "TestCase2", TC_FAIL, "compare_field_names: Unable to release string handle."); |
| } |
| return INK_SUCCESS; |
| } else { |
| if ((INKHandleStringRelease(bufp1, field_loc1, name1) == INK_ERROR) || |
| (INKHandleStringRelease(bufp2, field_loc2, name2) == INK_ERROR) |
| ) { |
| SDK_RPRINT(test, "", "TestCase3", TC_FAIL, "compare_field_names: Unable to release string handle."); |
| } |
| return INK_ERROR; |
| } |
| } |
| |
| REGRESSION_TEST(SDK_API_INKMimeHdrField) (RegressionTest * test, int atype, int *pstatus) |
| { |
| NOWARN_UNUSED(atype); |
| INKMBuffer bufp1 = (INKMBuffer) INK_ERROR_PTR; |
| |
| INKMLoc mime_loc1 = (INKMLoc) INK_ERROR_PTR; |
| |
| INKMLoc field_loc11 = (INKMLoc) INK_ERROR_PTR; |
| INKMLoc field_loc12 = (INKMLoc) INK_ERROR_PTR; |
| INKMLoc field_loc13 = (INKMLoc) INK_ERROR_PTR; |
| INKMLoc field_loc14 = (INKMLoc) INK_ERROR_PTR; |
| INKMLoc field_loc15 = (INKMLoc) INK_ERROR_PTR; |
| |
| |
| const char *field1Name = "field1"; |
| const char *field2Name = "field2"; |
| const char *field3Name = "field3"; |
| const char *field4Name = "field4"; |
| const char *field5Name = "field5"; |
| |
| const char *field1NameGet; |
| const char *field2NameGet; |
| const char *field3NameGet; |
| const char *field4NameGet; |
| const char *field5NameGet; |
| |
| int field1NameGetLength; |
| int field2NameGetLength; |
| int field3NameGetLength; |
| int field4NameGetLength; |
| int field5NameGetLength; |
| |
| int field1_length; |
| int field2_length; |
| int field3_length; |
| int field4_length; |
| /* int field5_length; unused: lv */ |
| |
| INKMLoc test_field_loc11 = (INKMLoc) INK_ERROR_PTR; |
| INKMLoc test_field_loc12 = (INKMLoc) INK_ERROR_PTR; |
| INKMLoc test_field_loc13 = (INKMLoc) INK_ERROR_PTR; |
| INKMLoc test_field_loc14 = (INKMLoc) INK_ERROR_PTR; |
| INKMLoc test_field_loc15 = (INKMLoc) INK_ERROR_PTR; |
| |
| int actualNumberOfFields; |
| int numberOfFields; |
| |
| const char *field1Value1 = "field1Value1"; |
| const char *field1Value2 = "field1Value2"; |
| const char *field1Value3 = "field1Value3"; |
| const char *field1Value4 = "field1Value4"; |
| const char *field1Value5 = "field1Value5"; |
| const char *field1ValueNew = "newfieldValue"; |
| |
| const char *field1Value1Get; |
| const char *field1Value2Get; |
| const char *field1Value3Get; |
| const char *field1Value4Get; |
| const char *field1Value5Get; |
| const char *field1ValueNewGet; |
| |
| int lengthField1Value1; |
| int lengthField1Value2; |
| int lengthField1Value3; |
| int lengthField1Value4; |
| int lengthField1Value5; |
| int lengthField1ValueNew; |
| |
| time_t field2Value1 = time(NULL); |
| time_t field2Value1Get; |
| time_t field2ValueNew; |
| time_t field2ValueNewGet; |
| |
| int field3Value1 = 31; |
| int field3Value2 = 32; |
| int field3Value3 = 33; |
| int field3Value4 = 34; |
| int field3Value5 = 35; |
| int field3ValueNew = 30; |
| |
| int field3Value1Get; |
| int field3Value2Get; |
| int field3Value3Get; |
| int field3Value4Get; |
| int field3Value5Get; |
| int field3ValueNewGet; |
| |
| unsigned int field4Value1 = 41; |
| unsigned int field4Value2 = 42; |
| unsigned int field4Value3 = 43; |
| unsigned int field4Value4 = 44; |
| unsigned int field4Value5 = 45; |
| unsigned int field4ValueNew = 40; |
| |
| unsigned int field4Value1Get; |
| unsigned int field4Value2Get; |
| unsigned int field4Value3Get; |
| unsigned int field4Value4Get; |
| unsigned int field4Value5Get; |
| unsigned int field4ValueNewGet; |
| |
| const char *field5Value1 = "field5Value1"; |
| const char *field5Value1Append = "AppendedValue"; |
| const char *fieldValueAppendGet; |
| int lengthFieldValueAppended; |
| int field5Value2 = 52; |
| const char *field5Value3 = "DeleteValue"; |
| const char *fieldValueDeleteGet; |
| int lengthFieldValueDeleteGet; |
| unsigned int field5Value4 = 54; |
| int numberOfValueInField; |
| |
| INKMLoc field_loc; |
| |
| bool test_passed_MBuffer_Create = false; |
| bool test_passed_Mime_Hdr_Create = false; |
| bool test_passed_Mime_Hdr_Field_Create = false; |
| bool test_passed_Mime_Hdr_Field_Name = false; |
| bool test_passed_Mime_Hdr_Field_Append = false; |
| bool test_passed_Mime_Hdr_Field_Get = false; |
| bool test_passed_Mime_Hdr_Field_Next = false; |
| bool test_passed_Mime_Hdr_Fields_Count = false; |
| bool test_passed_Mime_Hdr_Field_Value_String_Insert = false; |
| bool test_passed_Mime_Hdr_Field_Value_String_Get = false; |
| bool test_passed_Mime_Hdr_Field_Value_String_Set = false; |
| bool test_passed_Mime_Hdr_Field_Value_Date_Insert = false; |
| bool test_passed_Mime_Hdr_Field_Value_Date_Get = false; |
| bool test_passed_Mime_Hdr_Field_Value_Date_Set = false; |
| bool test_passed_Mime_Hdr_Field_Value_Int_Insert = false; |
| bool test_passed_Mime_Hdr_Field_Value_Int_Get = false; |
| bool test_passed_Mime_Hdr_Field_Value_Int_Set = false; |
| bool test_passed_Mime_Hdr_Field_Value_Uint_Insert = false; |
| bool test_passed_Mime_Hdr_Field_Value_Uint_Get = false; |
| bool test_passed_Mime_Hdr_Field_Value_Uint_Set = false; |
| bool test_passed_Mime_Hdr_Field_Value_Append = false; |
| bool test_passed_Mime_Hdr_Field_Value_Delete = false; |
| bool test_passed_Mime_Hdr_Field_Values_Clear = false; |
| bool test_passed_Mime_Hdr_Field_Values_Count = false; |
| bool test_passed_Mime_Hdr_Field_Destroy = false; |
| bool test_passed_Mime_Hdr_Fields_Clear = false; |
| bool test_passed_Mime_Hdr_Destroy = false; |
| bool test_passed_MBuffer_Destroy = false; |
| bool test_passed_Mime_Hdr_Field_Length_Get = false; |
| |
| *pstatus = REGRESSION_TEST_INPROGRESS; |
| |
| // INKMBufferCreate |
| if ((bufp1 = INKMBufferCreate()) == INK_ERROR_PTR) { |
| // Cannot proceed with tests. |
| SDK_RPRINT(test, "INKMBufferCreate", "TestCase1", TC_FAIL, "INKMBufferCreate Returns INK_ERROR_PTR"); |
| } else { |
| SDK_RPRINT(test, "INKMBufferCreate", "TestCase1", TC_PASS, "ok"); |
| test_passed_MBuffer_Create = true; |
| } |
| |
| // INKMimeHdrCreate |
| if (test_passed_MBuffer_Create == true) { |
| if ((mime_loc1 = INKMimeHdrCreate(bufp1)) == INK_ERROR_PTR) { |
| SDK_RPRINT(test, "INKMimeHdrCreate", "TestCase1", TC_FAIL, "INKMimeHdrCreate Returns INK_ERROR_PTR"); |
| } else { |
| SDK_RPRINT(test, "INKMimeHdrCreate", "TestCase1", TC_PASS, "ok"); |
| test_passed_Mime_Hdr_Create = true; |
| } |
| } else { |
| SDK_RPRINT(test, "INKMimeHdrCreate", "TestCase1", TC_FAIL, "Cannot run test as Test for INKMBufferCreate Failed"); |
| } |
| |
| // INKMimeHdrFieldCreate |
| if (test_passed_Mime_Hdr_Create == true) { |
| if (((field_loc11 = INKMimeHdrFieldCreate(bufp1, mime_loc1)) == INK_ERROR_PTR) || |
| ((field_loc12 = INKMimeHdrFieldCreate(bufp1, mime_loc1)) == INK_ERROR_PTR) || |
| ((field_loc13 = INKMimeHdrFieldCreate(bufp1, mime_loc1)) == INK_ERROR_PTR) || |
| ((field_loc14 = INKMimeHdrFieldCreate(bufp1, mime_loc1)) == INK_ERROR_PTR) || |
| ((field_loc15 = INKMimeHdrFieldCreate(bufp1, mime_loc1)) == INK_ERROR_PTR) |
| ) { |
| SDK_RPRINT(test, "INKMimeHdrFieldCreate", "TestCase1|2|3|4|5", TC_FAIL, |
| "INKMimeHdrFieldCreate Returns INK_ERROR_PTR"); |
| } else { |
| SDK_RPRINT(test, "INKMimeHdrFieldCreate", "TestCase1|2|3|4|5", TC_PASS, "ok"); |
| test_passed_Mime_Hdr_Field_Create = true; |
| } |
| } else { |
| SDK_RPRINT(test, "INKMimeHdrFieldCreate", "All Test Case", TC_FAIL, |
| "Cannot run test as Test for INKMimeHdrCreate Failed"); |
| } |
| |
| |
| //INKMimeHdrFieldNameGet&Set |
| if (test_passed_Mime_Hdr_Field_Create == true) { |
| if ((INKMimeHdrFieldNameSet(bufp1, mime_loc1, field_loc11, field1Name, -1) == INK_ERROR) || |
| (INKMimeHdrFieldNameSet(bufp1, mime_loc1, field_loc12, field2Name, -1) == INK_ERROR) || |
| (INKMimeHdrFieldNameSet(bufp1, mime_loc1, field_loc13, field3Name, -1) == INK_ERROR) || |
| (INKMimeHdrFieldNameSet(bufp1, mime_loc1, field_loc14, field4Name, -1) == INK_ERROR) || |
| (INKMimeHdrFieldNameSet(bufp1, mime_loc1, field_loc15, field5Name, -1) == INK_ERROR) |
| ) { |
| SDK_RPRINT(test, "INKMimeHdrFieldNameSet", "TestCase1|2|3|4|5", TC_FAIL, |
| "INKMimeHdrFieldNameSet Returns INK_ERROR_PTR"); |
| } else { |
| if (((field1NameGet = |
| INKMimeHdrFieldNameGet(bufp1, mime_loc1, field_loc11, &field1NameGetLength)) == INK_ERROR_PTR) || |
| ((field2NameGet = |
| INKMimeHdrFieldNameGet(bufp1, mime_loc1, field_loc12, &field2NameGetLength)) == INK_ERROR_PTR) || |
| ((field3NameGet = |
| INKMimeHdrFieldNameGet(bufp1, mime_loc1, field_loc13, &field3NameGetLength)) == INK_ERROR_PTR) || |
| ((field4NameGet = |
| INKMimeHdrFieldNameGet(bufp1, mime_loc1, field_loc14, &field4NameGetLength)) == INK_ERROR_PTR) || |
| ((field5NameGet = |
| INKMimeHdrFieldNameGet(bufp1, mime_loc1, field_loc15, &field5NameGetLength)) == INK_ERROR_PTR) |
| ) { |
| SDK_RPRINT(test, "INKMimeHdrFieldNameGet", "TestCase1|2|3|4|5", TC_FAIL, |
| "INKMimeHdrFieldNameGet Returns INK_ERROR_PTR"); |
| SDK_RPRINT(test, "INKMimeHdrFieldNameGet|Set", "TestCase1|2|3|4|5", TC_FAIL, |
| "INKMimeHdrFieldNameGet Returns INK_ERROR_PTR"); |
| } else { |
| if (((strncmp(field1NameGet, field1Name, field1NameGetLength) == 0) && |
| (field1NameGetLength == (int) strlen(field1Name))) && |
| ((strncmp(field2NameGet, field2Name, field2NameGetLength) == 0) && |
| (field2NameGetLength == (int) strlen(field2Name))) && |
| ((strncmp(field3NameGet, field3Name, field3NameGetLength) == 0) && |
| (field3NameGetLength == (int) strlen(field3Name))) && |
| ((strncmp(field4NameGet, field4Name, field4NameGetLength) == 0) && |
| (field4NameGetLength == (int) strlen(field4Name))) && |
| ((strncmp(field5NameGet, field5Name, field5NameGetLength) == 0) && |
| field5NameGetLength == (int) strlen(field5Name)) |
| ) { |
| SDK_RPRINT(test, "INKMimeHdrFieldNameGet&Set", "TestCase1&2&3&4&5", TC_PASS, "ok"); |
| test_passed_Mime_Hdr_Field_Name = true; |
| } else { |
| SDK_RPRINT(test, "INKMimeHdrFieldNameGet&Set", "TestCase1|2|3|4|5", TC_FAIL, "Values Don't Match"); |
| } |
| if ((INKHandleStringRelease(bufp1, field_loc11, field1NameGet) == INK_ERROR) || |
| (INKHandleStringRelease(bufp1, field_loc12, field2NameGet) == INK_ERROR) || |
| (INKHandleStringRelease(bufp1, field_loc13, field3NameGet) == INK_ERROR) || |
| (INKHandleStringRelease(bufp1, field_loc14, field4NameGet) == INK_ERROR) || |
| (INKHandleStringRelease(bufp1, field_loc15, field5NameGet) == INK_ERROR) |
| ) { |
| SDK_RPRINT(test, "INKMimeHdrFieldNameGet&Set", "", TC_FAIL, "Unable to release handle to string"); |
| } |
| } |
| } |
| } else { |
| SDK_RPRINT(test, "INKMimeHdrFieldNameGet&Set", "All Test Case", TC_FAIL, |
| "Cannot run test as Test for INKMBufferFieldCreate Failed"); |
| } |
| |
| |
| |
| |
| // INKMimeHdrFieldAppend, INKMimeHdrFieldGet, INKMimeHdrFieldNext |
| if (test_passed_Mime_Hdr_Field_Name == true) { |
| if ((INKMimeHdrFieldAppend(bufp1, mime_loc1, field_loc11) == INK_ERROR) || |
| (INKMimeHdrFieldAppend(bufp1, mime_loc1, field_loc12) == INK_ERROR) || |
| (INKMimeHdrFieldAppend(bufp1, mime_loc1, field_loc13) == INK_ERROR) || |
| (INKMimeHdrFieldAppend(bufp1, mime_loc1, field_loc14) == INK_ERROR) || |
| (INKMimeHdrFieldAppend(bufp1, mime_loc1, field_loc15) == INK_ERROR) |
| ) { |
| SDK_RPRINT(test, "INKMimeHdrFieldAppend", "TestCase1|2|3|4|5", TC_FAIL, |
| "INKMimeHdrFieldAppend Returns INK_ERROR"); |
| } else { |
| if ((test_field_loc11 = INKMimeHdrFieldGet(bufp1, mime_loc1, 0)) == INK_ERROR_PTR) { |
| SDK_RPRINT(test, "INKMimeHdrFieldAppend", "TestCase1|2|3|4|5", TC_FAIL, |
| "INKMimeHdrFieldGet Returns INK_ERROR_PTR"); |
| SDK_RPRINT(test, "INKMimeHdrFieldNext", "TestCase1", TC_FAIL, |
| "Cannot Test INKMimeHdrFieldNext as INKMimeHdrFieldGet Returns INK_ERROR_PTR"); |
| SDK_RPRINT(test, "INKMimeHdrFieldGet", "TestCase1", TC_FAIL, "INKMimeHdrFieldGet Returns INK_ERROR_PTR"); |
| } else { |
| if (compare_field_names(test, bufp1, mime_loc1, field_loc11, bufp1, mime_loc1, test_field_loc11) == INK_ERROR) { |
| SDK_RPRINT(test, "INKMimeHdrFieldAppend", "TestCase1", TC_FAIL, "Values Don't match"); |
| SDK_RPRINT(test, "INKMimeHdrFieldNext", "TestCase1", TC_FAIL, |
| "Cannot Test INKMimeHdrFieldNext as Values don't match"); |
| SDK_RPRINT(test, "INKMimeHdrFieldGet", "TestCase1", TC_FAIL, "Values Don't match"); |
| } else { |
| SDK_RPRINT(test, "INKMimeHdrFieldAppend", "TestCase1", TC_PASS, "ok"); |
| SDK_RPRINT(test, "INKMimeHdrFieldGet", "TestCase1", TC_PASS, "ok"); |
| test_passed_Mime_Hdr_Field_Append = true; |
| test_passed_Mime_Hdr_Field_Get = true; |
| } |
| } |
| |
| if (test_passed_Mime_Hdr_Field_Append == true) { |
| if ((test_field_loc12 = INKMimeHdrFieldNext(bufp1, mime_loc1, test_field_loc11)) == INK_ERROR_PTR) { |
| SDK_RPRINT(test, "INKMimeHdrFieldAppend", "TestCase2", TC_FAIL, |
| "INKMimeHdrFieldAppend failed as INKMimeHdrFieldNext Returns INK_ERROR_PTR"); |
| SDK_RPRINT(test, "INKMimeHdrFieldNext", "TestCase2", TC_FAIL, "INKMimeHdrFieldNext Returns INK_ERROR_PTR"); |
| SDK_RPRINT(test, "INKMimeHdrFieldGet", "TestCase2", TC_FAIL, |
| "Cannot be sure that INKMimeHdrFieldGet passed as INKMimeHdrFieldNext Returns INK_ERROR_PTR"); |
| test_passed_Mime_Hdr_Field_Append = false; |
| test_passed_Mime_Hdr_Field_Next = false; |
| test_passed_Mime_Hdr_Field_Get = false; |
| } else { |
| if (compare_field_names(test, bufp1, mime_loc1, field_loc12, bufp1, mime_loc1, test_field_loc12) == INK_ERROR) { |
| SDK_RPRINT(test, "INKMimeHdrFieldAppend", "TestCase2", TC_PASS, "Values Don't match"); |
| SDK_RPRINT(test, "INKMimeHdrFieldNext", "TestCase2", TC_PASS, "Values Don't match"); |
| SDK_RPRINT(test, "INKMimeHdrFieldGet", "TestCase2", TC_PASS, "Values Don't match"); |
| test_passed_Mime_Hdr_Field_Append = false; |
| test_passed_Mime_Hdr_Field_Next = false; |
| test_passed_Mime_Hdr_Field_Get = false; |
| } else { |
| SDK_RPRINT(test, "INKMimeHdrFieldAppend", "TestCase2", TC_PASS, "ok"); |
| SDK_RPRINT(test, "INKMimeHdrFieldNext", "TestCase2", TC_PASS, "ok"); |
| SDK_RPRINT(test, "INKMimeHdrFieldGet", "TestCase2", TC_PASS, "ok"); |
| test_passed_Mime_Hdr_Field_Next = true; |
| } |
| } |
| } |
| |
| if (test_passed_Mime_Hdr_Field_Append == true) { |
| if ((test_field_loc13 = INKMimeHdrFieldNext(bufp1, mime_loc1, test_field_loc12)) == INK_ERROR_PTR) { |
| SDK_RPRINT(test, "INKMimeHdrFieldAppend", "TestCase3", TC_FAIL, |
| "INKMimeHdrFieldNext Returns INK_ERROR. Cannot check."); |
| SDK_RPRINT(test, "INKMimeHdrFieldNext", "TestCase3", TC_FAIL, "INKMimeHdrFieldNext Returns INK_ERROR_PTR"); |
| SDK_RPRINT(test, "INKMimeHdrFieldGet", "TestCase3", TC_FAIL, |
| "Cannot be sure that INKMimeHdrFieldGet passed as INKMimeHdrFieldNext Returns INK_ERROR_PTR"); |
| test_passed_Mime_Hdr_Field_Append = false; |
| test_passed_Mime_Hdr_Field_Next = false; |
| test_passed_Mime_Hdr_Field_Get = false; |
| } else { |
| if (compare_field_names(test, bufp1, mime_loc1, field_loc13, bufp1, mime_loc1, test_field_loc13) == INK_ERROR) { |
| SDK_RPRINT(test, "INKMimeHdrFieldAppend", "TestCase3", TC_FAIL, "Values Don't match"); |
| SDK_RPRINT(test, "INKMimeHdrFieldNext", "TestCase3", TC_FAIL, "Values Don't match"); |
| SDK_RPRINT(test, "INKMimeHdrFieldGet", "TestCase3", TC_FAIL, "Values Don't match"); |
| test_passed_Mime_Hdr_Field_Append = false; |
| test_passed_Mime_Hdr_Field_Next = false; |
| test_passed_Mime_Hdr_Field_Get = false; |
| } else { |
| SDK_RPRINT(test, "INKMimeHdrFieldAppend", "TestCase3", TC_PASS, "ok"); |
| SDK_RPRINT(test, "INKMimeHdrFieldNext", "TestCase3", TC_PASS, "ok"); |
| SDK_RPRINT(test, "INKMimeHdrFieldGet", "TestCase3", TC_PASS, "ok"); |
| } |
| } |
| } |
| |
| if (test_passed_Mime_Hdr_Field_Append == true) { |
| if ((test_field_loc14 = INKMimeHdrFieldNext(bufp1, mime_loc1, test_field_loc13)) == INK_ERROR_PTR) { |
| SDK_RPRINT(test, "INKMimeHdrFieldAppend", "TestCase4", TC_FAIL, |
| "INKMimeHdrFieldNext Returns INK_ERROR. Cannot check."); |
| SDK_RPRINT(test, "INKMimeHdrFieldNext", "TestCase4", TC_FAIL, "INKMimeHdrFieldNext Returns INK_ERROR_PTR"); |
| SDK_RPRINT(test, "INKMimeHdrFieldAppend", "TestCase4", TC_FAIL, |
| "Cannot be sure that INKMimeHdrFieldGet passed as INKMimeHdrFieldNext Returns INK_ERROR."); |
| test_passed_Mime_Hdr_Field_Append = false; |
| test_passed_Mime_Hdr_Field_Next = false; |
| test_passed_Mime_Hdr_Field_Get = false; |
| } else { |
| if (compare_field_names(test, bufp1, mime_loc1, field_loc14, bufp1, mime_loc1, test_field_loc14) == INK_ERROR) { |
| SDK_RPRINT(test, "INKMimeHdrFieldAppend", "TestCase4", TC_FAIL, "Values Don't match"); |
| SDK_RPRINT(test, "INKMimeHdrFieldNext", "TestCase4", TC_FAIL, "Values Don't match"); |
| SDK_RPRINT(test, "INKMimeHdrFieldGet", "TestCase4", TC_FAIL, "Values Don't match"); |
| test_passed_Mime_Hdr_Field_Append = false; |
| test_passed_Mime_Hdr_Field_Next = false; |
| test_passed_Mime_Hdr_Field_Get = false; |
| } else { |
| SDK_RPRINT(test, "INKMimeHdrFieldAppend", "TestCase4", TC_PASS, "ok"); |
| SDK_RPRINT(test, "INKMimeHdrFieldNext", "TestCase4", TC_PASS, "ok"); |
| SDK_RPRINT(test, "INKMimeHdrFieldGet", "TestCase4", TC_PASS, "ok"); |
| } |
| } |
| } |
| |
| if (test_passed_Mime_Hdr_Field_Append == true) { |
| if ((test_field_loc15 = INKMimeHdrFieldNext(bufp1, mime_loc1, test_field_loc14)) == INK_ERROR_PTR) { |
| SDK_RPRINT(test, "INKMimeHdrFieldNext", "TestCase5", TC_FAIL, "INKMimeHdrFieldNext Returns INK_ERROR_PTR"); |
| SDK_RPRINT(test, "INKMimeHdrFieldAppend", "TestCase5", TC_FAIL, |
| "INKMimeHdrFieldNext Returns INK_ERROR. Cannot check."); |
| test_passed_Mime_Hdr_Field_Append = false; |
| test_passed_Mime_Hdr_Field_Next = false; |
| test_passed_Mime_Hdr_Field_Get = false; |
| } else { |
| if (compare_field_names(test, bufp1, mime_loc1, field_loc15, bufp1, mime_loc1, test_field_loc15) == INK_ERROR) { |
| SDK_RPRINT(test, "INKMimeHdrFieldAppend", "TestCase5", TC_FAIL, "Values Don't match"); |
| SDK_RPRINT(test, "INKMimeHdrFieldNext", "TestCase5", TC_FAIL, "Values Don't match"); |
| test_passed_Mime_Hdr_Field_Append = false; |
| test_passed_Mime_Hdr_Field_Next = false; |
| test_passed_Mime_Hdr_Field_Get = false; |
| } else { |
| SDK_RPRINT(test, "INKMimeHdrFieldAppend", "TestCase5", TC_PASS, "ok"); |
| SDK_RPRINT(test, "INKMimeHdrFieldNext", "TestCase5", TC_PASS, "ok"); |
| } |
| } |
| } |
| |
| if ((INKHandleMLocRelease(bufp1, mime_loc1, test_field_loc11) == INK_ERROR) || |
| (INKHandleMLocRelease(bufp1, mime_loc1, test_field_loc12) == INK_ERROR) || |
| (INKHandleMLocRelease(bufp1, mime_loc1, test_field_loc13) == INK_ERROR) || |
| (INKHandleMLocRelease(bufp1, mime_loc1, test_field_loc14) == INK_ERROR) || |
| (INKHandleMLocRelease(bufp1, mime_loc1, test_field_loc15) == INK_ERROR) |
| ) { |
| SDK_RPRINT(test, "INKMimeHdrFieldAppend/Next/Get", "", TC_FAIL, |
| "Unable to release handle using INKHandleMLocRelease. Can be bad handle."); |
| } |
| } |
| } else { |
| SDK_RPRINT(test, "INKMimeHdrFieldAppend & INKMimeHdrFieldNext", "All Test Case", TC_FAIL, |
| "Cannot run test as Test for INKMimeHdrFieldNameGet&Set Failed"); |
| } |
| |
| |
| //INKMimeHdrFieldsCount |
| if (test_passed_Mime_Hdr_Field_Create == true) { |
| if ((numberOfFields = INKMimeHdrFieldsCount(bufp1, mime_loc1)) == INK_ERROR) { |
| SDK_RPRINT(test, "INKMimeHdrFieldsCount", "TestCase1", TC_FAIL, "INKMimeHdrFieldsCount Returns INK_ERROR"); |
| } else { |
| actualNumberOfFields = 0; |
| if ((field_loc = INKMimeHdrFieldGet(bufp1, mime_loc1, actualNumberOfFields)) == INK_ERROR_PTR) { |
| SDK_RPRINT(test, "INKMimeHdrFieldsCount", "TestCase1", TC_FAIL, "INKMimeHdrFieldGet Returns INK_ERROR_PTR"); |
| } else { |
| while (field_loc != NULL) { |
| INKMLoc next_field_loc; |
| |
| actualNumberOfFields++; |
| if ((next_field_loc = INKMimeHdrFieldNext(bufp1, mime_loc1, field_loc)) == INK_ERROR_PTR) { |
| SDK_RPRINT(test, "INKMimeHdrFieldsCount", "TestCase1", TC_FAIL, |
| "INKMimeHdrFieldNext Returns INK_ERROR_PTR"); |
| } |
| if (INKHandleMLocRelease(bufp1, mime_loc1, field_loc) == INK_ERROR) { |
| SDK_RPRINT(test, "INKMimeHdrFieldsCount", "TestCase1", TC_FAIL, |
| "Unable to release handle using INKHandleMLocRelease"); |
| } |
| field_loc = next_field_loc; |
| next_field_loc = NULL; |
| } |
| if (actualNumberOfFields == numberOfFields) { |
| SDK_RPRINT(test, "INKMimeHdrFieldsCount", "TestCase1", TC_PASS, "ok"); |
| test_passed_Mime_Hdr_Fields_Count = true; |
| } else { |
| SDK_RPRINT(test, "INKMimeHdrFieldsCount", "TestCase1", TC_FAIL, "Value's Dont match"); |
| } |
| } |
| } |
| } else { |
| SDK_RPRINT(test, "INKMimeHdrFieldsCount", "TestCase1", TC_FAIL, "Cannot run Test as INKMimeHdrFieldCreate failed"); |
| } |
| |
| // INKMimeHdrFieldValueStringInsert, INKMimeHdrFieldValueStringGet, INKMimeHdrFieldValueStringSet |
| if (test_passed_Mime_Hdr_Field_Create == true) { |
| if ((INKMimeHdrFieldValueStringInsert(bufp1, mime_loc1, field_loc11, -1, field1Value2, -1) == INK_ERROR) || |
| (INKMimeHdrFieldValueStringInsert(bufp1, mime_loc1, field_loc11, 0, field1Value1, -1) == INK_ERROR) || |
| (INKMimeHdrFieldValueStringInsert(bufp1, mime_loc1, field_loc11, -1, field1Value5, -1) == INK_ERROR) || |
| (INKMimeHdrFieldValueStringInsert(bufp1, mime_loc1, field_loc11, 2, field1Value4, -1) == INK_ERROR) || |
| (INKMimeHdrFieldValueStringInsert(bufp1, mime_loc1, field_loc11, 2, field1Value3, -1) == INK_ERROR) |
| ) { |
| SDK_RPRINT(test, "INKMimeHdrFieldValueStringInsert", "TestCase1|2|3|4|5", TC_FAIL, |
| "INKMimeHdrFieldValueStringInsert Returns INK_ERROR"); |
| SDK_RPRINT(test, "INKMimeHdrFieldValueStringGet", "TestCase1&2&3&4&5", TC_FAIL, |
| "Cannot run Test as INKMimeHdrFieldValueStringInsert returns INK_ERROR"); |
| SDK_RPRINT(test, "INKMimeHdrFieldValueStringSet", "TestCase1", TC_FAIL, |
| "Cannot run Test as INKMimeHdrFieldValueStringInsert returns INK_ERROR"); |
| } else { |
| if ((INKMimeHdrFieldValueStringGet(bufp1, mime_loc1, field_loc11, 0, &field1Value1Get, &lengthField1Value1) == |
| INK_ERROR) || |
| (INKMimeHdrFieldValueStringGet(bufp1, mime_loc1, field_loc11, 1, &field1Value2Get, &lengthField1Value2) == |
| INK_ERROR) || |
| (INKMimeHdrFieldValueStringGet(bufp1, mime_loc1, field_loc11, 2, &field1Value3Get, &lengthField1Value3) == |
| INK_ERROR) || |
| (INKMimeHdrFieldValueStringGet(bufp1, mime_loc1, field_loc11, 3, &field1Value4Get, &lengthField1Value4) == |
| INK_ERROR) || |
| (INKMimeHdrFieldValueStringGet(bufp1, mime_loc1, field_loc11, 4, &field1Value5Get, &lengthField1Value5) == |
| INK_ERROR) |
| ) { |
| SDK_RPRINT(test, "INKMimeHdrFieldValueStringInsert|Get", "TestCase1|2|3|4|5", TC_FAIL, |
| "INKMimeHdrFieldValueStringGet Returns INK_ERROR"); |
| SDK_RPRINT(test, "INKMimeHdrFieldValueStringSet", "TestCase1", TC_FAIL, |
| "INKMimeHdrFieldValueStringSet cannot be tested as INKMimeHdrFieldValueStringInsert|Get failed"); |
| } else { |
| if (((strncmp(field1Value1Get, field1Value1, lengthField1Value1) == 0) && |
| lengthField1Value1 == (int) strlen(field1Value1)) && |
| ((strncmp(field1Value2Get, field1Value2, lengthField1Value2) == 0) && |
| lengthField1Value2 == (int) strlen(field1Value2)) && |
| ((strncmp(field1Value3Get, field1Value3, lengthField1Value3) == 0) && |
| lengthField1Value3 == (int) strlen(field1Value3)) && |
| ((strncmp(field1Value4Get, field1Value4, lengthField1Value4) == 0) && |
| lengthField1Value4 == (int) strlen(field1Value4)) && |
| ((strncmp(field1Value5Get, field1Value5, lengthField1Value5) == 0) && |
| lengthField1Value5 == (int) strlen(field1Value5)) |
| ) { |
| SDK_RPRINT(test, "INKMimeHdrFieldValueStringInsert", "TestCase1&2&3&4&5", TC_PASS, "ok"); |
| SDK_RPRINT(test, "INKMimeHdrFieldValueStringGet", "TestCase1&2&3&4&5", TC_PASS, "ok"); |
| test_passed_Mime_Hdr_Field_Value_String_Insert = true; |
| test_passed_Mime_Hdr_Field_Value_String_Get = true; |
| |
| if ((INKMimeHdrFieldValueStringSet(bufp1, mime_loc1, field_loc11, 3, field1ValueNew, -1)) == INK_ERROR) { |
| SDK_RPRINT(test, "INKMimeHdrFieldValueStringSet", "TestCase1", TC_FAIL, |
| "INKMimeHdrFieldValueStringSet returns INK_ERROR"); |
| } else { |
| if (INKMimeHdrFieldValueStringGet |
| (bufp1, mime_loc1, field_loc11, 3, &field1ValueNewGet, &lengthField1ValueNew) == INK_ERROR) { |
| SDK_RPRINT(test, "INKMimeHdrFieldValueStringSet", "TestCase1", TC_FAIL, |
| "INKMimeHdrFieldValueStringGet returns INK_ERROR"); |
| } else { |
| if ((strncmp(field1ValueNewGet, field1ValueNew, lengthField1ValueNew) == 0) && |
| (lengthField1ValueNew == (int) strlen(field1ValueNew))) { |
| SDK_RPRINT(test, "INKMimeHdrFieldValueStringSet", "TestCase1", TC_PASS, "ok"); |
| test_passed_Mime_Hdr_Field_Value_String_Set = true; |
| } else { |
| SDK_RPRINT(test, "INKMimeHdrFieldValueStringSet", "TestCase1", TC_FAIL, "Value's Don't match"); |
| } |
| if (INKHandleStringRelease(bufp1, field_loc11, field1ValueNewGet) == INK_ERROR) { |
| SDK_RPRINT(test, "INKMimeHdrFieldValueStringGet", "", TC_FAIL, "Unable to release handle to string"); |
| } |
| } |
| } |
| } else { |
| SDK_RPRINT(test, "INKMimeHdrFieldValueStringInsert", "TestCase1|2|3|4|5", TC_PASS, "Value's Don't Match"); |
| SDK_RPRINT(test, "INKMimeHdrFieldValueStringGet", "TestCase1|2|3|4|5", TC_PASS, "Value's Don't Match"); |
| SDK_RPRINT(test, "INKMimeHdrFieldValueStringSet", "TestCase1", TC_FAIL, |
| "INKMimeHdrFieldValueStringSet cannot be tested as INKMimeHdrFieldValueStringInsert|Get failed"); |
| } |
| if ((INKHandleStringRelease(bufp1, field_loc11, field1Value1Get) == INK_ERROR) || |
| (INKHandleStringRelease(bufp1, field_loc12, field1Value2Get) == INK_ERROR) || |
| (INKHandleStringRelease(bufp1, field_loc13, field1Value3Get) == INK_ERROR) || |
| (INKHandleStringRelease(bufp1, field_loc14, field1Value4Get) == INK_ERROR) || |
| (INKHandleStringRelease(bufp1, field_loc15, field1Value5Get) == INK_ERROR) |
| ) { |
| SDK_RPRINT(test, "INKMimeHdrFieldValueStringInsert&Get", "", TC_FAIL, "Unable to release handle to string"); |
| } |
| } |
| } |
| } else { |
| SDK_RPRINT(test, "INKMimeHdrFieldValueStringInsert&Set&Get", "All", TC_FAIL, |
| "Cannot run Test as INKMimeHdrFieldCreate failed"); |
| } |
| |
| |
| // INKMimeHdrFieldValueDateInsert, INKMimeHdrFieldValueDateGet, INKMimeHdrFieldValueDateSet |
| if (test_passed_Mime_Hdr_Field_Create == true) { |
| if (INKMimeHdrFieldValueDateInsert(bufp1, mime_loc1, field_loc12, field2Value1) == INK_ERROR) { |
| SDK_RPRINT(test, "INKMimeHdrFieldValueDateInsert", "TestCase1", TC_FAIL, |
| "INKMimeHdrFieldValueDateInsert Returns INK_ERROR"); |
| SDK_RPRINT(test, "INKMimeHdrFieldValueDateGet", "TestCase1", TC_FAIL, |
| "Cannot run Test as INKMimeHdrFieldValueDateInsert returns INK_ERROR"); |
| SDK_RPRINT(test, "INKMimeHdrFieldValueDateSet", "TestCase1", TC_FAIL, |
| "Cannot run Test as INKMimeHdrFieldValueDateInsert returns INK_ERROR"); |
| } else { |
| if (INKMimeHdrFieldValueDateGet(bufp1, mime_loc1, field_loc12, &field2Value1Get) == INK_ERROR) { |
| SDK_RPRINT(test, "INKMimeHdrFieldValueDateInsert|Get", "TestCase1", TC_FAIL, |
| "INKMimeHdrFieldValueDateGet Returns INK_ERROR"); |
| SDK_RPRINT(test, "INKMimeHdrFieldValueDateSet", "TestCase1", TC_FAIL, |
| "INKMimeHdrFieldValueDateSet cannot be tested as INKMimeHdrFieldValueDateInsert|Get failed"); |
| } else { |
| if (field2Value1Get == field2Value1) { |
| SDK_RPRINT(test, "INKMimeHdrFieldValueDateInsert", "TestCase1", TC_PASS, "ok"); |
| SDK_RPRINT(test, "INKMimeHdrFieldValueDateGet", "TestCase1", TC_PASS, "ok"); |
| test_passed_Mime_Hdr_Field_Value_Date_Insert = true; |
| test_passed_Mime_Hdr_Field_Value_Date_Get = true; |
| field2ValueNew = time(NULL); |
| if ((INKMimeHdrFieldValueDateSet(bufp1, mime_loc1, field_loc12, field2ValueNew)) == INK_ERROR) { |
| SDK_RPRINT(test, "INKMimeHdrFieldValueDateSet", "TestCase1", TC_FAIL, |
| "INKMimeHdrFieldValueDateSet returns INK_ERROR"); |
| } else { |
| if (INKMimeHdrFieldValueDateGet(bufp1, mime_loc1, field_loc12, &field2ValueNewGet) == INK_ERROR) { |
| SDK_RPRINT(test, "INKMimeHdrFieldValueDateSet", "TestCase1", TC_FAIL, |
| "INKMimeHdrFieldValueDateGet returns INK_ERROR"); |
| } else { |
| if (field2ValueNewGet == field2ValueNew) { |
| SDK_RPRINT(test, "INKMimeHdrFieldValueDateSet", "TestCase1", TC_PASS, "ok"); |
| test_passed_Mime_Hdr_Field_Value_Date_Set = true; |
| } else { |
| SDK_RPRINT(test, "INKMimeHdrFieldValueDateSet", "TestCase1", TC_FAIL, "Value's Don't match"); |
| } |
| } |
| } |
| } else { |
| SDK_RPRINT(test, "INKMimeHdrFieldValueDateInsert", "TestCase1", TC_PASS, "Value's Don't Match"); |
| SDK_RPRINT(test, "INKMimeHdrFieldValueDateGet", "TestCase1", TC_PASS, "Value's Don't Match"); |
| SDK_RPRINT(test, "INKMimeHdrFieldValueDateSet", "TestCase1", TC_FAIL, |
| "INKMimeHdrFieldValueDateSet cannot be tested as INKMimeHdrFieldValueDateInsert|Get failed"); |
| } |
| } |
| } |
| } else { |
| SDK_RPRINT(test, "INKMimeHdrFieldValueDateInsert&Set&Get", "TestCase1", TC_FAIL, |
| "Cannot run Test as INKMimeHdrFieldCreate failed"); |
| } |
| |
| |
| // INKMimeHdrFieldValueIntInsert, INKMimeHdrFieldValueIntGet, INKMimeHdrFieldValueIntSet |
| if (test_passed_Mime_Hdr_Field_Create == true) { |
| if ((INKMimeHdrFieldValueIntInsert(bufp1, mime_loc1, field_loc13, -1, field3Value2) == INK_ERROR) || |
| (INKMimeHdrFieldValueIntInsert(bufp1, mime_loc1, field_loc13, 0, field3Value1) == INK_ERROR) || |
| (INKMimeHdrFieldValueIntInsert(bufp1, mime_loc1, field_loc13, -1, field3Value5) == INK_ERROR) || |
| (INKMimeHdrFieldValueIntInsert(bufp1, mime_loc1, field_loc13, 2, field3Value4) == INK_ERROR) || |
| (INKMimeHdrFieldValueIntInsert(bufp1, mime_loc1, field_loc13, 2, field3Value3) == INK_ERROR) |
| ) { |
| SDK_RPRINT(test, "INKMimeHdrFieldValueIntInsert", "TestCase1|2|3|4|5", TC_FAIL, |
| "INKMimeHdrFieldValueIntInsert Returns INK_ERROR"); |
| SDK_RPRINT(test, "INKMimeHdrFieldValueIntGet", "TestCase1&2&3&4&5", TC_FAIL, |
| "Cannot run Test as INKMimeHdrFieldValueIntInsert returns INK_ERROR"); |
| SDK_RPRINT(test, "INKMimeHdrFieldValueIntSet", "TestCase1", TC_FAIL, |
| "Cannot run Test as INKMimeHdrFieldValueIntInsert returns INK_ERROR"); |
| } else { |
| if ((INKMimeHdrFieldValueIntGet(bufp1, mime_loc1, field_loc13, 0, &field3Value1Get) == INK_ERROR) || |
| (INKMimeHdrFieldValueIntGet(bufp1, mime_loc1, field_loc13, 1, &field3Value2Get) == INK_ERROR) || |
| (INKMimeHdrFieldValueIntGet(bufp1, mime_loc1, field_loc13, 2, &field3Value3Get) == INK_ERROR) || |
| (INKMimeHdrFieldValueIntGet(bufp1, mime_loc1, field_loc13, 3, &field3Value4Get) == INK_ERROR) || |
| (INKMimeHdrFieldValueIntGet(bufp1, mime_loc1, field_loc13, 4, &field3Value5Get) == INK_ERROR) |
| ) { |
| SDK_RPRINT(test, "INKMimeHdrFieldValueIntInsert|Get", "TestCase1|2|3|4|5", TC_FAIL, |
| "INKMimeHdrFieldValueIntGet Returns INK_ERROR"); |
| SDK_RPRINT(test, "INKMimeHdrFieldValueIntSet", "TestCase1", TC_FAIL, |
| "INKMimeHdrFieldValueIntSet cannot be tested as INKMimeHdrFieldValueIntInsert|Get failed"); |
| } else { |
| if ((field3Value1Get == field3Value1) && |
| (field3Value2Get == field3Value2) && |
| (field3Value3Get == field3Value3) && (field3Value4Get == field3Value4) && (field3Value5Get == field3Value5) |
| ) { |
| SDK_RPRINT(test, "INKMimeHdrFieldValueIntInsert", "TestCase1&2&3&4&5", TC_PASS, "ok"); |
| SDK_RPRINT(test, "INKMimeHdrFieldValueIntGet", "TestCase1&2&3&4&5", TC_PASS, "ok"); |
| test_passed_Mime_Hdr_Field_Value_Int_Insert = true; |
| test_passed_Mime_Hdr_Field_Value_Int_Get = true; |
| if ((INKMimeHdrFieldValueIntSet(bufp1, mime_loc1, field_loc13, 3, field3ValueNew)) == INK_ERROR) { |
| SDK_RPRINT(test, "INKMimeHdrFieldValueIntSet", "TestCase1", TC_FAIL, |
| "INKMimeHdrFieldValueIntSet returns INK_ERROR"); |
| } else { |
| if (INKMimeHdrFieldValueIntGet(bufp1, mime_loc1, field_loc13, 3, &field3ValueNewGet) == INK_ERROR) { |
| SDK_RPRINT(test, "INKMimeHdrFieldValueIntSet", "TestCase1", TC_FAIL, |
| "INKMimeHdrFieldValueIntGet returns INK_ERROR"); |
| } else { |
| if (field3ValueNewGet == field3ValueNew) { |
| SDK_RPRINT(test, "INKMimeHdrFieldValueIntSet", "TestCase1", TC_PASS, "ok"); |
| test_passed_Mime_Hdr_Field_Value_Int_Set = true; |
| } else { |
| SDK_RPRINT(test, "INKMimeHdrFieldValueIntSet", "TestCase1", TC_FAIL, "Value's Don't match"); |
| } |
| } |
| } |
| } else { |
| SDK_RPRINT(test, "INKMimeHdrFieldValueIntInsert", "TestCase1|2|3|4|5", TC_PASS, "Value's Don't Match"); |
| SDK_RPRINT(test, "INKMimeHdrFieldValueIntGet", "TestCase1|2|3|4|5", TC_PASS, "Value's Don't Match"); |
| SDK_RPRINT(test, "INKMimeHdrFieldValueIntSet", "TestCase1", TC_FAIL, |
| "INKMimeHdrFieldValueIntSet cannot be tested as INKMimeHdrFieldValueIntInsert|Get failed"); |
| } |
| } |
| } |
| } else { |
| SDK_RPRINT(test, "INKMimeHdrFieldValueIntInsert&Set&Get", "All", TC_FAIL, |
| "Cannot run Test as INKMimeHdrFieldCreate failed"); |
| } |
| |
| // INKMimeHdrFieldValueUintInsert, INKMimeHdrFieldValueUintGet, INKMimeHdrFieldValueUintSet |
| if (test_passed_Mime_Hdr_Field_Create == true) { |
| if ((INKMimeHdrFieldValueUintInsert(bufp1, mime_loc1, field_loc14, -1, field4Value2) == INK_ERROR) || |
| (INKMimeHdrFieldValueUintInsert(bufp1, mime_loc1, field_loc14, 0, field4Value1) == INK_ERROR) || |
| (INKMimeHdrFieldValueUintInsert(bufp1, mime_loc1, field_loc14, -1, field4Value5) == INK_ERROR) || |
| (INKMimeHdrFieldValueUintInsert(bufp1, mime_loc1, field_loc14, 2, field4Value4) == INK_ERROR) || |
| (INKMimeHdrFieldValueUintInsert(bufp1, mime_loc1, field_loc14, 2, field4Value3) == INK_ERROR) |
| ) { |
| SDK_RPRINT(test, "INKMimeHdrFieldValueUintInsert", "TestCase1|2|3|4|5", TC_FAIL, |
| "INKMimeHdrFieldValueUintInsert Returns INK_ERROR"); |
| SDK_RPRINT(test, "INKMimeHdrFieldValueUintGet", "TestCase1&2&3&4&5", TC_FAIL, |
| "Cannot run Test as INKMimeHdrFieldValueUintInsert returns INK_ERROR"); |
| SDK_RPRINT(test, "INKMimeHdrFieldValueUintSet", "TestCase1", TC_FAIL, |
| "Cannot run Test as INKMimeHdrFieldValueUintInsert returns INK_ERROR"); |
| } else { |
| if ((INKMimeHdrFieldValueUintGet(bufp1, mime_loc1, field_loc14, 0, &field4Value1Get) == INK_ERROR) || |
| (INKMimeHdrFieldValueUintGet(bufp1, mime_loc1, field_loc14, 1, &field4Value2Get) == INK_ERROR) || |
| (INKMimeHdrFieldValueUintGet(bufp1, mime_loc1, field_loc14, 2, &field4Value3Get) == INK_ERROR) || |
| (INKMimeHdrFieldValueUintGet(bufp1, mime_loc1, field_loc14, 3, &field4Value4Get) == INK_ERROR) || |
| (INKMimeHdrFieldValueUintGet(bufp1, mime_loc1, field_loc14, 4, &field4Value5Get) == INK_ERROR) |
| ) { |
| SDK_RPRINT(test, "INKMimeHdrFieldValueUintInsert|Get", "TestCase1|2|3|4|5", TC_FAIL, |
| "INKMimeHdrFieldValueUintGet Returns INK_ERROR"); |
| SDK_RPRINT(test, "INKMimeHdrFieldValueUintSet", "TestCase1", TC_FAIL, |
| "INKMimeHdrFieldValueUintSet cannot be tested as INKMimeHdrFieldValueUintInsert|Get failed"); |
| } else { |
| if ((field4Value1Get == field4Value1) && |
| (field4Value2Get == field4Value2) && |
| (field4Value3Get == field4Value3) && (field4Value4Get == field4Value4) && (field4Value5Get == field4Value5) |
| ) { |
| SDK_RPRINT(test, "INKMimeHdrFieldValueUintInsert", "TestCase1&2&3&4&5", TC_PASS, "ok"); |
| SDK_RPRINT(test, "INKMimeHdrFieldValueUintGet", "TestCase1&2&3&4&5", TC_PASS, "ok"); |
| test_passed_Mime_Hdr_Field_Value_Uint_Insert = true; |
| test_passed_Mime_Hdr_Field_Value_Uint_Get = true; |
| if ((INKMimeHdrFieldValueUintSet(bufp1, mime_loc1, field_loc14, 3, field4ValueNew)) == INK_ERROR) { |
| SDK_RPRINT(test, "INKMimeHdrFieldValueUintSet", "TestCase1", TC_FAIL, |
| "INKMimeHdrFieldValueUintSet returns INK_ERROR"); |
| } else { |
| if (INKMimeHdrFieldValueUintGet(bufp1, mime_loc1, field_loc14, 3, &field4ValueNewGet) == INK_ERROR) { |
| SDK_RPRINT(test, "INKMimeHdrFieldValueUintSet", "TestCase1", TC_FAIL, |
| "INKMimeHdrFieldValueUintGet returns INK_ERROR"); |
| } else { |
| if (field4ValueNewGet == field4ValueNew) { |
| SDK_RPRINT(test, "INKMimeHdrFieldValueUintSet", "TestCase1", TC_PASS, "ok"); |
| test_passed_Mime_Hdr_Field_Value_Uint_Set = true; |
| } else { |
| SDK_RPRINT(test, "INKMimeHdrFieldValueUintSet", "TestCase1", TC_FAIL, "Value's Don't match"); |
| } |
| } |
| } |
| } else { |
| SDK_RPRINT(test, "INKMimeHdrFieldValueUintInsert", "TestCase1|2|3|4|5", TC_PASS, "Value's Don't Match"); |
| SDK_RPRINT(test, "INKMimeHdrFieldValueUintGet", "TestCase1|2|3|4|5", TC_PASS, "Value's Don't Match"); |
| SDK_RPRINT(test, "INKMimeHdrFieldValueUintSet", "TestCase1", TC_FAIL, |
| "INKMimeHdrFieldValueUintSet cannot be tested as INKMimeHdrFieldValueUintInsert|Get failed"); |
| } |
| } |
| } |
| } else { |
| SDK_RPRINT(test, "INKMimeHdrFieldValueUintInsert&Set&Get", "All", TC_FAIL, |
| "Cannot run Test as INKMimeHdrFieldCreate failed"); |
| } |
| |
| // INKMimeHdrFieldLengthGet |
| field1_length = INKMimeHdrFieldLengthGet(bufp1, mime_loc1, field_loc11); |
| field2_length = INKMimeHdrFieldLengthGet(bufp1, mime_loc1, field_loc12); |
| field3_length = INKMimeHdrFieldLengthGet(bufp1, mime_loc1, field_loc13); |
| field4_length = INKMimeHdrFieldLengthGet(bufp1, mime_loc1, field_loc14); |
| if ((field1_length == INK_ERROR || field1_length == 0) || |
| (field2_length == INK_ERROR || field2_length == 0) || |
| (field3_length == INK_ERROR || field3_length == 0) || (field4_length == INK_ERROR || field4_length == 0)) { |
| SDK_RPRINT(test, "INKMimeHdrFieldLengthGet", "TestCase1", TC_FAIL, "Returned bad length"); |
| test_passed_Mime_Hdr_Field_Length_Get = false; |
| } else { |
| SDK_RPRINT(test, "INKMimeHdrFieldLengthGet", "TestCase1", TC_PASS, "ok"); |
| test_passed_Mime_Hdr_Field_Length_Get = true; |
| } |
| |
| |
| |
| // INKMimeHdrFieldValueAppend, INKMimeHdrFieldValueDelete, INKMimeHdrFieldValuesCount, INKMimeHdrFieldValuesClear |
| |
| if (test_passed_Mime_Hdr_Field_Create == true) { |
| if ((INKMimeHdrFieldValueStringInsert(bufp1, mime_loc1, field_loc15, -1, field5Value1, -1) == INK_ERROR) || |
| (INKMimeHdrFieldValueIntInsert(bufp1, mime_loc1, field_loc15, -1, field5Value2) == INK_ERROR) || |
| (INKMimeHdrFieldValueStringInsert(bufp1, mime_loc1, field_loc15, -1, field5Value3, -1) == INK_ERROR) || |
| (INKMimeHdrFieldValueUintInsert(bufp1, mime_loc1, field_loc15, -1, field5Value4) == INK_ERROR) |
| ) { |
| SDK_RPRINT(test, "INKMimeHdrFieldValueAppend", "TestCase1", TC_FAIL, |
| "INKMimeHdrFieldValueString|Int|UintInsert returns INK_ERROR. Cannot create field for testing."); |
| SDK_RPRINT(test, "INKMimeHdrFieldValueDelete", "TestCase1", TC_FAIL, |
| "INKMimeHdrFieldValueString|Int|UintInsert returns INK_ERROR. Cannot create field for testing."); |
| SDK_RPRINT(test, "INKMimeHdrFieldValuesCount", "TestCase1", TC_FAIL, |
| "INKMimeHdrFieldValueString|Int|UintInsert returns INK_ERROR. Cannot create field for testing."); |
| SDK_RPRINT(test, "INKMimeHdrFieldValuesClear", "TestCase1", TC_FAIL, |
| "INKMimeHdrFieldValueString|Int|UintInsert returns INK_ERROR. Cannot create field for testing."); |
| } else { |
| if (INKMimeHdrFieldValueAppend(bufp1, mime_loc1, field_loc15, 0, field5Value1Append, -1) == INK_ERROR) { |
| SDK_RPRINT(test, "INKMimeHdrFieldValueAppend", "TestCase1", TC_FAIL, |
| "INKMimeHdrFieldValueAppend returns INK_ERROR"); |
| } else { |
| if ((INKMimeHdrFieldValueStringGet |
| (bufp1, mime_loc1, field_loc15, 0, &fieldValueAppendGet, &lengthFieldValueAppended)) != INK_SUCCESS) { |
| SDK_RPRINT(test, "INKMimeHdrFieldValueAppend", "TestCase1", TC_FAIL, |
| "INKMimeHdrFieldValueStringGet doesn't return INK_SUCCESS"); |
| } else { |
| char *expected_value; |
| size_t len = strlen(field5Value1) + strlen(field5Value1Append) + 1; |
| expected_value = (char *) INKmalloc(len); |
| memset(expected_value, 0, strlen(field5Value1) + strlen(field5Value1Append) + 1); |
| ink_strncpy(expected_value, field5Value1, len); |
| strncat(expected_value, field5Value1Append, len - strlen(expected_value) - 1); |
| if ((strncmp(fieldValueAppendGet, expected_value, lengthFieldValueAppended) == 0) && |
| (lengthFieldValueAppended = strlen(expected_value)) |
| ) { |
| SDK_RPRINT(test, "INKMimeHdrFieldValueAppend", "TestCase1", TC_PASS, "ok"); |
| test_passed_Mime_Hdr_Field_Value_Append = true; |
| } else { |
| SDK_RPRINT(test, "INKMimeHdrFieldValueAppend", "TestCase1", TC_FAIL, "Values mismatch"); |
| } |
| if (INKHandleStringRelease(bufp1, field_loc15, fieldValueAppendGet) == INK_ERROR) { |
| SDK_RPRINT(test, "INKMimeHdrFieldValueAppend", "", TC_FAIL, "Unable to release handle to string"); |
| } |
| INKfree(expected_value); |
| } |
| } |
| |
| if ((numberOfValueInField = INKMimeHdrFieldValuesCount(bufp1, mime_loc1, field_loc15)) == INK_ERROR) { |
| SDK_RPRINT(test, "INKMimeHdrFieldValuesCount", "TestCase1", TC_FAIL, |
| "INKMimeHdrFieldValuesCount returns INK_ERROR"); |
| } else { |
| if (numberOfValueInField == 4) { |
| SDK_RPRINT(test, "INKMimeHdrFieldValuesCount", "TestCase1", TC_PASS, "ok"); |
| test_passed_Mime_Hdr_Field_Values_Count = true; |
| } else { |
| SDK_RPRINT(test, "INKMimeHdrFieldValuesCount", "TestCase1", TC_FAIL, "Values don't match"); |
| } |
| } |
| |
| |
| if (INKMimeHdrFieldValueDelete(bufp1, mime_loc1, field_loc15, 2) == INK_ERROR) { |
| SDK_RPRINT(test, "INKMimeHdrFieldValueDelete", "TestCase1", TC_FAIL, |
| "INKMimeHdrFieldValueDelete Returns INK_ERROR"); |
| } else { |
| if ((INKMimeHdrFieldValueStringGet |
| (bufp1, mime_loc1, field_loc15, 2, &fieldValueDeleteGet, &lengthFieldValueDeleteGet)) != INK_SUCCESS) { |
| SDK_RPRINT(test, "INKMimeHdrFieldValueDelete", "TestCase1", TC_FAIL, |
| "INKMimeHdrFieldValueStringGet doesn't return INK_SUCCESS. Cannot test for INKMimeHdrFieldValueDelete"); |
| } else { |
| if ((strncmp(fieldValueDeleteGet, field5Value3, lengthFieldValueDeleteGet) == 0) && |
| (lengthFieldValueDeleteGet == (int) strlen(field5Value3))) { |
| SDK_RPRINT(test, "INKMimeHdrFieldValueDelete", "TestCase1", TC_FAIL, |
| "Value not deleted from field or incorrect index deleted from field."); |
| } else { |
| SDK_RPRINT(test, "INKMimeHdrFieldValueDelete", "TestCase1", TC_PASS, "ok"); |
| test_passed_Mime_Hdr_Field_Value_Delete = true; |
| } |
| if (INKHandleStringRelease(bufp1, field_loc15, fieldValueDeleteGet) == INK_ERROR) { |
| SDK_RPRINT(test, "INKMimeHdrFieldValueDelete", "", TC_FAIL, "Unable to release handle to string"); |
| } |
| } |
| } |
| |
| if (INKMimeHdrFieldValuesClear(bufp1, mime_loc1, field_loc15) == INK_ERROR) { |
| SDK_RPRINT(test, "INKMimeHdrFieldValuesClear", "TestCase1", TC_FAIL, |
| "INKMimeHdrFieldValuesClear returns INK_ERROR"); |
| } else { |
| if ((numberOfValueInField = INKMimeHdrFieldValuesCount(bufp1, mime_loc1, field_loc15)) == INK_ERROR) { |
| SDK_RPRINT(test, "INKMimeHdrFieldValuesClear", "TestCase1", TC_FAIL, |
| "INKMimeHdrFieldValuesCount returns INK_ERROR. Cannot test INKMimeHdrFieldValuesClear"); |
| } else { |
| if (numberOfValueInField == 0) { |
| SDK_RPRINT(test, "INKMimeHdrFieldValuesClear", "TestCase1", TC_PASS, "ok"); |
| test_passed_Mime_Hdr_Field_Values_Clear = true; |
| } else { |
| SDK_RPRINT(test, "INKMimeHdrFieldValuesClear", "TestCase1", TC_FAIL, "Values don't match"); |
| } |
| } |
| } |
| } |
| |
| // INKMimeHdrFieldDestroy |
| if (INKMimeHdrFieldDestroy(bufp1, mime_loc1, field_loc15) == INK_ERROR) { |
| SDK_RPRINT(test, "INKMimeHdrFieldDestroy", "TestCase1", TC_FAIL, "INKMimeHdrFieldDestroy returns INK_ERROR"); |
| } else { |
| if ((test_field_loc15 = INKMimeHdrFieldFind(bufp1, mime_loc1, field5Name, -1)) == INK_ERROR_PTR) { |
| SDK_RPRINT(test, "INKMimeHdrFieldDestroy", "TestCase1", TC_FAIL, "INKMimeHdrFieldFind returns INK_ERROR_PTR"); |
| } else { |
| if (test_field_loc15 == NULL) { |
| SDK_RPRINT(test, "INKMimeHdrFieldDestroy", "TestCase1", TC_PASS, "ok"); |
| test_passed_Mime_Hdr_Field_Destroy = true; |
| } else { |
| SDK_RPRINT(test, "INKMimeHdrFieldDestroy", "TestCase1", TC_FAIL, "Field not destroyed"); |
| if (INKHandleMLocRelease(bufp1, mime_loc1, test_field_loc15) == INK_ERROR) { |
| SDK_RPRINT(test, "INKMimeHdrFieldDestroy", "TestCase1", TC_FAIL, |
| "Unable to release handle using INKHandleMLocRelease"); |
| } |
| } |
| } |
| if (INKHandleMLocRelease(bufp1, mime_loc1, field_loc15) == INK_ERROR) { |
| SDK_RPRINT(test, "INKMimeHdrFieldDestroy", "TestCase2", TC_FAIL, |
| "Unable to release handle using INKHandleMLocRelease"); |
| } |
| } |
| } else { |
| SDK_RPRINT(test, "INKMimeHdrFieldValueAppend", "TestCase1", TC_FAIL, |
| "Cannot run test as INKMimeHdrFieldCreate has failed"); |
| SDK_RPRINT(test, "INKMimeHdrFieldValueDelete", "TestCase1", TC_FAIL, |
| "Cannot run test as INKMimeHdrFieldCreate has failed"); |
| SDK_RPRINT(test, "INKMimeHdrFieldValuesCount", "TestCase1", TC_FAIL, |
| "Cannot run test as INKMimeHdrFieldCreate has failed"); |
| SDK_RPRINT(test, "INKMimeHdrFieldValuesClear", "TestCase1", TC_FAIL, |
| "Cannot run test as INKMimeHdrFieldCreate has failed"); |
| SDK_RPRINT(test, "INKMimeHdrFieldDestroy", "TestCase1", TC_FAIL, |
| "Cannot run test as INKMimeHdrFieldCreate has failed"); |
| } |
| |
| // Mime Hdr Fields Clear |
| if (test_passed_Mime_Hdr_Field_Append == true) { |
| if (INKMimeHdrFieldsClear(bufp1, mime_loc1) != INK_SUCCESS) { |
| SDK_RPRINT(test, "INKMimeHdrFieldsClear", "TestCase1", TC_FAIL, "INKMimeHdrFieldsClear returns INK_ERROR"); |
| } else { |
| if ((numberOfFields = INKMimeHdrFieldsCount(bufp1, mime_loc1)) == INK_ERROR) { |
| SDK_RPRINT(test, "INKMimeHdrFieldsClear", "TestCase1", TC_FAIL, "INKMimeHdrFieldsCount returns INK_ERROR"); |
| } else { |
| if (numberOfFields == 0) { |
| SDK_RPRINT(test, "INKMimeHdrFieldsClear", "TestCase1", TC_PASS, "ok"); |
| test_passed_Mime_Hdr_Fields_Clear = true; |
| } else { |
| SDK_RPRINT(test, "INKMimeHdrFieldsClear", "TestCase1", TC_FAIL, "Fields still exist"); |
| } |
| } |
| if ((INKHandleMLocRelease(bufp1, mime_loc1, field_loc11) == INK_ERROR) || |
| (INKHandleMLocRelease(bufp1, mime_loc1, field_loc12) == INK_ERROR) || |
| (INKHandleMLocRelease(bufp1, mime_loc1, field_loc13) == INK_ERROR) || |
| (INKHandleMLocRelease(bufp1, mime_loc1, field_loc14) == INK_ERROR) |
| ) { |
| SDK_RPRINT(test, "INKMimeHdrFieldsDestroy", "", TC_FAIL, "Unable to release handle using INKHandleMLocRelease"); |
| } |
| } |
| } else { |
| SDK_RPRINT(test, "INKMimeHdrFieldsClear", "TestCase1", TC_FAIL, |
| "Cannot run test as Fields have not been inserted in the mime header"); |
| } |
| |
| // Mime Hdr Destroy |
| if (test_passed_Mime_Hdr_Create == true) { |
| if (INKMimeHdrDestroy(bufp1, mime_loc1) == INK_ERROR) { |
| SDK_RPRINT(test, "INKMimeHdrDestroy", "TestCase1", TC_FAIL, "INKMimeHdrDestroy return INK_ERROR"); |
| SDK_RPRINT(test, "INKMimeHdrDestroy", "TestCase1", TC_FAIL, "Probably INKMimeHdrCreate failed."); |
| } else { |
| SDK_RPRINT(test, "INKMimeHdrDestroy", "TestCase1", TC_PASS, "ok"); |
| test_passed_Mime_Hdr_Destroy = true; |
| } |
| /** Commented out as Traffic Server was crashing. Will have to look into it. */ |
| /* |
| if (INKHandleMLocRelease(bufp1,INK_NULL_MLOC,mime_loc1)==INK_ERROR) { |
| SDK_RPRINT(test,"INKHandlMLocRelease","INKMimeHdrDestroy",TC_FAIL,"unable to release handle using INKHandleMLocRelease"); |
| } |
| */ |
| } else { |
| SDK_RPRINT(test, "INKMimeHdrDestroy", "TestCase1", TC_FAIL, "Cannot run test as INKMimeHdrCreate failed"); |
| } |
| |
| // MBuffer Destroy |
| if (test_passed_MBuffer_Create == true) { |
| if (INKMBufferDestroy(bufp1) == INK_ERROR) { |
| SDK_RPRINT(test, "INKMBufferDestroy", "TestCase1", TC_FAIL, "INKMBufferDestroy return INK_ERROR"); |
| SDK_RPRINT(test, "INKMBufferDestroy", "TestCase1", TC_FAIL, "Probably INKMBufferCreate failed."); |
| } else { |
| SDK_RPRINT(test, "INKMBufferDestroy", "TestCase1", TC_PASS, "ok"); |
| test_passed_MBuffer_Destroy = true; |
| } |
| } else { |
| SDK_RPRINT(test, "INKMimeHdrDestroy", "TestCase1", TC_FAIL, "Cannot run test as INKMimeHdrCreate failed"); |
| } |
| |
| |
| if ((test_passed_MBuffer_Create == true) && |
| (test_passed_Mime_Hdr_Create == true) && |
| (test_passed_Mime_Hdr_Field_Create == true) && |
| (test_passed_Mime_Hdr_Field_Name == true) && |
| (test_passed_Mime_Hdr_Field_Append == true) && |
| (test_passed_Mime_Hdr_Field_Get == true) && |
| (test_passed_Mime_Hdr_Field_Next == true) && |
| (test_passed_Mime_Hdr_Fields_Count == true) && |
| (test_passed_Mime_Hdr_Field_Value_String_Insert == true) && |
| (test_passed_Mime_Hdr_Field_Value_String_Get == true) && |
| (test_passed_Mime_Hdr_Field_Value_String_Set == true) && |
| (test_passed_Mime_Hdr_Field_Value_Date_Insert == true) && |
| (test_passed_Mime_Hdr_Field_Value_Date_Get == true) && |
| (test_passed_Mime_Hdr_Field_Value_Date_Set == true) && |
| (test_passed_Mime_Hdr_Field_Value_Int_Insert == true) && |
| (test_passed_Mime_Hdr_Field_Value_Int_Get == true) && |
| (test_passed_Mime_Hdr_Field_Value_Int_Set == true) && |
| (test_passed_Mime_Hdr_Field_Value_Uint_Insert == true) && |
| (test_passed_Mime_Hdr_Field_Value_Uint_Get == true) && |
| (test_passed_Mime_Hdr_Field_Value_Uint_Set == true) && |
| (test_passed_Mime_Hdr_Field_Value_Append == true) && |
| (test_passed_Mime_Hdr_Field_Value_Delete == true) && |
| (test_passed_Mime_Hdr_Field_Values_Clear == true) && |
| (test_passed_Mime_Hdr_Field_Values_Count == true) && |
| (test_passed_Mime_Hdr_Field_Destroy == true) && |
| (test_passed_Mime_Hdr_Fields_Clear == true) && |
| (test_passed_Mime_Hdr_Destroy == true) && |
| (test_passed_MBuffer_Destroy == true) && (test_passed_Mime_Hdr_Field_Length_Get == true) |
| ) { |
| *pstatus = REGRESSION_TEST_PASSED; |
| } else { |
| *pstatus = REGRESSION_TEST_FAILED; |
| } |
| return; |
| |
| } |
| |
| |
| ////////////////////////////////////////////// |
| // SDK_API_INKHttpHdrParse |
| // |
| // Unit Test for API: INKHttpParserCreate |
| // INKHttpParserDestroy |
| // INKHttpParserClear |
| // INKHttpHdrParseReq |
| // INKHttpHdrParseResp |
| ////////////////////////////////////////////// |
| |
| char * |
| convert_http_hdr_to_string(INKMBuffer bufp, INKMLoc hdr_loc) |
| { |
| INKIOBuffer output_buffer; |
| INKIOBufferReader reader; |
| int total_avail; |
| |
| INKIOBufferBlock block; |
| const char *block_start; |
| int64 block_avail; |
| |
| char *output_string; |
| int output_len; |
| |
| output_buffer = INKIOBufferCreate(); |
| |
| if (!output_buffer) { |
| INKError("couldn't allocate IOBuffer\n"); |
| } |
| |
| reader = INKIOBufferReaderAlloc(output_buffer); |
| |
| /* This will print just MIMEFields and not |
| the http request line */ |
| INKHttpHdrPrint(bufp, hdr_loc, output_buffer); |
| |
| /* Find out how the big the complete header is by |
| seeing the total bytes in the buffer. We need to |
| look at the buffer rather than the first block to |
| see the size of the entire header */ |
| total_avail = INKIOBufferReaderAvail(reader); |
| |
| /* Allocate the string with an extra byte for the string |
| terminator */ |
| output_string = (char *) INKmalloc(total_avail + 1); |
| output_len = 0; |
| |
| /* We need to loop over all the buffer blocks to make |
| sure we get the complete header since the header can |
| be in multiple blocks */ |
| block = INKIOBufferReaderStart(reader); |
| while (block) { |
| |
| block_start = INKIOBufferBlockReadStart(block, reader, &block_avail); |
| |
| /* We'll get a block pointer back even if there is no data |
| left to read so check for this condition and break out of |
| the loop. A block with no data to read means we've exhausted |
| buffer of data since if there was more data on a later |
| block in the chain, this block would have been skipped over */ |
| if (block_avail == 0) { |
| break; |
| } |
| |
| memcpy(output_string + output_len, block_start, block_avail); |
| output_len += block_avail; |
| |
| /* Consume the data so that we get to the next block */ |
| INKIOBufferReaderConsume(reader, block_avail); |
| |
| /* Get the next block now that we've consumed the |
| data off the last block */ |
| block = INKIOBufferReaderStart(reader); |
| } |
| |
| /* Terminate the string */ |
| output_string[output_len] = '\0'; |
| output_len++; |
| |
| /* Free up the INKIOBuffer that we used to print out the header */ |
| INKIOBufferReaderFree(reader); |
| INKIOBufferDestroy(output_buffer); |
| |
| return output_string; |
| } |
| |
| REGRESSION_TEST(SDK_API_INKHttpHdrParse) (RegressionTest * test, int atype, int *pstatus) |
| { |
| NOWARN_UNUSED(atype); |
| const char *req = |
| "GET http://www.example.com/ HTTP/1.1\r\nmimefield1:field1value1,field1value2\r\nmimefield2:field2value1,field2value2\r\n\r\n"; |
| const char *resp = |
| "HTTP/1.1 200 OK\r\n1mimefield:1field1value,1field2value\r\n2mimefield:2field1value,2field2value\r\n\r\n"; |
| const char *start; |
| const char *end; |
| char *temp; |
| |
| int retval; |
| |
| INKMBuffer reqbufp; |
| INKMBuffer respbufp = (INKMBuffer) INK_ERROR_PTR; |
| |
| INKMLoc req_hdr_loc = (INKMLoc) INK_ERROR_PTR; |
| INKMLoc resp_hdr_loc = (INKMLoc) INK_ERROR_PTR; |
| |
| INKHttpParser parser; |
| |
| bool test_passed_parse_req = false; |
| bool test_passed_parse_resp = false; |
| bool test_passed_parser_clear = false; |
| bool test_passed_parser_destroy = false; |
| bool resp_run = true; |
| |
| |
| //Create Parser |
| parser = INKHttpParserCreate(); |
| if (parser == INK_ERROR_PTR) { |
| SDK_RPRINT(test, "INKHttpParserCreate", "TestCase1", TC_FAIL, "INKHttpParserCreate returns INK_ERROR_PTR"); |
| SDK_RPRINT(test, "INKHttpParserDestroy", "TestCase1", TC_FAIL, "Unable to run test as INKHttpParserCreate failed"); |
| SDK_RPRINT(test, "INKHttpParserClear", "TestCase1", TC_FAIL, "Unable to run test as INKHttpParserCreate failed"); |
| SDK_RPRINT(test, "INKHttpHdrParseReq", "TestCase1", TC_FAIL, "Unable to run test as INKHttpParserCreate failed"); |
| SDK_RPRINT(test, "INKHttpHdrParseResp", "TestCase1", TC_FAIL, "Unable to run test as INKHttpParserCreate failed"); |
| |
| *pstatus = REGRESSION_TEST_FAILED; |
| return; |
| } else { |
| SDK_RPRINT(test, "INKHttpParserCreate", "TestCase1", TC_PASS, "ok"); |
| } |
| |
| // Request |
| reqbufp = INKMBufferCreate(); |
| if (reqbufp == INK_ERROR_PTR) { |
| SDK_RPRINT(test, "INKHttpHdrParseReq", "TestCase1", TC_FAIL, "Cannot create buffer for parsing request"); |
| } else { |
| req_hdr_loc = INKHttpHdrCreate(reqbufp); |
| if (req_hdr_loc == INK_ERROR_PTR) { |
| SDK_RPRINT(test, "INKHttpHdrParseReq", "TestCase1", TC_FAIL, "Cannot create Http hdr for parsing request"); |
| if (INKMBufferDestroy(reqbufp) == INK_ERROR) { |
| SDK_RPRINT(test, "INKHttpHdrParseReq", "TestCase1", TC_FAIL, "Error in Destroying MBuffer"); |
| } |
| } else { |
| start = req; |
| end = req + strlen(req) + 1; |
| if ((retval = INKHttpHdrParseReq(parser, reqbufp, req_hdr_loc, &start, end)) == INK_PARSE_ERROR) { |
| SDK_RPRINT(test, "INKHttpHdrParseReq", "TestCase1", TC_FAIL, "INKHttpHdrParseReq returns INK_PARSE_ERROR"); |
| } else { |
| if (retval == INK_PARSE_DONE) { |
| test_passed_parse_req = true; |
| } else { |
| SDK_RPRINT(test, "INKHttpHdrParseReq", "TestCase1", TC_FAIL, "Parsing Error"); |
| } |
| } |
| } |
| } |
| |
| if (INKHttpParserClear(parser) == INK_ERROR) { |
| SDK_RPRINT(test, "INKHttpParserClear", "TestCase1", TC_FAIL, "INKHttpParserClear returns INK_ERROR"); |
| SDK_RPRINT(test, "INKHttpHdrParseResp", "TestCase1", TC_FAIL, "Cannot run test as INKHttpParserClear Failed"); |
| } else { |
| SDK_RPRINT(test, "INKHttpParserClear", "TestCase1", TC_PASS, "ok"); |
| test_passed_parser_clear = true; |
| } |
| |
| // Response |
| if (test_passed_parser_clear == true) { |
| respbufp = INKMBufferCreate(); |
| if (respbufp == INK_ERROR_PTR) { |
| SDK_RPRINT(test, "INKHttpHdrParseResp", "TestCase1", TC_FAIL, "Cannot create buffer for parsing response"); |
| } else { |
| resp_hdr_loc = INKHttpHdrCreate(respbufp); |
| if (resp_hdr_loc == INK_ERROR_PTR) { |
| SDK_RPRINT(test, "INKHttpHdrParseResp", "TestCase1", TC_FAIL, "Cannot create Http hdr for parsing response"); |
| if (INKMBufferDestroy(respbufp) == INK_ERROR) { |
| SDK_RPRINT(test, "INKHttpHdrParseResp", "TestCase1", TC_FAIL, "Error in Destroying MBuffer"); |
| } |
| } else { |
| start = resp; |
| end = resp + strlen(resp) + 1; |
| if ((retval = INKHttpHdrParseResp(parser, respbufp, resp_hdr_loc, &start, end)) == INK_PARSE_ERROR) { |
| SDK_RPRINT(test, "INKHttpHdrParseReq", "TestCase1", TC_FAIL, |
| "INKHttpHdrParseReq returns INK_PARSE_ERROR. Maybe an error with INKHttpParserClear."); |
| } else { |
| if (retval == INK_PARSE_DONE) { |
| test_passed_parse_resp = true; |
| } else { |
| SDK_RPRINT(test, "INKHttpHdrParseResp", "TestCase1", TC_FAIL, "Parsing Error"); |
| } |
| } |
| } |
| } |
| } else { |
| resp_run = false; |
| } |
| |
| if (test_passed_parse_req == true) { |
| temp = convert_http_hdr_to_string(reqbufp, req_hdr_loc); |
| if (strcmp(req, temp) == 0) { |
| SDK_RPRINT(test, "INKHttpHdrParseReq", "TestCase1", TC_PASS, "ok"); |
| } else { |
| SDK_RPRINT(test, "INKHttpHdrParseReq", "TestCase1", TC_FAIL, "Incorrect parsing"); |
| test_passed_parse_req = false; |
| } |
| INKfree(temp); |
| } |
| |
| if (test_passed_parse_resp == true) { |
| temp = convert_http_hdr_to_string(respbufp, resp_hdr_loc); |
| if (strcmp(resp, temp) == 0) { |
| SDK_RPRINT(test, "INKHttpHdrParseResp", "TestCase1", TC_PASS, "ok"); |
| } else { |
| SDK_RPRINT(test, "INKHttpHdrParseResp", "TestCase1", TC_FAIL, "Incorrect parsing"); |
| test_passed_parse_resp = false; |
| } |
| INKfree(temp); |
| } |
| |
| if (INKHttpParserDestroy(parser) != INK_SUCCESS) { |
| SDK_RPRINT(test, "INKHttpParserDestroy", "TestCase1", TC_FAIL, "INKHttpParserDestroy doesn't return INK_SUCCESS"); |
| } else { |
| SDK_RPRINT(test, "INKHttpParserDestroy", "TestCase1", TC_PASS, "ok"); |
| test_passed_parser_destroy = true; |
| } |
| |
| if ((test_passed_parse_req != true) || |
| (test_passed_parse_resp != true) || (test_passed_parser_clear != true) || (test_passed_parser_destroy != true) |
| ) { |
| *pstatus = REGRESSION_TEST_FAILED; |
| } else { |
| *pstatus = REGRESSION_TEST_PASSED; |
| } |
| |
| INKMimeHdrDestroy(reqbufp, req_hdr_loc); |
| if (resp_run == true) |
| INKMimeHdrDestroy(respbufp, resp_hdr_loc); |
| |
| INKHandleMLocRelease(reqbufp, INK_NULL_MLOC, req_hdr_loc); |
| if (resp_run == true) |
| INKHandleMLocRelease(respbufp, INK_NULL_MLOC, resp_hdr_loc); |
| |
| INKMBufferDestroy(reqbufp); |
| if (resp_run == true) |
| INKMBufferDestroy(respbufp); |
| |
| return; |
| } |
| |
| |
| |
| |
| ////////////////////////////////////////////// |
| // SDK_API_INKMimeHdrParse |
| // |
| // Unit Test for API: INKMimeHdrCopy |
| // INKMimeHdrClone |
| // INKMimeHdrFieldCopy |
| // INKMimeHdrFieldClone |
| // INKMimeHdrFieldCopyValues |
| // INKMimeHdrFieldNextDup |
| // INKMimeHdrFieldRemove |
| // INKMimeHdrLengthGet |
| // INKMimeHdrParse |
| // INKMimeHdrPrint |
| // INKMimeParserClear |
| // INKMimeParserCreate |
| // INKMimeParserDestroy |
| // INKHandleMLocRelease |
| // INKHandleStringRelease |
| ////////////////////////////////////////////// |
| |
| char * |
| convert_mime_hdr_to_string(INKMBuffer bufp, INKMLoc hdr_loc) |
| { |
| INKIOBuffer output_buffer; |
| INKIOBufferReader reader; |
| int total_avail; |
| |
| INKIOBufferBlock block; |
| const char *block_start; |
| int64 block_avail; |
| |
| char *output_string; |
| int output_len; |
| |
| output_buffer = INKIOBufferCreate(); |
| |
| if (!output_buffer) { |
| INKError("couldn't allocate IOBuffer\n"); |
| } |
| |
| reader = INKIOBufferReaderAlloc(output_buffer); |
| |
| /* This will print just MIMEFields and not |
| the http request line */ |
| INKMimeHdrPrint(bufp, hdr_loc, output_buffer); |
| |
| /* Find out how the big the complete header is by |
| seeing the total bytes in the buffer. We need to |
| look at the buffer rather than the first block to |
| see the size of the entire header */ |
| total_avail = INKIOBufferReaderAvail(reader); |
| |
| /* Allocate the string with an extra byte for the string |
| terminator */ |
| output_string = (char *) INKmalloc(total_avail + 1); |
| output_len = 0; |
| |
| /* We need to loop over all the buffer blocks to make |
| sure we get the complete header since the header can |
| be in multiple blocks */ |
| block = INKIOBufferReaderStart(reader); |
| while (block) { |
| |
| block_start = INKIOBufferBlockReadStart(block, reader, &block_avail); |
| |
| /* We'll get a block pointer back even if there is no data |
| left to read so check for this condition and break out of |
| the loop. A block with no data to read means we've exhausted |
| buffer of data since if there was more data on a later |
| block in the chain, this block would have been skipped over */ |
| if (block_avail == 0) { |
| break; |
| } |
| |
| memcpy(output_string + output_len, block_start, block_avail); |
| output_len += block_avail; |
| |
| /* Consume the data so that we get to the next block */ |
| INKIOBufferReaderConsume(reader, block_avail); |
| |
| /* Get the next block now that we've consumed the |
| data off the last block */ |
| block = INKIOBufferReaderStart(reader); |
| } |
| |
| /* Terminate the string */ |
| output_string[output_len] = '\0'; |
| output_len++; |
| |
| /* Free up the INKIOBuffer that we used to print out the header */ |
| INKIOBufferReaderFree(reader); |
| INKIOBufferDestroy(output_buffer); |
| |
| return output_string; |
| } |
| |
| INKReturnCode |
| compare_field_values(RegressionTest * test, INKMBuffer bufp1, INKMLoc hdr_loc1, INKMLoc field_loc1, INKMBuffer bufp2, |
| INKMBuffer hdr_loc2, INKMLoc field_loc2, bool * test_handle_string_release, bool first_time) |
| { |
| |
| int no_of_values1; |
| int no_of_values2; |
| int i; |
| |
| const char *str1 = NULL; |
| const char *str2 = NULL; |
| |
| int length1 = 0; |
| int length2 = 0; |
| |
| if (first_time == true) { |
| *test_handle_string_release = true; |
| } |
| no_of_values1 = INKMimeHdrFieldValuesCount(bufp1, hdr_loc1, field_loc1); |
| no_of_values2 = INKMimeHdrFieldValuesCount(bufp2, hdr_loc2, field_loc2); |
| if ((no_of_values1 == INK_ERROR) || (no_of_values2 == INK_ERROR)) { |
| SDK_RPRINT(test, "compare_field_values", "TestCase", TC_FAIL, "INKMimeHdrFieldValuesCount returns INK_ERROR"); |
| return INK_ERROR; |
| } |
| |
| if (no_of_values1 != no_of_values2) { |
| SDK_RPRINT(test, "compare_field_values", "TestCase", TC_FAIL, "Field Values not equal"); |
| return INK_ERROR; |
| } |
| |
| for (i = 0; i < no_of_values1; i++) { |
| if ((INKMimeHdrFieldValueStringGet(bufp1, hdr_loc1, field_loc1, i, &str1, &length1) != INK_SUCCESS) || |
| (INKMimeHdrFieldValueStringGet(bufp2, hdr_loc2, field_loc2, i, &str2, &length2) != INK_SUCCESS) |
| ) { |
| SDK_RPRINT(test, "compare_field_values", "TestCase", TC_FAIL, |
| "INKMimeHdrFieldValueStringGet doesn't return INK_SUCCESS"); |
| if ((str1 != INK_ERROR_PTR) || (str1 != NULL)) { |
| if (INKHandleStringRelease(bufp1, field_loc1, str1) == INK_ERROR) { |
| SDK_RPRINT(test, "INKHandleStringRelease", "TestCase1", TC_FAIL, "INKHandleStringRelease returns INK_ERROR"); |
| *test_handle_string_release = false; |
| } |
| } |
| if ((str2 != INK_ERROR_PTR) || (str2 != NULL)) { |
| if (INKHandleStringRelease(bufp2, field_loc2, str2) == INK_ERROR) { |
| SDK_RPRINT(test, "INKHandleStringRelease", "TestCase2", TC_FAIL, "INKHandleStringRelease returns INK_ERROR"); |
| *test_handle_string_release = false; |
| } |
| } |
| return INK_ERROR; |
| } |
| if (!((length1 == length2) && (strncmp(str1, str2, length1) == 0) |
| )) { |
| SDK_RPRINT(test, "compare_field_values", "TestCase", TC_FAIL, "Field Value %d differ from each other", i); |
| if (INKHandleStringRelease(bufp1, field_loc1, str1) == INK_ERROR) { |
| SDK_RPRINT(test, "INKHandleStringRelease", "TestCase3", TC_FAIL, "INKHandleStringRelease returns INK_ERROR"); |
| *test_handle_string_release = false; |
| } |
| |
| if (INKHandleStringRelease(bufp2, field_loc2, str2) == INK_ERROR) { |
| SDK_RPRINT(test, "INKHandleStringRelease", "TestCase4", TC_FAIL, "INKHandleStringRelease returns INK_ERROR"); |
| *test_handle_string_release = false; |
| } |
| return INK_ERROR; |
| } |
| } |
| |
| return INK_SUCCESS; |
| } |
| |
| |
| REGRESSION_TEST(SDK_API_INKMimeHdrParse) (RegressionTest * test, int atype, int *pstatus) |
| { |
| NOWARN_UNUSED(atype); |
| const char *parse_string = |
| "field1:field1Value1,field1Value2\r\nfield2:10,-34,45\r\nfield3:field3Value1,23\r\nfield2: 2345, field2Value2\r\n\r\n"; |
| const char *DUPLICATE_FIELD_NAME = "field2"; |
| const char *REMOVE_FIELD_NAME = "field3"; |
| |
| INKMimeParser parser; |
| |
| INKMBuffer bufp1 = (INKMBuffer) INK_ERROR_PTR; |
| INKMBuffer bufp2 = (INKMBuffer) INK_ERROR_PTR; |
| INKMBuffer bufp3 = (INKMBuffer) INK_ERROR_PTR; |
| |
| INKMLoc mime_hdr_loc1 = (INKMLoc) INK_ERROR_PTR; |
| INKMLoc mime_hdr_loc2 = (INKMLoc) INK_ERROR_PTR; |
| INKMLoc mime_hdr_loc3 = (INKMLoc) INK_ERROR_PTR; |
| |
| INKMLoc field_loc1 = (INKMLoc) INK_ERROR_PTR; |
| INKMLoc field_loc2 = (INKMLoc) INK_ERROR_PTR; |
| |
| const char *start; |
| const char *end; |
| char *temp; |
| |
| int retval; |
| int hdrLength; |
| |
| bool test_passed_parser_create = false; |
| bool test_passed_parse = false; |
| bool test_passed_parser_clear = false; |
| bool test_passed_parser_destroy = false; |
| bool test_passed_mime_hdr_print = false; |
| bool test_passed_mime_hdr_length_get = false; |
| bool test_passed_mime_hdr_field_next_dup = false; |
| bool test_passed_mime_hdr_copy = false; |
| bool test_passed_mime_hdr_clone = false; |
| bool test_passed_mime_hdr_field_remove = false; |
| bool test_passed_mime_hdr_field_copy = false; |
| bool test_passed_mime_hdr_field_copy_values = false; |
| bool test_passed_handle_mloc_release = false; |
| bool test_passed_handle_string_release = false; |
| bool test_passed_mime_hdr_field_find = false; |
| |
| //Create Parser |
| parser = INKMimeParserCreate(); |
| if (parser == INK_ERROR_PTR) { |
| SDK_RPRINT(test, "INKMimeParserCreate", "TestCase1", TC_FAIL, "INKMimeParserCreate returns INK_ERROR_PTR"); |
| } else { |
| SDK_RPRINT(test, "INKMimeParserCreate", "TestCase1", TC_PASS, "ok"); |
| test_passed_parser_create = true; |
| } |
| |
| if (test_passed_parser_create == true) { |
| // Parsing |
| bufp1 = INKMBufferCreate(); |
| if (bufp1 == INK_ERROR_PTR) { |
| SDK_RPRINT(test, "INKMimeHdrParse", "TestCase1", TC_FAIL, "Cannot create buffer for parsing"); |
| SDK_RPRINT(test, "INKMimeHdrPrint", "TestCase1", TC_FAIL, |
| "Cannot run test as unable to create a buffer for parsing"); |
| SDK_RPRINT(test, "INKMimeHdrLengthGet", "TestCase1", TC_FAIL, |
| "Cannot run test as unable to create a buffer for parsing"); |
| } else { |
| mime_hdr_loc1 = INKMimeHdrCreate(bufp1); |
| if (mime_hdr_loc1 == INK_ERROR_PTR) { |
| SDK_RPRINT(test, "INKMimeHdrParse", "TestCase1", TC_FAIL, "Cannot create Mime hdr for parsing"); |
| SDK_RPRINT(test, "INKMimeHdrPrint", "TestCase1", TC_FAIL, |
| "Cannot run test as unable to create Mime Header for parsing"); |
| SDK_RPRINT(test, "INKMimeHdrLengthGet", "TestCase1", TC_FAIL, |
| "Cannot run test as unable to create Mime Header for parsing"); |
| |
| if (INKMBufferDestroy(bufp1) == INK_ERROR) { |
| SDK_RPRINT(test, "INKMimeHdrParse", "TestCase1", TC_FAIL, "Error in Destroying MBuffer"); |
| } |
| } else { |
| start = parse_string; |
| end = parse_string + strlen(parse_string) + 1; |
| if ((retval = INKMimeHdrParse(parser, bufp1, mime_hdr_loc1, &start, end)) == INK_PARSE_ERROR) { |
| SDK_RPRINT(test, "INKMimeHdrParse", "TestCase1", TC_FAIL, "INKMimeHdrParse returns INK_PARSE_ERROR"); |
| SDK_RPRINT(test, "INKMimeHdrPrint", "TestCase1", TC_FAIL, |
| "Cannot run test as INKMimeHdrParse returned Error."); |
| SDK_RPRINT(test, "INKMimeHdrLengthGet", "TestCase1", TC_FAIL, |
| "Cannot run test as INKMimeHdrParse returned Error."); |
| } else { |
| if (retval == INK_PARSE_DONE) { |
| temp = convert_mime_hdr_to_string(bufp1, mime_hdr_loc1); // Implements INKMimeHdrPrint. |
| if (strcmp(parse_string, temp) == 0) { |
| SDK_RPRINT(test, "INKMimeHdrParse", "TestCase1", TC_PASS, "ok"); |
| SDK_RPRINT(test, "INKMimeHdrPrint", "TestCase1", TC_PASS, "ok"); |
| |
| // INKMimeHdrLengthGet |
| if ((hdrLength = INKMimeHdrLengthGet(bufp1, mime_hdr_loc1)) == INK_ERROR) { |
| SDK_RPRINT(test, "INKMimeHdrLengthGet", "TestCase1", TC_FAIL, "INKMimeHdrLengthGet returns INK_ERROR"); |
| } else { |
| if (hdrLength == (int) strlen(temp)) { |
| SDK_RPRINT(test, "INKMimeHdrLengthGet", "TestCase1", TC_PASS, "ok"); |
| test_passed_mime_hdr_length_get = true; |
| } else { |
| SDK_RPRINT(test, "INKMimeHdrLengthGet", "TestCase1", TC_FAIL, "Value's Mismatch"); |
| } |
| } |
| |
| test_passed_parse = true; |
| test_passed_mime_hdr_print = true; |
| } else { |
| SDK_RPRINT(test, "INKMimeHdrParse|INKMimeHdrPrint", "TestCase1", TC_FAIL, |
| "Incorrect parsing or incorrect Printing"); |
| SDK_RPRINT(test, "INKMimeHdrLengthGet", "TestCase1", TC_FAIL, |
| "Cannot run test as INKMimeHdrParse|INKMimeHdrPrint failed."); |
| } |
| |
| INKfree(temp); |
| } else { |
| SDK_RPRINT(test, "INKMimeHdrParse", "TestCase1", TC_FAIL, "Parsing Error"); |
| SDK_RPRINT(test, "INKMimeHdrPrint", "TestCase1", TC_FAIL, |
| "Cannot run test as INKMimeHdrParse returned error."); |
| SDK_RPRINT(test, "INKMimeHdrLengthGet", "TestCase1", TC_FAIL, |
| "Cannot run test as INKMimeHdrParse returned error."); |
| } |
| } |
| } |
| } |
| } else { |
| SDK_RPRINT(test, "INKMimeHdrParse", "TestCase1", TC_FAIL, "Cannot run test as unable to create a parser"); |
| SDK_RPRINT(test, "INKMimeHdrPrint", "TestCase1", TC_FAIL, "Cannot run test as unable to create a parser"); |
| SDK_RPRINT(test, "INKMimeHdrLengthGet", "TestCase1", TC_FAIL, "Cannot run test as unable to create a parser"); |
| } |
| |
| |
| // HOW DO I CHECK FOR PARSER CLEAR???? |
| if (test_passed_parser_create == true) { |
| if (INKMimeParserClear(parser) == INK_ERROR) { |
| SDK_RPRINT(test, "INKMimeParserClear", "TestCase1", TC_FAIL, "INKMimeParserClear returns INK_ERROR"); |
| } else { |
| SDK_RPRINT(test, "INKMimeParserClear", "TestCase1", TC_PASS, "ok"); |
| test_passed_parser_clear = true; |
| } |
| } else { |
| SDK_RPRINT(test, "INKMimeParserClear", "TestCase1", TC_FAIL, "Cannot run test as unable to create a parser"); |
| } |
| |
| |
| if (test_passed_parser_create == true) { |
| if (INKMimeParserDestroy(parser) != INK_SUCCESS) { |
| SDK_RPRINT(test, "INKMimeParserDestroy", "TestCase1", TC_FAIL, "INKMimeParserDestroy doesn't return INK_SUCCESS"); |
| } else { |
| SDK_RPRINT(test, "INKMimeParserDestroy", "TestCase1", TC_PASS, "ok"); |
| test_passed_parser_destroy = true; |
| } |
| } else { |
| SDK_RPRINT(test, "INKMimeParserDestroy", "TestCase1", TC_FAIL, "Cannot run test as unable to create a parser"); |
| } |
| |
| //INKMimeHdrFieldNextDup |
| if (test_passed_parse == true) { |
| if ((field_loc1 = INKMimeHdrFieldFind(bufp1, mime_hdr_loc1, DUPLICATE_FIELD_NAME, -1)) == INK_ERROR_PTR) { |
| SDK_RPRINT(test, "INKMimeHdrFieldNextDup", "TestCase1", TC_FAIL, "INKMimeHdrFieldFind returns INK_ERROR_PTR"); |
| SDK_RPRINT(test, "INKMimeHdrFieldFind", "TestCase1", TC_PASS, "INKMimeHdrFieldFind returns INK_ERROR_PTR"); |
| } else { |
| const char *fieldName; |
| int length; |
| if ((fieldName = INKMimeHdrFieldNameGet(bufp1, mime_hdr_loc1, field_loc1, &length)) != INK_ERROR_PTR) { |
| if (strcmp(fieldName, DUPLICATE_FIELD_NAME) == 0) { |
| SDK_RPRINT(test, "INKMimeHdrFieldFind", "TestCase1", TC_PASS, "ok"); |
| test_passed_mime_hdr_field_find = true; |
| } else { |
| SDK_RPRINT(test, "INKMimeHdrFieldFind", "TestCase1", TC_PASS, |
| "INKMimeHdrFieldFind returns incorrect field pointer"); |
| } |
| if (INKHandleStringRelease(bufp1, mime_hdr_loc1, fieldName) != INK_SUCCESS) { |
| SDK_RPRINT(test, "INKMimeHdrFieldFind", "TestCase1", TC_PASS, |
| "Unable to release handle to field name acquired using INKMimeHdrFieldNameGet"); |
| } |
| } else { |
| SDK_RPRINT(test, "INKMimeHdrFieldFind", "TestCase1", TC_PASS, "INKMimeHdrFieldNameGet returns INK_ERROR_PTR"); |
| } |
| |
| if ((field_loc2 = INKMimeHdrFieldNextDup(bufp1, mime_hdr_loc1, field_loc1)) == INK_ERROR_PTR) { |
| SDK_RPRINT(test, "INKMimeHdrFieldNextDup", "TestCase1", TC_FAIL, |
| "INKMimeHdrFieldNextDup returns INK_ERROR_PTR"); |
| } else { |
| if (compare_field_names(test, bufp1, mime_hdr_loc1, field_loc1, bufp1, mime_hdr_loc1, field_loc2) == INK_ERROR) { |
| SDK_RPRINT(test, "INKMimeHdrFieldNextDup", "TestCase1", TC_FAIL, "Incorrect Pointer"); |
| } else { |
| SDK_RPRINT(test, "INKMimeHdrFieldNextDup", "TestCase1", TC_PASS, "ok"); |
| test_passed_mime_hdr_field_next_dup = true; |
| } |
| } |
| |
| // INKHandleMLocRelease |
| if (INKHandleMLocRelease(bufp1, mime_hdr_loc1, field_loc1) == INK_ERROR) { |
| SDK_RPRINT(test, "INKHandleMLocRelease", "TestCase1", TC_FAIL, "INKHandleMLocRelease returns INK_ERROR"); |
| } else { |
| SDK_RPRINT(test, "INKHandleMLocRelease", "TestCase1", TC_PASS, "ok"); |
| test_passed_handle_mloc_release = true; |
| } |
| |
| if ((field_loc2 != NULL) && (field_loc2 != INK_ERROR_PTR)) { |
| if (INKHandleMLocRelease(bufp1, mime_hdr_loc1, field_loc2) == INK_ERROR) { |
| SDK_RPRINT(test, "INKHandleMLocRelease", "TestCase2", TC_FAIL, "INKHandleMLocRelease returns INK_ERROR"); |
| test_passed_handle_mloc_release = false; |
| } else { |
| SDK_RPRINT(test, "INKHandleMLocRelease", "TestCase2", TC_PASS, "ok"); |
| } |
| } |
| } |
| } else { |
| SDK_RPRINT(test, "INKMimeHdrFieldNext", "TestCase1", TC_FAIL, "Unable to run test as parsing failed."); |
| } |
| |
| //INKMimeHdrCopy |
| if (test_passed_parse == true) { |
| // Parsing |
| bufp2 = INKMBufferCreate(); |
| if (bufp2 == INK_ERROR_PTR) { |
| SDK_RPRINT(test, "INKMimeHdrCopy", "TestCase1", TC_FAIL, "Cannot create buffer for copying."); |
| } else { |
| mime_hdr_loc2 = INKMimeHdrCreate(bufp2); |
| if (mime_hdr_loc2 == INK_ERROR_PTR) { |
| SDK_RPRINT(test, "INKMimeHdrCopy", "TestCase1", TC_FAIL, "Cannot create Mime hdr for copying"); |
| if (INKMBufferDestroy(bufp2) == INK_ERROR) { |
| SDK_RPRINT(test, "INKMimeHdrCopy", "TestCase1", TC_FAIL, "Error in Destroying MBuffer"); |
| } |
| } else { |
| if (INKMimeHdrCopy(bufp2, mime_hdr_loc2, bufp1, mime_hdr_loc1) == INK_ERROR) { |
| SDK_RPRINT(test, "INKMimeHdrCopy", "TestCase1", TC_FAIL, "INKMimeHdrCopy returns INK_ERROR"); |
| } else { |
| temp = convert_mime_hdr_to_string(bufp2, mime_hdr_loc2); // Implements INKMimeHdrPrint. |
| if (strcmp(parse_string, temp) == 0) { |
| SDK_RPRINT(test, "INKMimeHdrCopy", "TestCase1", TC_PASS, "ok"); |
| test_passed_mime_hdr_copy = true; |
| } else { |
| SDK_RPRINT(test, "INKMimeHdrCopy", "TestCase1", TC_FAIL, "Value's Mismatch"); |
| } |
| INKfree(temp); |
| } |
| } |
| } |
| } else { |
| SDK_RPRINT(test, "INKMimeHdrCopy", "TestCase1", TC_FAIL, "Unable to run test as parsing failed."); |
| } |
| |
| bufp3 = INKMBufferCreate(); |
| mime_hdr_loc3 = INKMimeHdrCreate(bufp3); |
| test_passed_mime_hdr_clone = true; |
| |
| // INKMimeHdrFieldRemove |
| if (test_passed_mime_hdr_copy == true) { |
| if ((field_loc1 = INKMimeHdrFieldFind(bufp2, mime_hdr_loc2, REMOVE_FIELD_NAME, -1)) == INK_ERROR_PTR) { |
| SDK_RPRINT(test, "INKMimeHdrFieldRemove", "TestCase1", TC_FAIL, "INKMimeHdrFieldFind returns INK_ERROR_PTR"); |
| } else { |
| if (INKMimeHdrFieldRemove(bufp2, mime_hdr_loc2, field_loc1) == INK_ERROR) { |
| SDK_RPRINT(test, "INKMimeHdrFieldRemove", "TestCase1", TC_FAIL, "INKMimeHdrFieldRemove returns INK_ERROR_PTR"); |
| } else { |
| if ((field_loc2 = INKMimeHdrFieldFind(bufp2, mime_hdr_loc2, REMOVE_FIELD_NAME, -1)) == INK_ERROR_PTR) { |
| SDK_RPRINT(test, "INKMimeHdrFieldRemove", "TestCase1", TC_FAIL, "INKMimeHdrFieldFind returns INK_ERROR_PTR"); |
| } else { |
| if ((field_loc2 == NULL) || (field_loc1 != field_loc2)) { |
| test_passed_mime_hdr_field_remove = true; |
| } else { |
| SDK_RPRINT(test, "INKMimeHdrFieldRemove", "TestCase1", TC_FAIL, "Field Not Removed"); |
| } |
| |
| if ((test_passed_mime_hdr_field_remove == true)) { |
| if (INKMimeHdrFieldAppend(bufp2, mime_hdr_loc2, field_loc1) == INK_ERROR) { |
| SDK_RPRINT(test, "INKMimeHdrFieldRemove", "TestCase1", TC_FAIL, |
| "Unable to readd the field to mime header. Probably destroyed"); |
| test_passed_mime_hdr_field_remove = false; |
| } else { |
| SDK_RPRINT(test, "INKMimeHdrFieldRemove", "TestCase1", TC_PASS, "ok"); |
| } |
| } |
| } |
| } |
| |
| // INKHandleMLocRelease |
| if (INKHandleMLocRelease(bufp2, mime_hdr_loc2, field_loc1) == INK_ERROR) { |
| SDK_RPRINT(test, "INKHandleMLocRelease", "TestCase3", TC_FAIL, "INKHandleMLocRelease returns INK_ERROR"); |
| test_passed_handle_mloc_release = false; |
| } else { |
| SDK_RPRINT(test, "INKHandleMLocRelease", "TestCase3", TC_PASS, "ok"); |
| } |
| |
| if ((field_loc2 != NULL) && (field_loc2 != INK_ERROR_PTR)) { |
| if (INKHandleMLocRelease(bufp2, mime_hdr_loc2, field_loc2) == INK_ERROR) { |
| SDK_RPRINT(test, "INKHandleMLocRelease", "TestCase4", TC_FAIL, "INKHandleMLocRelease returns INK_ERROR"); |
| test_passed_handle_mloc_release = false; |
| } else { |
| SDK_RPRINT(test, "INKHandleMLocRelease", "TestCase4", TC_PASS, "ok"); |
| } |
| } |
| } |
| } else { |
| SDK_RPRINT(test, "INKMimeHdrFieldNext", "TestCase1", TC_FAIL, "Unable to run test as parsing failed."); |
| } |
| |
| // INKMimeHdrFieldCopy && INKHandleStringRelease |
| if (test_passed_mime_hdr_copy == true) { |
| if ((field_loc1 = INKMimeHdrFieldCreate(bufp2, mime_hdr_loc2)) == INK_ERROR_PTR) { |
| SDK_RPRINT(test, "INKMimeHdrFieldCopy", "TestCase1", TC_FAIL, "Unable to create field for Copying"); |
| } else { |
| if ((field_loc2 = INKMimeHdrFieldGet(bufp1, mime_hdr_loc1, 0)) == INK_ERROR_PTR) { |
| SDK_RPRINT(test, "INKMimeHdrFieldCopy", "TestCase1", TC_FAIL, "Unable to get source field for copying"); |
| } else { |
| if (INKMimeHdrFieldCopy(bufp2, mime_hdr_loc2, field_loc1, bufp1, mime_hdr_loc1, field_loc2) == INK_ERROR) { |
| SDK_RPRINT(test, "INKMimeHdrFieldCopy", "TestCase1", TC_FAIL, "INKMimeHdrFieldCopy returns INK_ERROR"); |
| } else { |
| if ((compare_field_names(test, bufp2, mime_hdr_loc2, field_loc1, bufp1, mime_hdr_loc1, field_loc2) == |
| INK_ERROR) || |
| (compare_field_values |
| (test, bufp2, mime_hdr_loc2, field_loc1, bufp1, mime_hdr_loc1, field_loc2, |
| &test_passed_handle_string_release, true) == INK_ERROR) |
| ) { |
| SDK_RPRINT(test, "INKMimeHdrFieldCopy", "TestCase1", TC_FAIL, "Value's Mismatch"); |
| } else { |
| SDK_RPRINT(test, "INKMimeHdrFieldCopy", "TestCase1", TC_PASS, "ok"); |
| test_passed_mime_hdr_field_copy = true; |
| } |
| } |
| } |
| if (INKHandleMLocRelease(bufp2, mime_hdr_loc2, field_loc1) == INK_ERROR) { |
| SDK_RPRINT(test, "INKHandleMLocRelease", "TestCase5", TC_FAIL, "INKHandleMLocRelease returns INK_ERROR"); |
| test_passed_handle_mloc_release = false; |
| } else { |
| SDK_RPRINT(test, "INKHandleMLocRelease", "TestCase5", TC_PASS, "ok"); |
| } |
| |
| if ((field_loc2 != NULL) && (field_loc2 != INK_ERROR_PTR)) { |
| if (INKHandleMLocRelease(bufp1, mime_hdr_loc1, field_loc2) == INK_ERROR) { |
| SDK_RPRINT(test, "INKHandleMLocRelease", "TestCase6", TC_FAIL, "INKHandleMLocRelease returns INK_ERROR"); |
| test_passed_handle_mloc_release = false; |
| } else { |
| SDK_RPRINT(test, "INKHandleMLocRelease", "TestCase6", TC_PASS, "ok"); |
| } |
| } |
| } |
| } else { |
| SDK_RPRINT(test, "INKMimeHdrFieldCopy", "TestCase1", TC_FAIL, |
| "Unable to run test as bufp2 might not have been created"); |
| } |
| |
| // INKMimeHdrFieldClone && INKHandleStringRelease |
| if (test_passed_mime_hdr_clone == true) { |
| field_loc1 = NULL; |
| field_loc2 = NULL; |
| if ((field_loc2 = INKMimeHdrFieldGet(bufp1, mime_hdr_loc1, 0)) == INK_ERROR_PTR) { |
| SDK_RPRINT(test, "INKMimeHdrFieldClone", "TestCase1", TC_FAIL, "Unable to get source field for copying"); |
| } else { |
| if ((field_loc1 = INKMimeHdrFieldClone(bufp3, mime_hdr_loc3, bufp1, mime_hdr_loc1, field_loc2)) == INK_ERROR_PTR) { |
| SDK_RPRINT(test, "INKMimeHdrFieldClone", "TestCase1", TC_FAIL, "INKMimeHdrFieldClone returns INK_ERROR_PTR"); |
| } else { |
| if ((compare_field_names(test, bufp3, mime_hdr_loc3, field_loc1, bufp1, mime_hdr_loc1, field_loc2) == INK_ERROR) |
| || |
| (compare_field_values |
| (test, bufp3, mime_hdr_loc3, field_loc1, bufp1, mime_hdr_loc1, field_loc2, |
| &test_passed_handle_string_release, true) == INK_ERROR) |
| ) { |
| SDK_RPRINT(test, "INKMimeHdrFieldClone", "TestCase1", TC_FAIL, "Value's Mismatch"); |
| } else { |
| SDK_RPRINT(test, "INKMimeHdrFieldClone", "TestCase1", TC_PASS, "ok"); |
| } |
| } |
| } |
| if ((field_loc1 != NULL) && (field_loc1 != INK_ERROR_PTR)) { |
| if (INKHandleMLocRelease(bufp3, mime_hdr_loc3, field_loc1) == INK_ERROR) { |
| SDK_RPRINT(test, "INKHandleMLocRelease", "TestCase7", TC_FAIL, "INKHandleMLocRelease returns INK_ERROR"); |
| test_passed_handle_mloc_release = false; |
| } else { |
| SDK_RPRINT(test, "INKHandleMLocRelease", "TestCase7", TC_PASS, "ok"); |
| } |
| } |
| |
| if ((field_loc2 != NULL) && (field_loc2 != INK_ERROR_PTR)) { |
| if (INKHandleMLocRelease(bufp1, mime_hdr_loc1, field_loc2) == INK_ERROR) { |
| SDK_RPRINT(test, "INKHandleMLocRelease", "TestCase8", TC_FAIL, "INKHandleMLocRelease returns INK_ERROR"); |
| test_passed_handle_mloc_release = false; |
| } else { |
| SDK_RPRINT(test, "INKHandleMLocRelease", "TestCase8", TC_PASS, "ok"); |
| } |
| } |
| } else { |
| SDK_RPRINT(test, "INKMimeHdrFieldClone", "TestCase1", TC_FAIL, |
| "Unable to run test as bufp3 might not have been created"); |
| } |
| |
| // INKMimeHdrFieldCopyValues && INKHandleStringRelease |
| if (test_passed_mime_hdr_copy == true) { |
| if ((field_loc1 = INKMimeHdrFieldCreate(bufp2, mime_hdr_loc2)) == INK_ERROR_PTR) { |
| SDK_RPRINT(test, "INKMimeHdrFieldCopyValues", "TestCase1", TC_FAIL, "Unable to create field for Copying"); |
| } else { |
| if ((field_loc2 = INKMimeHdrFieldGet(bufp1, mime_hdr_loc1, 0)) == INK_ERROR_PTR) { |
| SDK_RPRINT(test, "INKMimeHdrFieldCopyValues", "TestCase1", TC_FAIL, "Unable to get source field for copying"); |
| } else { |
| if (INKMimeHdrFieldCopyValues(bufp2, mime_hdr_loc2, field_loc1, bufp1, mime_hdr_loc1, field_loc2) == INK_ERROR) { |
| SDK_RPRINT(test, "INKMimeHdrFieldCopyValues", "TestCase1", TC_FAIL, "INKMimeHdrFieldCopy returns INK_ERROR"); |
| } else { |
| if (compare_field_values |
| (test, bufp2, mime_hdr_loc2, field_loc1, bufp1, mime_hdr_loc1, field_loc2, |
| &test_passed_handle_string_release, false) == INK_ERROR) { |
| SDK_RPRINT(test, "INKMimeHdrFieldCopyValues", "TestCase1", TC_FAIL, "Value's Mismatch"); |
| } else { |
| SDK_RPRINT(test, "INKMimeHdrFieldCopyValues", "TestCase1", TC_PASS, "ok"); |
| test_passed_mime_hdr_field_copy_values = true; |
| } |
| } |
| } |
| if (INKHandleMLocRelease(bufp2, mime_hdr_loc2, field_loc1) == INK_ERROR) { |
| SDK_RPRINT(test, "INKHandleMLocRelease", "TestCase9", TC_FAIL, "INKHandleMLocRelease returns INK_ERROR"); |
| test_passed_handle_mloc_release = false; |
| } else { |
| SDK_RPRINT(test, "INKHandleMLocRelease", "TestCase9", TC_PASS, "ok"); |
| } |
| |
| if ((field_loc2 != NULL) && (field_loc2 != INK_ERROR_PTR)) { |
| if (INKHandleMLocRelease(bufp1, mime_hdr_loc1, field_loc2) == INK_ERROR) { |
| SDK_RPRINT(test, "INKHandleMLocRelease", "TestCase10", TC_FAIL, "INKHandleMLocRelease returns INK_ERROR"); |
| test_passed_handle_mloc_release = false; |
| } else { |
| SDK_RPRINT(test, "INKHandleMLocRelease", "TestCase10", TC_PASS, "ok"); |
| } |
| } |
| } |
| } else { |
| SDK_RPRINT(test, "INKMimeHdrFieldCopy", "TestCase1", TC_FAIL, |
| "Unable to run test as bufp2 might not have been created"); |
| } |
| |
| if ((INKMimeHdrDestroy(bufp1, mime_hdr_loc1) == INK_ERROR) || |
| (INKMimeHdrDestroy(bufp2, mime_hdr_loc2) == INK_ERROR) || (INKMimeHdrDestroy(bufp3, mime_hdr_loc3) == INK_ERROR) |
| ) { |
| SDK_RPRINT(test, "", "TestCase", TC_FAIL, "INKMimeHdrDestroy returns INK_ERROR"); |
| } |
| |
| if ((INKHandleMLocRelease(bufp1, INK_NULL_MLOC, mime_hdr_loc1) == INK_ERROR) || |
| (INKHandleMLocRelease(bufp2, INK_NULL_MLOC, mime_hdr_loc2) == INK_ERROR) || |
| (INKHandleMLocRelease(bufp3, INK_NULL_MLOC, mime_hdr_loc3) == INK_ERROR) |
| ) { |
| SDK_RPRINT(test, "INKHandleMLocRelease", "TestCase11|12|13", TC_FAIL, "Unable to release handle to Mime Hdrs"); |
| test_passed_handle_mloc_release = false; |
| } |
| |
| if ((INKMBufferDestroy(bufp1) == INK_ERROR) || |
| (INKMBufferDestroy(bufp2) == INK_ERROR) || (INKMBufferDestroy(bufp3) == INK_ERROR) |
| ) { |
| SDK_RPRINT(test, "", "TestCase", TC_FAIL, "INKMBufferDestroy returns INK_ERROR"); |
| } |
| |
| if (test_passed_handle_string_release == true) { |
| SDK_RPRINT(test, "INKHandleStringRelease", "All", TC_PASS, "ok"); |
| } else { |
| SDK_RPRINT(test, "INKHandleStringRelease", "TestCase", TC_PASS, "Returned INK_ERROR"); |
| } |
| |
| if ((test_passed_parser_create != true) || |
| (test_passed_parse != true) || |
| (test_passed_parser_clear != true) || |
| (test_passed_parser_destroy != true) || |
| (test_passed_mime_hdr_print != true) || |
| (test_passed_mime_hdr_length_get != true) || |
| (test_passed_mime_hdr_field_next_dup != true) || |
| (test_passed_mime_hdr_copy != true) || |
| (test_passed_mime_hdr_clone != true) || |
| (test_passed_mime_hdr_field_remove != true) || |
| (test_passed_mime_hdr_field_copy != true) || |
| (test_passed_mime_hdr_field_copy_values != true) || |
| (test_passed_handle_mloc_release != true) || |
| (test_passed_handle_string_release != true) || (test_passed_mime_hdr_field_find != true) |
| ) { |
| *pstatus = REGRESSION_TEST_FAILED; |
| } else { |
| *pstatus = REGRESSION_TEST_PASSED; |
| } |
| |
| } |
| |
| ////////////////////////////////////////////// |
| // SDK_API_INKUrlParse |
| // |
| // Unit Test for API: INKUrlParse |
| ////////////////////////////////////////////// |
| |
| REGRESSION_TEST(SDK_API_INKUrlParse) (RegressionTest * test, int atype, int *pstatus) |
| { |
| NOWARN_UNUSED(atype); |
| const char *url = "http://abc:def@www.example.com:3426/homepage.cgi;ab?abc=def#abc"; |
| const char *start; |
| const char *end; |
| char *temp; |
| |
| int retval; |
| |
| INKMBuffer bufp; |
| INKMLoc url_loc = (INKMLoc) INK_ERROR_PTR; |
| bool test_passed_parse_url = false; |
| int length; |
| |
| *pstatus = REGRESSION_TEST_INPROGRESS; |
| |
| |
| bufp = INKMBufferCreate(); |
| if (bufp == INK_ERROR_PTR) { |
| SDK_RPRINT(test, "INKUrlParse", "TestCase1", TC_FAIL, "Cannot create buffer for parsing url"); |
| } else { |
| url_loc = INKUrlCreate(bufp); |
| if (url_loc == INK_ERROR_PTR) { |
| SDK_RPRINT(test, "INKUrlParse", "TestCase1", TC_FAIL, "Cannot create Url for parsing the url"); |
| if (INKMBufferDestroy(bufp) == INK_ERROR) { |
| SDK_RPRINT(test, "INKUrlParse", "TestCase1", TC_FAIL, "Error in Destroying MBuffer"); |
| } |
| } else { |
| start = url; |
| end = url + strlen(url) + 1; |
| if ((retval = INKUrlParse(bufp, url_loc, &start, end)) == INK_PARSE_ERROR) { |
| SDK_RPRINT(test, "INKUrlParse", "TestCase1", TC_FAIL, "INKUrlParse returns INK_PARSE_ERROR"); |
| } else { |
| if (retval == INK_PARSE_DONE) { |
| temp = INKUrlStringGet(bufp, url_loc, &length); |
| if (temp == INK_ERROR_PTR) { |
| SDK_RPRINT(test, "INKUrlParse", "TestCase1", TC_FAIL, "INKUrlStringGet returns INK_ERROR_PTR"); |
| } else { |
| if (strncmp(url, temp, length) == 0) { |
| SDK_RPRINT(test, "INKUrlParse", "TestCase1", TC_PASS, "ok"); |
| test_passed_parse_url = true; |
| } else { |
| SDK_RPRINT(test, "INKUrlParse", "TestCase1", TC_FAIL, "Value's Mismatch"); |
| } |
| INKfree(temp); |
| } |
| } else { |
| SDK_RPRINT(test, "INKHttpHdrParseReq", "TestCase1", TC_FAIL, "Parsing Error"); |
| } |
| } |
| } |
| } |
| |
| if (test_passed_parse_url != true) { |
| *pstatus = REGRESSION_TEST_FAILED; |
| } else { |
| *pstatus = REGRESSION_TEST_PASSED; |
| } |
| |
| INKUrlDestroy(bufp, url_loc); |
| |
| INKHandleMLocRelease(bufp, INK_NULL_MLOC, url_loc); |
| |
| INKMBufferDestroy(bufp); |
| |
| return; |
| } |
| |
| ////////////////////////////////////////////// |
| // SDK_API_INKTextLog |
| // |
| // Unit Test for APIs: INKTextLogObjectCreate |
| // INKTextLogObjectWrite |
| // INKTextLogObjectDestroy |
| // INKTextLogObjectFlush |
| ////////////////////////////////////////////// |
| #define LOG_TEST_PATTERN "SDK team rocks" |
| |
| typedef struct |
| { |
| RegressionTest *test; |
| int *pstatus; |
| char *fullpath_logname; |
| unsigned long magic; |
| } LogTestData; |
| |
| |
| static int |
| log_test_handler(INKCont contp, INKEvent event, void *edata) |
| { |
| NOWARN_UNUSED(edata); |
| INKFile filep; |
| char buf[1024]; |
| bool str_found; |
| |
| INKAssert(event == INK_EVENT_TIMEOUT); |
| |
| LogTestData *data = (LogTestData *) INKContDataGet(contp); |
| INKAssert(data->magic == MAGIC_ALIVE); |
| |
| // Verify content was correctly written into log file |
| |
| if ((filep = INKfopen(data->fullpath_logname, "r")) == NULL) { |
| SDK_RPRINT(data->test, "INKTextLogObject", "TestCase1", TC_FAIL, |
| "can not open log file %s", data->fullpath_logname); |
| *(data->pstatus) = REGRESSION_TEST_FAILED; |
| return -1; |
| } |
| |
| str_found = false; |
| while (INKfgets(filep, buf, 1024) != NULL) { |
| if (strstr(buf, LOG_TEST_PATTERN) != NULL) { |
| str_found = true; |
| break; |
| } |
| } |
| INKfclose(filep); |
| if (str_found == false) { |
| SDK_RPRINT(data->test, "INKTextLogObject", "TestCase1", TC_FAIL, |
| "can not find pattern %s in log file", LOG_TEST_PATTERN); |
| *(data->pstatus) = REGRESSION_TEST_FAILED; |
| return -1; |
| } |
| |
| *(data->pstatus) = REGRESSION_TEST_PASSED; |
| |
| data->magic = MAGIC_DEAD; |
| INKfree(data->fullpath_logname); |
| INKfree(data); |
| data = NULL; |
| |
| return -1; |
| } |
| |
| REGRESSION_TEST(SDK_API_INKTextLog) (RegressionTest * test, int atype, int *pstatus) |
| { |
| NOWARN_UNUSED(atype); |
| *pstatus = REGRESSION_TEST_INPROGRESS; |
| |
| INKTextLogObject log; |
| INKReturnCode retVal; |
| |
| char logname[128]; |
| char fullpath_logname[128]; |
| |
| /* Generate a random log file name, so if we run the test several times, we won't use the |
| same log file name. */ |
| char *tmp = REC_ConfigReadString("proxy.config.log2.logfile_dir"); |
| snprintf(logname, sizeof(logname), "RegressionTestLog%d.log", (int) getpid()); |
| snprintf(fullpath_logname, sizeof(fullpath_logname), "%s/%s", tmp, logname); |
| // xfree(tmp); |
| |
| retVal = INKTextLogObjectCreate(logname, INK_LOG_MODE_ADD_TIMESTAMP, &log); |
| if (retVal != INK_SUCCESS) { |
| SDK_RPRINT(test, "INKTextLogObjectCreate", "TestCase1", TC_FAIL, "can not create log object"); |
| *pstatus = REGRESSION_TEST_FAILED; |
| return; |
| } else { |
| SDK_RPRINT(test, "INKTextLogObjectCreate", "TestCase1", TC_PASS, "ok"); |
| } |
| |
| retVal = INKTextLogObjectWrite(log, (char*)LOG_TEST_PATTERN); |
| if (retVal != INK_SUCCESS) { |
| SDK_RPRINT(test, "INKTextLogObjectWrite", "TestCase1", TC_FAIL, "can not write to log object"); |
| *pstatus = REGRESSION_TEST_FAILED; |
| return; |
| } else { |
| SDK_RPRINT(test, "INKTextLogObjectWrite", "TestCase1", TC_PASS, "ok"); |
| } |
| |
| retVal = INKTextLogObjectFlush(log); |
| if (retVal != INK_SUCCESS) { |
| SDK_RPRINT(test, "INKTextLogObjectFlush", "TestCase1", TC_FAIL, "can not flush log object"); |
| *pstatus = REGRESSION_TEST_FAILED; |
| return; |
| } else { |
| SDK_RPRINT(test, "INKTextLogObjectFlush", "TestCase1", TC_PASS, "ok"); |
| } |
| |
| retVal = INKTextLogObjectDestroy(log); |
| if (retVal != INK_SUCCESS) { |
| SDK_RPRINT(test, "INKTextLogObjectDestroy", "TestCase1", TC_FAIL, "can not destroy log object"); |
| *pstatus = REGRESSION_TEST_FAILED; |
| return; |
| } else { |
| SDK_RPRINT(test, "INKTextLogObjectDestroy", "TestCase1", TC_PASS, "ok"); |
| } |
| |
| |
| INKCont log_test_cont = INKContCreate(log_test_handler, INKMutexCreate()); |
| LogTestData *data = (LogTestData *) INKmalloc(sizeof(LogTestData)); |
| data->test = test; |
| data->pstatus = pstatus; |
| data->fullpath_logname = INKstrdup(fullpath_logname); |
| data->magic = MAGIC_ALIVE; |
| INKContDataSet(log_test_cont, data); |
| |
| INKContSchedule(log_test_cont, 5000); |
| return; |
| } |
| |
| |
| ////////////////////////////////////////////// |
| // SDK_API_INKMgmtGet |
| // |
| // Unit Test for APIs: INKMgmtCounterGet |
| // INKMgmtFloatGet |
| // INKMgmtIntGet |
| // INKMgmtStringGet |
| ////////////////////////////////////////////// |
| |
| REGRESSION_TEST(SDK_API_INKMgmtGet) (RegressionTest * test, int atype, int *pstatus) |
| { |
| NOWARN_UNUSED(atype); |
| const char *CONFIG_PARAM_COUNTER_NAME = "proxy.process.http.total_parent_proxy_connections"; |
| int CONFIG_PARAM_COUNTER_VALUE = 0; |
| |
| const char *CONFIG_PARAM_FLOAT_NAME = "proxy.config.http.background_fill_completed_threshold"; |
| float CONFIG_PARAM_FLOAT_VALUE = 0.5; |
| |
| const char *CONFIG_PARAM_INT_NAME = "proxy.config.http.cache.http"; |
| int CONFIG_PARAM_INT_VALUE = 1; |
| |
| const char *CONFIG_PARAM_STRING_NAME = "proxy.config.product_name"; |
| const char *CONFIG_PARAM_STRING_VALUE = "Traffic Server"; |
| |
| *pstatus = REGRESSION_TEST_INPROGRESS; |
| |
| int retVal; |
| int err = 0; |
| INKMgmtCounter cvalue = 0; |
| INKMgmtFloat fvalue = 0.0; |
| INKMgmtInt ivalue = -1; |
| INKMgmtString svalue = NULL; |
| |
| retVal = INKMgmtCounterGet(CONFIG_PARAM_COUNTER_NAME, &cvalue); |
| if (retVal == 0) { |
| SDK_RPRINT(test, "INKMgmtCounterGet", "TestCase1.1", TC_FAIL, "can not get value of param %s", |
| CONFIG_PARAM_COUNTER_NAME); |
| err = 1; |
| } else if (cvalue != CONFIG_PARAM_COUNTER_VALUE) { |
| SDK_RPRINT(test, "INKMgmtCounterGet", "TestCase1.1", TC_FAIL, |
| "got incorrect value of param %s, should have been %d, found %d", CONFIG_PARAM_COUNTER_NAME, |
| CONFIG_PARAM_COUNTER_VALUE, cvalue); |
| err = 1; |
| } else { |
| SDK_RPRINT(test, "INKMgmtCounterGet", "TestCase1.1", TC_PASS, "ok"); |
| } |
| |
| retVal = INKMgmtFloatGet(CONFIG_PARAM_FLOAT_NAME, &fvalue); |
| if ((retVal == 0) || (fvalue != CONFIG_PARAM_FLOAT_VALUE)) { |
| SDK_RPRINT(test, "INKMgmtFloatGet", "TestCase2", TC_FAIL, "can not get value of param %s", CONFIG_PARAM_FLOAT_NAME); |
| err = 1; |
| } else { |
| SDK_RPRINT(test, "INKMgmtFloatGet", "TestCase1.2", TC_PASS, "ok"); |
| } |
| |
| retVal = INKMgmtIntGet(CONFIG_PARAM_INT_NAME, &ivalue); |
| if ((retVal == 0) || (ivalue != CONFIG_PARAM_INT_VALUE)) { |
| SDK_RPRINT(test, "INKMgmtIntGet", "TestCase1.3", TC_FAIL, "can not get value of param %s", CONFIG_PARAM_INT_NAME); |
| err = 1; |
| } else { |
| SDK_RPRINT(test, "INKMgmtIntGet", "TestCase1.3", TC_PASS, "ok"); |
| } |
| |
| retVal = INKMgmtStringGet(CONFIG_PARAM_STRING_NAME, &svalue); |
| if (retVal == 0) { |
| SDK_RPRINT(test, "INKMgmtStringGet", "TestCase1.4", TC_FAIL, "can not get value of param %s", |
| CONFIG_PARAM_STRING_NAME); |
| err = 1; |
| } else if (strcmp(svalue, CONFIG_PARAM_STRING_VALUE) != 0) { |
| SDK_RPRINT(test, "INKMgmtStringGet", "TestCase1.4", TC_FAIL, |
| "got incorrect value of param %s, should have been \"%s\", found \"%s\"", CONFIG_PARAM_STRING_NAME, |
| CONFIG_PARAM_STRING_VALUE, svalue); |
| err = 1; |
| } else { |
| SDK_RPRINT(test, "INKMgmtStringGet", "TestCase1.4", TC_PASS, "ok"); |
| } |
| |
| if (err) { |
| *pstatus = REGRESSION_TEST_FAILED; |
| return; |
| } |
| |
| *pstatus = REGRESSION_TEST_PASSED; |
| SDK_RPRINT(test, "INKMgmtGet", "TestCase1", TC_PASS, "ok"); |
| return; |
| } |
| |
| |
| ////////////////////////////////////////////// |
| // SDK_API_INKMgmtUpdateRegister |
| // |
| // Unit Test for APIs: INKMgmtUpdateRegister |
| // |
| // FIX ME: How to test this API automatically |
| // as it requires a GUI action ?? |
| ////////////////////////////////////////////// |
| |
| // dummy handler. Should never get called. |
| int |
| gui_update_handler(INKCont contp, INKEvent event, void *edata) |
| { |
| NOWARN_UNUSED(contp); |
| NOWARN_UNUSED(event); |
| NOWARN_UNUSED(edata); |
| INKReleaseAssert(!"gui_update_handler should not be called"); |
| return 0; |
| } |
| |
| REGRESSION_TEST(SDK_API_INKMgmtUpdateRegister) (RegressionTest * test, int atype, int *pstatus) |
| { |
| NOWARN_UNUSED(atype); |
| *pstatus = REGRESSION_TEST_INPROGRESS; |
| |
| INKCont mycont = INKContCreate(gui_update_handler, INKMutexCreate()); |
| |
| if (INKMgmtUpdateRegister(mycont, "myPlugin", "myPluginPath/myGui.cgi") != INK_SUCCESS) { |
| SDK_RPRINT(test, "INKMgmtUpdateRegister", "TestCase1", TC_FAIL, "can not register plugin interface"); |
| *pstatus = REGRESSION_TEST_FAILED; |
| } else { |
| *pstatus = REGRESSION_TEST_PASSED; |
| } |
| return; |
| } |
| |
| |
| ////////////////////////////////////////////// |
| // SDK_API_INKConstant |
| // |
| // Unit Test for APIs: All INK_XXX constants |
| // |
| ////////////////////////////////////////////// |
| |
| #define PRINT_DIFF( _x ) \ |
| { \ |
| if ( _x - ORIG_##_x != 0) { \ |
| test_passed = false; \ |
| SDK_RPRINT (test, "##_x", "TestCase1", TC_FAIL, \ |
| "%s:Original Value = %d; New Value = %d \n", #_x,_x, ORIG_##_x); \ |
| } \ |
| } |
| |
| |
| typedef enum |
| { |
| ORIG_INK_PARSE_ERROR = -1, |
| ORIG_INK_PARSE_DONE = 0, |
| ORIG_INK_PARSE_OK = 1, |
| ORIG_INK_PARSE_CONT = 2 |
| } ORIG_INKParseResult; |
| |
| typedef enum |
| { |
| ORIG_INK_HTTP_TYPE_UNKNOWN, |
| ORIG_INK_HTTP_TYPE_REQUEST, |
| ORIG_INK_HTTP_TYPE_RESPONSE |
| } ORIG_INKHttpType; |
| |
| typedef enum |
| { |
| ORIG_INK_HTTP_STATUS_NONE = 0, |
| |
| ORIG_INK_HTTP_STATUS_CONTINUE = 100, |
| ORIG_INK_HTTP_STATUS_SWITCHING_PROTOCOL = 101, |
| |
| ORIG_INK_HTTP_STATUS_OK = 200, |
| ORIG_INK_HTTP_STATUS_CREATED = 201, |
| ORIG_INK_HTTP_STATUS_ACCEPTED = 202, |
| ORIG_INK_HTTP_STATUS_NON_AUTHORITATIVE_INFORMATION = 203, |
| ORIG_INK_HTTP_STATUS_NO_CONTENT = 204, |
| ORIG_INK_HTTP_STATUS_RESET_CONTENT = 205, |
| ORIG_INK_HTTP_STATUS_PARTIAL_CONTENT = 206, |
| |
| ORIG_INK_HTTP_STATUS_MULTIPLE_CHOICES = 300, |
| ORIG_INK_HTTP_STATUS_MOVED_PERMANENTLY = 301, |
| ORIG_INK_HTTP_STATUS_MOVED_TEMPORARILY = 302, |
| ORIG_INK_HTTP_STATUS_SEE_OTHER = 303, |
| ORIG_INK_HTTP_STATUS_NOT_MODIFIED = 304, |
| ORIG_INK_HTTP_STATUS_USE_PROXY = 305, |
| |
| ORIG_INK_HTTP_STATUS_BAD_REQUEST = 400, |
| ORIG_INK_HTTP_STATUS_UNAUTHORIZED = 401, |
| ORIG_INK_HTTP_STATUS_PAYMENT_REQUIRED = 402, |
| ORIG_INK_HTTP_STATUS_FORBIDDEN = 403, |
| ORIG_INK_HTTP_STATUS_NOT_FOUND = 404, |
| ORIG_INK_HTTP_STATUS_METHOD_NOT_ALLOWED = 405, |
| ORIG_INK_HTTP_STATUS_NOT_ACCEPTABLE = 406, |
| ORIG_INK_HTTP_STATUS_PROXY_AUTHENTICATION_REQUIRED = 407, |
| ORIG_INK_HTTP_STATUS_REQUEST_TIMEOUT = 408, |
| ORIG_INK_HTTP_STATUS_CONFLICT = 409, |
| ORIG_INK_HTTP_STATUS_GONE = 410, |
| ORIG_INK_HTTP_STATUS_LENGTH_REQUIRED = 411, |
| ORIG_INK_HTTP_STATUS_PRECONDITION_FAILED = 412, |
| ORIG_INK_HTTP_STATUS_REQUEST_ENTITY_TOO_LARGE = 413, |
| ORIG_INK_HTTP_STATUS_REQUEST_URI_TOO_LONG = 414, |
| ORIG_INK_HTTP_STATUS_UNSUPPORTED_MEDIA_TYPE = 415, |
| |
| ORIG_INK_HTTP_STATUS_INTERNAL_SERVER_ERROR = 500, |
| ORIG_INK_HTTP_STATUS_NOT_IMPLEMENTED = 501, |
| ORIG_INK_HTTP_STATUS_BAD_GATEWAY = 502, |
| ORIG_INK_HTTP_STATUS_SERVICE_UNAVAILABLE = 503, |
| ORIG_INK_HTTP_STATUS_GATEWAY_TIMEOUT = 504, |
| ORIG_INK_HTTP_STATUS_HTTPVER_NOT_SUPPORTED = 505 |
| } ORIG_INKHttpStatus; |
| |
| typedef enum |
| { |
| ORIG_INK_HTTP_READ_REQUEST_HDR_HOOK, |
| ORIG_INK_HTTP_OS_DNS_HOOK, |
| ORIG_INK_HTTP_SEND_REQUEST_HDR_HOOK, |
| ORIG_INK_HTTP_READ_CACHE_HDR_HOOK, |
| ORIG_INK_HTTP_READ_RESPONSE_HDR_HOOK, |
| ORIG_INK_HTTP_SEND_RESPONSE_HDR_HOOK, |
| ORIG_INK_HTTP_REQUEST_TRANSFORM_HOOK, |
| ORIG_INK_HTTP_RESPONSE_TRANSFORM_HOOK, |
| ORIG_INK_HTTP_SELECT_ALT_HOOK, |
| ORIG_INK_HTTP_TXN_START_HOOK, |
| ORIG_INK_HTTP_TXN_CLOSE_HOOK, |
| ORIG_INK_HTTP_SSN_START_HOOK, |
| ORIG_INK_HTTP_SSN_CLOSE_HOOK, |
| ORIG_INK_HTTP_CACHE_LOOKUP_COMPLETE_HOOK, |
| ORIG_INK_HTTP_READ_REQUEST_PRE_REMAP_HOOK, |
| ORIG_INK_HTTP_LAST_HOOK |
| } ORIG_INKHttpHookID; |
| |
| typedef enum |
| { |
| ORIG_INK_EVENT_NONE = 0, |
| ORIG_INK_EVENT_IMMEDIATE = 1, |
| ORIG_INK_EVENT_TIMEOUT = 2, |
| ORIG_INK_EVENT_ERROR = 3, |
| ORIG_INK_EVENT_CONTINUE = 4, |
| |
| ORIG_INK_EVENT_VCONN_READ_READY = 100, |
| ORIG_INK_EVENT_VCONN_WRITE_READY = 101, |
| ORIG_INK_EVENT_VCONN_READ_COMPLETE = 102, |
| ORIG_INK_EVENT_VCONN_WRITE_COMPLETE = 103, |
| ORIG_INK_EVENT_VCONN_EOS = 104, |
| |
| ORIG_INK_EVENT_NET_CONNECT = 200, |
| ORIG_INK_EVENT_NET_CONNECT_FAILED = 201, |
| ORIG_INK_EVENT_NET_ACCEPT = 202, |
| ORIG_INK_EVENT_NET_ACCEPT_FAILED = 204, |
| |
| ORIG_INK_EVENT_HOST_LOOKUP = 500, |
| |
| ORIG_INK_EVENT_CACHE_OPEN_READ = 1102, |
| ORIG_INK_EVENT_CACHE_OPEN_READ_FAILED = 1103, |
| ORIG_INK_EVENT_CACHE_OPEN_WRITE = 1108, |
| ORIG_INK_EVENT_CACHE_OPEN_WRITE_FAILED = 1109, |
| ORIG_INK_EVENT_CACHE_REMOVE = 1112, |
| ORIG_INK_EVENT_CACHE_REMOVE_FAILED = 1113, |
| ORIG_INK_EVENT_CACHE_SCAN = 1120, |
| ORIG_INK_EVENT_CACHE_SCAN_FAILED = 1121, |
| ORIG_INK_EVENT_CACHE_SCAN_OBJECT = 1122, |
| ORIG_INK_EVENT_CACHE_SCAN_OPERATION_BLOCKED = 1123, |
| ORIG_INK_EVENT_CACHE_SCAN_OPERATION_FAILED = 1124, |
| ORIG_INK_EVENT_CACHE_SCAN_DONE = 1125, |
| |
| ORIG_INK_EVENT_HTTP_CONTINUE = 60000, |
| ORIG_INK_EVENT_HTTP_ERROR = 60001, |
| ORIG_INK_EVENT_HTTP_READ_REQUEST_HDR = 60002, |
| ORIG_INK_EVENT_HTTP_OS_DNS = 60003, |
| ORIG_INK_EVENT_HTTP_SEND_REQUEST_HDR = 60004, |
| ORIG_INK_EVENT_HTTP_READ_CACHE_HDR = 60005, |
| ORIG_INK_EVENT_HTTP_READ_RESPONSE_HDR = 60006, |
| ORIG_INK_EVENT_HTTP_SEND_RESPONSE_HDR = 60007, |
| ORIG_INK_EVENT_HTTP_REQUEST_TRANSFORM = 60008, |
| ORIG_INK_EVENT_HTTP_RESPONSE_TRANSFORM = 60009, |
| ORIG_INK_EVENT_HTTP_SELECT_ALT = 60010, |
| ORIG_INK_EVENT_HTTP_TXN_START = 60011, |
| ORIG_INK_EVENT_HTTP_TXN_CLOSE = 60012, |
| ORIG_INK_EVENT_HTTP_SSN_START = 60013, |
| ORIG_INK_EVENT_HTTP_SSN_CLOSE = 60014, |
| ORIG_INK_EVENT_HTTP_CACHE_LOOKUP_COMPLETE = 60015, |
| |
| ORIG_INK_EVENT_MGMT_UPDATE = 60100 |
| } ORIG_INKEvent; |
| |
| typedef enum |
| { |
| ORIG_INK_CACHE_LOOKUP_MISS, |
| ORIG_INK_CACHE_LOOKUP_HIT_STALE, |
| ORIG_INK_CACHE_LOOKUP_HIT_FRESH |
| } ORIG_INKCacheLookupResult; |
| |
| typedef enum |
| { |
| ORIG_INK_CACHE_DATA_TYPE_NONE, |
| ORIG_INK_CACHE_DATA_TYPE_HTTP, |
| ORIG_INK_CACHE_DATA_TYPE_OTHER |
| } ORIG_INKCacheDataType; |
| |
| typedef enum |
| { |
| ORIG_INK_CACHE_ERROR_NO_DOC = -20400, |
| ORIG_INK_CACHE_ERROR_DOC_BUSY = -20401, |
| ORIG_INK_CACHE_ERROR_NOT_READY = -20407 |
| } ORIG_INKCacheError; |
| |
| typedef enum |
| { |
| ORIG_INK_CACHE_SCAN_RESULT_DONE = 0, |
| ORIG_INK_CACHE_SCAN_RESULT_CONTINUE = 1, |
| ORIG_INK_CACHE_SCAN_RESULT_DELETE = 10, |
| ORIG_INK_CACHE_SCAN_RESULT_DELETE_ALL_ALTERNATES, |
| ORIG_INK_CACHE_SCAN_RESULT_UPDATE, |
| ORIG_INK_CACHE_SCAN_RESULT_RETRY |
| } ORIG_INKCacheScanResult; |
| |
| typedef enum |
| { |
| ORIG_INK_DATA_ALLOCATE, |
| ORIG_INK_DATA_MALLOCED, |
| ORIG_INK_DATA_CONSTANT |
| } ORIG_INKIOBufferDataFlags; |
| |
| typedef enum |
| { |
| ORIG_INK_VC_CLOSE_ABORT = -1, |
| ORIG_INK_VC_CLOSE_NORMAL = 1 |
| } ORIG_INKVConnCloseFlags; |
| |
| typedef enum |
| { |
| ORIG_INK_SDK_VERSION_2_0 = 0 |
| } ORIG_INKSDKVersion; |
| |
| typedef enum |
| { |
| ORIG_INK_ERROR = -1, |
| ORIG_INK_SUCCESS = 0 |
| } ORIG_INKReturnCode; |
| |
| |
| REGRESSION_TEST(SDK_API_INKConstant) (RegressionTest * test, int atype, int *pstatus) |
| { |
| NOWARN_UNUSED(atype); |
| *pstatus = REGRESSION_TEST_INPROGRESS; |
| bool test_passed = true; |
| |
| PRINT_DIFF(INK_PARSE_ERROR); |
| PRINT_DIFF(INK_PARSE_DONE); |
| PRINT_DIFF(INK_PARSE_OK); |
| PRINT_DIFF(INK_PARSE_CONT); |
| |
| PRINT_DIFF(INK_HTTP_STATUS_NONE); |
| PRINT_DIFF(INK_HTTP_STATUS_CONTINUE); |
| PRINT_DIFF(INK_HTTP_STATUS_SWITCHING_PROTOCOL); |
| PRINT_DIFF(INK_HTTP_STATUS_OK); |
| PRINT_DIFF(INK_HTTP_STATUS_CREATED); |
| |
| |
| PRINT_DIFF(INK_HTTP_STATUS_ACCEPTED); |
| PRINT_DIFF(INK_HTTP_STATUS_NON_AUTHORITATIVE_INFORMATION); |
| PRINT_DIFF(INK_HTTP_STATUS_NO_CONTENT); |
| PRINT_DIFF(INK_HTTP_STATUS_RESET_CONTENT); |
| PRINT_DIFF(INK_HTTP_STATUS_PARTIAL_CONTENT); |
| |
| PRINT_DIFF(INK_HTTP_STATUS_MULTIPLE_CHOICES); |
| PRINT_DIFF(INK_HTTP_STATUS_MOVED_PERMANENTLY); |
| PRINT_DIFF(INK_HTTP_STATUS_MOVED_TEMPORARILY); |
| PRINT_DIFF(INK_HTTP_STATUS_SEE_OTHER); |
| PRINT_DIFF(INK_HTTP_STATUS_NOT_MODIFIED); |
| PRINT_DIFF(INK_HTTP_STATUS_USE_PROXY); |
| PRINT_DIFF(INK_HTTP_STATUS_BAD_REQUEST); |
| PRINT_DIFF(INK_HTTP_STATUS_UNAUTHORIZED); |
| PRINT_DIFF(INK_HTTP_STATUS_FORBIDDEN); |
| PRINT_DIFF(INK_HTTP_STATUS_NOT_FOUND); |
| PRINT_DIFF(INK_HTTP_STATUS_METHOD_NOT_ALLOWED); |
| PRINT_DIFF(INK_HTTP_STATUS_NOT_ACCEPTABLE); |
| PRINT_DIFF(INK_HTTP_STATUS_PROXY_AUTHENTICATION_REQUIRED); |
| PRINT_DIFF(INK_HTTP_STATUS_REQUEST_TIMEOUT); |
| PRINT_DIFF(INK_HTTP_STATUS_CONFLICT); |
| PRINT_DIFF(INK_HTTP_STATUS_GONE); |
| PRINT_DIFF(INK_HTTP_STATUS_PRECONDITION_FAILED); |
| PRINT_DIFF(INK_HTTP_STATUS_REQUEST_ENTITY_TOO_LARGE); |
| PRINT_DIFF(INK_HTTP_STATUS_REQUEST_URI_TOO_LONG); |
| PRINT_DIFF(INK_HTTP_STATUS_UNSUPPORTED_MEDIA_TYPE); |
| PRINT_DIFF(INK_HTTP_STATUS_INTERNAL_SERVER_ERROR); |
| PRINT_DIFF(INK_HTTP_STATUS_NOT_IMPLEMENTED); |
| PRINT_DIFF(INK_HTTP_STATUS_BAD_GATEWAY); |
| PRINT_DIFF(INK_HTTP_STATUS_GATEWAY_TIMEOUT); |
| PRINT_DIFF(INK_HTTP_STATUS_HTTPVER_NOT_SUPPORTED); |
| |
| PRINT_DIFF(INK_HTTP_READ_REQUEST_HDR_HOOK); |
| PRINT_DIFF(INK_HTTP_OS_DNS_HOOK); |
| PRINT_DIFF(INK_HTTP_SEND_REQUEST_HDR_HOOK); |
| PRINT_DIFF(INK_HTTP_READ_RESPONSE_HDR_HOOK); |
| PRINT_DIFF(INK_HTTP_SEND_RESPONSE_HDR_HOOK); |
| PRINT_DIFF(INK_HTTP_REQUEST_TRANSFORM_HOOK); |
| PRINT_DIFF(INK_HTTP_RESPONSE_TRANSFORM_HOOK); |
| PRINT_DIFF(INK_HTTP_SELECT_ALT_HOOK); |
| PRINT_DIFF(INK_HTTP_TXN_START_HOOK); |
| PRINT_DIFF(INK_HTTP_TXN_CLOSE_HOOK); |
| PRINT_DIFF(INK_HTTP_SSN_START_HOOK); |
| PRINT_DIFF(INK_HTTP_SSN_CLOSE_HOOK); |
| PRINT_DIFF(INK_HTTP_CACHE_LOOKUP_COMPLETE_HOOK); |
| PRINT_DIFF(INK_HTTP_LAST_HOOK); |
| |
| PRINT_DIFF(INK_EVENT_NONE); |
| PRINT_DIFF(INK_EVENT_IMMEDIATE); |
| PRINT_DIFF(INK_EVENT_TIMEOUT); |
| PRINT_DIFF(INK_EVENT_ERROR); |
| |
| PRINT_DIFF(INK_EVENT_CONTINUE); |
| PRINT_DIFF(INK_EVENT_VCONN_READ_READY); |
| PRINT_DIFF(INK_EVENT_VCONN_WRITE_READY); |
| PRINT_DIFF(INK_EVENT_VCONN_READ_COMPLETE); |
| PRINT_DIFF(INK_EVENT_VCONN_WRITE_COMPLETE); |
| PRINT_DIFF(INK_EVENT_VCONN_EOS); |
| |
| PRINT_DIFF(INK_EVENT_NET_CONNECT); |
| PRINT_DIFF(INK_EVENT_NET_CONNECT_FAILED); |
| PRINT_DIFF(INK_EVENT_NET_ACCEPT); |
| PRINT_DIFF(INK_EVENT_NET_ACCEPT_FAILED); |
| |
| PRINT_DIFF(INK_EVENT_HOST_LOOKUP); |
| |
| PRINT_DIFF(INK_EVENT_CACHE_OPEN_READ); |
| PRINT_DIFF(INK_EVENT_CACHE_OPEN_READ_FAILED); |
| PRINT_DIFF(INK_EVENT_CACHE_OPEN_WRITE); |
| PRINT_DIFF(INK_EVENT_CACHE_OPEN_WRITE_FAILED); |
| PRINT_DIFF(INK_EVENT_CACHE_REMOVE); |
| PRINT_DIFF(INK_EVENT_CACHE_REMOVE_FAILED); |
| PRINT_DIFF(INK_EVENT_CACHE_SCAN); |
| PRINT_DIFF(INK_EVENT_CACHE_SCAN_FAILED); |
| PRINT_DIFF(INK_EVENT_CACHE_SCAN_OBJECT); |
| PRINT_DIFF(INK_EVENT_CACHE_SCAN_OPERATION_BLOCKED); |
| PRINT_DIFF(INK_EVENT_CACHE_SCAN_OPERATION_FAILED); |
| PRINT_DIFF(INK_EVENT_CACHE_SCAN_DONE); |
| |
| PRINT_DIFF(INK_EVENT_HTTP_CONTINUE); |
| PRINT_DIFF(INK_EVENT_HTTP_ERROR); |
| PRINT_DIFF(INK_EVENT_HTTP_READ_REQUEST_HDR); |
| PRINT_DIFF(INK_EVENT_HTTP_OS_DNS); |
| PRINT_DIFF(INK_EVENT_HTTP_SEND_REQUEST_HDR); |
| PRINT_DIFF(INK_EVENT_HTTP_READ_CACHE_HDR); |
| PRINT_DIFF(INK_EVENT_HTTP_READ_RESPONSE_HDR); |
| PRINT_DIFF(INK_EVENT_HTTP_SEND_RESPONSE_HDR); |
| PRINT_DIFF(INK_EVENT_HTTP_REQUEST_TRANSFORM); |
| PRINT_DIFF(INK_EVENT_HTTP_RESPONSE_TRANSFORM); |
| PRINT_DIFF(INK_EVENT_HTTP_SELECT_ALT); |
| PRINT_DIFF(INK_EVENT_HTTP_TXN_START); |
| PRINT_DIFF(INK_EVENT_HTTP_TXN_CLOSE); |
| PRINT_DIFF(INK_EVENT_HTTP_SSN_START); |
| PRINT_DIFF(INK_EVENT_HTTP_SSN_CLOSE); |
| PRINT_DIFF(INK_EVENT_HTTP_CACHE_LOOKUP_COMPLETE); |
| |
| PRINT_DIFF(INK_EVENT_MGMT_UPDATE); |
| |
| PRINT_DIFF(INK_CACHE_LOOKUP_MISS); |
| PRINT_DIFF(INK_CACHE_LOOKUP_HIT_STALE); |
| PRINT_DIFF(INK_CACHE_LOOKUP_HIT_FRESH); |
| |
| PRINT_DIFF(INK_CACHE_DATA_TYPE_NONE); |
| PRINT_DIFF(INK_CACHE_DATA_TYPE_HTTP); |
| PRINT_DIFF(INK_CACHE_DATA_TYPE_OTHER); |
| |
| PRINT_DIFF(INK_CACHE_ERROR_NO_DOC); |
| PRINT_DIFF(INK_CACHE_ERROR_DOC_BUSY); |
| PRINT_DIFF(INK_CACHE_ERROR_NOT_READY); |
| |
| PRINT_DIFF(INK_CACHE_SCAN_RESULT_DONE); |
| PRINT_DIFF(INK_CACHE_SCAN_RESULT_CONTINUE); |
| PRINT_DIFF(INK_CACHE_SCAN_RESULT_DELETE); |
| PRINT_DIFF(INK_CACHE_SCAN_RESULT_DELETE_ALL_ALTERNATES); |
| PRINT_DIFF(INK_CACHE_SCAN_RESULT_UPDATE); |
| PRINT_DIFF(INK_CACHE_SCAN_RESULT_RETRY); |
| |
| PRINT_DIFF(INK_DATA_ALLOCATE); |
| PRINT_DIFF(INK_DATA_MALLOCED); |
| PRINT_DIFF(INK_DATA_CONSTANT); |
| |
| PRINT_DIFF(INK_VC_CLOSE_ABORT); |
| PRINT_DIFF(INK_VC_CLOSE_NORMAL); |
| |
| PRINT_DIFF(INK_SDK_VERSION_2_0); |
| |
| PRINT_DIFF(INK_ERROR); |
| PRINT_DIFF(INK_SUCCESS); |
| |
| |
| if (test_passed) { |
| *pstatus = REGRESSION_TEST_PASSED; |
| } else { |
| *pstatus = REGRESSION_TEST_FAILED; |
| } |
| |
| } |
| |
| ////////////////////////////////////////////// |
| // SDK_API_INKHttpSsn |
| // |
| // Unit Test for API: INKHttpSsnHookAdd |
| // INKHttpSsnReenable |
| // INKHttpTxnHookAdd |
| // INKHttpTxnErrorBodySet |
| // INKHttpTxnParentProxyGet |
| // INKHttpTxnParentProxySet |
| ////////////////////////////////////////////// |
| |
| |
| typedef struct |
| { |
| RegressionTest *test; |
| int *pstatus; |
| SocketServer *os; |
| ClientTxn *browser; |
| INKHttpSsn ssnp; |
| int test_passed_ssn_hook_add; |
| int test_passed_ssn_reenable; |
| int test_passed_txn_ssn_get; |
| int test_passed_txn_hook_add; |
| int test_passed_txn_error_body_set; |
| bool test_passed_Parent_Proxy; |
| int magic; |
| } ContData; |
| |
| static int |
| checkHttpTxnParentProxy(ContData * data, INKHttpTxn txnp) |
| { |
| |
| const char *hostname = "txnpp.example.com"; |
| int port = 10180; |
| char *hostnameget = NULL; |
| int portget = 0; |
| |
| if (INKHttpTxnParentProxySet(txnp, (char*)hostname, port) != INK_SUCCESS) { |
| SDK_RPRINT(data->test, "INKHttpTxnParentProxySet", "TestCase1", TC_FAIL, |
| "INKHttpTxnParentProxySet doesn't return INK_SUCCESS"); |
| SDK_RPRINT(data->test, "INKHttpTxnParentProxyGet", "TestCase1", TC_FAIL, |
| "INKHttpTxnParentProxySet doesn't return INK_SUCCESS"); |
| return INK_EVENT_CONTINUE; |
| } |
| |
| if (INKHttpTxnParentProxyGet(txnp, &hostnameget, &portget) != INK_SUCCESS) { |
| SDK_RPRINT(data->test, "INKHttpTxnParentProxySet", "TestCase1", TC_FAIL, |
| "INKHttpTxnParentProxyGet doesn't return INK_SUCCESS"); |
| SDK_RPRINT(data->test, "INKHttpTxnParentProxyGet", "TestCase1", TC_FAIL, |
| "INKHttpTxnParentProxyGet doesn't return INK_SUCCESS"); |
| return INK_EVENT_CONTINUE; |
| } |
| |
| if ((strcmp(hostname, hostnameget) == 0) && (port == portget)) { |
| SDK_RPRINT(data->test, "INKHttpTxnParentProxySet", "TestCase1", TC_PASS, "ok"); |
| SDK_RPRINT(data->test, "INKHttpTxnParentProxyGet", "TestCase1", TC_PASS, "ok"); |
| data->test_passed_Parent_Proxy = true; |
| } else { |
| SDK_RPRINT(data->test, "INKHttpTxnParentProxySet", "TestCase1", TC_FAIL, "Value's Mismatch"); |
| SDK_RPRINT(data->test, "INKHttpTxnParentProxyGet", "TestCase1", TC_FAIL, "Value's Mismatch"); |
| } |
| |
| return INK_EVENT_CONTINUE; |
| } |
| |
| |
| static int |
| ssn_handler(INKCont contp, INKEvent event, void *edata) |
| { |
| |
| INKHttpTxn txnp = NULL; |
| ContData *data = NULL; |
| data = (ContData *) INKContDataGet(contp); |
| if ((data == INK_ERROR_PTR) || (data == NULL)) { |
| switch (event) { |
| case INK_EVENT_HTTP_SSN_START: |
| INKHttpSsnReenable((INKHttpSsn) edata, INK_EVENT_HTTP_CONTINUE); |
| break; |
| case INK_EVENT_IMMEDIATE: |
| case INK_EVENT_TIMEOUT: |
| break; |
| case INK_EVENT_HTTP_TXN_START: |
| default: |
| INKHttpTxnReenable((INKHttpTxn) edata, INK_EVENT_HTTP_CONTINUE); |
| break; |
| } |
| return 0; |
| } |
| |
| switch (event) { |
| case INK_EVENT_HTTP_SSN_START: |
| data->ssnp = (INKHttpSsn) edata; |
| if (INKHttpSsnHookAdd(data->ssnp, INK_HTTP_TXN_START_HOOK, contp) != INK_SUCCESS) { |
| SDK_RPRINT(data->test, "INKHttpSsnHookAdd", "TestCase1", TC_FAIL, "INKHttpSsnHookAdd doesn't return INK_SUCCESS"); |
| data->test_passed_ssn_hook_add--; |
| } |
| if (INKHttpSsnReenable(data->ssnp, INK_EVENT_HTTP_CONTINUE) != INK_SUCCESS) { |
| SDK_RPRINT(data->test, "INKHttpSsnReenable", "TestCase1", TC_FAIL, |
| "INKHttpSsnReenable doesn't return INK_SUCCESS"); |
| data->test_passed_ssn_reenable--; |
| } |
| break; |
| |
| case INK_EVENT_HTTP_TXN_START: |
| SDK_RPRINT(data->test, "INKHttpSsnReenable", "TestCase", TC_PASS, "ok"); |
| data->test_passed_ssn_reenable++; |
| { |
| txnp = (INKHttpTxn) edata; |
| INKHttpSsn ssnp = INKHttpTxnSsnGet(txnp); |
| if (ssnp != data->ssnp) { |
| SDK_RPRINT(data->test, "INKHttpSsnHookAdd", "TestCase", TC_FAIL, "Value's mismatch"); |
| data->test_passed_ssn_hook_add--; |
| SDK_RPRINT(data->test, "INKHttpTxnSsnGet", "TestCase", TC_FAIL, "Session doesn't match"); |
| data->test_passed_txn_ssn_get--; |
| } else { |
| SDK_RPRINT(data->test, "INKHttpSsnHookAdd", "TestCase1", TC_PASS, "ok"); |
| data->test_passed_ssn_hook_add++; |
| SDK_RPRINT(data->test, "INKHttpTxnSsnGet", "TestCase1", TC_PASS, "ok"); |
| data->test_passed_txn_ssn_get++; |
| } |
| if (INKHttpTxnHookAdd(txnp, INK_HTTP_OS_DNS_HOOK, contp) != INK_SUCCESS) { |
| SDK_RPRINT(data->test, "INKHttpTxnHookAdd", "TestCase1", TC_FAIL, |
| "INKHttpTxnHookAdd doesn't return INK_SUCCESS"); |
| data->test_passed_txn_hook_add--; |
| } |
| if (INKHttpTxnReenable(txnp, INK_EVENT_HTTP_CONTINUE) != INK_SUCCESS) { |
| SDK_RPRINT(data->test, "INKHttpSsn", "TestCase1", TC_FAIL, "INKHttpTxnReenable doesn't return INK_SUCCESS"); |
| } |
| } |
| break; |
| |
| case INK_EVENT_HTTP_OS_DNS: |
| SDK_RPRINT(data->test, "INKHttpTxnHookAdd", "TestCase1", TC_PASS, "ok"); |
| data->test_passed_txn_hook_add++; |
| txnp = (INKHttpTxn) edata; |
| |
| if (INKHttpTxnHookAdd(txnp, INK_HTTP_SEND_RESPONSE_HDR_HOOK, contp) != INK_SUCCESS) { |
| SDK_RPRINT(data->test, "INKHttpTxnHookAdd", "TestCase1", TC_FAIL, "INKHttpTxnHookAdd doesn't return INK_SUCCESS"); |
| data->test_passed_txn_hook_add--; |
| } |
| |
| checkHttpTxnParentProxy(data, txnp); |
| |
| if (INKHttpTxnReenable(txnp, INK_EVENT_HTTP_ERROR) != INK_SUCCESS) { |
| SDK_RPRINT(data->test, "INKHttpSsn", "TestCase1", TC_FAIL, "INKHttpTxnReenable doesn't return INK_SUCCESS"); |
| } |
| break; |
| |
| case INK_EVENT_HTTP_SEND_RESPONSE_HDR: |
| SDK_RPRINT(data->test, "INKHttpTxnHookAdd", "TestCase2", TC_PASS, "ok"); |
| data->test_passed_txn_hook_add++; |
| txnp = (INKHttpTxn) edata; |
| if (1) { |
| char *temp = INKstrdup(ERROR_BODY); |
| if (INKHttpTxnErrorBodySet(txnp, temp, strlen(temp), NULL) != INK_SUCCESS) { |
| SDK_RPRINT(data->test, "INKHttpTxnErrorBodySet", "TestCase1", TC_FAIL, |
| "INKHttpTxnErrorBodySet doesn't return INK_SUCCESS"); |
| data->test_passed_txn_error_body_set--; |
| } |
| } |
| if (INKHttpTxnReenable(txnp, INK_EVENT_HTTP_CONTINUE) != INK_SUCCESS) { |
| SDK_RPRINT(data->test, "INKHttpSsn", "TestCase1", TC_FAIL, "INKHttpTxnReenable doesn't return INK_SUCCESS"); |
| } |
| break; |
| |
| case INK_EVENT_IMMEDIATE: |
| case INK_EVENT_TIMEOUT: |
| /* Browser still waiting the response ? */ |
| if (data->browser->status == REQUEST_INPROGRESS) { |
| INKContSchedule(contp, 25); |
| } |
| /* Browser got the response. test is over. clean up */ |
| else { |
| /* Check if browser response body is the one we expected */ |
| char *temp = data->browser->response; |
| temp = strstr(temp, "\r\n\r\n"); |
| if (temp != NULL) { |
| temp += strlen("\r\n\r\n"); |
| if ((temp[0] == '\0') || (strncmp(temp, "\r\n\r\n", 4) == 0)) { |
| SDK_RPRINT(data->test, "INKHttpTxnErrorBodySet", "TestCase1", TC_FAIL, "No Error Body found"); |
| data->test_passed_txn_error_body_set--; |
| } |
| if (strncmp(temp, ERROR_BODY, strlen(ERROR_BODY)) == 0) { |
| SDK_RPRINT(data->test, "INKHttpTxnErrorBodySet", "TestCase1", TC_PASS, "ok"); |
| data->test_passed_txn_error_body_set++; |
| } |
| } else { |
| SDK_RPRINT(data->test, "INKHttpTxnErrorBodySet", "TestCase1", TC_FAIL, |
| "strstr returns NULL. Didn't find end of headers."); |
| data->test_passed_txn_error_body_set--; |
| } |
| |
| /* Note: response is available using test->browser->response pointer */ |
| if ((data->browser->status == REQUEST_SUCCESS) && |
| (data->test_passed_ssn_hook_add == 1) && |
| (data->test_passed_ssn_reenable == 1) && |
| (data->test_passed_txn_ssn_get == 1) && |
| (data->test_passed_txn_hook_add == 2) && (data->test_passed_txn_error_body_set == 1) |
| && (data->test_passed_Parent_Proxy == true) |
| ) { |
| *(data->pstatus) = REGRESSION_TEST_PASSED; |
| } else { |
| *(data->pstatus) = REGRESSION_TEST_FAILED; |
| } |
| |
| // transaction is over. clean up. |
| synclient_txn_delete(data->browser); |
| /* Don't need it as didn't initialize the server |
| synserver_delete(data->os); |
| */ |
| data->magic = MAGIC_DEAD; |
| INKfree(data); |
| INKContDataSet(contp, NULL); |
| } |
| break; |
| |
| default: |
| *(data->pstatus) = REGRESSION_TEST_FAILED; |
| SDK_RPRINT(data->test, "INKHttpSsn", "TestCase1", TC_FAIL, "Unexpected event %d", event); |
| break; |
| } |
| return 0; |
| } |
| |
| |
| EXCLUSIVE_REGRESSION_TEST(SDK_API_HttpSsn) (RegressionTest * test, int atype, int *pstatus) |
| { |
| NOWARN_UNUSED(atype); |
| *pstatus = REGRESSION_TEST_INPROGRESS; |
| |
| INKCont cont = INKContCreate(ssn_handler, INKMutexCreate()); |
| if ((cont == NULL) || (cont == INK_ERROR_PTR)) { |
| SDK_RPRINT(test, "INKHttSsn", "TestCase1", TC_FAIL, "Unable to create Continuation."); |
| *pstatus = REGRESSION_TEST_FAILED; |
| return; |
| } |
| |
| ContData *socktest = (ContData *) INKmalloc(sizeof(ContData)); |
| socktest->test = test; |
| socktest->pstatus = pstatus; |
| socktest->test_passed_ssn_hook_add = 0; |
| socktest->test_passed_ssn_reenable = 0; |
| socktest->test_passed_txn_ssn_get = 0; |
| socktest->test_passed_txn_hook_add = 0; |
| socktest->test_passed_txn_error_body_set = 0; |
| socktest->test_passed_Parent_Proxy = false; |
| socktest->magic = MAGIC_ALIVE; |
| INKContDataSet(cont, socktest); |
| |
| /* Register to HTTP hooks that are called in case of a cache MISS */ |
| INKHttpHookAdd(INK_HTTP_SSN_START_HOOK, cont); |
| |
| /* Create a client transaction */ |
| socktest->browser = synclient_txn_create(); |
| char *request = generate_request(3); // response is expected to be error case |
| synclient_txn_send_request(socktest->browser, request); |
| INKfree(request); |
| |
| /* Wait until transaction is done */ |
| if (socktest->browser->status == REQUEST_INPROGRESS) { |
| INKContSchedule(cont, 25); |
| } |
| |
| return; |
| } |
| |
| ///////////////////////////////////////////////////// |
| // SDK_API_INKHttpTxnCache |
| // |
| // Unit Test for API: INKHttpTxnCachedReqGet |
| // INKHttpTxnCachedRespGet |
| // INKHttpTxnCacheLookupStatusGet |
| ///////////////////////////////////////////////////// |
| |
| typedef struct |
| { |
| RegressionTest *test; |
| int *pstatus; |
| SocketServer *os; |
| ClientTxn *browser1; |
| ClientTxn *browser2; |
| char *request; |
| bool test_passed_txn_cached_req_get; |
| bool test_passed_txn_cached_resp_get; |
| bool test_passed_txn_cache_lookup_status; |
| bool first_time; |
| int magic; |
| } CacheTestData; |
| |
| static int |
| cache_hook_handler(INKCont contp, INKEvent event, void *edata) |
| { |
| |
| INKHttpTxn txnp = NULL; |
| CacheTestData *data = NULL; |
| data = (CacheTestData *) INKContDataGet(contp); |
| if ((data == INK_ERROR_PTR) || (data == NULL)) { |
| switch (event) { |
| case INK_EVENT_IMMEDIATE: |
| case INK_EVENT_TIMEOUT: |
| break; |
| case INK_EVENT_HTTP_READ_CACHE_HDR: |
| default: |
| INKHttpTxnReenable((INKHttpTxn) edata, INK_EVENT_HTTP_CONTINUE); |
| break; |
| } |
| return 0; |
| } |
| |
| switch (event) { |
| case INK_EVENT_HTTP_CACHE_LOOKUP_COMPLETE: |
| { |
| int lookup_status; |
| if (data->first_time == true) { |
| txnp = (INKHttpTxn) edata; |
| if (INKHttpTxnCacheLookupStatusGet(txnp, &lookup_status) != INK_SUCCESS) { |
| SDK_RPRINT(data->test, "INKHttpTxnCacheLookupStatusGet", "TestCase1", TC_FAIL, |
| "INKHttpTxnCacheLookupStatus doesn't return INK_SUCCESS"); |
| } else { |
| if (lookup_status == INK_CACHE_LOOKUP_MISS) { |
| SDK_RPRINT(data->test, "INKHttpTxnCacheLookupStatusGet", "TestCase1", TC_PASS, "ok"); |
| data->test_passed_txn_cache_lookup_status = true; |
| } else { |
| SDK_RPRINT(data->test, "INKHttpTxnCacheLookupStatusGet", "TestCase1", TC_FAIL, |
| "Incorrect Value returned by INKHttpTxnCacheLookupStatusGet"); |
| } |
| } |
| } else { |
| txnp = (INKHttpTxn) edata; |
| if (INKHttpTxnCacheLookupStatusGet(txnp, &lookup_status) != INK_SUCCESS) { |
| SDK_RPRINT(data->test, "INKHttpTxnCacheLookupStatusGet", "TestCase2", TC_FAIL, |
| "INKHttpTxnCacheLookupStatus doesn't return INK_SUCCESS"); |
| data->test_passed_txn_cache_lookup_status = false; |
| } else { |
| if (lookup_status == INK_CACHE_LOOKUP_HIT_FRESH) { |
| SDK_RPRINT(data->test, "INKHttpTxnCacheLookupStatusGet", "TestCase2", TC_PASS, "ok"); |
| } else { |
| SDK_RPRINT(data->test, "INKHttpTxnCacheLookupStatusGet", "TestCase2", TC_FAIL, |
| "Incorrect Value returned by INKHttpTxnCacheLookupStatusGet"); |
| data->test_passed_txn_cache_lookup_status = false; |
| } |
| } |
| } |
| if (INKHttpTxnReenable(txnp, INK_EVENT_HTTP_CONTINUE) != INK_SUCCESS) { |
| SDK_RPRINT(data->test, "INKHttpTxnCacheLookupStatusGet", "", TC_FAIL, "Unable to reenable the transaction"); |
| } |
| } |
| break; |
| case INK_EVENT_HTTP_READ_CACHE_HDR: |
| { |
| INKMBuffer reqbuf; |
| INKMBuffer respbuf; |
| |
| INKMLoc reqhdr; |
| INKMLoc resphdr; |
| |
| txnp = (INKHttpTxn) edata; |
| |
| if (INKHttpTxnCachedReqGet(txnp, &reqbuf, &reqhdr) == 0) { |
| SDK_RPRINT(data->test, "INKHttpTxnCachedReqGet", "TestCase1", TC_FAIL, "INKHttpTxnCachedReqGet returns 0"); |
| } else { |
| if ((reqbuf == (((HttpSM *) txnp)->t_state.cache_req_hdr_heap_handle)) && |
| (reqhdr == ((((HttpSM *) txnp)->t_state.cache_info.object_read->request_get())->m_http)) |
| ) { |
| SDK_RPRINT(data->test, "INKHttpTxnCachedReqGet", "TestCase1", TC_PASS, "ok"); |
| data->test_passed_txn_cached_req_get = true; |
| } else { |
| SDK_RPRINT(data->test, "INKHttpTxnCachedReqGet", "TestCase1", TC_FAIL, "Value's Mismatch"); |
| } |
| } |
| |
| if (INKHttpTxnCachedRespGet(txnp, &respbuf, &resphdr) == 0) { |
| SDK_RPRINT(data->test, "INKHttpTxnCachedRespGet", "TestCase1", TC_FAIL, "INKHttpTxnCachedRespGet returns 0"); |
| } else { |
| if ((respbuf == (((HttpSM *) txnp)->t_state.cache_resp_hdr_heap_handle)) && |
| (resphdr == ((((HttpSM *) txnp)->t_state.cache_info.object_read->response_get())->m_http)) |
| ) { |
| SDK_RPRINT(data->test, "INKHttpTxnCachedRespGet", "TestCase1", TC_PASS, "ok"); |
| data->test_passed_txn_cached_resp_get = true; |
| } else { |
| SDK_RPRINT(data->test, "INKHttpTxnCachedRespGet", "TestCase1", TC_FAIL, "Value's Mismatch"); |
| } |
| } |
| |
| if ((INKHandleMLocRelease(reqbuf, INK_NULL_MLOC, reqhdr) != INK_SUCCESS) || |
| (INKHandleMLocRelease(respbuf, INK_NULL_MLOC, resphdr) != INK_SUCCESS) |
| ) { |
| SDK_RPRINT(data->test, "INKHttpTxnCache", "", TC_FAIL, "Unable to release handle to headers."); |
| } |
| |
| if (INKHttpTxnReenable(txnp, INK_EVENT_HTTP_CONTINUE) != INK_SUCCESS) { |
| SDK_RPRINT(data->test, "INKHttpTxnCache", "", TC_FAIL, "Unable to reenable the transaction."); |
| } |
| } |
| |
| break; |
| |
| case INK_EVENT_IMMEDIATE: |
| case INK_EVENT_TIMEOUT: |
| /* Browser still waiting the response ? */ |
| if (data->first_time == true) { |
| if (data->browser1->status == REQUEST_INPROGRESS) { |
| INKContSchedule(contp, 25); |
| return 0; |
| } |
| } else { |
| if (data->browser2->status == REQUEST_INPROGRESS) { |
| INKContSchedule(contp, 25); |
| return 0; |
| } |
| } |
| |
| /* Browser got the response. test is over. clean up */ |
| { |
| /* If this is the first time, then the response is in cache and we should make */ |
| /* another request to get cache hit */ |
| if (data->first_time == true) { |
| data->first_time = false; |
| /* Kill the origin server */ |
| synserver_delete(data->os); |
| /* Send another similar client request */ |
| synclient_txn_send_request(data->browser2, data->request); |
| INKfree(data->request); |
| INKContSchedule(contp, 25); |
| return 0; |
| } |
| |
| /* Note: response is available using test->browser->response pointer */ |
| if ((data->browser1->status == REQUEST_SUCCESS) && |
| (data->browser2->status == REQUEST_SUCCESS) && |
| (data->test_passed_txn_cached_req_get == true) && |
| (data->test_passed_txn_cached_resp_get == true) && (data->test_passed_txn_cache_lookup_status == true) |
| ) { |
| *(data->pstatus) = REGRESSION_TEST_PASSED; |
| } else { |
| *(data->pstatus) = REGRESSION_TEST_FAILED; |
| } |
| |
| // transaction is over. clean up. |
| synclient_txn_delete(data->browser1); |
| synclient_txn_delete(data->browser2); |
| |
| data->magic = MAGIC_DEAD; |
| INKfree(data); |
| INKContDataSet(contp, NULL); |
| } |
| break; |
| |
| default: |
| *(data->pstatus) = REGRESSION_TEST_FAILED; |
| SDK_RPRINT(data->test, "INKHttpTxnCache", "TestCase1", TC_FAIL, "Unexpected event %d", event); |
| break; |
| } |
| return 0; |
| } |
| |
| |
| EXCLUSIVE_REGRESSION_TEST(SDK_API_HttpTxnCache) (RegressionTest * test, int atype, int *pstatus) |
| { |
| NOWARN_UNUSED(atype); |
| *pstatus = REGRESSION_TEST_INPROGRESS; |
| |
| INKCont cont = INKContCreate(cache_hook_handler, INKMutexCreate()); |
| if ((cont == NULL) || (cont == INK_ERROR_PTR)) { |
| SDK_RPRINT(test, "INKHttSsn", "TestCase1", TC_FAIL, "Unable to create Continuation."); |
| *pstatus = REGRESSION_TEST_FAILED; |
| return; |
| } |
| |
| CacheTestData *socktest = (CacheTestData *) INKmalloc(sizeof(CacheTestData)); |
| socktest->test = test; |
| socktest->pstatus = pstatus; |
| socktest->test_passed_txn_cached_req_get = false; |
| socktest->test_passed_txn_cached_resp_get = false; |
| socktest->first_time = true; |
| socktest->magic = MAGIC_ALIVE; |
| INKContDataSet(cont, socktest); |
| |
| /* Register to HTTP hooks that are called in case of a cache MISS */ |
| INKHttpHookAdd(INK_HTTP_READ_CACHE_HDR_HOOK, cont); |
| INKHttpHookAdd(INK_HTTP_CACHE_LOOKUP_COMPLETE_HOOK, cont); |
| |
| /* Create a new synthetic server */ |
| socktest->os = synserver_create(SYNSERVER_LISTEN_PORT); |
| synserver_start(socktest->os); |
| |
| /* Create a client transaction */ |
| socktest->browser1 = synclient_txn_create(); |
| socktest->browser2 = synclient_txn_create(); |
| socktest->request = generate_request(2); |
| synclient_txn_send_request(socktest->browser1, socktest->request); |
| |
| /* Wait until transaction is done */ |
| INKContSchedule(cont, 25); |
| |
| return; |
| } |
| |
| /////////////////////////////////////////////////////// |
| // SDK_API_INKHttpTxnTransform |
| // |
| // Unit Test for API: INKHttpTxnTransformRespGet |
| // INKHttpTxnTransformedRespCache |
| // INKHttpTxnUntransformedRespCache |
| /////////////////////////////////////////////////////// |
| |
| /** Append Transform Data Structure **/ |
| typedef struct |
| { |
| INKVIO output_vio; |
| INKIOBuffer output_buffer; |
| INKIOBufferReader output_reader; |
| int append_needed; |
| } MyTransformData; |
| /** Append Transform Data Structure Ends **/ |
| |
| typedef struct |
| { |
| RegressionTest *test; |
| int *pstatus; |
| SocketServer *os; |
| ClientTxn *browser1; |
| ClientTxn *browser2; |
| ClientTxn *browser3; |
| ClientTxn *browser4; |
| char *request1; |
| char *request2; |
| bool test_passed_txn_transform_resp_get; |
| bool test_passed_txn_transformed_resp_cache; |
| bool test_passed_txn_untransformed_resp_cache; |
| bool test_passed_transform_create; |
| int req_no; |
| MyTransformData *transformData; |
| int magic; |
| } TransformTestData; |
| |
| /**** Append Transform Code (Tailored to needs)****/ |
| |
| static INKIOBuffer append_buffer; |
| static INKIOBufferReader append_buffer_reader; |
| static int append_buffer_length; |
| |
| static MyTransformData * |
| my_data_alloc() |
| { |
| MyTransformData *data; |
| |
| data = (MyTransformData *) INKmalloc(sizeof(MyTransformData)); |
| data->output_vio = NULL; |
| data->output_buffer = NULL; |
| data->output_reader = NULL; |
| data->append_needed = 1; |
| |
| return data; |
| } |
| |
| static void |
| my_data_destroy(MyTransformData * data) |
| { |
| if (data) { |
| if (data->output_buffer) { |
| INKIOBufferDestroy(data->output_buffer); |
| } |
| INKfree(data); |
| } |
| } |
| |
| static void |
| handle_transform(INKCont contp) |
| { |
| INKVConn output_conn; |
| INKVIO write_vio; |
| TransformTestData *contData; |
| MyTransformData *data; |
| int towrite; |
| int avail; |
| |
| /* Get the output connection where we'll write data to. */ |
| output_conn = INKTransformOutputVConnGet(contp); |
| |
| /* Get the write VIO for the write operation that was performed on |
| ourself. This VIO contains the buffer that we are to read from |
| as well as the continuation we are to call when the buffer is |
| empty. */ |
| write_vio = INKVConnWriteVIOGet(contp); |
| |
| /* Get our data structure for this operation. The private data |
| structure contains the output VIO and output buffer. If the |
| private data structure pointer is NULL, then we'll create it |
| and initialize its internals. */ |
| contData = (TransformTestData *) INKContDataGet(contp); |
| data = contData->transformData; |
| if (!data) { |
| towrite = INKVIONBytesGet(write_vio); |
| if (towrite != INT_MAX) { |
| towrite += append_buffer_length; |
| } |
| contData->transformData = my_data_alloc(); |
| data = contData->transformData; |
| data->output_buffer = INKIOBufferCreate(); |
| data->output_reader = INKIOBufferReaderAlloc(data->output_buffer); |
| data->output_vio = INKVConnWrite(output_conn, contp, data->output_reader, towrite); |
| // Don't need this as the structure is encapsulated in another structure |
| // which is set to be Continuation's Data. |
| // INKContDataSet (contp, data); |
| } |
| |
| /* We also check to see if the write VIO's buffer is non-NULL. A |
| NULL buffer indicates that the write operation has been |
| shutdown and that the continuation does not want us to send any |
| more WRITE_READY or WRITE_COMPLETE events. For this simplistic |
| transformation that means we're done. In a more complex |
| transformation we might have to finish writing the transformed |
| data to our output connection. */ |
| if (!INKVIOBufferGet(write_vio)) { |
| if (data->append_needed) { |
| data->append_needed = 0; |
| INKIOBufferCopy(INKVIOBufferGet(data->output_vio), append_buffer_reader, append_buffer_length, 0); |
| } |
| |
| INKVIONBytesSet(data->output_vio, INKVIONDoneGet(write_vio) + append_buffer_length); |
| INKVIOReenable(data->output_vio); |
| return; |
| } |
| |
| /* Determine how much data we have left to read. For this append |
| transform plugin this is also the amount of data we have left |
| to write to the output connection. */ |
| towrite = INKVIONTodoGet(write_vio); |
| if (towrite > 0) { |
| /* The amount of data left to read needs to be truncated by |
| the amount of data actually in the read buffer. */ |
| avail = INKIOBufferReaderAvail(INKVIOReaderGet(write_vio)); |
| if (towrite > avail) { |
| towrite = avail; |
| } |
| |
| if (towrite > 0) { |
| /* Copy the data from the read buffer to the output buffer. */ |
| INKIOBufferCopy(INKVIOBufferGet(data->output_vio), INKVIOReaderGet(write_vio), towrite, 0); |
| |
| /* Tell the read buffer that we have read the data and are no |
| longer interested in it. */ |
| INKIOBufferReaderConsume(INKVIOReaderGet(write_vio), towrite); |
| |
| /* Modify the write VIO to reflect how much data we've |
| completed. */ |
| INKVIONDoneSet(write_vio, INKVIONDoneGet(write_vio) + towrite); |
| } |
| } |
| |
| /* Now we check the write VIO to see if there is data left to |
| read. */ |
| if (INKVIONTodoGet(write_vio) > 0) { |
| if (towrite > 0) { |
| /* If there is data left to read, then we reenable the output |
| connection by reenabling the output VIO. This will wakeup |
| the output connection and allow it to consume data from the |
| output buffer. */ |
| INKVIOReenable(data->output_vio); |
| |
| /* Call back the write VIO continuation to let it know that we |
| are ready for more data. */ |
| INKContCall(INKVIOContGet(write_vio), INK_EVENT_VCONN_WRITE_READY, write_vio); |
| } |
| } else { |
| if (data->append_needed) { |
| data->append_needed = 0; |
| INKIOBufferCopy(INKVIOBufferGet(data->output_vio), append_buffer_reader, append_buffer_length, 0); |
| } |
| |
| /* If there is no data left to read, then we modify the output |
| VIO to reflect how much data the output connection should |
| expect. This allows the output connection to know when it |
| is done reading. We then reenable the output connection so |
| that it can consume the data we just gave it. */ |
| INKVIONBytesSet(data->output_vio, INKVIONDoneGet(write_vio) + append_buffer_length); |
| INKVIOReenable(data->output_vio); |
| |
| /* Call back the write VIO continuation to let it know that we |
| have completed the write operation. */ |
| INKContCall(INKVIOContGet(write_vio), INK_EVENT_VCONN_WRITE_COMPLETE, write_vio); |
| } |
| } |
| |
| static int |
| transformtest_transform(INKCont contp, INKEvent event, void *edata) |
| { |
| NOWARN_UNUSED(edata); |
| TransformTestData *contData = (TransformTestData *) INKContDataGet(contp); |
| if (contData->test_passed_transform_create == false) { |
| contData->test_passed_transform_create = true; |
| SDK_RPRINT(contData->test, "INKTransformCreate", "TestCase1", TC_PASS, "ok"); |
| } |
| /* Check to see if the transformation has been closed by a call to |
| INKVConnClose. */ |
| if (INKVConnClosedGet(contp)) { |
| my_data_destroy(contData->transformData); |
| contData->transformData = NULL; |
| INKContDestroy(contp); |
| return 0; |
| } else { |
| switch (event) { |
| case INK_EVENT_ERROR: |
| { |
| INKVIO write_vio; |
| |
| /* Get the write VIO for the write operation that was |
| performed on ourself. This VIO contains the continuation of |
| our parent transformation. */ |
| write_vio = INKVConnWriteVIOGet(contp); |
| |
| /* Call back the write VIO continuation to let it know that we |
| have completed the write operation. */ |
| INKContCall(INKVIOContGet(write_vio), INK_EVENT_ERROR, write_vio); |
| } |
| break; |
| case INK_EVENT_VCONN_WRITE_COMPLETE: |
| /* When our output connection says that it has finished |
| reading all the data we've written to it then we should |
| shutdown the write portion of its connection to |
| indicate that we don't want to hear about it anymore. */ |
| INKVConnShutdown(INKTransformOutputVConnGet(contp), 0, 1); |
| break; |
| case INK_EVENT_VCONN_WRITE_READY: |
| default: |
| /* If we get a WRITE_READY event or any other type of |
| event (sent, perhaps, because we were reenabled) then |
| we'll attempt to transform more data. */ |
| handle_transform(contp); |
| break; |
| } |
| } |
| |
| return 0; |
| } |
| |
| static int |
| transformable(INKHttpTxn txnp, TransformTestData * data) |
| { |
| INKMBuffer bufp; |
| INKMLoc hdr_loc; |
| |
| if (INKHttpTxnServerRespGet(txnp, &bufp, &hdr_loc) == 0) { |
| SDK_RPRINT(data->test, "INKHttpTxnTransform", "", TC_FAIL, "[transformable]: INKHttpTxnServerRespGet return 0"); |
| } |
| |
| /* |
| * We are only interested in "200 OK" responses. |
| */ |
| |
| if (INK_HTTP_STATUS_OK == INKHttpHdrStatusGet(bufp, hdr_loc)) { |
| return 1; |
| } |
| // XXX - Can't return INK_ERROR because that is a different type |
| // -bcall 7/24/07 |
| // if (resp_status == INK_ERROR) { |
| // SDK_RPRINT(data->test,"INKHttpTxnTransform","",TC_FAIL,"[transformable]: INKHttpHdrStatusGet returns INK_ERROR"); |
| // } |
| |
| return 0; /* not a 200 */ |
| } |
| |
| static void |
| transform_add(INKHttpTxn txnp, TransformTestData * data) |
| { |
| INKVConn connp; |
| |
| connp = INKTransformCreate(transformtest_transform, txnp); |
| INKContDataSet(connp, data); |
| if ((connp == NULL) || (connp == INK_ERROR_PTR)) { |
| SDK_RPRINT(data->test, "INKHttpTxnTransform", "", TC_FAIL, "Unable to create Transformation."); |
| return; |
| } |
| |
| if (INKHttpTxnHookAdd(txnp, INK_HTTP_RESPONSE_TRANSFORM_HOOK, connp) != INK_SUCCESS) { |
| SDK_RPRINT(data->test, "INKHttpTxnTransform", "", TC_FAIL, "Unable to add Transformation to the transform hook."); |
| } |
| return; |
| } |
| |
| static int |
| load(const char *append_string) |
| { |
| INKIOBufferBlock blk; |
| char *p; |
| int64 avail; |
| |
| append_buffer = INKIOBufferCreate(); |
| append_buffer_reader = INKIOBufferReaderAlloc(append_buffer); |
| |
| blk = INKIOBufferStart(append_buffer); |
| p = INKIOBufferBlockWriteStart(blk, &avail); |
| |
| ink_strncpy(p, append_string, avail); |
| if (append_string != NULL) { |
| INKIOBufferProduce(append_buffer, strlen(append_string)); |
| } |
| |
| append_buffer_length = INKIOBufferReaderAvail(append_buffer_reader); |
| |
| return 1; |
| } |
| |
| /**** Append Transform Code Ends ****/ |
| |
| static int |
| transform_hook_handler(INKCont contp, INKEvent event, void *edata) |
| { |
| |
| INKHttpTxn txnp = NULL; |
| TransformTestData *data = NULL; |
| data = (TransformTestData *) INKContDataGet(contp); |
| if ((data == INK_ERROR_PTR) || (data == NULL)) { |
| switch (event) { |
| case INK_EVENT_IMMEDIATE: |
| case INK_EVENT_TIMEOUT: |
| break; |
| case INK_EVENT_HTTP_READ_RESPONSE_HDR: |
| default: |
| INKHttpTxnReenable((INKHttpTxn) edata, INK_EVENT_HTTP_CONTINUE); |
| break; |
| } |
| return 0; |
| } |
| |
| |
| switch (event) { |
| case INK_EVENT_HTTP_READ_RESPONSE_HDR: |
| txnp = (INKHttpTxn) edata; |
| /* Setup hooks for Transformation */ |
| if (transformable(txnp, data)) { |
| transform_add(txnp, data); |
| } |
| /* Call TransformedRespCache or UntransformedRespCache depending on request */ |
| { |
| INKMBuffer bufp; |
| INKMLoc hdr; |
| INKMLoc field; |
| |
| if (INKHttpTxnClientReqGet(txnp, &bufp, &hdr) == 0) { |
| SDK_RPRINT(data->test, "INKHttpTxnTransform", "TestCase", TC_FAIL, "INKHttpTxnClientReqGet returns 0"); |
| } else { |
| field = INKMimeHdrFieldFind(bufp, hdr, "Request", -1); |
| if ((field == NULL) || (field == INK_ERROR_PTR)) { |
| SDK_RPRINT(data->test, "INKHttpTxnTransform", "TestCase", TC_FAIL, "Didn't find field request"); |
| } else { |
| int reqid; |
| if (INKMimeHdrFieldValueIntGet(bufp, hdr, field, 0, &reqid) != INK_SUCCESS) { |
| SDK_RPRINT(data->test, "INKHttpTxnTransform", "TestCase", TC_FAIL, "Error in getting field Value"); |
| } else { |
| if (reqid == 1) { |
| if ((INKHttpTxnTransformedRespCache(txnp, 0) != INK_SUCCESS) || |
| (INKHttpTxnUntransformedRespCache(txnp, 1) != INK_SUCCESS) |
| ) { |
| SDK_RPRINT(data->test, "INKHttpTxnTransformedRespCache", "TestCase", TC_FAIL, |
| "INKHttpTxnTransformedRespCache or INKHttpTxnUntransformedRespCache doesn't return INK_SUCCESS.reqid=%d", |
| reqid); |
| } |
| } |
| if (reqid == 2) { |
| if ((INKHttpTxnTransformedRespCache(txnp, 1) != INK_SUCCESS) || |
| (INKHttpTxnUntransformedRespCache(txnp, 0) != INK_SUCCESS) |
| ) { |
| SDK_RPRINT(data->test, "INKHttpTxnTransformedRespCache", "TestCase", TC_FAIL, |
| "INKHttpTxnTransformedRespCache or INKHttpTxnUntransformedRespCache doesn't return INK_SUCCESS.reqid=%d", |
| reqid); |
| } |
| } |
| } |
| if (INKHandleMLocRelease(bufp, hdr, field) != INK_SUCCESS) { |
| SDK_RPRINT(data->test, "INKHttpTxnTransform", "TestCase", TC_FAIL, |
| "Unable to release handle to field in Client request"); |
| } |
| } |
| if (INKHandleMLocRelease(bufp, INK_NULL_MLOC, hdr) != INK_SUCCESS) { |
| SDK_RPRINT(data->test, "INKHttpTxnTransform", "TestCase", TC_FAIL, |
| "Unable to release handle to Client request"); |
| } |
| } |
| } |
| |
| /* Add the transaction hook to SEND_RESPONSE_HDR_HOOK */ |
| if (INKHttpTxnHookAdd(txnp, INK_HTTP_SEND_RESPONSE_HDR_HOOK, contp) != INK_SUCCESS) { |
| SDK_RPRINT(data->test, "INKHttpTxnTransform", "", TC_FAIL, |
| "Cannot add transaction hook to SEND_RESPONSE_HDR_HOOK"); |
| } |
| /* Reenable the transaction */ |
| if (INKHttpTxnReenable(txnp, INK_EVENT_HTTP_CONTINUE) != INK_SUCCESS) { |
| SDK_RPRINT(data->test, "INKHttpTxnTransform", "", TC_FAIL, |
| "Reenabling the transaction doesn't return INK_SUCCESS"); |
| } |
| break; |
| |
| case INK_EVENT_HTTP_SEND_RESPONSE_HDR: |
| { |
| INKMBuffer bufp; |
| INKMLoc hdr; |
| txnp = (INKHttpTxn) edata; |
| if (INKHttpTxnTransformRespGet(txnp, &bufp, &hdr) == 0) { |
| SDK_RPRINT(data->test, "INKHttpTxnTransformRespGet", "TestCase", TC_FAIL, |
| "INKHttpTxnTransformRespGet returns 0"); |
| data->test_passed_txn_transform_resp_get = false; |
| } else { |
| if ((bufp == &(((HttpSM *) txnp)->t_state.hdr_info.transform_response)) && |
| (hdr == (&(((HttpSM *) txnp)->t_state.hdr_info.transform_response))->m_http) |
| ) { |
| SDK_RPRINT(data->test, "INKHttpTxnTransformRespGet", "TestCase", TC_PASS, "ok"); |
| } else { |
| SDK_RPRINT(data->test, "INKHttpTxnTransformRespGet", "TestCase", TC_FAIL, "Value's Mismatch"); |
| data->test_passed_txn_transform_resp_get = false; |
| } |
| if (INKHandleMLocRelease(bufp, INK_NULL_MLOC, hdr) != INK_SUCCESS) { |
| SDK_RPRINT(data->test, "INKHttpTxnTransformRespGet", "TestCase", TC_FAIL, |
| "Unable to release handle to Transform header handle"); |
| } |
| |
| } |
| } |
| if (INKHttpTxnReenable(txnp, INK_EVENT_HTTP_CONTINUE) != INK_SUCCESS) { |
| SDK_RPRINT(data->test, "INKHttpTxnTransformRespGet", "", TC_FAIL, |
| "Reenabling the transaction doesn't return INK_SUCCESS"); |
| } |
| break; |
| |
| case INK_EVENT_IMMEDIATE: |
| case INK_EVENT_TIMEOUT: |
| |
| switch (data->req_no) { |
| case 1: |
| if (data->browser1->status == REQUEST_INPROGRESS) { |
| INKContSchedule(contp, 25); |
| return 0; |
| } |
| data->req_no++; |
| Debug(UTDBG_TAG "_transform", "Running Browser 2"); |
| synclient_txn_send_request(data->browser2, data->request2); |
| INKContSchedule(contp, 25); |
| return 0; |
| case 2: |
| if (data->browser2->status == REQUEST_INPROGRESS) { |
| INKContSchedule(contp, 25); |
| return 0; |
| } |
| data->req_no++; |
| synserver_delete(data->os); |
| Debug(UTDBG_TAG "_transform", "Running Browser 3"); |
| synclient_txn_send_request(data->browser3, data->request1); |
| INKContSchedule(contp, 25); |
| return 0; |
| case 3: |
| if (data->browser3->status == REQUEST_INPROGRESS) { |
| INKContSchedule(contp, 25); |
| return 0; |
| } |
| data->req_no++; |
| Debug(UTDBG_TAG "_transform", "Running Browser 4"); |
| synclient_txn_send_request(data->browser4, data->request2); |
| INKContSchedule(contp, 25); |
| return 0; |
| case 4: |
| if (data->browser4->status == REQUEST_INPROGRESS) { |
| INKContSchedule(contp, 25); |
| return 0; |
| } |
| data->req_no++; |
| INKfree(data->request1); |
| INKfree(data->request2); |
| // for squid log: if this is the last (or only) test in your |
| // regression run you will not see any log entries in squid |
| // (because logging is buffered and not flushed before |
| // termination when running regressions) |
| // sleep(10); |
| break; |
| default: |
| SDK_RPRINT(data->test, "INKHttpTxnTransform", "TestCase", TC_FAIL, "Something terribly wrong with the test"); |
| exit(0); |
| |
| } |
| /* Browser got the response. test is over */ |
| { |
| /* Check if we got the response we were expecting or not */ |
| if ((strstr(data->browser1->response, TRANSFORM_APPEND_STRING) != NULL) && |
| (strstr(data->browser3->response, TRANSFORM_APPEND_STRING) == NULL) |
| ) { |
| SDK_RPRINT(data->test, "INKHttpTxnUntransformedResponseCache", "TestCase1", TC_PASS, "ok"); |
| data->test_passed_txn_untransformed_resp_cache = true; |
| } else { |
| SDK_RPRINT(data->test, "INKHttpTxnUntransformedResponseCache", "TestCase1", TC_FAIL, "Value's Mismatch"); |
| } |
| |
| if ((strstr(data->browser2->response, TRANSFORM_APPEND_STRING) != NULL) && |
| (strstr(data->browser4->response, TRANSFORM_APPEND_STRING) != NULL) |
| ) { |
| SDK_RPRINT(data->test, "INKHttpTxnTransformedResponseCache", "TestCase1", TC_PASS, "ok"); |
| data->test_passed_txn_transformed_resp_cache = true; |
| } else { |
| SDK_RPRINT(data->test, "INKHttpTxnTransformedResponseCache", "TestCase1", TC_FAIL, "Value's Mismatch"); |
| } |
| |
| /* Note: response is available using test->browser->response pointer */ |
| *(data->pstatus) = REGRESSION_TEST_PASSED; |
| if (data->browser1->status != REQUEST_SUCCESS) { |
| SDK_RPRINT(data->test, "INKTransformCreate", "TestCase1", TC_FAIL, "Browser 1 status was not REQUEST_SUCCESS"); |
| *(data->pstatus) = REGRESSION_TEST_FAILED; |
| } |
| if (data->browser2->status != REQUEST_SUCCESS) { |
| SDK_RPRINT(data->test, "INKTransformCreate", "TestCase1", TC_FAIL, "Browser 2 status was not REQUEST_SUCCESS"); |
| *(data->pstatus) = REGRESSION_TEST_FAILED; |
| } |
| if (data->browser3->status != REQUEST_SUCCESS) { |
| SDK_RPRINT(data->test, "INKTransformCreate", "TestCase1", TC_FAIL, "Browser 3 status was not REQUEST_SUCCESS"); |
| *(data->pstatus) = REGRESSION_TEST_FAILED; |
| } |
| if (data->browser4->status != REQUEST_SUCCESS) { |
| SDK_RPRINT(data->test, "INKTransformCreate", "TestCase1", TC_FAIL, "Browser 4 status was not REQUEST_SUCCESS"); |
| *(data->pstatus) = REGRESSION_TEST_FAILED; |
| } |
| if (data->test_passed_txn_transform_resp_get != true) { |
| SDK_RPRINT(data->test, "INKTransformCreate", "TestCase1", TC_FAIL, "did not pass transform_resp_get"); |
| *(data->pstatus) = REGRESSION_TEST_FAILED; |
| } |
| if (data->test_passed_txn_transformed_resp_cache != true) { |
| SDK_RPRINT(data->test, "INKTransformCreate", "TestCase1", TC_FAIL, "did not pass transformed_resp_cache"); |
| *(data->pstatus) = REGRESSION_TEST_FAILED; |
| } |
| if (data->test_passed_txn_untransformed_resp_cache != true) { |
| SDK_RPRINT(data->test, "INKTransformCreate", "TestCase1", TC_FAIL, "did not pass untransformed_resp_cache"); |
| *(data->pstatus) = REGRESSION_TEST_FAILED; |
| } |
| if (data->test_passed_transform_create != true) { |
| SDK_RPRINT(data->test, "INKTransformCreate", "TestCase1", TC_FAIL, "did not pass transform_create"); |
| *(data->pstatus) = REGRESSION_TEST_FAILED; |
| } |
| // transaction is over. clean up. |
| synclient_txn_delete(data->browser1); |
| synclient_txn_delete(data->browser2); |
| synclient_txn_delete(data->browser3); |
| synclient_txn_delete(data->browser4); |
| |
| data->magic = MAGIC_DEAD; |
| INKfree(data); |
| INKContDataSet(contp, NULL); |
| } |
| break; |
| |
| default: |
| *(data->pstatus) = REGRESSION_TEST_FAILED; |
| SDK_RPRINT(data->test, "INKHttpTxnTransform", "TestCase1", TC_FAIL, "Unexpected event %d", event); |
| break; |
| } |
| return 0; |
| } |
| |
| |
| EXCLUSIVE_REGRESSION_TEST(SDK_API_HttpTxnTransform) (RegressionTest * test, int atype, int *pstatus) |
| { |
| NOWARN_UNUSED(atype); |
| *pstatus = REGRESSION_TEST_INPROGRESS; |
| |
| Debug(UTDBG_TAG "_transform", "Starting test"); |
| |
| INKCont cont = INKContCreate(transform_hook_handler, INKMutexCreate()); |
| if ((cont == NULL) || (cont == INK_ERROR_PTR)) { |
| SDK_RPRINT(test, "INKHttSsn", "TestCase1", TC_FAIL, "Unable to create Continuation."); |
| *pstatus = REGRESSION_TEST_FAILED; |
| return; |
| } |
| |
| TransformTestData *socktest = (TransformTestData *) INKmalloc(sizeof(TransformTestData)); |
| socktest->test = test; |
| socktest->pstatus = pstatus; |
| socktest->test_passed_txn_transform_resp_get = true; |
| socktest->test_passed_txn_transformed_resp_cache = false; |
| socktest->test_passed_txn_transformed_resp_cache = false; |
| socktest->test_passed_transform_create = false; |
| socktest->transformData = NULL; |
| socktest->req_no = 1; |
| socktest->magic = MAGIC_ALIVE; |
| INKContDataSet(cont, socktest); |
| |
| /* Prepare the buffer to be appended to responses */ |
| load(TRANSFORM_APPEND_STRING); |
| |
| /* Register to HTTP hooks that are called in case of a cache MISS */ |
| INKHttpHookAdd(INK_HTTP_READ_RESPONSE_HDR_HOOK, cont); |
| |
| /* Create a new synthetic server */ |
| socktest->os = synserver_create(SYNSERVER_LISTEN_PORT); |
| synserver_start(socktest->os); |
| |
| /* Create a client transaction */ |
| socktest->browser1 = synclient_txn_create(); |
| socktest->browser2 = synclient_txn_create(); |
| socktest->browser3 = synclient_txn_create(); |
| socktest->browser4 = synclient_txn_create(); |
| socktest->request1 = generate_request(4); |
| socktest->request2 = generate_request(5); |
| Debug(UTDBG_TAG "_transform", "Running Browser 1"); |
| synclient_txn_send_request(socktest->browser1, socktest->request1); |
| // synclient_txn_send_request(socktest->browser2, socktest->request2); |
| |
| /* Wait until transaction is done */ |
| INKContSchedule(cont, 25); |
| |
| return; |
| } |
| |
| ////////////////////////////////////////////// |
| // SDK_API_INKHttpTxnAltInfo |
| // |
| // Unit Test for API: INKHttpTxnCachedReqGet |
| // INKHttpTxnCachedRespGet |
| ////////////////////////////////////////////// |
| |
| typedef struct |
| { |
| RegressionTest *test; |
| int *pstatus; |
| SocketServer *os; |
| ClientTxn *browser1; |
| ClientTxn *browser2; |
| ClientTxn *browser3; |
| char *request1; |
| char *request2; |
| char *request3; |
| bool test_passed_txn_alt_info_client_req_get; |
| bool test_passed_txn_alt_info_cached_req_get; |
| bool test_passed_txn_alt_info_cached_resp_get; |
| bool test_passed_txn_alt_info_quality_set; |
| bool run_at_least_once; |
| bool first_time; |
| int magic; |
| } AltInfoTestData; |
| |
| static int |
| altinfo_hook_handler(INKCont contp, INKEvent event, void *edata) |
| { |
| |
| AltInfoTestData *data = NULL; |
| data = (AltInfoTestData *) INKContDataGet(contp); |
| if ((data == INK_ERROR_PTR) || (data == NULL)) { |
| switch (event) { |
| case INK_EVENT_IMMEDIATE: |
| case INK_EVENT_TIMEOUT: |
| break; |
| case INK_EVENT_HTTP_SELECT_ALT: |
| break; |
| default: |
| INKHttpTxnReenable((INKHttpTxn) edata, INK_EVENT_HTTP_CONTINUE); |
| break; |
| } |
| return 0; |
| } |
| |
| switch (event) { |
| case INK_EVENT_HTTP_SELECT_ALT: |
| { |
| INKMBuffer clientreqbuf; |
| INKMBuffer cachereqbuf; |
| INKMBuffer cacherespbuf; |
| |
| INKMLoc clientreqhdr; |
| INKMLoc cachereqhdr; |
| INKMLoc cacheresphdr; |
| |
| INKHttpAltInfo infop = (INKHttpAltInfo) edata; |
| |
| data->run_at_least_once = true; |
| if (INKHttpAltInfoClientReqGet(infop, &clientreqbuf, &clientreqhdr) != INK_SUCCESS) { |
| SDK_RPRINT(data->test, "INKHttpAltInfoClientReqGet", "TestCase", TC_FAIL, |
| "INKHttpAltInfoClientReqGet doesn't return INK_SUCCESS"); |
| data->test_passed_txn_alt_info_client_req_get = false; |
| } else { |
| if ((clientreqbuf == (&(((HttpAltInfo *) infop)->m_client_req))) && |
| (clientreqhdr == ((HttpAltInfo *) infop)->m_client_req.m_http) |
| ) { |
| SDK_RPRINT(data->test, "INKHttpAltInfoClientReqGet", "TestCase", TC_PASS, "ok"); |
| } else { |
| SDK_RPRINT(data->test, "INKHttpAltInfoClientReqGet", "TestCase", TC_FAIL, "Value's Mismatch"); |
| data->test_passed_txn_alt_info_client_req_get = false; |
| } |
| } |
| |
| if (INKHttpAltInfoCachedReqGet(infop, &cachereqbuf, &cachereqhdr) != INK_SUCCESS) { |
| SDK_RPRINT(data->test, "INKHttpAltInfoCachedReqGet", "TestCase", TC_FAIL, |
| "INKHttpAltInfoCachedReqGet doesn't return INK_SUCCESS"); |
| data->test_passed_txn_alt_info_cached_req_get = false; |
| } else { |
| if ((cachereqbuf == (&(((HttpAltInfo *) infop)->m_cached_req))) && |
| (cachereqhdr == ((HttpAltInfo *) infop)->m_cached_req.m_http) |
| ) { |
| SDK_RPRINT(data->test, "INKHttpAltInfoCachedReqGet", "TestCase", TC_PASS, "ok"); |
| } else { |
| SDK_RPRINT(data->test, "INKHttpAltInfoCachedReqGet", "TestCase", TC_FAIL, "Value's Mismatch"); |
| data->test_passed_txn_alt_info_cached_req_get = false; |
| } |
| } |
| |
| if (INKHttpAltInfoCachedRespGet(infop, &cacherespbuf, &cacheresphdr) != INK_SUCCESS) { |
| SDK_RPRINT(data->test, "INKHttpAltInfoCachedRespGet", "TestCase", TC_FAIL, |
| "INKHttpAltInfoCachedRespGet doesn't return INK_SUCCESS"); |
| data->test_passed_txn_alt_info_cached_resp_get = false; |
| } else { |
| if ((cacherespbuf == (&(((HttpAltInfo *) infop)->m_cached_resp))) && |
| (cacheresphdr == ((HttpAltInfo *) infop)->m_cached_resp.m_http) |
| ) { |
| SDK_RPRINT(data->test, "INKHttpAltInfoCachedRespGet", "TestCase", TC_PASS, "ok"); |
| } else { |
| SDK_RPRINT(data->test, "INKHttpAltInfoCachedRespGet", "TestCase", TC_FAIL, "Value's Mismatch"); |
| data->test_passed_txn_alt_info_cached_resp_get = false; |
| } |
| } |
| |
| if (INKHttpAltInfoQualitySet(infop, 0.5) != INK_SUCCESS) { |
| SDK_RPRINT(data->test, "INKHttpAltInfoQualityset", "TestCase", TC_FAIL, |
| "INKHttpAltInfoQualitySet doesn't return INK_SUCCESS"); |
| data->test_passed_txn_alt_info_quality_set = false; |
| } else { |
| SDK_RPRINT(data->test, "INKHttpAltInfoQualitySet", "TestCase", TC_PASS, "ok"); |
| } |
| } |
| |
| break; |
| |
| case INK_EVENT_IMMEDIATE: |
| case INK_EVENT_TIMEOUT: |
| /* Browser still waiting the response ? */ |
| if (data->first_time == true) { |
| if ((data->browser1->status == REQUEST_INPROGRESS) || (data->browser2->status == REQUEST_INPROGRESS) |
| ) { |
| INKContSchedule(contp, 25); |
| return 0; |
| } |
| } else { |
| if (data->browser3->status == REQUEST_INPROGRESS) { |
| INKContSchedule(contp, 25); |
| return 0; |
| } |
| } |
| |
| /* Browser got the response. test is over. clean up */ |
| { |
| /* If this is the first time, then both the responses are in cache and we should make */ |
| /* another request to get cache hit */ |
| if (data->first_time == true) { |
| data->first_time = false; |
| /* Kill the origin server */ |
| synserver_delete(data->os); |
| // ink_release_assert(0); |
| /* Send another similar client request */ |
| synclient_txn_send_request(data->browser3, data->request3); |
| |
| /* Register to HTTP hooks that are called in case of alternate selection */ |
| if (INKHttpHookAdd(INK_HTTP_SELECT_ALT_HOOK, contp) != INK_SUCCESS) { |
| SDK_RPRINT(data->test, "INKHttpAltInfo", "", TC_FAIL, "INKHttpHookAdd doesn't return INK_SUCCESS"); |
| } |
| |
| INKContSchedule(contp, 25); |
| return 0; |
| } |
| |
| /* Note: response is available using test->browser->response pointer */ |
| if ((data->browser3->status == REQUEST_SUCCESS) && |
| (data->test_passed_txn_alt_info_client_req_get == true) && |
| (data->test_passed_txn_alt_info_cached_req_get == true) && |
| (data->test_passed_txn_alt_info_cached_resp_get == true) && |
| (data->test_passed_txn_alt_info_quality_set == true) && (data->run_at_least_once == true) |
| ) { |
| *(data->pstatus) = REGRESSION_TEST_PASSED; |
| } else { |
| if (data->run_at_least_once == false) { |
| SDK_RPRINT(data->test, "INKHttpAltInfo", "All", TC_FAIL, "Test not executed even once"); |
| } |
| *(data->pstatus) = REGRESSION_TEST_FAILED; |
| } |
| |
| // transaction is over. clean up. |
| synclient_txn_delete(data->browser1); |
| synclient_txn_delete(data->browser2); |
| synclient_txn_delete(data->browser3); |
| |
| INKfree(data->request1); |
| INKfree(data->request2); |
| INKfree(data->request3); |
| |
| data->magic = MAGIC_DEAD; |
| INKfree(data); |
| INKContDataSet(contp, NULL); |
| } |
| break; |
| |
| default: |
| *(data->pstatus) = REGRESSION_TEST_FAILED; |
| SDK_RPRINT(data->test, "INKHttpTxnCache", "TestCase1", TC_FAIL, "Unexpected event %d", event); |
| break; |
| } |
| return 0; |
| } |
| |
| |
| |
| EXCLUSIVE_REGRESSION_TEST(SDK_API_HttpAltInfo) (RegressionTest * test, int atype, int *pstatus) |
| { |
| NOWARN_UNUSED(atype); |
| *pstatus = REGRESSION_TEST_INPROGRESS; |
| |
| INKCont cont = INKContCreate(altinfo_hook_handler, INKMutexCreate()); |
| if ((cont == NULL) || (cont == INK_ERROR_PTR)) { |
| SDK_RPRINT(test, "INKHttSsn", "TestCase1", TC_FAIL, "Unable to create Continuation."); |
| *pstatus = REGRESSION_TEST_FAILED; |
| return; |
| } |
| |
| AltInfoTestData *socktest = (AltInfoTestData *) INKmalloc(sizeof(AltInfoTestData)); |
| socktest->test = test; |
| socktest->pstatus = pstatus; |
| socktest->test_passed_txn_alt_info_client_req_get = true; |
| socktest->test_passed_txn_alt_info_cached_req_get = true; |
| socktest->test_passed_txn_alt_info_cached_resp_get = true; |
| socktest->test_passed_txn_alt_info_quality_set = true; |
| socktest->run_at_least_once = false; |
| socktest->first_time = true; |
| socktest->magic = MAGIC_ALIVE; |
| INKContDataSet(cont, socktest); |
| |
| /* Create a new synthetic server */ |
| socktest->os = synserver_create(SYNSERVER_LISTEN_PORT); |
| synserver_start(socktest->os); |
| |
| /* Create a client transaction */ |
| socktest->browser1 = synclient_txn_create(); |
| socktest->browser2 = synclient_txn_create(); |
| socktest->browser3 = synclient_txn_create(); |
| socktest->request1 = generate_request(6); |
| socktest->request2 = generate_request(7); |
| socktest->request3 = generate_request(8); |
| synclient_txn_send_request(socktest->browser1, socktest->request1); |
| synclient_txn_send_request(socktest->browser2, socktest->request2); |
| |
| /* Wait until transaction is done */ |
| INKContSchedule(cont, 25); |
| |
| return; |
| } |
| |
| |
| ////////////////////////////////////////////// |
| // SDK_API_INKHttpConnect |
| // |
| // Unit Test for APIs: |
| // - INKHttpConnect |
| // - INKHttpTxnIntercept |
| // - INKHttpTxnInterceptServer |
| // |
| // |
| // 2 Test cases. |
| // |
| // Same test strategy: |
| // - create a synthetic server listening on port A |
| // - use HttpConnect to send a request to TS for an url on a remote host H, port B |
| // - use TxnIntercept or TxnServerIntercept to forward the request |
| // to the synthetic server on local host, port A |
| // - make sure response is correct |
| // |
| ////////////////////////////////////////////// |
| |
| // Important: we create servers listening on different port than the default one |
| // to make sure our synthetix servers are called |
| |
| #define TEST_CASE_CONNECT_ID1 9 //INKHttpTxnIntercept |
| #define TEST_CASE_CONNECT_ID2 10 //INKHttpTxnServerIntercept |
| |
| #define SYNSERVER_DUMMY_PORT -1 |
| |
| typedef struct |
| { |
| RegressionTest *test; |
| int *pstatus; |
| int test_case; |
| INKVConn vc; |
| SocketServer *os; |
| ClientTxn *browser; |
| char *request; |
| unsigned long magic; |
| } ConnectTestData; |
| |
| |
| static int |
| cont_test_handler(INKCont contp, INKEvent event, void *edata) |
| { |
| INKHttpTxn txnp = (INKHttpTxn) edata; |
| ConnectTestData *data = (ConnectTestData *) INKContDataGet(contp); |
| int request_id = -1; |
| |
| INKReleaseAssert(data->magic == MAGIC_ALIVE); |
| INKReleaseAssert((data->test_case == TEST_CASE_CONNECT_ID1) || (data->test_case == TEST_CASE_CONNECT_ID2)); |
| |
| INKDebug(UTDBG_TAG, "Calling cont_test_handler with event %d", event); |
| |
| switch (event) { |
| case INK_EVENT_HTTP_READ_REQUEST_HDR: |
| INKDebug(UTDBG_TAG, "cont_test_handler: event READ_REQUEST"); |
| |
| // First make sure we're getting called for either request 9 or txn 10 |
| // Otherwise, this is a request sent by another test. do nothing. |
| request_id = get_request_id(txnp); |
| INKReleaseAssert(request_id != -1); |
| |
| INKDebug(UTDBG_TAG, "cont_test_handler: Request id = %d", request_id); |
| |
| if ((request_id != TEST_CASE_CONNECT_ID1) && (request_id != TEST_CASE_CONNECT_ID2)) { |
| INKDebug(UTDBG_TAG, "This is not an event for this test !"); |
| INKHttpTxnReenable(txnp, INK_EVENT_HTTP_CONTINUE); |
| goto done; |
| } |
| |
| if ((request_id == TEST_CASE_CONNECT_ID1) && (data->test_case == TEST_CASE_CONNECT_ID1)) { |
| INKDebug(UTDBG_TAG, "Calling INKHttpTxnIntercept"); |
| INKHttpTxnIntercept(data->os->accept_cont, txnp); |
| } else if ((request_id == TEST_CASE_CONNECT_ID2) && (data->test_case == TEST_CASE_CONNECT_ID2)) { |
| INKDebug(UTDBG_TAG, "Calling INKHttpTxnServerIntercept"); |
| INKHttpTxnServerIntercept(data->os->accept_cont, txnp); |
| } |
| |
| INKHttpTxnReenable(txnp, INK_EVENT_HTTP_CONTINUE); |
| break; |
| |
| case INK_EVENT_TIMEOUT: |
| /* Browser still waiting the response ? */ |
| if (data->browser->status == REQUEST_INPROGRESS) { |
| INKDebug(UTDBG_TAG, "Browser still waiting response..."); |
| INKContSchedule(contp, 25); |
| } |
| /* Browser got the response */ |
| else { |
| |
| /* Check if browser response body is the one we expected */ |
| char *body_response = get_body_ptr(data->browser->response); |
| const char *body_expected; |
| if (data->test_case == TEST_CASE_CONNECT_ID1) { |
| body_expected = "Body for response 9"; |
| } else { |
| body_expected = "Body for response 10"; |
| } |
| INKDebug(UTDBG_TAG, "Body Response = \n|%s|\nBody Expected = \n|%s|", body_response, body_expected); |
| |
| if (strncmp(body_response, body_expected, strlen(body_expected)) != 0) { |
| if (data->test_case == TEST_CASE_CONNECT_ID1) { |
| SDK_RPRINT(data->test, "INKHttpConnect", "TestCase1", TC_FAIL, "Unexpected response"); |
| SDK_RPRINT(data->test, "INKHttpTxnIntercept", "TestCase1", TC_FAIL, "Unexpected response"); |
| } else { |
| SDK_RPRINT(data->test, "INKHttpConnect", "TestCase2", TC_FAIL, "Unexpected response"); |
| SDK_RPRINT(data->test, "INKHttpTxnServerIntercept", "TestCase2", TC_FAIL, "Unexpected response"); |
| } |
| *(data->pstatus) = REGRESSION_TEST_FAILED; |
| |
| } else { |
| if (data->test_case == TEST_CASE_CONNECT_ID1) { |
| SDK_RPRINT(data->test, "INKHttpConnect", "TestCase1", TC_PASS, "ok"); |
| SDK_RPRINT(data->test, "INKHttpTxnIntercept", "TestCase1", TC_PASS, "ok"); |
| } else { |
| SDK_RPRINT(data->test, "INKHttpConnect", "TestCase2", TC_PASS, "ok"); |
| SDK_RPRINT(data->test, "INKHttpTxnServerIntercept", "TestCase2", TC_PASS, "ok"); |
| } |
| *(data->pstatus) = REGRESSION_TEST_PASSED; |
| } |
| |
| // transaction is over. clean it up. |
| synclient_txn_delete(data->browser); |
| synserver_delete(data->os); |
| |
| // As we registered to a global hook, we may be called back again. |
| // Do not destroy the continuation... |
| // data->magic = MAGIC_DEAD; |
| // INKfree(data); |
| // INKContDataSet(contp, NULL); |
| } |
| break; |
| |
| default: |
| *(data->pstatus) = REGRESSION_TEST_FAILED; |
| SDK_RPRINT(data->test, "INKHttpConnect", "TestCase1 or 2", TC_FAIL, "Unexpected event %d", event); |
| break; |
| } |
| |
| done: |
| return INK_EVENT_IMMEDIATE; |
| } |
| |
| |
| EXCLUSIVE_REGRESSION_TEST(SDK_API_INKHttpConnectIntercept) (RegressionTest * test, int atype, int *pstatus) |
| { |
| NOWARN_UNUSED(atype); |
| *pstatus = REGRESSION_TEST_INPROGRESS; |
| |
| INKDebug(UTDBG_TAG, "Starting test INKHttpConnectIntercept"); |
| |
| INKCont cont_test = INKContCreate(cont_test_handler, INKMutexCreate()); |
| ConnectTestData *data = (ConnectTestData *) INKmalloc(sizeof(ConnectTestData)); |
| INKContDataSet(cont_test, data); |
| |
| data->test = test; |
| data->pstatus = pstatus; |
| data->magic = MAGIC_ALIVE; |
| data->test_case = TEST_CASE_CONNECT_ID1; |
| |
| /* Register to hook READ_REQUEST */ |
| INKHttpHookAdd(INK_HTTP_READ_REQUEST_HDR_HOOK, cont_test); |
| |
| // Create a synthetic server which won't really listen on a socket port |
| // It will be called by the Http SM with a VC |
| data->os = synserver_create(SYNSERVER_DUMMY_PORT); |
| |
| data->browser = synclient_txn_create(); |
| data->request = generate_request(9); |
| |
| /* Now send a request to the OS via TS using INKHttpConnect */ |
| |
| /* ip and log do not matter as it is used for logging only */ |
| INKHttpConnect(1, 1, &(data->vc)); |
| |
| synclient_txn_send_request_to_vc(data->browser, data->request, data->vc); |
| |
| /* Wait until transaction is done */ |
| INKContSchedule(cont_test, 25); |
| |
| return; |
| } |
| |
| |
| EXCLUSIVE_REGRESSION_TEST(SDK_API_INKHttpConnectServerIntercept) (RegressionTest * test, int atype, int *pstatus) |
| { |
| NOWARN_UNUSED(atype); |
| *pstatus = REGRESSION_TEST_INPROGRESS; |
| |
| INKDebug(UTDBG_TAG, "Starting test INKHttpConnectServerintercept"); |
| |
| INKCont cont_test = INKContCreate(cont_test_handler, INKMutexCreate()); |
| ConnectTestData *data = (ConnectTestData *) INKmalloc(sizeof(ConnectTestData)); |
| INKContDataSet(cont_test, data); |
| |
| data->test = test; |
| data->pstatus = pstatus; |
| data->magic = MAGIC_ALIVE; |
| data->test_case = TEST_CASE_CONNECT_ID2; |
| |
| /* Register to hook READ_REQUEST */ |
| INKHttpHookAdd(INK_HTTP_READ_REQUEST_HDR_HOOK, cont_test); |
| |
| /* This is cool ! we can use the code written for the synthetic server and client in InkAPITest.cc */ |
| data->os = synserver_create(SYNSERVER_DUMMY_PORT); |
| |
| data->browser = synclient_txn_create(); |
| data->request = generate_request(10); |
| |
| /* Now send a request to the OS via TS using INKHttpConnect */ |
| |
| /* ip and log do not matter as it is used for logging only */ |
| INKHttpConnect(2, 2, &(data->vc)); |
| |
| synclient_txn_send_request_to_vc(data->browser, data->request, data->vc); |
| |
| /* Wait until transaction is done */ |
| INKContSchedule(cont_test, 25); |
| |
| return; |
| } |