EXPECT_TRUE(agent_event == NULL && belong_to_this == true);


  /* 模拟收到已完成的sub task备份包 */
  agent_event = rpc_event2;
  /* 检查结果 */
  ret = scan_request.agent_event_finish(agent_event, belong_to_this);
  EXPECT_TRUE(ret == OB_SUCCESS);
  EXPECT_TRUE(belong_to_this == false);   /// rpc_event2已经收到过,重复包无效
} 




#if 0
  ObMergerTabletLocationCache cache;
  EXPECT_TRUE(cache.size() == 0);
  int ret = cache.clear();
  EXPECT_TRUE(ret != OB_SUCCESS);

  ret = cache.init(1000, 100, timeout);
  EXPECT_TRUE(ret == OB_SUCCESS);
  EXPECT_TRUE(cache.size() == 0);
  ret = cache.clear();
  EXPECT_TRUE(ret == OB_SUCCESS);
  
  char temp[100];
  char temp_end[100];
  uint64_t count = 0;
  // not more than 10 bit rows because of the string key
  const uint64_t START_ROW = 10L;
TEST_F(TestObRpcScan, test_single_table_scan)
{
  /// 0. start packet handler thread
  CThread packet_hanlder_thread;
  packet_hanlder_thread.start(&handler, NULL);

  /// 1. setup transport
  /// 2. setup servers (root, ups, CSes)
  /// 3. setup scan request (location list, scan range)

  TBSYS_LOG(INFO, "( 1 )");
  tbnet::Transport * transport = new tbnet::Transport();
  tbnet::DefaultPacketStreamer * streamer = new tbnet::DefaultPacketStreamer();
  ObPacketFactory * factory = new ObPacketFactory();
  streamer->setPacketFactory(factory);
  ObClientManager client_manager;
  client_manager.initialize(transport, streamer);
  transport->start();
#if 0
  EXPECT_CALL(client_manager, post_request(_,_,_,_,_,_,_))
    .Times(AtLeast(1))
    .WillRepeatedly(Invoke(callback_func));
  EXPECT_CALL(client_manager, handlePacket(_,_))
    .Times(AtLeast(1))
    .WillOnce(Return(OB_SUCCESS))
    .WillOnce(Return((tbnet::IPacketHandler::HPRetCode)0));
#endif

  TBSYS_LOG(INFO, "( 2 )");
  ObServer update_server;
  ObServer root_server;
  ObServer merge_server;
  update_server.set_ipv4_addr(addr, MockUpdateServer::UPDATE_SERVER_PORT);
  root_server.set_ipv4_addr(addr, MockRootServer::ROOT_SERVER_PORT);
  ObMergerRpcProxy proxy(3, timeout, root_server, merge_server);

  ObMergerRpcStub stub;
  ThreadSpecificBuffer buffer;
  stub.init(&buffer, &client_manager);
  ObMergerRootRpcProxy rpc(0, timeout, root_server);
  EXPECT_TRUE(OB_SUCCESS == rpc.init(&stub));

  merge_server.set_ipv4_addr(addr, 10256);
  ObMergerTabletLocationCache * location = new ObMergerTabletLocationCache;
  location->init(50000 * 5, 1000, 100000);

  TBSYS_LOG(INFO, "( 3 )");
  // start root server
  MockRootServer root;
  tbsys::CThread root_server_thread;
  MockServerRunner test_root_server(root);
  root_server_thread.start(&test_root_server, NULL);

  /// (4) do it!
  MockObMergerAsyncRpcStub async;
  async.init(&buffer, &client_manager);
  ObMergerLocationCacheProxy location_proxy(root_server, &rpc, location);
  ObRpcScan scan;
  ObRowkeyInfo rowkey_info;
  ObRowkeyColumn column;
  column.length_ = 4;
  column.column_id_ = 102;
  column.type_ = ObIntType;
  rowkey_info.add_column(column);
#if 0
  ObSqlExpression p, p_end;
  ExprItem item_a, item_op, item_const;
  bool is_cond = false;
  /* 101 <= column <= 107 */
  item_a.type_ = T_REF_COLUMN;
  item_a.value_.cell_.tid = 123;
  item_a.value_.cell_.cid = 102;
  item_op.type_ = T_OP_LT;
  item_op.value_.int_ = 2;  /* 2 operands */
  item_const.type_ = T_INT;
  item_const.value_.int_ = 107;
  ASSERT_EQ(OB_SUCCESS, p.add_expr_item(item_a));
  ASSERT_EQ(OB_SUCCESS, p.add_expr_item(item_const));
  ASSERT_EQ(OB_SUCCESS, p.add_expr_item(item_op));
  ASSERT_EQ(OB_SUCCESS, p.add_expr_item_end());
  ASSERT_EQ(OB_SUCCESS, p.is_simple_condition(is_cond));
  ASSERT_EQ(true, is_cond);


  item_a.type_ = T_REF_COLUMN;
  item_a.value_.cell_.tid = 123;
  item_a.value_.cell_.cid = 102;
  item_op.type_ = T_OP_GE;
  item_op.value_.int_ = 2;  /* 2 operands */
  item_const.type_ = T_INT;
  item_const.value_.int_ = 101;
  ASSERT_EQ(OB_SUCCESS, p_end.add_expr_item(item_a));
  ASSERT_EQ(OB_SUCCESS, p_end.add_expr_item(item_const));
  ASSERT_EQ(OB_SUCCESS, p_end.add_expr_item(item_op));
  ASSERT_EQ(OB_SUCCESS, p_end.add_expr_item_end());
  ASSERT_EQ(OB_SUCCESS, p_end.is_simple_condition(is_cond));
  ASSERT_EQ(true, is_cond);

  scan.add_filter(p);
  scan.add_filter(p_end);
#endif
  scan.set_table(test::ObFakeTable::TABLE_ID);
  scan.set_rowkey_info(rowkey_info);
  scan.add_output_column(ExprGen::create_expr_by_id(1));

  EXPECT_CALL(async, scan(_,_,_,_))
    .Times(AtLeast(1))
    .WillRepeatedly(Invoke(callback_scan_async));

  EXPECT_CALL(async, get_session_next(_,_,_,_,_))
    .Times(AtLeast(1))
    .WillRepeatedly(Invoke(callback_session_async));




  ASSERT_TRUE(OB_SUCCESS == scan.init(&location_proxy, &async));
  ASSERT_TRUE(OB_SUCCESS == scan.open());

  const ObRow * cur_row = NULL;
  while(1)
  {
    int ret = OB_SUCCESS;

    TBSYS_LOG(INFO, "get_next_row() - begin");
    if (OB_ITER_END == (ret = scan.get_next_row(cur_row)))
    {
      TBSYS_LOG(INFO, "get_next_row() - iter_end");
      break;
    }
    else if (OB_SUCCESS != ret)
    {
      TBSYS_LOG(WARN, "get next row failed. ret=%d", ret);
      break;
    }
    /*TBSYS_LOG(DEBUG, "[id:%lu][key:%.*s][obj:dumped bellow]", cur_row->table_id_, cur_row->row_key_.length(),
      cur_row->row_key_.ptr());
      cur_row->value_.dump();
      */
    if (NULL != cur_row)
    {
      TBSYS_LOG(INFO, "row info:[SEE_DEBUG_LEVEL]");
      cur_row->dump();
    }
    else
    {
      TBSYS_LOG(WARN, "no current row");
    }
    TBSYS_LOG(INFO, "get_next_row() - end");
  }
  TBSYS_LOG(INFO, "scannnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnning - terminatet");
  //sleep(10);

  scan.close();

  usleep(1000 * 1000 * 2);
  TBSYS_LOG(INFO, "( request sent )");
  transport->stop();
  test_root_server.~MockServerRunner();
  root_server_thread.join();
}