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() );