| // RUN: %clangxx_unit -O0 %s -o %t 2>&1 | |
| // RUN: %env_esan_opts="record_snapshots=0" %run %t 2>&1 | FileCheck %s | |
| #include "esan/esan_circular_buffer.h" | |
| #include "sanitizer_common/sanitizer_placement_new.h" | |
| #include <assert.h> | |
| #include <stdio.h> | |
| static const int TestBufCapacity = 4; | |
| // The buffer should have a capacity of TestBufCapacity. | |
| void testBuffer(__esan::CircularBuffer<int> *Buf) { | |
| assert(Buf->size() == 0); | |
| assert(Buf->empty()); | |
| Buf->push_back(1); | |
| assert(Buf->back() == 1); | |
| assert((*Buf)[0] == 1); | |
| assert(Buf->size() == 1); | |
| assert(!Buf->empty()); | |
| Buf->push_back(2); | |
| Buf->push_back(3); | |
| Buf->push_back(4); | |
| Buf->push_back(5); | |
| assert((*Buf)[0] == 2); | |
| assert(Buf->size() == 4); | |
| Buf->pop_back(); | |
| assert((*Buf)[0] == 2); | |
| assert(Buf->size() == 3); | |
| Buf->pop_back(); | |
| Buf->pop_back(); | |
| assert((*Buf)[0] == 2); | |
| assert(Buf->size() == 1); | |
| assert(!Buf->empty()); | |
| Buf->pop_back(); | |
| assert(Buf->empty()); | |
| } | |
| int main() | |
| { | |
| // Test initialize/free. | |
| __esan::CircularBuffer<int> GlobalBuf; | |
| GlobalBuf.initialize(TestBufCapacity); | |
| testBuffer(&GlobalBuf); | |
| GlobalBuf.free(); | |
| // Test constructor/free. | |
| __esan::CircularBuffer<int> *LocalBuf; | |
| static char placeholder[sizeof(*LocalBuf)]; | |
| LocalBuf = new(placeholder) __esan::CircularBuffer<int>(TestBufCapacity); | |
| testBuffer(LocalBuf); | |
| LocalBuf->free(); | |
| fprintf(stderr, "All checks passed.\n"); | |
| // CHECK: All checks passed. | |
| return 0; | |
| } |