TEST_F(TestTabletLocationItem, test_deserialize)
{
  ObMergerTabletLocation server;
  ObMergerTabletLocationList list;
  list.set_timestamp(1000);
  ObTabletLocation temp_server;
  ObServer chunkserver;
  for (int32_t i = 0; i < ObMergerTabletLocationList::MAX_REPLICA_COUNT; ++i)
  {
    chunkserver.set_ipv4_addr(i + 300000, i + 1024);
    temp_server.tablet_version_ = i;
    temp_server.chunkserver_ = chunkserver;
    EXPECT_TRUE(OB_SUCCESS == list.add(temp_server));
    EXPECT_TRUE(i + 1 == list.size());
  }
  ObStringBuf buffer;
  list.set_buffer(buffer);
  list.print_info();
  char start[1024] = "0x00000000";
  char end[1024] = "0xFFFFFFFF";
  ObRange range;
  range.start_key_.assign(start, (int32_t)strlen(start));
  range.end_key_.assign(end, (int32_t)strlen(end));
  int ret = list.set_tablet_range(range);
  EXPECT_TRUE(OB_SUCCESS == ret);
  int64_t size = list.get_serialize_size();
  EXPECT_TRUE(size != 0);
  char * temp = new char[size];
  EXPECT_TRUE(NULL != temp);
  int64_t pos = 0;
  EXPECT_TRUE(OB_SUCCESS != list.serialize(temp, size - 1 , pos));
  pos = 0;
  EXPECT_TRUE(OB_SUCCESS == list.serialize(temp, size, pos));
  EXPECT_TRUE(pos == size);

  ObMergerTabletLocationList list2;
  list2.set_buffer(buffer);
  pos = 0;
  EXPECT_TRUE(OB_SUCCESS == list2.deserialize(temp, size, pos));
  list2.print_info();
  list.print_info();
  char start1[1024] = "0x0000000000";
  char end1[1024] = "0xFFFFFFFFFF";
  range.start_key_.assign(start1, (int32_t)strlen(start1));
  range.end_key_.assign(end1, (int32_t)strlen(end1));
  EXPECT_TRUE(OB_SUCCESS == list.set_tablet_range(range));
  size = list.get_serialize_size();
  EXPECT_TRUE(size != 0);
  delete []temp;
  temp = new char[size];
  EXPECT_TRUE(NULL != temp);
  pos = 0;
  EXPECT_TRUE(OB_SUCCESS == list.serialize(temp, size, pos));
  pos = 0;
  EXPECT_TRUE(OB_SUCCESS != list2.deserialize(temp, size, pos));
  //
  pos = 0;
  list2.reset();
  EXPECT_TRUE(OB_SUCCESS == list2.deserialize(temp, size, pos));
}
TEST_F(TestTabletLocationItem, test_serialize)
{
  ObMergerTabletLocation server;
  ObMergerTabletLocationList list;
  list.set_timestamp(1000); 
  ObTabletLocation temp_server;
  ObServer chunkserver;
  for (int32_t i = 0; i < ObMergerTabletLocationList::MAX_REPLICA_COUNT; ++i)
  {
    chunkserver.set_ipv4_addr(i + 300000, i + 1024);
    temp_server.tablet_version_ = i;
    temp_server.chunkserver_ = chunkserver;
    EXPECT_TRUE(OB_SUCCESS == list.add(temp_server));
    EXPECT_TRUE(i + 1 == list.size());
  }
  
  list.print_info();
  int64_t size = list.get_serialize_size();
  EXPECT_TRUE(size != 0);
  
  char * temp = new char[size];
  EXPECT_TRUE(NULL != temp);
  int64_t pos = 0;
  EXPECT_TRUE(OB_SUCCESS != list.serialize(temp, size - 1 , pos));
  pos = 0;
  EXPECT_TRUE(OB_SUCCESS == list.serialize(temp, size, pos));
  EXPECT_TRUE(pos == size);
  
  ObMergerTabletLocationList list2;
  pos = 0;
  EXPECT_TRUE(OB_SUCCESS == list2.deserialize(temp, size, pos));
  list2.print_info();
  list.print_info();
}
int ObMergerTabletLocationCache::set(const ObRange & range, const ObMergerTabletLocationList & location)
{
  int ret = OB_SUCCESS;
  if (!init_)
  {
    TBSYS_LOG(ERROR, "%s", "check init failed");
    ret = OB_INNER_STAT_ERROR;
  }
  else
  {
    ObCachePair pair;
    // malloc the pair mem buffer
    int64_t size = range.get_serialize_size();
    ret = tablet_cache_.malloc(pair, static_cast<int32_t>(size), static_cast<int32_t>(location.get_serialize_size()));
    if (OB_SUCCESS != ret)
    {
      TBSYS_LOG(ERROR, "check malloc failed:key_size[%lu], ret[%d]", size, ret);
    }
    
    int64_t pos = 0;
    // key serialize to the pair
    if (OB_SUCCESS == ret)
    {  
      ret = range.serialize(pair.get_key().ptr(), size, pos);
      if (ret != OB_SUCCESS)
      {
        TBSYS_LOG(ERROR, "serialize range failed:ret[%d]", ret);
      }
    }

    // value serialize to the pair
    if (OB_SUCCESS == ret)
    {
      pos = 0;
      ret = location.serialize(pair.get_value().ptr(), location.get_serialize_size(), pos);
      if (ret != OB_SUCCESS)
      {
        TBSYS_LOG(ERROR, "serialize locationlist failed:ret[%d]", ret);
      }
    }

    // delete the old cache item
    if (OB_SUCCESS == ret)
    {
      ret = del(range.table_id_, range.end_key_);
      if ((ret != OB_SUCCESS) && (ret != OB_ENTRY_NOT_EXIST))
      {
        TBSYS_LOG(WARN, "del the old item:table[%lu], ret[%d]", range.table_id_, ret);
      }
      else
      {
        ret = OB_SUCCESS;
      }
    }

    // add new pair and return the old pair for deletion
    if (OB_SUCCESS == ret)
    {
      ObCachePair oldpair;
      ret = tablet_cache_.add(pair, oldpair);
      if (ret != OB_SUCCESS)
      {
        TBSYS_LOG(ERROR, "add the pair failed:ret[%d]", ret);
      }
      else
      {
        TBSYS_LOG(DEBUG, "%s", "set tablet location cache succ");
      }
    }
  }
  return ret;
}