polardbxengine/extra/IS/consensus/unittest/paxos_log_cache-t.cc

172 lines
4.5 KiB
C++

/************************************************************************
*
* Copyright (c) 2017 Alibaba.com, Inc. All Rights Reserved
* $Id: paxos_log_cache-t.cc,v 1.0 01/17/2017 06:57:45 PM yingqiang.zyq(yingqiang.zyq@alibaba-inc.com) $
*
************************************************************************/
/**
* @file paxos_log_cache-t.cc
* @author yingqiang.zyq(yingqiang.zyq@alibaba-inc.com)
* @date 01/17/2017 06:57:45 PM
* @version 1.0
* @brief
*
**/
#include <gtest/gtest.h>
#include "paxos_log_cache.h"
using namespace alisql;
::google::protobuf::RepeatedPtrField<LogEntry> makeEntries(uint64_t bi, uint64_t ei)
{
::google::protobuf::RepeatedPtrField<LogEntry> les;
LogEntry le;
le.set_term(1);
le.set_optype(1);
for (uint64_t i= bi; i <= ei; ++i)
{
le.set_index(i);
*(les.Add())= le;
}
return les;
}
TEST(PaxosLogCacheNode, t1)
{
PaxosLogCache cache;
PaxosLogCacheNode *node;
auto t1= makeEntries(2, 4);
cache.put(2, 4, t1);
EXPECT_EQ(cache.getByteSize(), cache.debugGetByteSize());
auto t2= makeEntries(7, 9);
cache.put(7, 9, t2);
EXPECT_EQ(cache.getByteSize(), cache.debugGetByteSize());
node= cache.debugGet(0);
EXPECT_EQ(node->beginIndex, 2);
EXPECT_EQ(node->endIndex, 4);
EXPECT_EQ(node->entries.size(), 3);
EXPECT_EQ(node->entries.begin()->index(), 2);
EXPECT_EQ(cache.getByteSize(), cache.debugGetByteSize());
node= cache.debugGet(1);
EXPECT_EQ(node->beginIndex, 7);
EXPECT_EQ(node->endIndex, 9);
EXPECT_EQ(node->entries.size(), 3);
EXPECT_EQ(node->entries.begin()->index(), 7);
EXPECT_EQ(cache.getByteSize(), cache.debugGetByteSize());
auto t3= makeEntries(6, 8);
cache.put(6, 8, t3);
EXPECT_EQ(cache.getByteSize(), cache.debugGetByteSize());
node= cache.debugGet(1);
EXPECT_EQ(node->beginIndex, 6);
EXPECT_EQ(node->endIndex, 9);
EXPECT_EQ(node->entries.size(), 4);
EXPECT_EQ(node->entries.begin()->index(), 6);
EXPECT_EQ(cache.getByteSize(), cache.debugGetByteSize());
node= cache.get(1);
EXPECT_EQ(node == NULL, true);
EXPECT_EQ(cache.getByteSize(), cache.debugGetByteSize());
node= cache.get(3);
EXPECT_EQ(node->beginIndex, 3);
EXPECT_EQ(node->endIndex, 4);
EXPECT_EQ(node->entries.size(), 2);
EXPECT_EQ(node->entries.begin()->index(), 3);
EXPECT_EQ(cache.getByteSize(), cache.debugGetByteSize());
auto t5= makeEntries(13, 15);
cache.put(13, 15, t5);
EXPECT_EQ(cache.getByteSize(), cache.debugGetByteSize());
node= cache.get(12);
EXPECT_EQ(node == NULL, true);
EXPECT_EQ(cache.getByteSize(), cache.debugGetByteSize());
node= cache.debugGet(0);
EXPECT_EQ(node->beginIndex, 13);
EXPECT_EQ(node->endIndex, 15);
EXPECT_EQ(node->entries.size(), 3);
EXPECT_EQ(node->entries.begin()->index(), 13);
EXPECT_EQ(cache.getByteSize(), cache.debugGetByteSize());
auto t4= makeEntries(17, 19);
cache.put(17, 19, t4);
EXPECT_EQ(cache.getByteSize(), cache.debugGetByteSize());
node= cache.get(17);
EXPECT_EQ(node->beginIndex, 17);
EXPECT_EQ(node->endIndex, 19);
EXPECT_EQ(node->entries.size(), 3);
EXPECT_EQ(node->entries.begin()->index(), 17);
EXPECT_EQ(cache.getByteSize(), cache.debugGetByteSize());
node= cache.debugGet(0);
EXPECT_EQ(node == NULL, true);
EXPECT_EQ(cache.getByteSize(), cache.debugGetByteSize());
auto t6= makeEntries(21, 21);
cache.put(21, 21, t6);
EXPECT_EQ(cache.getByteSize(), cache.debugGetByteSize());
auto t7= makeEntries(22, 22);
cache.put(22, 22, t7);
EXPECT_EQ(cache.getByteSize(), cache.debugGetByteSize());
node= cache.debugGet(0);
EXPECT_EQ(node->beginIndex, 21);
EXPECT_EQ(node->endIndex, 22);
EXPECT_EQ(node->entries.size(), 2);
EXPECT_EQ(node->entries.begin()->index(), 21);
EXPECT_EQ(cache.getByteSize(), cache.debugGetByteSize());
auto t8= makeEntries(20, 20);
cache.put(20, 20, t8);
EXPECT_EQ(cache.getByteSize(), cache.debugGetByteSize());
node= cache.debugGet(0);
EXPECT_EQ(node->beginIndex, 20);
EXPECT_EQ(node->endIndex, 22);
EXPECT_EQ(node->entries.size(), 3);
EXPECT_EQ(node->entries.begin()->index(), 20);
EXPECT_EQ(cache.getByteSize(), cache.debugGetByteSize());
// print 0 if WITH_DEBUG_LOG_CACHE is OFF
std::cout << "Cache ByteSize: " << cache.getByteSize() << std::endl;
node= cache.get(1000); // will return null and clear all cache
EXPECT_TRUE(node == NULL);
EXPECT_EQ(cache.getByteSize(), 0);
auto t9= makeEntries(2, 4);
cache.put(2, 4, t9);
EXPECT_EQ(cache.getByteSize(), cache.debugGetByteSize());
cache.clear();
EXPECT_EQ(cache.getByteSize(), 0);
}