First official checkin.
5 * Created by Jens Alfke on 9/11/09.
6 * Copyright 2009 Jens Alfke. All rights reserved.
7 * BSD-Licensed: See the file "LICENSE.txt" for details.
10 #include <gtest/gtest.h>
11 #include "TestUtils.h"
14 #include "VersionDictionary.h"
18 using namespace Mooseyard;
22 ASSERT_EQ(8, sizeof(Chunk));
23 ASSERT_EQ(8, sizeof(KeyValueChunk));
25 time_t startTime = ::time(NULL);
29 EXPECT_EQ((void*)NULL, otto.lastVersion());
30 ASSERT_NE((void*)NULL, otto.currentVersion());
32 for( int i=0; i<sNWords; i++) {
34 otto.currentVersion()->put(Key(kv),kv);
36 Timer t("Saving Ottoman", sNWords);
37 otto.saveAs("/tmp/test.ottoman");
39 VersionDictionary *last = otto.lastVersion();
40 ASSERT_NE((void*)NULL, last);
41 EXPECT_EQ(sNWords, last->count());
42 ASSERT_NE((void*)NULL, otto.currentVersion());
43 EXPECT_FALSE(otto.currentVersion()->isChanged());
44 createTime = last->timestamp();
45 EXPECT_GE(createTime, startTime);
46 EXPECT_LE(createTime, ::time(NULL));
49 Ottoman otto("/tmp/test.ottoman");
50 VersionDictionary *last = otto.lastVersion();
51 ASSERT_NE((void*)NULL, last);
52 ASSERT_EQ(0, last->generation());
53 ASSERT_EQ(createTime, last->timestamp());
55 Timer t("Reading from Ottoman", sNWords);
56 EXPECT_EQ( sNWords , last->count() );
57 for( int i=0; i<sNWords; i++) {
59 Blob value = last->get(key);
61 ASSERT_TRUE( value.equals(key) ) << "expected '" << key << "', got '" << value << "' (i=" << i <<")";
65 printf("Iterating through the Ottoman...\n");
66 Timer t("Iterating Ottoman", sNWords);
68 for( VersionDictionary::Iterator it(last); it; ++it) {
70 ASSERT_TRUE(it.key().length > 0 && it.key().length < 50);
71 ASSERT_TRUE(it.key().equals(it.value()));
72 ASSERT_EQ( 0, ((size_t)it.value().bytes & 0x3) ); // 4-byte aligned
74 ASSERT_EQ(sNWords, n);
77 printf("Opening Ottoman...\n");
78 Ottoman otto("/tmp/test.ottoman");
79 OverlayDictionary *current = otto.currentVersion();
80 ASSERT_TRUE(current != NULL);
81 EXPECT_EQ( sNWords , current->count() );
82 EXPECT_TRUE(current->get("asparagus").equals("asparagus"));
84 current->put("animal", "AMINAL");
85 current->put("growf", "growf");
86 EXPECT_TRUE(current->remove("asparagus"));
88 EXPECT_EQ( sNWords, current->count() );
89 EXPECT_TRUE(current->get("animal").equals("AMINAL"));
90 EXPECT_TRUE(current->get("growf").equals("growf"));
91 EXPECT_EQ( NULL, current->get("asparagus").bytes );
92 EXPECT_TRUE(!current->contains("asparagus"));
95 for( OverlayDictionary::Iterator it(*current); it; ++it) {
97 ASSERT_TRUE(!it.key().equals("asparagus"));
99 ASSERT_EQ(sNWords, n);
101 printf("Saving Ottoman...\n");
103 Timer t("Saving Ottoman");
107 EXPECT_EQ( sNWords, current->count() );
108 EXPECT_TRUE(current->get("animal").equals("AMINAL"));
109 EXPECT_TRUE(current->get("growf").equals("growf"));
110 EXPECT_EQ( NULL, current->get("asparagus").bytes );
111 EXPECT_TRUE(!current->contains("asparagus"));
114 for( OverlayDictionary::Iterator it(*current); it; ++it) {
116 ASSERT_TRUE(!it.key().equals("asparagus"));
118 ASSERT_EQ(sNWords, n);
120 EXPECT_EQ(1, otto.lastVersion()->generation());
121 const VersionDictionary *prev = otto.lastVersion()->previousVersion();
122 ASSERT_TRUE(prev != NULL);
123 EXPECT_EQ(0, prev->generation());
124 EXPECT_TRUE(prev->get("asparagus").equals("asparagus"));
125 EXPECT_TRUE(prev->get("growf").equals(NULL));
128 printf("Re-opening Ottoman...\n");
129 Ottoman otto("/tmp/test.ottoman", false);
130 ASSERT_EQ(NULL, otto.currentVersion());
131 VersionDictionary *last = otto.lastVersion();
132 ASSERT_TRUE(last != NULL);
133 EXPECT_EQ(1, last->generation());
134 EXPECT_GE(last->timestamp(), createTime);
135 EXPECT_LE(last->timestamp(), ::time(NULL));
136 EXPECT_EQ( sNWords , last->count() );
137 EXPECT_TRUE(last->get("animal").equals("AMINAL"));
138 EXPECT_TRUE(last->get("growf").equals("growf"));
139 EXPECT_EQ( NULL, last->get("asparagus").bytes );
140 EXPECT_TRUE(!last->contains("asparagus"));
143 for( VersionDictionary::Iterator it(last); it; ++it) {
145 ASSERT_TRUE(!it.key().equals("asparagus"));
147 ASSERT_EQ(sNWords, n);
150 printf("Writing Ottoman to a new file...\n");
151 Ottoman oldhf("/tmp/test.ottoman");
153 oldhf.saveAs("/tmp/test2.ottoman");
156 printf("Opening new file...\n");
157 Ottoman otto("/tmp/test2.ottoman");
158 OverlayDictionary *current = otto.currentVersion();
159 ASSERT_TRUE(current != NULL);
161 EXPECT_EQ( sNWords , current->count() );
162 EXPECT_TRUE(current->get("animal").equals("AMINAL"));
163 EXPECT_TRUE(current->get("growf").equals("growf"));
164 EXPECT_EQ( NULL, current->get("asparagus").bytes );
165 EXPECT_TRUE(!current->contains("asparagus"));
168 for( OverlayDictionary::Iterator it(*current); it; ++it) {
170 ASSERT_TRUE(!it.key().equals("asparagus"));
172 ASSERT_EQ(sNWords, n);
174 printf("Iterating the chunks...\n");
178 ChunkIterator *it = otto.chunkIterator();
179 for (; *it; it->next()) {
180 uint16_t type = it->chunk()->type();
181 if (type != lastType) {
183 printf("%6d\n", count);
184 printf("type %u ... ", type);
190 if (type != 0) // don't count padding chunks
194 printf("%6d\n", count);
195 printf("Iterated over %i chunks\n",n);
196 EXPECT_EQ(sNWords+256+1, n);
197 EXPECT_TRUE(it->atEOF());
199 printf("Scavenging...\n");
200 EXPECT_TRUE( otto.scavenge() );