xref: /aosp_15_r20/external/compiler-rt/test/esan/Unit/circular_buffer.cpp (revision 7c3d14c8b49c529e04be81a3ce6f5cc23712e4c6)
1*7c3d14c8STreehugger Robot // RUN: %clangxx_unit -O0 %s -o %t 2>&1
2*7c3d14c8STreehugger Robot // RUN: %env_esan_opts="record_snapshots=0" %run %t 2>&1 | FileCheck %s
3*7c3d14c8STreehugger Robot 
4*7c3d14c8STreehugger Robot #include "esan/esan_circular_buffer.h"
5*7c3d14c8STreehugger Robot #include "sanitizer_common/sanitizer_placement_new.h"
6*7c3d14c8STreehugger Robot #include <assert.h>
7*7c3d14c8STreehugger Robot #include <stdio.h>
8*7c3d14c8STreehugger Robot 
9*7c3d14c8STreehugger Robot static const int TestBufCapacity = 4;
10*7c3d14c8STreehugger Robot 
11*7c3d14c8STreehugger Robot // The buffer should have a capacity of TestBufCapacity.
testBuffer(__esan::CircularBuffer<int> * Buf)12*7c3d14c8STreehugger Robot void testBuffer(__esan::CircularBuffer<int> *Buf) {
13*7c3d14c8STreehugger Robot   assert(Buf->size() == 0);
14*7c3d14c8STreehugger Robot   assert(Buf->empty());
15*7c3d14c8STreehugger Robot 
16*7c3d14c8STreehugger Robot   Buf->push_back(1);
17*7c3d14c8STreehugger Robot   assert(Buf->back() == 1);
18*7c3d14c8STreehugger Robot   assert((*Buf)[0] == 1);
19*7c3d14c8STreehugger Robot   assert(Buf->size() == 1);
20*7c3d14c8STreehugger Robot   assert(!Buf->empty());
21*7c3d14c8STreehugger Robot 
22*7c3d14c8STreehugger Robot   Buf->push_back(2);
23*7c3d14c8STreehugger Robot   Buf->push_back(3);
24*7c3d14c8STreehugger Robot   Buf->push_back(4);
25*7c3d14c8STreehugger Robot   Buf->push_back(5);
26*7c3d14c8STreehugger Robot   assert((*Buf)[0] == 2);
27*7c3d14c8STreehugger Robot   assert(Buf->size() == 4);
28*7c3d14c8STreehugger Robot 
29*7c3d14c8STreehugger Robot   Buf->pop_back();
30*7c3d14c8STreehugger Robot   assert((*Buf)[0] == 2);
31*7c3d14c8STreehugger Robot   assert(Buf->size() == 3);
32*7c3d14c8STreehugger Robot 
33*7c3d14c8STreehugger Robot   Buf->pop_back();
34*7c3d14c8STreehugger Robot   Buf->pop_back();
35*7c3d14c8STreehugger Robot   assert((*Buf)[0] == 2);
36*7c3d14c8STreehugger Robot   assert(Buf->size() == 1);
37*7c3d14c8STreehugger Robot   assert(!Buf->empty());
38*7c3d14c8STreehugger Robot 
39*7c3d14c8STreehugger Robot   Buf->pop_back();
40*7c3d14c8STreehugger Robot   assert(Buf->empty());
41*7c3d14c8STreehugger Robot }
42*7c3d14c8STreehugger Robot 
main()43*7c3d14c8STreehugger Robot int main()
44*7c3d14c8STreehugger Robot {
45*7c3d14c8STreehugger Robot   // Test initialize/free.
46*7c3d14c8STreehugger Robot   __esan::CircularBuffer<int> GlobalBuf;
47*7c3d14c8STreehugger Robot   GlobalBuf.initialize(TestBufCapacity);
48*7c3d14c8STreehugger Robot   testBuffer(&GlobalBuf);
49*7c3d14c8STreehugger Robot   GlobalBuf.free();
50*7c3d14c8STreehugger Robot 
51*7c3d14c8STreehugger Robot   // Test constructor/free.
52*7c3d14c8STreehugger Robot   __esan::CircularBuffer<int> *LocalBuf;
53*7c3d14c8STreehugger Robot   static char placeholder[sizeof(*LocalBuf)];
54*7c3d14c8STreehugger Robot   LocalBuf = new(placeholder) __esan::CircularBuffer<int>(TestBufCapacity);
55*7c3d14c8STreehugger Robot   testBuffer(LocalBuf);
56*7c3d14c8STreehugger Robot   LocalBuf->free();
57*7c3d14c8STreehugger Robot 
58*7c3d14c8STreehugger Robot   fprintf(stderr, "All checks passed.\n");
59*7c3d14c8STreehugger Robot   // CHECK: All checks passed.
60*7c3d14c8STreehugger Robot   return 0;
61*7c3d14c8STreehugger Robot }
62