2
* ====================================================================
3
* Licensed to the Apache Software Foundation (ASF) under one
4
* or more contributor license agreements. See the NOTICE file
5
* distributed with this work for additional information
6
* regarding copyright ownership. The ASF licenses this file
7
* to you under the Apache License, Version 2.0 (the
8
* "License"); you may not use this file except in compliance
9
* with the License. You may obtain a copy of the License at
11
* http://www.apache.org/licenses/LICENSE-2.0
13
* Unless required by applicable law or agreed to in writing,
14
* software distributed under the License is distributed on an
15
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16
* KIND, either express or implied. See the License for the
17
* specific language governing permissions and limitations
19
* ====================================================================
25
#include "../src/aprwrap.hpp"
27
#include <gmock/gmock.h>
33
TEST(Pools, InitializeGlobalPool)
36
EXPECT_THAT(pool.get(), testing::NotNull());
37
EXPECT_THAT(apr_pool_parent_get(pool.get()), testing::NotNull());
40
TEST(Pools, CreateSubpool)
43
APR::Pool subpool(&pool);
44
EXPECT_EQ(pool.get(), apr_pool_parent_get(subpool.get()));
47
TEST(Pools, TypedAllocate)
50
const unsigned char* buffer = pool.alloc<unsigned char>(1);
51
EXPECT_THAT(buffer, testing::NotNull());
54
// N.B.: This test may pass randomly even if zero-filled allocation
55
// does not work correctly, since we cannot make assumptions about the
56
// values of uninitialized memory.
57
TEST(Pools, TypedAllocateZerofill)
60
static const std::size_t size = 32757;
61
const unsigned char* buffer = pool.allocz<unsigned char>(size);
62
ASSERT_THAT(buffer, testing::NotNull());
63
EXPECT_EQ(size, std::count(buffer, buffer + size, 0));
67
// Array helper functions
71
// Create a randomly-ordered array of constant strings.
72
apr_array_header_t* fill_array(APR::Pool& pool)
74
apr_array_header_t* a = apr_array_make(pool.get(), 0, sizeof(const char*));
75
APR_ARRAY_PUSH(a, const char*) = "primus";
76
APR_ARRAY_PUSH(a, const char*) = "secundus";
77
APR_ARRAY_PUSH(a, const char*) = "tertius";
78
APR_ARRAY_PUSH(a, const char*) = "quartus";
79
APR_ARRAY_PUSH(a, const char*) = "quintus";
80
APR_ARRAY_PUSH(a, const char*) = "sextus";
81
APR_ARRAY_PUSH(a, const char*) = "septimus";
82
std::random_shuffle(&APR_ARRAY_IDX(a, 0, const char*),
83
&APR_ARRAY_IDX(a, a->nelts, const char*));
86
} // anonymous namespace
92
TEST(Arrays, CreateArray)
94
typedef APR::Array<unsigned char> Array;
99
EXPECT_THAT(array.array(), testing::NotNull());
100
EXPECT_EQ(0, array.size());
101
EXPECT_EQ(sizeof(unsigned char), sizeof(Array::value_type));
102
EXPECT_EQ(sizeof(Array::value_type), array.array()->elt_size);
105
TEST(Arrays, WrapArray)
107
typedef APR::Array<unsigned char> Array;
110
apr_array_header_t* apr_array =
111
apr_array_make(pool.get(), 0, sizeof(Array::value_type));
112
ASSERT_THAT(apr_array, testing::NotNull());
114
Array array(apr_array);
115
EXPECT_EQ(apr_array, array.array());
116
EXPECT_EQ(0, array.size());
119
TEST(Arrays, RewrapTypeMismatch)
121
typedef APR::Array<unsigned char> ByteArray;
122
typedef APR::Array<int> IntArray;
125
EXPECT_THROW(ByteArray array(IntArray(pool).array()),
126
std::invalid_argument);
129
TEST(Arrays, OutOfBounds)
131
typedef APR::Array<unsigned char> Array;
136
EXPECT_THROW(array.at(-1), std::out_of_range);
137
EXPECT_THROW(array.at(array.size()), std::out_of_range);
140
TEST(Arrays, Indexing)
142
typedef APR::Array<const char*> Array;
145
Array array(fill_array(pool));
147
EXPECT_STREQ(array[0], APR_ARRAY_IDX(array.array(), 0, Array::value_type));
148
EXPECT_STREQ(array[array.size() - 1], APR_ARRAY_IDX(array.array(),
149
array.array()->nelts - 1,
153
TEST(Arrays, CheckedIndexing)
155
typedef APR::Array<const char*> Array;
158
Array array(fill_array(pool));
160
EXPECT_STREQ(array.at(0), APR_ARRAY_IDX(array.array(), 0, Array::value_type));
161
EXPECT_STREQ(array.at(array.size() - 1),
162
APR_ARRAY_IDX(array.array(), array.array()->nelts - 1,
166
TEST(Arrays, Iteration)
168
typedef APR::Array<const char*> Array;
171
Array array(fill_array(pool));
173
struct Iteration : public Array::Iteration
175
Iteration(apr_array_header_t* raw_array)
176
: m_index(0), m_raw_array(raw_array)
179
bool operator()(Array::value_type& value)
181
EXPECT_STREQ(value, APR_ARRAY_IDX(m_raw_array, m_index,
188
Array::size_type m_index;
189
apr_array_header_t* m_raw_array;
190
} callback(array.array());
192
array.iterate(callback);
195
TEST(Arrays, ConstIteration)
197
typedef APR::Array<const char*> Array;
200
Array array(fill_array(pool));
202
struct Iteration : public Array::ConstIteration
204
Iteration(const apr_array_header_t* raw_array)
205
: m_index(0), m_raw_array(raw_array)
208
bool operator()(const Array::value_type& value)
210
EXPECT_STREQ(value, APR_ARRAY_IDX(m_raw_array, m_index,
217
Array::size_type m_index;
218
const apr_array_header_t* m_raw_array;
219
} callback(array.array());
221
array.iterate(callback);
226
typedef APR::Array<const char*> Array;
229
Array array(fill_array(pool));
231
const Array::size_type point = array.size();
232
const Array::value_type first = array[0];
233
const Array::value_type last = array[point - 1];
235
array.push("octavius");
237
array.push("decimus");
239
EXPECT_EQ(point + 3, array.size());
240
EXPECT_STREQ(first, array[0]);
241
EXPECT_STREQ(last, array[point - 1]);
242
EXPECT_STREQ("octavius", array[point]);
243
EXPECT_STREQ("decimus", array[array.size() - 1]);
248
typedef APR::Array<const char*> Array;
251
Array array(fill_array(pool));
253
for (Array::size_type i = 0, z = array.size(); i <= z; ++i)
255
const char** last = (!array.array()->nelts ? NULL
256
: &APR_ARRAY_IDX(array.array(),
257
array.array()->nelts - 1,
259
EXPECT_EQ(last, array.pop());
267
TEST(ConstArrays, WrapArray)
269
typedef APR::ConstArray<unsigned char> Array;
272
const apr_array_header_t* apr_array =
273
apr_array_make(pool.get(), 0, sizeof(Array::value_type));
274
ASSERT_THAT(apr_array, testing::NotNull());
276
Array array(apr_array);
277
EXPECT_EQ(apr_array, array.array());
278
EXPECT_EQ(0, array.size());
281
TEST(ConstArrays, RewrapTypeMismatch)
283
typedef APR::ConstArray<unsigned char> ByteArray;
284
typedef APR::Array<int> IntArray;
287
EXPECT_THROW(ByteArray array(IntArray(pool).array()),
288
std::invalid_argument);
291
TEST(ConstArrays, OutOfBounds)
293
typedef APR::ConstArray<unsigned char> Array;
296
Array array = Array(APR::Array<Array::value_type>(pool));
298
EXPECT_THROW(array.at(-1), std::out_of_range);
299
EXPECT_THROW(array.at(array.size()), std::out_of_range);
302
TEST(ConstArrays, Indexing)
304
typedef APR::ConstArray<const char*> Array;
307
Array array(fill_array(pool));
309
EXPECT_STREQ(array[0], APR_ARRAY_IDX(array.array(), 0, Array::value_type));
310
EXPECT_STREQ(array[array.size() - 1], APR_ARRAY_IDX(array.array(),
311
array.array()->nelts - 1,
315
TEST(ConstArrays, CheckedIndexing)
317
typedef APR::ConstArray<const char*> Array;
320
Array array(fill_array(pool));
322
EXPECT_STREQ(array.at(0), APR_ARRAY_IDX(array.array(), 0, Array::value_type));
323
EXPECT_STREQ(array.at(array.size() - 1),
324
APR_ARRAY_IDX(array.array(), array.array()->nelts - 1,
328
TEST(ConstArrays, Iteration)
330
typedef APR::ConstArray<const char*> Array;
333
Array array(fill_array(pool));
335
struct Iteration : public Array::Iteration
337
Iteration(const apr_array_header_t* raw_array)
338
: m_index(0), m_raw_array(raw_array)
341
bool operator()(const Array::value_type& value)
343
EXPECT_STREQ(value, APR_ARRAY_IDX(m_raw_array, m_index,
350
Array::size_type m_index;
351
const apr_array_header_t* m_raw_array;
352
} callback(array.array());
354
array.iterate(callback);
361
TEST(Hashes, StringHash)
363
typedef APR::Hash<char, const char> H;
368
hash.set("bbb", "b");
369
hash.set("cccc", "c");
371
EXPECT_EQ(3, hash.size());
372
EXPECT_STREQ("a", hash.get("aa"));
373
EXPECT_STREQ("b", hash.get("bbb"));
374
EXPECT_STREQ("c", hash.get("cccc"));
377
TEST(Hashes, FixedStringHash)
379
// The point of this test is to verify that the key-length parameter
380
// of the template actually limits the length of the keys.
381
typedef APR::Hash<char, const char, 2> H;
385
hash.set("aa&qux", "a");
386
hash.set("bb#foo", "b");
387
hash.set("cc@bar", "c");
389
EXPECT_EQ(3, hash.size());
390
EXPECT_STREQ("a", hash.get("aa%foo"));
391
EXPECT_STREQ("b", hash.get("bb*bar"));
392
EXPECT_STREQ("c", hash.get("cc$qux"));
397
typedef APR::Hash<char, const char> H;
402
hash.set("bbb", "b");
403
hash.set("cccc", "c");
407
EXPECT_EQ(2, hash.size());
408
EXPECT_STREQ("a", hash.get("aa"));
409
EXPECT_STREQ("c", hash.get("cccc"));
412
TEST(Hashes, Iterate)
414
typedef APR::Hash<char, const char> H;
419
hash.set("bbb", "b");
420
hash.set("cccc", "c");
422
struct C : public H::Iteration
425
explicit C(H& hashref) : m_hash(hashref) {}
427
bool operator()(const H::Key& key, H::value_type value)
429
EXPECT_STREQ(value, m_hash.get(key));
434
hash.iterate(callback, pool);