summaryrefslogtreecommitdiff
path: root/ndb/src/kernel/vm/testDataBuffer/testDataBuffer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ndb/src/kernel/vm/testDataBuffer/testDataBuffer.cpp')
-rw-r--r--ndb/src/kernel/vm/testDataBuffer/testDataBuffer.cpp186
1 files changed, 186 insertions, 0 deletions
diff --git a/ndb/src/kernel/vm/testDataBuffer/testDataBuffer.cpp b/ndb/src/kernel/vm/testDataBuffer/testDataBuffer.cpp
new file mode 100644
index 00000000000..def8387e343
--- /dev/null
+++ b/ndb/src/kernel/vm/testDataBuffer/testDataBuffer.cpp
@@ -0,0 +1,186 @@
+/* Copyright (C) 2003 MySQL AB
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
+
+#include <NdbTick.h>
+#include <DataBuffer.hpp>
+#include <stdlib.h>
+#include <string.h>
+
+struct Buffer {
+ Buffer(Uint32 size){ m_sz = size; buffer = new Uint32[m_sz]; m_len = 0;}
+ ~Buffer(){ delete [] buffer;}
+
+ Uint32 m_sz;
+ Uint32 m_len;
+ Uint32 * buffer;
+};
+
+inline
+void
+require(bool b){
+ if(!b)
+ abort();
+}
+
+template<Uint32 sz>
+void
+compare(DataBuffer<sz> & db, Buffer & buf){
+ typename DataBuffer<sz>::DataBufferIterator it;
+ db.first(it);
+ for(Uint32 i = 0; i<buf.m_len; i++){
+ if(buf.buffer[i] != * it.data){
+ db.print(stdout);
+ abort();
+ }
+ db.next(it);
+ }
+
+ for(Uint32 i = 0; i<buf.m_len; i++){
+ if(!db.position(it, i))
+ abort();
+ if(buf.buffer[i] != * it.data){
+ db.print(stdout);
+ abort();
+ }
+ }
+}
+
+template<Uint32 sz>
+void
+test(Uint32 loops, Uint32 iter){
+
+ ndbout_c("DataBuffer<%d> loops=%d iter=%d", sz, loops, iter);
+
+ while(loops-- > 0){
+ Uint32 size = sz*((10 + (rand() % (10 * sz)) + sz - 1)/sz);
+
+ typename DataBuffer<sz>::DataBufferPool thePool;
+ typename DataBuffer<sz>::DataBufferIterator it;
+ DataBuffer<sz> db(thePool);
+
+ thePool.setSize((size + sz - 1) / sz);
+ Buffer buf(size);
+
+ bool testOverRun = true;
+
+ for(Uint32 i = 0; i<iter; i++){
+ Uint32 c = (rand() % (testOverRun ? 7 : 4));
+ Uint32 free = (size - db.getSize());
+ Uint32 alloc = 0;
+ if(free == 0){
+ c = (testOverRun ? c : 0);
+ if(c >= 1 && c <= 3)
+ c += 3;
+ }
+
+ if(free <= 1)
+ alloc = 1;
+ else
+ alloc = 1 + (rand() % (free - 1));
+
+ //ndbout_c("iter=%d case=%d free=%d alloc=%d", i, c, free, alloc);
+ switch(c){
+ case 0: // Release
+ db.first(it);
+ for(; !it.curr.isNull(); db.next(it))
+ * it.data = 0;
+
+ db.release();
+ buf.m_len = 0;
+ break;
+ case 1:{ // Append (success)
+ for(Uint32 i = 0; i<alloc; i++)
+ buf.buffer[buf.m_len + i] = buf.m_len + i;//rand();
+
+ require(db.append(&buf.buffer[buf.m_len], alloc));
+ buf.m_len += alloc;
+ break;
+ }
+ case 2: { // Seize(1) (success)
+ for(Uint32 i = 0; i<alloc; i++){
+ buf.buffer[buf.m_len + i] = buf.m_len + i;//rand();
+ require(db.seize(1));
+ require(db.position(it, db.getSize()-1));
+ * it.data = buf.buffer[buf.m_len + i];
+ }
+ buf.m_len += alloc;
+ break;
+ }
+ case 3: { // Seize(n) (success)
+ for(Uint32 i = 0; i<alloc; i++){
+ buf.buffer[buf.m_len + i] = buf.m_len + i;//rand();
+ }
+ Uint32 pos = db.getSize();
+ require(db.seize(alloc));
+ require(db.position(it, pos));
+ for(Uint32 i = 0; i<alloc; i++){
+ * it.data = buf.buffer[buf.m_len + i];
+ db.next(it);
+ }
+ buf.m_len += alloc;
+ break;
+ }
+ case 4: { // Append fail
+ require(!db.append(buf.buffer, alloc + free));
+ require(db.getSize() == 0);
+ buf.m_len = 0;
+ break;
+ }
+ case 5: { // Seize(1) - fail
+ for(Uint32 i = 0; i<free; i++){
+ require(db.seize(1));
+ }
+
+ require(!db.seize(1));
+ require(db.getSize() == 0);
+ buf.m_len = 0;
+ break;
+ }
+ case 6: { // Seize(n) - fail
+ require(!db.seize(alloc + free));
+ require(db.getSize() == 0);
+ buf.m_len = 0;
+ break;
+ }
+ }
+ compare(db, buf);
+ }
+ }
+}
+
+int
+main(void){
+
+ srand(NdbTick_CurrentMillisecond());
+
+
+ test<1>(1000, 1000);
+ test<11>(1000, 1000);
+ test<15>(1000, 1000);
+ test<16>(1000, 1000);
+ test<17>(1000, 1000);
+#if 0
+#endif
+ return 0;
+}
+
+void
+ErrorReporter::handleAssert(const char * msg, const char * file, int line)
+{
+ ndbout << "ErrorReporter::handleAssert activated - "
+ << " line= " << line << endl;
+ abort();
+}