root/trunk/whisperlib/common/io/buffer/test/data_block_test.cc

Revision 7, 5.0 kB (checked in by whispercastorg, 2 years ago)

version 0.2.0

Line 
1 // Copyright (c) 2009, Whispersoft s.r.l.
2 // All rights reserved.
3 //
4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions are
6 // met:
7 //
8 // * Redistributions of source code must retain the above copyright
9 // notice, this list of conditions and the following disclaimer.
10 // * Redistributions in binary form must reproduce the above
11 // copyright notice, this list of conditions and the following disclaimer
12 // in the documentation and/or other materials provided with the
13 // distribution.
14 // * Neither the name of Whispersoft s.r.l. nor the names of its
15 // contributors may be used to endorse or promote products derived from
16 // this software without specific prior written permission.
17 //
18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 //
30 // Author: Catalin Popescu
31 #include "common/base/types.h"
32 #include "common/base/log.h"
33 #include "common/base/timer.h"
34 #include "common/base/system.h"
35
36 #include "common/io/buffer/data_block.h"
37
38 int main(int argc, char* argv[]) {
39   common::Init(argc, argv);
40
41
42 #ifdef __USE_VARIANT_MEMORY_STREAM_IMPLEMENTATION__
43   io::DataBlock* scratch = new io::DataBlock(1024);
44   io::BlockDqueue q(scratch);
45   q.pop_back();
46 #else
47   io::BlockDqueue q;
48 #endif
49
50   q.push_back(new io::DataBlock(1024));
51   q.push_back(new io::DataBlock(2048));
52   q.push_back(new io::DataBlock(4096));
53   q.push_back(new io::DataBlock(9192));
54 #ifdef __USE_VARIANT_MEMORY_STREAM_IMPLEMENTATION__
55   q.push_back(scratch);
56 #endif
57
58   io::DataBlockPointer p0(&q, q.begin_id(), 0);
59   io::DataBlockPointer p1(&q, q.begin_id(), 0);
60   io::DataBlockPointer p2(&q, q.begin_id() + 1, 0);
61   io::DataBlockPointer p3(&q, q.begin_id() + 2, 0);
62   io::DataBlockPointer p4(&q, q.begin_id() + 3, 0);
63 #ifdef __USE_VARIANT_MEMORY_STREAM_IMPLEMENTATION__
64   io::DataBlockPointer p5(&q, q.begin_id() + 4, 0);
65 #endif
66
67   CHECK(p0 == p1) << " - " << p0 << " vs. " << p1;
68   CHECK(p2 > p1);
69   CHECK(p3 > p1);
70   CHECK(p1 < p4);
71   CHECK(p3 > p2);
72   CHECK_EQ(p0.ReadableSize(), 0);
73   CHECK_EQ(p1.ReadableSize(), 0);
74   CHECK_EQ(p2.ReadableSize(), 0);
75
76   CHECK_EQ(p0.Distance(p0), 0);
77   CHECK_EQ(p0.Distance(p1), 0);
78   CHECK_EQ(p1.Distance(p2), 0);
79   CHECK_EQ(p1.Distance(p3), 0);
80   CHECK_EQ(p3.Distance(p4), 0);
81
82   // Advance / devance on empty stuff
83   CHECK_EQ(p0.Advance(1), 0);
84 #ifdef __USE_VARIANT_MEMORY_STREAM_IMPLEMENTATION__
85   CHECK(p5 == p0);
86 #else
87   CHECK(p4 == p0);
88 #endif
89   CHECK_EQ(p0.Advance(-1), 0);
90   CHECK(p1 == p0);
91   CHECK_EQ(p0.Devance(-1), 0);
92 #ifdef __USE_VARIANT_MEMORY_STREAM_IMPLEMENTATION__
93   CHECK(p5 == p0);
94 #else
95   CHECK(p4 == p0);
96 #endif
97   CHECK_EQ(p0.Devance(1), 0);
98   CHECK(p1 == p0);
99
100   // Write stuff
101   char buffer[16384];
102   for ( int32 i = 0; i < NUMBEROF(buffer); ++i ) {
103     buffer[i] = i % 256;
104   }
105   CHECK_EQ(p0.WriteData(buffer, 512), 512);
106   CHECK_EQ(p0.Distance(p1), 512);
107   CHECK_EQ(p0.Distance(p2), 0);
108
109   CHECK_EQ(p0.WriteData(buffer, 1024), 1024);
110   CHECK_EQ(p0.Distance(p1), 1024 + 512);
111   CHECK_EQ(p0.Distance(p2), 512);
112   CHECK_EQ(p0.Distance(p3), 0);
113
114   CHECK_EQ(p0.WriteData(buffer, 2048), 2048);
115   CHECK_EQ(p0.Distance(p1), 2048 + 1024 + 512);
116   CHECK_EQ(p0.Distance(p2), 2048 + 512);
117   CHECK_EQ(p0.Distance(p3), 512);
118   CHECK_EQ(p0.Distance(p4), 0);
119
120   // Start reading ...
121   CHECK_EQ(p1.ReadData(buffer, 2048), 2048);
122   for ( int i = 0; i < 2048; ++i ) {
123     CHECK_EQ(static_cast<uint8>(buffer[i]),
124              static_cast<int>(i % 256)) << " i= " << i;
125   }
126   CHECK_EQ(p1.Distance(p2), 1024);
127   CHECK_EQ(p1.Distance(p3), 1024);
128
129   CHECK_EQ(p1.ReadData(buffer, 512),  512);
130   for ( int i = 0; i < 512; ++i ) {
131     CHECK_EQ(static_cast<uint8>(buffer[i]),
132              static_cast<int>(i % 256)) << " i= " << i;
133   }
134   CHECK_EQ(p1.Distance(p2), 1024 + 512);
135   CHECK_EQ(p1.Distance(p3), 512);
136
137   CHECK_EQ(p1.ReadData(buffer, 333), 333);
138   CHECK_EQ(p1.Distance(p2), 1024 + 512 + 333);
139   for ( int i = 0; i < 333; ++i ) {
140     CHECK_EQ(static_cast<uint8>(buffer[i]),
141              static_cast<int>(i % 256)) << " i= " << i;
142   }
143
144   CHECK_EQ(p1.ReadData(buffer, 2048 - 333), 1024 - 333);
145   for ( int i = 0; i < 333; ++i ) {
146     CHECK_EQ(static_cast<uint8>(buffer[i]),
147              static_cast<int>((333 + i) % 256)) << " i= " << i;
148   }
149   CHECK(p0 == p1);
150   CHECK_EQ(p1.Distance(p2), 2048 + 512);
151   CHECK_EQ(p1.Distance(p3), 512);
152   printf("PASS\n");
153   common::Exit(0);
154 }
Note: See TracBrowser for help on using the browser.