summaryrefslogtreecommitdiffstats
path: root/vespalib/src/tests/datastore/buffer_type/buffer_type_test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'vespalib/src/tests/datastore/buffer_type/buffer_type_test.cpp')
-rw-r--r--vespalib/src/tests/datastore/buffer_type/buffer_type_test.cpp50
1 files changed, 38 insertions, 12 deletions
diff --git a/vespalib/src/tests/datastore/buffer_type/buffer_type_test.cpp b/vespalib/src/tests/datastore/buffer_type/buffer_type_test.cpp
index 96d94e9a71b..b5a0212528b 100644
--- a/vespalib/src/tests/datastore/buffer_type/buffer_type_test.cpp
+++ b/vespalib/src/tests/datastore/buffer_type/buffer_type_test.cpp
@@ -14,6 +14,7 @@ struct Setup {
uint32_t _minArrays;
ElemCount _usedElems;
ElemCount _neededElems;
+ ElemCount _deadElems;
uint32_t _bufferId;
float _allocGrowFactor;
bool _resizing;
@@ -21,6 +22,7 @@ struct Setup {
: _minArrays(0),
_usedElems(0),
_neededElems(0),
+ _deadElems(0),
_bufferId(1),
_allocGrowFactor(0.5),
_resizing(false)
@@ -33,25 +35,40 @@ struct Setup {
};
struct Fixture {
- Setup setup;
+ std::vector<Setup> setups;
IntBufferType bufferType;
- ElemCount deadElems;
int buffer[ARRAYS_SIZE];
Fixture(const Setup &setup_)
- : setup(setup_),
- bufferType(ARRAYS_SIZE, setup._minArrays, MAX_ARRAYS, NUM_ARRAYS_FOR_NEW_BUFFER, setup._allocGrowFactor),
- deadElems(0),
+ : setups(),
+ bufferType(ARRAYS_SIZE, setup_._minArrays, MAX_ARRAYS, NUM_ARRAYS_FOR_NEW_BUFFER, setup_._allocGrowFactor),
buffer()
- {}
+ {
+ setups.reserve(4);
+ setups.push_back(setup_);
+ }
~Fixture() {
- bufferType.onHold(&setup._usedElems);
- bufferType.onFree(setup._usedElems);
+ for (auto& setup : setups) {
+ bufferType.onHold(&setup._usedElems);
+ bufferType.onFree(setup._usedElems);
+ }
+ }
+ Setup& curr_setup() {
+ return setups.back();
+ }
+ void add_setup(const Setup& setup_in) {
+ // The buffer type stores pointers to ElemCount (from Setup) and we must ensure these do not move in memory.
+ assert(setups.size() < setups.capacity());
+ setups.push_back(setup_in);
}
void onActive() {
- bufferType.onActive(setup._bufferId, &setup._usedElems, deadElems, &buffer[0]);
+ bufferType.onActive(curr_setup()._bufferId, &curr_setup()._usedElems, curr_setup()._deadElems, &buffer[0]);
}
size_t arraysToAlloc() {
- return bufferType.calcArraysToAlloc(setup._bufferId, setup._neededElems, setup._resizing);
+ return bufferType.calcArraysToAlloc(curr_setup()._bufferId, curr_setup()._neededElems, curr_setup()._resizing);
+ }
+ void assertArraysToAlloc(size_t exp) {
+ onActive();
+ EXPECT_EQUAL(exp, arraysToAlloc());
}
};
@@ -59,8 +76,7 @@ void
assertArraysToAlloc(size_t exp, const Setup &setup)
{
Fixture f(setup);
- f.onActive();
- EXPECT_EQUAL(exp, f.arraysToAlloc());
+ f.assertArraysToAlloc(exp);
}
TEST("require that complete arrays are allocated")
@@ -113,4 +129,14 @@ TEST("require that arrays to alloc is capped to min arrays")
TEST_DO(assertArraysToAlloc(17, Setup().used(34 * 4).needed(4).minArrays(16)));
}
+TEST("arrays to alloc considers used elements across all active buffers")
+{
+ Fixture f(Setup().used(6 * 4));
+ f.assertArraysToAlloc(6 * 0.5);
+ f.add_setup(Setup().used(8 * 4));
+ f.assertArraysToAlloc((6 + 8) * 0.5);
+ f.add_setup(Setup().used(10 * 4));
+ f.assertArraysToAlloc((6 + 8 + 10) * 0.5);
+}
+
TEST_MAIN() { TEST_RUN_ALL(); }