| /* |
| ** Copyright 2003-2004 The Apache Software Foundation |
| ** |
| ** Licensed 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 "apr_time.h" |
| #include "apr_strings.h" |
| #include "apreq_env.h" |
| #include "test_apreq.h" |
| #include "apreq.h" |
| #include "apreq_tables.h" |
| #include "apr_hash.h" |
| #if APR_HAVE_STDIO_H |
| #include <stdio.h> |
| #endif |
| #if APR_HAVE_STDLIB_H |
| #include <stdlib.h> |
| #endif |
| #if APR_HAVE_STRING_H |
| #include <string.h> |
| #endif |
| |
| static apreq_table_t *t = NULL; |
| static apreq_table_t *s = NULL; |
| static apreq_table_t *h = NULL; |
| |
| #define NELTS 16 |
| #define LOOP 10000 |
| #define FAIL(MSG) \ |
| CuFail(tc, apr_psprintf(p, MSG ": APR = %.3f vs APREQ = %.3f (microseconds)", \ |
| (double)apr_delta / LOOP, (double)apreq_delta / LOOP)) |
| #define TEST_DELTAS(winner,loser,MSG) if (winner##_delta > loser##_delta) FAIL(MSG) |
| |
| #define RUN_GET(k,v) do {apr_time_t apr_delta,apreq_delta;const char *val; \ |
| int i; apreq_delta = apr_time_now(); for(i=0;i<LOOP;++i) val = \ |
| apreq_table_get(t,k); apreq_delta = apr_time_now() - apreq_delta; \ |
| if (v) { CuAssertPtrNotNull(tc,val);CuAssertStrEquals(tc,v,val);} \ |
| else CuAssertPtrEquals(tc,NULL,val); \ |
| apr_delta = apr_time_now(); for(i=0;i<LOOP;++i) val = apr_table_get(s,k); \ |
| apr_delta = apr_time_now() - apr_delta; \ |
| if (v) {CuAssertPtrNotNull(tc,val); CuAssertStrEquals(tc,v,val);} \ |
| else CuAssertPtrEquals(tc,NULL,val);\ |
| TEST_DELTAS(apreq,apr,"apr_table_get(" k ") wins"); apr_delta = apr_time_now(); \ |
| /* for(i=0;i<LOOP;++i) val = apr_hash_get(h,k,APR_HASH_KEY_STRING);\ |
| apr_delta = apr_time_now() - apr_delta; \ |
| if (v) {CuAssertPtrNotNull(tc,val);CuAssertStrEquals(tc,v,val);} \ |
| else CuAssertPtrEquals(tc,NULL,val); \ |
| TEST_DELTAS(apreq,apr,"APR hash_get(" k ") wins"); \ |
| */} while (0) |
| |
| |
| |
| #define V(k,v) apreq_make_value(p,k,strlen(k),v,strlen(v)) |
| #define VV(k) { #k, 0, 1, 0 } |
| |
| static char *headers[12] = {"Host", "User-Agent", "Accept", |
| "Accept-Language", "Accept-Encoding", |
| "Accept-Charset", "Keep-Alive", |
| "Connection", "Referer", "Cookie", |
| "Content-Type", "Content-Length"}; |
| |
| static apreq_table_t *init_apreq(int N) |
| { |
| apreq_table_t *t = apreq_table_make(p,N); |
| int j; |
| static apreq_value_t v[] = { VV(Host), VV(User-Agent), VV(Accept), |
| VV(Accept-Language), VV(Accept-Encoding), |
| VV(Accept-Charset), VV(Keep-Alive), |
| VV(Connection), VV(Referer), VV(Cookie), |
| VV(Content-Type), VV(Content-Length) }; |
| for (j = 0; j < 12; ++j) |
| apreq_table_addv(t,v + j); |
| |
| return t; |
| } |
| |
| static apr_table_t *init_apr(int N) |
| { |
| apr_table_t *t = apr_table_make(p,N); |
| int j; |
| |
| for (j=0; j < 12; ++j) |
| apr_table_addn(t, headers[j], ""); |
| |
| return t; |
| } |
| |
| |
| static apr_hash_t *init_hash(void) |
| { |
| apr_hash_t *h = apr_hash_make(p); |
| int j; |
| |
| for (j = 0; j < 12; ++j) { |
| const char *k = headers[j]; |
| int klen = strlen(k); |
| const char *v = apr_hash_get(h, k, klen); |
| if (v == NULL) |
| apr_hash_set(h, k, klen, ""); |
| else |
| apr_hash_set(h, k, klen, apr_pstrcat(p,v,", ", k, NULL)); |
| } |
| return h; |
| } |
| |
| |
| /* measures httpd server's request header initialization time */ |
| static void perf_init(CuTest *tc) |
| { |
| apr_time_t apreq_delta,apr_delta; |
| int i; |
| |
| apr_delta = apr_time_now(); |
| for (i=0; i<LOOP;++i) { |
| apr_table_t *s = init_apr(NELTS); |
| /* apr_table_t *t = apr_table_make(p,NELTS); |
| // apr_table_overlap(t,s,APR_OVERLAP_TABLES_MERGE); |
| */ apr_table_compress(s); |
| } |
| apr_delta = apr_time_now() - apr_delta; |
| |
| apreq_delta = apr_time_now(); |
| for (i=0; i<LOOP;++i) { |
| apreq_table_t *t = init_apreq(NELTS); |
| apreq_table_normalize(t); |
| } |
| apreq_delta = apr_time_now() - apreq_delta; |
| |
| |
| TEST_DELTAS(apreq,apr,"apreq should win"); |
| |
| apr_delta = apr_time_now(); |
| for (i=0; i<LOOP;++i) { |
| apr_hash_t *h = init_hash(); |
| } |
| apr_delta = apr_time_now() - apr_delta; |
| |
| TEST_DELTAS(apr,apreq,"apr_hash should win"); |
| } |
| |
| |
| #define GET_AVG(N) \ |
| apr_delta = apr_time_now(); \ |
| for (j = 0; j < LOOP; ++j) { \ |
| const char *val = apr_table_get(s, headers[j % N]); \ |
| CuAssertPtrNotNull(tc, val); \ |
| } \ |
| apr_delta = apr_time_now() - apr_delta; \ |
| apreq_delta = apr_time_now(); \ |
| for (j = 0; j < LOOP; ++j) { \ |
| const char *val = apreq_table_get(t, headers[j % N]); \ |
| CuAssertPtrNotNull(tc, val); \ |
| } \ |
| apreq_delta = apr_time_now() - apreq_delta; |
| |
| static void perf_get_avg(CuTest *tc) |
| { |
| apr_table_t *s = init_apr(NELTS); |
| apreq_table_t *t = init_apreq(NELTS); |
| apr_time_t apr_delta, apreq_delta; |
| int j; |
| |
| GET_AVG (2); TEST_DELTAS(apr,apreq,"apr_tables should win (2)"); |
| GET_AVG (4); TEST_DELTAS(apr,apreq,"apr_tables should win (4)"); |
| GET_AVG (6); TEST_DELTAS(apreq,apr,"apreq should win (6)"); |
| GET_AVG (8); TEST_DELTAS(apreq,apr,"apreq should win (8)"); |
| GET_AVG(10); TEST_DELTAS(apreq,apr,"apreq should win (10)"); |
| GET_AVG(12); TEST_DELTAS(apreq,apr,"apreq should win (12)"); |
| } |
| |
| |
| /* |
| * nontrivial trees |
| * ------------------ |
| * |
| * (4) Accept-Encoding (7) Connection |
| * / \ / \ |
| * (2) Accept Accept-Language (3) (9) Cookie Content-Type (10) |
| * \ / |
| * (5) Accept-Charset Content-Length (11) |
| * |
| * (checksum doesn't help here) (checksum is a big win except |
| * for the Content-Length path.) |
| * |
| * |
| * apr_hash: (0.5 ~ 0.6 microseconds / lookup) |
| * apreq_table: (0.3 ~ 0.4 microseconds / entry) |
| * apr_table: (0.2 ~ 0.3 microseconds / entry) |
| */ |
| |
| |
| static void perf_get(CuTest *tc) |
| { |
| apr_hash_t *h = init_hash(); |
| apr_table_t *s = init_apr(NELTS); |
| apreq_table_t *t = init_apreq(NELTS); |
| apr_time_t apr_delta, apreq_delta; |
| int j; |
| |
| /* expected apr winners: "Accept", "Connection", "Cookie" */ |
| |
| RUN_GET("Accept-Encoding",""); |
| RUN_GET("Accept-Language",""); |
| RUN_GET("Accept-Charset",""); |
| RUN_GET("Content-Length",""); |
| RUN_GET("Content-Type",""); /* apr typically wins by ~.05 microseconds, |
| or ~ 25 clock cycles on my 500Mhz CPU */ |
| } |
| |
| |
| |
| #ifdef footoo |
| |
| static void table_set(CuTest *tc) |
| { |
| const char *val; |
| apreq_table_t *t = init_apreq(APREQ_NELTS); |
| apr_table_t *s = init_apr(APREQ_NELTS); |
| apreq_table_set(t1, V("setkey","bar")); |
| |
| apreq_table_set(t1, V("setkey","2ndtry")); |
| val = apreq_table_get(t1,"setkey"); |
| CuAssertStrEquals(tc,"2ndtry",val); |
| |
| } |
| |
| static void table_getnotthere(CuTest *tc) |
| { |
| const char *val; |
| |
| val = apreq_table_get(t1, "keynotthere"); |
| CuAssertPtrEquals(tc, NULL,val); |
| } |
| |
| static void table_add(CuTest *tc) |
| { |
| const char *val; |
| |
| apreq_table_add(t1, V("add", "bar")); |
| apreq_table_add(t1, V("add", "foo")); |
| val = apreq_table_get(t1, "add"); |
| CuAssertStrEquals(tc, "bar", val); |
| |
| |
| apreq_table_add(t1, V("f", "top")); |
| apreq_table_add(t1, V("fo", "child")); |
| apreq_table_add(t1, V("fro", "child-right")); |
| apreq_table_add(t1, V("foo", "bar")); |
| |
| /* |
| * f(5) black fo(6) black |
| * fo(6) red => f(5)red fro(7)red |
| * fro(7) red |
| * |
| */ |
| |
| |
| apreq_table_add(t1, V("flo", "child-left")); |
| apreq_table_add(t1, V("flr", "child-left-right")); |
| apreq_table_add(t1, V("frr", "child-right-right")); |
| apreq_table_add(t1, V("frl", "child-right-left")); |
| apreq_table_add(t1, V("flr", "child-left-right")); |
| apreq_table_add(t1, V("fll", "child-left-left")); |
| |
| apreq_table_add(t1, V("foot", "bart")); |
| apreq_table_add(t1, V("foon", "barn")); |
| apreq_table_add(t1, V("foot", "bart")); |
| apreq_table_add(t1, V("foop", "barp")); |
| apreq_table_add(t1, V("food", "bard")); |
| apreq_table_add(t1, V("foof", "barf")); |
| apreq_table_add(t1, V("fooz", "barz")); |
| apreq_table_add(t1, V("fooq", "barq")); |
| apreq_table_add(t1, V("foot", "bart")); |
| apreq_table_add(t1, V("fooj", "barj")); |
| apreq_table_add(t1, V("fook", "bark")); |
| apreq_table_add(t1, V("fool", "barl")); |
| apreq_table_add(t1, V("foor", "barr")); |
| apreq_table_add(t1, V("foos", "bars")); |
| |
| apreq_table_add(t1, V("foot", "bart")); |
| apreq_table_add(t1, V("foon", "barn")); |
| apreq_table_add(t1, V("foot", "bart")); |
| apreq_table_add(t1, V("foop", "barp")); |
| apreq_table_add(t1, V("food", "bard")); |
| apreq_table_add(t1, V("foof", "barf")); |
| apreq_table_add(t1, V("fooz", "barz")); |
| apreq_table_add(t1, V("fooq", "barq")); |
| apreq_table_add(t1, V("foot", "bart")); |
| apreq_table_add(t1, V("fooj", "barj")); |
| apreq_table_add(t1, V("fook", "bark")); |
| apreq_table_add(t1, V("fool", "barl")); |
| apreq_table_add(t1, V("foor", "barr")); |
| apreq_table_add(t1, V("foos", "bars")); |
| |
| apreq_table_add(t1, V("quux", "quux")); |
| apreq_table_add(t1, V("quuxa", "quuxa")); |
| apreq_table_add(t1, V("quuxz", "quuxz")); |
| apreq_table_add(t1, V("quuxb", "quuxb")); |
| apreq_table_add(t1, V("quuxg", "quuxg")); |
| apreq_table_add(t1, V("quuxw", "quuxw")); |
| apreq_table_add(t1, V("quuxr", "quuxr")); |
| apreq_table_add(t1, V("alpha", "omega")); |
| |
| val = apreq_table_get(t1, "foo"); |
| CuAssertStrEquals(tc, "bar", val); |
| val = apreq_table_get(t1, "quuxb"); |
| CuAssertStrEquals(tc, "quuxb", val); |
| val = apreq_table_get(t1,"flo"); |
| CuAssertStrEquals(tc, "child-left", val); |
| } |
| |
| static void table_unset(CuTest *tc) { |
| const char *val; |
| apreq_table_unset(t1, "flo"); |
| val = apreq_table_get(t1, "flo"); |
| CuAssertPtrEquals(tc, NULL, val); |
| |
| val = apreq_table_get(t1, "fro"); |
| CuAssertStrEquals(tc, "child-right", val); |
| val = apreq_table_get(t1, "fll"); |
| CuAssertStrEquals(tc, "child-left-left", val); |
| val = apreq_table_get(t1, "frl"); |
| CuAssertStrEquals(tc, "child-right-left", val); |
| |
| } |
| |
| |
| static void table_perf(CuTest *tc) |
| { |
| CuAssertStrEquals(tc, "quuxb", apreq_table_get(t1,"quuxb")); |
| |
| RUN_GET("alpha", "omega", "APR wins worst-case scenario"); |
| RUN_GET("quuxb", "quuxb", "APR wins multi-key case 1"); |
| RUN_GET("quuxw", "quuxw", "APR wins multi-key case 2"); |
| RUN_GET("foonot", NULL, "APR wins missing-key case"); |
| } |
| |
| static void table_perf2(CuTest *tc) |
| { |
| RUN_GET("fool", "barl", "APR wins multi-key case 3"); |
| RUN_GET(APREQ_URL_ENCTYPE, "foo","APR wins triple-key case"); |
| RUN_GET(APREQ_MFD_ENCTYPE, "bar","APR wins single-key case"); |
| } |
| |
| static void table_cache(CuTest *tc) |
| { |
| apr_table_t *t2 = apreq_table_export(p,t1); |
| apr_time_t start, apr_delta, apreq_delta; |
| const char *val; |
| int i; |
| |
| start = apr_time_now(); |
| for (i = 0; i < LOOP; ++i) |
| val = apr_table_get(t2, "foo"); |
| apr_delta = apr_time_now() - start; |
| CuAssertStrEquals(tc, "bar", val); |
| start = apr_time_now(); |
| for (i = 0; i < LOOP; ++i) |
| val = apreq_table_get(t1, "foo"); |
| apreq_delta = apr_time_now() - start; |
| CuAssertStrEquals(tc, "bar", val); |
| |
| // CuAssertTrue(tc, apreq_delta > apr_delta); |
| |
| /* apr_tables should win (above), since foo is the first "f" item; |
| * but it should lose to apreq_tables when cacheing is enabled (below). |
| */ |
| CuAssertStrEquals(tc, "bar", apreq_table_cache(t1,"foo")); |
| start = apr_time_now(); |
| for (i = 0; i < LOOP; ++i) |
| val = apreq_table_get(t1, "foo"); |
| apreq_delta = apr_time_now() - start; |
| CuAssertStrEquals(tc, "bar", val); |
| |
| TEST_DELTAS("APR beats apreq's cache"); |
| } |
| |
| static void table_nelts(CuTest *tc) |
| { |
| const char *val; |
| apreq_table_t *t = apreq_table_make(p, 1); |
| |
| |
| apreq_table_set(t, V("abc", "def")); |
| apreq_table_set(t, V("def", "abc")); |
| apreq_table_set(t, V("foo", "zzz")); |
| val = apreq_table_get(t, "foo"); |
| CuAssertStrEquals(tc, val, "zzz"); |
| |
| val = apreq_table_get(t, "abc"); |
| CuAssertStrEquals(tc, val, "def"); |
| val = apreq_table_get(t, "def"); |
| CuAssertStrEquals(tc, val, "abc"); |
| CuAssertIntEquals(tc, 3, apreq_table_nelts(t)); |
| } |
| |
| static void table_clear(CuTest *tc) |
| { |
| apreq_table_clear(t1); |
| CuAssertIntEquals(tc, 0, apreq_table_nelts(t1)); |
| } |
| |
| static void table_overlap(CuTest *tc) |
| { |
| const char *val; |
| apreq_table_t *t2 = init_apreq(APREQ_NELTS); |
| apr_table_t *r1, *r2; |
| apr_status_t s; |
| apr_time_t start, apreq_delta, apr_delta; |
| t1 = apreq_table_make(p, APREQ_NELTS); |
| |
| r1 = apreq_table_export(p,t1); |
| r2 = apreq_table_export(p,t2); |
| |
| /* APR_OVERLAP_TABLES_SET had funky semantics, so we ignore it here */ |
| |
| start = apr_time_now(); |
| s = apreq_table_overlap(t1, t2, APR_OVERLAP_TABLES_MERGE); |
| apreq_delta = apr_time_now() - start; |
| CuAssertIntEquals(tc, APR_SUCCESS, s); |
| CuAssertIntEquals(tc, 12, apreq_table_nelts(t1)); |
| start = apr_time_now(); |
| apr_table_overlap(r1, r2, APR_OVERLAP_TABLES_MERGE); |
| apr_delta = apr_time_now() - start; |
| CuAssertIntEquals(tc, 12, apr_table_elts(r1)->nelts); |
| |
| if (apr_delta < apreq_delta) |
| CuFail(tc, apr_psprintf(p, "APR wins overlap contest #1: %" APR_INT64_T_FMT |
| " < %" APR_INT64_T_FMT " (microseconds)", apr_delta,apreq_delta)); |
| |
| t1 = apreq_table_make(p, 1); |
| t2 = apreq_table_make(p,1); |
| apreq_table_add(t1, V("a", "0")); |
| apreq_table_add(t1, V("g", "7")); |
| |
| apreq_table_add(t2, V("a", "1")); |
| apreq_table_add(t2, V("b", "2")); |
| apreq_table_add(t2, V("c", "3")); |
| apreq_table_add(t2, V("b", "2.0")); |
| apreq_table_add(t2, V("d", "4")); |
| apreq_table_add(t2, V("e", "5")); |
| apreq_table_add(t2, V("b", "2.")); |
| apreq_table_add(t2, V("f", "6")); |
| |
| r1 = apreq_table_export(p,t1); |
| r2 = apreq_table_export(p,t2); |
| |
| /* APR_OVERLAP_TABLES_SET had funky semantics, so we ignore it here */ |
| |
| val = apreq_table_get(t1, "a"); |
| CuAssertStrEquals(tc, "0",val); |
| |
| start = apr_time_now(); |
| s = apreq_table_overlap(t1, t2, APR_OVERLAP_TABLES_MERGE); |
| apreq_delta = apr_time_now() - start; |
| CuAssertIntEquals(tc, APR_SUCCESS, s); |
| CuAssertIntEquals(tc, 7, apreq_table_nelts(t1)); |
| start = apr_time_now(); |
| apr_table_overlap(r1, r2, APR_OVERLAP_TABLES_MERGE); |
| apr_delta = apr_time_now() - start; |
| CuAssertIntEquals(tc, 7, apr_table_elts(r1)->nelts); |
| |
| |
| if (apr_delta < apreq_delta) |
| CuFail(tc, apr_psprintf(p, "APR wins overlap contest #2: %" APR_INT64_T_FMT |
| " < %" APR_INT64_T_FMT " (microseconds)", apr_delta,apreq_delta)); |
| |
| |
| t2 = apreq_table_copy(p,t1); |
| |
| CuAssertIntEquals(tc, 3, apreq_table_ghosts(t2)); |
| CuAssertIntEquals(tc, 9, apreq_table_exorcise(t2)); |
| CuAssertIntEquals(tc, 0, apreq_table_ghosts(t2)); |
| CuAssertIntEquals(tc, 7, apreq_table_nelts(t2)); |
| |
| val = apreq_table_get(t2, "a"); |
| CuAssertStrEquals(tc, "0, 1",val); |
| val = apreq_table_get(t2, "b"); |
| CuAssertStrEquals(tc, "2, 2.0, 2.",val); |
| val = apreq_table_get(t2, "c"); |
| CuAssertStrEquals(tc, "3",val); |
| val = apreq_table_get(t2, "d"); |
| CuAssertStrEquals(tc, "4",val); |
| val = apreq_table_get(t2, "e"); |
| CuAssertStrEquals(tc, "5",val); |
| val = apreq_table_get(t2, "f"); |
| CuAssertStrEquals(tc, "6",val); |
| val = apreq_table_get(t2, "g"); |
| CuAssertStrEquals(tc, "7",val); |
| |
| } |
| |
| #define APREQ_ELT(a,i) (*(apreq_value_t **)((a)->elts + (i) * (a)->elt_size)) |
| |
| static void table_elts(CuTest *tc) |
| { |
| const char *val; |
| const apreq_value_t *v; |
| const apr_array_header_t *a; |
| |
| CuAssertIntEquals(tc, 7, apreq_table_nelts(t1)); |
| CuAssertIntEquals(tc, 3, apreq_table_ghosts(t1)); |
| |
| a = apreq_table_elts(t1); |
| |
| CuAssertIntEquals(tc, 7, apreq_table_nelts(t1)); |
| CuAssertIntEquals(tc, 0, apreq_table_ghosts(t1)); |
| |
| v = APREQ_ELT(a,0); |
| CuAssertStrEquals(tc,"0, 1", v->data); |
| v = APREQ_ELT(a,1); |
| CuAssertStrEquals(tc,"7", v->data); |
| v = APREQ_ELT(a,2); |
| CuAssertStrEquals(tc,"2, 2.0, 2.", v->data); |
| v = APREQ_ELT(a,3); |
| CuAssertStrEquals(tc,"3", v->data); |
| |
| v = APREQ_ELT(a,a->nelts-1); |
| CuAssertStrEquals(tc,"6", v->data); |
| v = APREQ_ELT(a,a->nelts-2); |
| CuAssertStrEquals(tc,"5", v->data); |
| v = APREQ_ELT(a,a->nelts-3); |
| CuAssertStrEquals(tc,"4", v->data); |
| |
| } |
| |
| static void table_overlay(CuTest *tc) |
| { |
| const char *val; |
| apreq_table_t *t2 = apreq_table_make(p, 1); |
| apr_status_t s; |
| |
| t1 = apreq_table_make(p, 1); |
| |
| apreq_table_add(t1, V("a", "0")); |
| apreq_table_add(t1, V("g", "7")); |
| |
| apreq_table_add(t2, V("a", "1")); |
| apreq_table_add(t2, V("b", "2")); |
| apreq_table_add(t2, V("c", "3")); |
| apreq_table_add(t2, V("b", "2.0")); |
| apreq_table_add(t2, V("d", "4")); |
| apreq_table_add(t2, V("e", "5")); |
| apreq_table_add(t2, V("b", "2.")); |
| apreq_table_add(t2, V("f", "6")); |
| t1 = apreq_table_overlay(p, t1, t2); |
| |
| CuAssertIntEquals(tc, 10, apreq_table_nelts(t1)); |
| |
| val = apreq_table_get(t1, "a"); |
| CuAssertStrEquals(tc, "0",val); |
| val = apreq_table_get(t1, "b"); |
| CuAssertStrEquals(tc, "2",val); |
| val = apreq_table_get(t1, "c"); |
| CuAssertStrEquals(tc, "3",val); |
| val = apreq_table_get(t1, "d"); |
| CuAssertStrEquals(tc, "4",val); |
| val = apreq_table_get(t1, "e"); |
| CuAssertStrEquals(tc, "5",val); |
| val = apreq_table_get(t1, "f"); |
| CuAssertStrEquals(tc, "6",val); |
| val = apreq_table_get(t1, "g"); |
| CuAssertStrEquals(tc, "7",val); |
| } |
| |
| static void table_keys(CuTest *tc) |
| { |
| const char *k; |
| apr_array_header_t *a = apr_array_make(p,1, sizeof k); |
| apr_status_t s = apreq_table_keys(t1,a); |
| |
| CuAssertIntEquals(tc, APR_SUCCESS, s); |
| CuAssertIntEquals(tc, 7, a->nelts); |
| k = ((const char **)a->elts)[0]; |
| CuAssertStrEquals(tc, "a", k); |
| k = ((const char **)a->elts)[1]; |
| CuAssertStrEquals(tc, "g", k); |
| k = ((const char **)a->elts)[2]; |
| CuAssertStrEquals(tc, "b", k); |
| k = ((const char **)a->elts)[3]; |
| CuAssertStrEquals(tc, "c", k); |
| k = ((const char **)a->elts)[4]; |
| CuAssertStrEquals(tc, "d", k); |
| k = ((const char **)a->elts)[5]; |
| CuAssertStrEquals(tc, "e", k); |
| k = ((const char **)a->elts)[6]; |
| CuAssertStrEquals(tc, "f", k); |
| } |
| |
| static void table_values(CuTest *tc) |
| { |
| const apreq_value_t *v; |
| apr_array_header_t *a = apr_array_make(p,1,sizeof v); |
| apr_status_t s = apreq_table_values(t1,"a",a); |
| CuAssertIntEquals(tc, APR_SUCCESS, s); |
| CuAssertIntEquals(tc, 2, a->nelts); |
| v = ((const apreq_value_t **)a->elts)[0]; |
| CuAssertStrEquals(tc, "a", v->name); |
| CuAssertStrEquals(tc, "0", v->data); |
| v = ((const apreq_value_t **)a->elts)[1]; |
| CuAssertStrEquals(tc, "a", v->name); |
| CuAssertStrEquals(tc, "1", v->data); |
| a->nelts = 0; |
| s = apreq_table_values(t1,"b",a); |
| CuAssertIntEquals(tc, APR_SUCCESS, s); |
| CuAssertIntEquals(tc, 3, a->nelts); |
| v = ((const apreq_value_t **)a->elts)[0]; |
| CuAssertStrEquals(tc, "b", v->name); |
| CuAssertStrEquals(tc, "2", v->data); |
| v = ((const apreq_value_t **)a->elts)[1]; |
| CuAssertStrEquals(tc, "b", v->name); |
| CuAssertStrEquals(tc, "2.0", v->data); |
| v = ((const apreq_value_t **)a->elts)[2]; |
| CuAssertStrEquals(tc, "b", v->name); |
| CuAssertStrEquals(tc, "2.", v->data); |
| |
| a->nelts = 0; |
| s = apreq_table_values(t1,NULL,a); |
| CuAssertIntEquals(tc, APR_SUCCESS, s); |
| CuAssertIntEquals(tc, 7, a->nelts); |
| |
| } |
| #endif |
| |
| CuSuite *testperformance(void) |
| { |
| CuSuite *suite = CuSuiteNew("Performance"); |
| |
| SUITE_ADD_TEST(suite, perf_init); |
| SUITE_ADD_TEST(suite, perf_get_avg); |
| SUITE_ADD_TEST(suite, perf_get); |
| /* |
| SUITE_ADD_TEST(suite, table_set); |
| SUITE_ADD_TEST(suite, table_getnotthere); |
| SUITE_ADD_TEST(suite, table_add); |
| SUITE_ADD_TEST(suite, table_unset); |
| SUITE_ADD_TEST(suite, table_perf); |
| SUITE_ADD_TEST(suite, table_perf2); |
| SUITE_ADD_TEST(suite, table_cache); |
| SUITE_ADD_TEST(suite, table_nelts); |
| SUITE_ADD_TEST(suite, table_clear); |
| SUITE_ADD_TEST(suite, table_overlap); |
| SUITE_ADD_TEST(suite, table_elts); |
| SUITE_ADD_TEST(suite, table_overlay); |
| SUITE_ADD_TEST(suite, table_keys); |
| SUITE_ADD_TEST(suite, table_values); |
| */ |
| return suite; |
| } |
| |