472 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			472 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /**
 | |
|  * Copyright (c) 2021 OceanBase
 | |
|  * OceanBase CE is licensed under Mulan PubL v2.
 | |
|  * You can use this software according to the terms and conditions of the Mulan PubL v2.
 | |
|  * You may obtain a copy of Mulan PubL v2 at:
 | |
|  *          http://license.coscl.org.cn/MulanPubL-2.0
 | |
|  * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 | |
|  * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 | |
|  * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 | |
|  * See the Mulan PubL v2 for more details.
 | |
|  */
 | |
| 
 | |
| #include "ob_mock_iterator.h"
 | |
| #include <gtest/gtest.h>
 | |
| 
 | |
| namespace oceanbase
 | |
| {
 | |
| using namespace oceanbase::common;
 | |
| using namespace oceanbase::storage;
 | |
| using namespace oceanbase::common::hash;
 | |
| using namespace oceanbase::unittest;
 | |
| namespace unittest
 | |
| {
 | |
| class TestObMockIteratorBuilder : public ::testing::Test
 | |
| {
 | |
| public:
 | |
|   void SetUp()
 | |
|   {
 | |
|     row = NULL;
 | |
|     ret_val = OB_SUCCESS;
 | |
|   }
 | |
|   void TearDown()
 | |
|   {
 | |
|     iter.reset();
 | |
|     row = NULL;
 | |
|   }
 | |
| 
 | |
|   ObMockIterator iter;
 | |
|   const ObStoreRow *row;
 | |
|   ObString vchar;
 | |
|   char buf[ObMockIteratorBuilder::MAX_DATA_LENGTH];
 | |
|   int ret_val;
 | |
| };
 | |
| 
 | |
| TEST_F(TestObMockIteratorBuilder, get)
 | |
| {
 | |
|   ObStoreRow rows[32];
 | |
|   ObObj objs[32];
 | |
|   int64_t i = 0;
 | |
|   for (i = 0; i < 32; ++i) {
 | |
|     rows[i].row_val_.cells_ = &objs[i];
 | |
|     rows[i].row_val_.count_ = 1;
 | |
|     rows[i].row_val_.cells_[0].set_int(i);
 | |
|     iter.add_row(&rows[i]);
 | |
|   }
 | |
| 
 | |
|   for (i = 0; i < 32; ++i) {
 | |
|     ASSERT_EQ(OB_SUCCESS, iter.get_next_row(row));
 | |
|     ASSERT_EQ(i % 32, row->row_val_.cells_[0].get_int());
 | |
|   }
 | |
| 
 | |
|   iter.reset_iter();
 | |
|   ASSERT_EQ(OB_SUCCESS, iter.get_row(7, row));
 | |
|   ASSERT_EQ(7, row->row_val_.cells_[0].get_int());
 | |
|   ASSERT_EQ(OB_SUCCESS, iter.get_next_row(row));
 | |
|   ASSERT_EQ(0, row->row_val_.cells_[0].get_int());
 | |
| 
 | |
|   ASSERT_EQ(OB_SUCCESS, iter.get_row(31, row));
 | |
|   ASSERT_EQ(31, row->row_val_.cells_[0].get_int());
 | |
|   ASSERT_EQ(OB_ITER_END, iter.get_row(32, row));
 | |
| 
 | |
|   iter.reset_iter();
 | |
|   ASSERT_EQ(OB_SUCCESS, iter.get_row(0, row));
 | |
|   ASSERT_EQ(0, row->row_val_.cells_[0].get_int());
 | |
|   ASSERT_EQ(OB_ITER_END, iter.get_row(32, row));
 | |
| 
 | |
|   iter.reset();
 | |
|   ASSERT_EQ(OB_ITER_END, iter.get_row(0, row));
 | |
| 
 | |
|   ret_val = iter.add_row(NULL);
 | |
|   ASSERT_EQ(OB_ERR_NULL_VALUE, ret_val);
 | |
| }
 | |
| 
 | |
| TEST_F(TestObMockIteratorBuilder, from)
 | |
| {
 | |
|   const char *input = "int varchar\n"
 | |
|                       "1   'test string'\n";
 | |
|   ret_val = iter.from(input);
 | |
|   ASSERT_EQ(OB_SUCCESS, ret_val);
 | |
| 
 | |
|   // row 0
 | |
|   ASSERT_EQ(OB_SUCCESS, iter.get_next_row(row));
 | |
|   // int
 | |
|   ASSERT_EQ(ObIntType, row->row_val_.cells_[0].get_type());
 | |
|   ASSERT_EQ(1, row->row_val_.cells_[0].get_int());
 | |
| 
 | |
|   // varchar
 | |
|   ASSERT_EQ(ObVarcharType, row->row_val_.cells_[1].get_type());
 | |
|   row->row_val_.cells_[1].get_varchar(vchar);
 | |
|   vchar.to_string(buf, ObMockIteratorBuilder::MAX_DATA_LENGTH);
 | |
|   ASSERT_STREQ("test string", buf);
 | |
| 
 | |
|   ObMockStoreRowIterator iter1;
 | |
|   ret_val = iter1.from(input);
 | |
|   ASSERT_EQ(OB_SUCCESS, ret_val);
 | |
| }
 | |
| 
 | |
| TEST_F(TestObMockIteratorBuilder, ext)
 | |
| {
 | |
|   const char *input = "int var  num  ts  int int\n"
 | |
|                       "1   NULL MIN  NOP MAX 2\n";
 | |
|   ret_val = iter.from(input);
 | |
|   ASSERT_EQ(OB_SUCCESS, ret_val);
 | |
| 
 | |
|   ASSERT_EQ(OB_SUCCESS, iter.get_next_row(row));
 | |
|   ASSERT_TRUE(row->row_val_.cells_[0].is_int());
 | |
|   ASSERT_TRUE(row->row_val_.cells_[1].is_null());
 | |
|   ASSERT_TRUE(row->row_val_.cells_[2].is_min_value());
 | |
|   ASSERT_TRUE(row->row_val_.cells_[3].is_nop_value());
 | |
|   ASSERT_TRUE(row->row_val_.cells_[4].is_max_value());
 | |
|   ASSERT_TRUE(row->row_val_.cells_[5].is_int());
 | |
| }
 | |
| 
 | |
| TEST_F(TestObMockIteratorBuilder, parse_header_error)
 | |
| {
 | |
|   ASSERT_EQ(OB_EMPTY_RESULT, iter.from(" "));
 | |
|   ASSERT_EQ(OB_EMPTY_RESULT, iter.from("\nint\n1\n"));
 | |
|   ASSERT_EQ(OB_OBJ_TYPE_ERROR, iter.from("intt\n1\n"));
 | |
|   ASSERT_EQ(OB_OBJ_TYPE_ERROR, iter.from("i\n1\n"));
 | |
| }
 | |
| 
 | |
| TEST_F(TestObMockIteratorBuilder, parse_int)
 | |
| {
 | |
|   const char *input = "int\n"
 | |
|                       "0x1234abcdef\n"
 | |
|                       "0xfffffffffffffff\n"
 | |
|                       "07654321\n"
 | |
|                       "0\n";
 | |
| 
 | |
|   ASSERT_EQ(OB_SUCCESS, iter.from(input));
 | |
| 
 | |
|   ASSERT_EQ(OB_SUCCESS, iter.get_next_row(row));
 | |
|   ASSERT_EQ(ObIntType, row->row_val_.cells_[0].get_type());
 | |
|   ASSERT_EQ(0x1234abcdef, row->row_val_.cells_[0].get_int());
 | |
| 
 | |
|   ASSERT_EQ(OB_SUCCESS, iter.get_next_row(row));
 | |
|   ASSERT_EQ(ObIntType, row->row_val_.cells_[0].get_type());
 | |
|   ASSERT_EQ(0xfffffffffffffff, row->row_val_.cells_[0].get_int());
 | |
| 
 | |
|   ASSERT_EQ(OB_SUCCESS, iter.get_next_row(row));
 | |
|   ASSERT_EQ(ObIntType, row->row_val_.cells_[0].get_type());
 | |
|   ASSERT_EQ(07654321, row->row_val_.cells_[0].get_int());
 | |
| 
 | |
|   ASSERT_EQ(OB_SUCCESS, iter.get_next_row(row));
 | |
|   ASSERT_EQ(ObIntType, row->row_val_.cells_[0].get_type());
 | |
|   ASSERT_EQ(0, row->row_val_.cells_[0].get_int());
 | |
| 
 | |
|   // error type
 | |
|   const char *input2 = "int\n"
 | |
|                        "0xffffffffffffffffff\n";
 | |
|   ASSERT_EQ(OB_NUMERIC_OVERFLOW, iter.from(input2));
 | |
| 
 | |
|   const char *input3 = "int\n"
 | |
|                        "abc\n";
 | |
|   ASSERT_EQ(OB_ERR_CAST_VARCHAR_TO_NUMBER, iter.from(input3));
 | |
| }
 | |
| 
 | |
| TEST_F(TestObMockIteratorBuilder, parse_number)
 | |
| {
 | |
|   const char *input = "number\n"
 | |
|                       "str\n";
 | |
| 
 | |
|   ASSERT_EQ(OB_INVALID_NUMERIC, iter.from(input));
 | |
| }
 | |
| 
 | |
| TEST_F(TestObMockIteratorBuilder, parse_timestamp)
 | |
| {
 | |
|   // error input while timestamp without ''
 | |
|   // in this example 11:12:12 will be handle by parse int, and 1 by timestamp
 | |
|   const char *input = "timestamp int\n"
 | |
|                       "2013-12-12 11:12:12 1\n";
 | |
|   ASSERT_EQ(OB_ARRAY_OUT_OF_RANGE, iter.from(input));
 | |
| 
 | |
|   const char *input2 = "timestamp\n"
 | |
|                        "'2012-22-12 11:12:12'\n";
 | |
|   ASSERT_EQ(OB_INVALID_DATE_FORMAT, iter.from(input2));
 | |
| 
 | |
|   // equal to 15-01-15 00:00:00
 | |
|   const char *input3 = "timestamp\n"
 | |
|                        "'15-01-15'\n";
 | |
|   ASSERT_EQ(OB_SUCCESS, iter.from(input3));
 | |
| 
 | |
|   const char *input4 = "timestamp\n"
 | |
|                        "1234567\n";
 | |
|   ASSERT_EQ(OB_INVALID_DATE_FORMAT, iter.from(input4));
 | |
| }
 | |
| 
 | |
| TEST_F(TestObMockIteratorBuilder, parse_dml_and_flag)
 | |
| {
 | |
| 
 | |
|   const char *input = "int dml           flag\n"
 | |
|                       "1  T_DML_UNKNOWN RF_ROW_DOES_NOT_EXIST\n"
 | |
|                       "1  T_DML_INSERT  RF_ROW_EXIST\n"
 | |
|                       "1  T_DML_UPDATE  RF_DELETE\n"
 | |
|                       "1  T_DML_DELETE  RF_DELETE\n"
 | |
|                       "1  T_DML_REPLACE RF_DELETE\n";
 | |
|   ASSERT_EQ(OB_SUCCESS, iter.from(input));
 | |
| 
 | |
|   ASSERT_EQ(OB_SUCCESS, iter.get_next_row(row));
 | |
|   ASSERT_EQ(T_DML_UNKNOWN, row->get_dml());
 | |
|   ASSERT_EQ(+RF_ROW_DOES_NOT_EXIST, row->flag_);
 | |
|   ASSERT_EQ(OB_SUCCESS, iter.get_next_row(row));
 | |
|   ASSERT_EQ(T_DML_INSERT, row->get_dml());
 | |
|   ASSERT_EQ(+RF_ROW_EXIST, row->flag_);
 | |
|   ASSERT_EQ(OB_SUCCESS, iter.get_next_row(row));
 | |
|   ASSERT_EQ(T_DML_UPDATE, row->get_dml());
 | |
|   ASSERT_EQ(+RF_DELETE, row->flag_);
 | |
|   ASSERT_EQ(OB_SUCCESS, iter.get_next_row(row));
 | |
|   ASSERT_EQ(T_DML_DELETE, row->get_dml());
 | |
|   ASSERT_EQ(+RF_DELETE, row->flag_);
 | |
|   ASSERT_EQ(OB_SUCCESS, iter.get_next_row(row));
 | |
|   ASSERT_EQ(T_DML_REPLACE, row->get_dml());
 | |
|   ASSERT_EQ(+RF_DELETE, row->flag_);
 | |
| 
 | |
|   // test default value
 | |
|   const char *input2 = "int\n"
 | |
|                        "1\n";
 | |
|   ASSERT_EQ(OB_SUCCESS, iter.from(input2));
 | |
|   ASSERT_EQ(OB_SUCCESS, iter.get_next_row(row));
 | |
|   ASSERT_EQ(T_DML_UNKNOWN, row->get_dml());
 | |
|   ASSERT_EQ(+RF_ROW_EXIST, row->flag_);
 | |
| 
 | |
|   const char *input3 = "int dml\n"
 | |
|                        "1 aa\n";
 | |
|   ASSERT_EQ(OB_HASH_NOT_EXIST, iter.from(input3));
 | |
| 
 | |
|   const char *input4 = "int flag\n"
 | |
|                        "1 aa\n";
 | |
|   ASSERT_EQ(OB_HASH_NOT_EXIST, iter.from(input4));
 | |
| }
 | |
| 
 | |
| TEST_F(TestObMockIteratorBuilder, parse_varchar)
 | |
| {
 | |
|   const char *input = "varchar\n"
 | |
|                       "'varchar int timestamp bool'\n"
 | |
|                       "'\n\t\r'\n"
 | |
|                       "'\\n\\t\\r'\n";
 | |
| 
 | |
|   ASSERT_EQ(OB_SUCCESS, iter.from(input));
 | |
| 
 | |
|   ASSERT_EQ(OB_SUCCESS, iter.get_next_row(row));
 | |
|   ASSERT_EQ(ObVarcharType, row->row_val_.cells_[0].get_type());
 | |
|   row->row_val_.cells_[0].get_varchar(vchar);
 | |
|   vchar.to_string(buf, ObMockIteratorBuilder::MAX_DATA_LENGTH);
 | |
|   ASSERT_STREQ("varchar int timestamp bool", buf);
 | |
| 
 | |
|   ASSERT_EQ(OB_SUCCESS, iter.get_next_row(row));
 | |
|   ASSERT_EQ(ObVarcharType, row->row_val_.cells_[0].get_type());
 | |
|   row->row_val_.cells_[0].get_varchar(vchar);
 | |
|   vchar.to_string(buf, ObMockIteratorBuilder::MAX_DATA_LENGTH);
 | |
|   ASSERT_STREQ("\n\t\r", buf);
 | |
| 
 | |
|   ASSERT_EQ(OB_SUCCESS, iter.get_next_row(row));
 | |
|   ASSERT_EQ(ObVarcharType, row->row_val_.cells_[0].get_type());
 | |
|   row->row_val_.cells_[0].get_varchar(vchar);
 | |
|   vchar.to_string(buf, ObMockIteratorBuilder::MAX_DATA_LENGTH);
 | |
|   ASSERT_STREQ("\n\t\r", buf);
 | |
| 
 | |
|   // change escape
 | |
|   const char *input2 = "varchar\n"
 | |
|                        "'#'##'\n"
 | |
|                        "'\n\t\r'\n"
 | |
|                        "'\\n\\t\\r'\n";
 | |
| 
 | |
|   ASSERT_EQ(OB_SUCCESS, iter.from(input2, '#'));
 | |
| 
 | |
|   ASSERT_EQ(OB_SUCCESS, iter.get_next_row(row));
 | |
|   ASSERT_EQ(ObVarcharType, row->row_val_.cells_[0].get_type());
 | |
|   row->row_val_.cells_[0].get_varchar(vchar);
 | |
|   vchar.to_string(buf, ObMockIteratorBuilder::MAX_DATA_LENGTH);
 | |
|   ASSERT_STREQ("'#", buf);
 | |
| 
 | |
|   ASSERT_EQ(OB_SUCCESS, iter.get_next_row(row));
 | |
|   ASSERT_EQ(ObVarcharType, row->row_val_.cells_[0].get_type());
 | |
|   row->row_val_.cells_[0].get_varchar(vchar);
 | |
|   vchar.to_string(buf, ObMockIteratorBuilder::MAX_DATA_LENGTH);
 | |
|   ASSERT_STREQ("\n\t\r", buf);
 | |
| 
 | |
|   ASSERT_EQ(OB_SUCCESS, iter.get_next_row(row));
 | |
|   ASSERT_EQ(ObVarcharType, row->row_val_.cells_[0].get_type());
 | |
|   row->row_val_.cells_[0].get_varchar(vchar);
 | |
|   vchar.to_string(buf, ObMockIteratorBuilder::MAX_DATA_LENGTH);
 | |
|   ASSERT_STREQ("\\n\\t\\r", buf);
 | |
| 
 | |
|   // input single big word
 | |
|   ObString input3;
 | |
|   char input_buf[ObMockIteratorBuilder::MAX_DATA_LENGTH + 16];
 | |
|   input3.assign_buffer(input_buf, ObMockIteratorBuilder::MAX_DATA_LENGTH + 16);
 | |
|   input3.write("varchar\n", sizeof("varchar\n") - 1);
 | |
|   for (int i = 0; i <= ObMockIteratorBuilder::MAX_DATA_LENGTH; i++) {
 | |
|     input3.write("a", 1);
 | |
|   }
 | |
|   input3.write("\n", 1);
 | |
|   ASSERT_EQ(OB_ARRAY_OUT_OF_RANGE, iter.from(input3));
 | |
| 
 | |
|   // input single big word end with escape
 | |
|   input3.assign_buffer(input_buf, ObMockIteratorBuilder::MAX_DATA_LENGTH + 16);
 | |
|   input3.write("varchar\n", sizeof("varchar\n") - 1);
 | |
|   for (int i = 0; i < ObMockIteratorBuilder::MAX_DATA_LENGTH; i++) {
 | |
|     input3.write("a", 1);
 | |
|   }
 | |
|   input3.write("\\r\n", 3);
 | |
|   ASSERT_EQ(OB_ARRAY_OUT_OF_RANGE, iter.from(input3));
 | |
| 
 | |
|   // escape at the end
 | |
|   const char *input4 = "varchar\n"
 | |
|                        "#";
 | |
|   ASSERT_EQ(OB_ARRAY_OUT_OF_RANGE, iter.from(input4, '#'));
 | |
| 
 | |
| }
 | |
| 
 | |
| TEST_F(TestObMockIteratorBuilder, parse)
 | |
| {
 | |
|   number::ObNumber nmb;
 | |
|   int64_t usec = 0;
 | |
|   int64_t pos = 0;
 | |
|   const char *input = "int  Varchar  number timestamp                  flag         dml\n"
 | |
|                       "0x1a number   1.2    '2012-12-12 01:21:12'      RF_ROW_EXIST T_DML_INSERT\n"
 | |
|                       "-1   '2\\' 3' -3     '2014-05-06 12:34:56.6789' OP_DEL_ROW   T_DML_REPLACE\n";
 | |
| 
 | |
|   ASSERT_EQ(OB_SUCCESS, iter.from(input));
 | |
| 
 | |
|   // row 0
 | |
|   ASSERT_EQ(OB_SUCCESS, iter.get_next_row(row));
 | |
|   // int
 | |
|   ASSERT_EQ(ObIntType, row->row_val_.cells_[0].get_type());
 | |
|   ASSERT_EQ(0x1a, row->row_val_.cells_[0].get_int());
 | |
| 
 | |
|   // varchar
 | |
|   ASSERT_EQ(ObVarcharType, row->row_val_.cells_[1].get_type());
 | |
|   row->row_val_.cells_[1].get_varchar(vchar);
 | |
|   vchar.to_string(buf, ObMockIteratorBuilder::MAX_DATA_LENGTH);
 | |
|   ASSERT_STREQ("number", buf);
 | |
| 
 | |
|   // number
 | |
|   ASSERT_EQ(ObNumberType, row->row_val_.cells_[2].get_type());
 | |
|   row->row_val_.cells_[2].get_number(nmb);
 | |
|   ASSERT_STREQ("1.2", nmb.format());
 | |
| 
 | |
|   // timestamp
 | |
|   ASSERT_TRUE(row->row_val_.cells_[3].is_timestamp());
 | |
|   row->row_val_.cells_[3].get_timestamp(usec);
 | |
|   pos = 0;
 | |
|   ObTimeUtility::usec_format_to_str(usec, ObString::make_string("%Y-%m-%d %T"),
 | |
|                                     buf, ObMockIteratorBuilder::MAX_DATA_LENGTH, pos);
 | |
|   ASSERT_STREQ("2012-12-12 01:21:12", buf);
 | |
| 
 | |
|   // flag and dml
 | |
|   ASSERT_EQ(+RF_ROW_EXIST, row->flag_);
 | |
|   ASSERT_EQ(T_DML_INSERT, row->get_dml());
 | |
| 
 | |
|   // row 1
 | |
|   ASSERT_EQ(OB_SUCCESS, iter.get_next_row(row));
 | |
|   // int negative
 | |
|   ASSERT_EQ(ObIntType, row->row_val_.cells_[0].get_type());
 | |
|   ASSERT_EQ(-1, row->row_val_.cells_[0].get_int());
 | |
| 
 | |
|   // varchar with eacape and space
 | |
|   ASSERT_EQ(ObVarcharType, row->row_val_.cells_[1].get_type());
 | |
|   row->row_val_.cells_[1].get_varchar(vchar);
 | |
|   vchar.to_string(buf, ObMockIteratorBuilder::MAX_DATA_LENGTH);
 | |
|   ASSERT_STREQ("2' 3", buf);
 | |
| 
 | |
|   // number negative
 | |
|   ASSERT_EQ(ObNumberType, row->row_val_.cells_[2].get_type());
 | |
|   row->row_val_.cells_[2].get_number(nmb);
 | |
|   ASSERT_STREQ("-3", nmb.format());
 | |
| 
 | |
|   // timestamp with ms
 | |
|   ASSERT_TRUE(row->row_val_.cells_[3].is_timestamp());
 | |
|   row->row_val_.cells_[3].get_timestamp(usec);
 | |
|   pos = 0;
 | |
|   ObTimeUtility::usec_format_to_str(usec, ObString::make_string("%Y-%m-%d %T.%f"),
 | |
|                                     buf, ObMockIteratorBuilder::MAX_DATA_LENGTH, pos);
 | |
|   ASSERT_STREQ("2014-05-06 12:34:56.678900", buf);
 | |
| 
 | |
|   // flag and dml
 | |
|   ASSERT_EQ(+RF_DELETE, row->flag_);
 | |
|   ASSERT_EQ(T_DML_REPLACE, row->get_dml());
 | |
| 
 | |
| }
 | |
| 
 | |
| TEST_F(TestObMockIteratorBuilder, equals)
 | |
| {
 | |
|   ObMockStoreRowIterator iter1;
 | |
|   const char *input1 =
 | |
|       "int var num\n"
 | |
|       "1   2   3\n";
 | |
|   ASSERT_EQ(OB_SUCCESS, iter1.from(input1));
 | |
| 
 | |
|   ObMockStoreRowIterator iter2;
 | |
|   const char *input2 =
 | |
|       "int var num\n"
 | |
|       "1   2   4\n";
 | |
|   EXPECT_EQ(OB_SUCCESS, iter2.from(input2));
 | |
|   EXPECT_FALSE(iter2.equals(iter1));
 | |
| 
 | |
|   ObMockStoreRowIterator iter3;
 | |
|   const char *input3 =
 | |
|       "int var num\n"
 | |
|       "1   2   3\n";
 | |
|   EXPECT_EQ(OB_SUCCESS, iter3.from(input3));
 | |
|   // rewind two iter before call
 | |
|   EXPECT_FALSE(iter3.equals(iter1));
 | |
| 
 | |
|   iter1.reset_iter();
 | |
|   iter3.reset_iter();
 | |
|   EXPECT_TRUE(iter3.equals(iter1));
 | |
| 
 | |
|   ObMockStoreRowIterator iter4;
 | |
|   const char *input4 =
 | |
|       "int var   num\n"
 | |
|       "1   2     3\n"
 | |
|       "2   'int' 4\n";
 | |
|   EXPECT_EQ(OB_SUCCESS, iter4.from(input4));
 | |
|   iter1.reset_iter();
 | |
|   EXPECT_FALSE(iter4.equals(iter1));
 | |
| }
 | |
| 
 | |
| TEST_F(TestObMockIteratorBuilder, test_new_row)
 | |
| {
 | |
|   ObMockNewRowIterator iter1;
 | |
|   const char *input1 =
 | |
|       "int var num\n"
 | |
|       "1   2   3\n";
 | |
|   ASSERT_EQ(OB_SUCCESS, iter1.from(input1));
 | |
| 
 | |
|   ObMockNewRowIterator iter2;
 | |
|   const char *input2 =
 | |
|       "int var num\n"
 | |
|       "1   2   4\n";
 | |
|   EXPECT_EQ(OB_SUCCESS, iter2.from(input2));
 | |
|   EXPECT_FALSE(iter2.equals(iter1));
 | |
| }
 | |
| 
 | |
| TEST_F(TestObMockIteratorBuilder, test_query_row)
 | |
| {
 | |
|   ObMockQueryRowIterator iter1;
 | |
|   const char *input1 =
 | |
|       "int var num\n"
 | |
|       "1   2   3\n";
 | |
|   ASSERT_EQ(OB_SUCCESS, iter1.from(input1));
 | |
| 
 | |
|   ObMockQueryRowIterator iter2;
 | |
|   const char *input2 =
 | |
|       "int var num\n"
 | |
|       "1   2   4\n";
 | |
|   EXPECT_EQ(OB_SUCCESS, iter2.from(input2));
 | |
|   EXPECT_FALSE(iter2.equals(iter1));
 | |
| }
 | |
| 
 | |
| }
 | |
| }
 | |
| 
 | |
| int main(int argc, char **argv)
 | |
| {
 | |
|   OB_LOGGER.set_log_level("WARN");
 | |
| 
 | |
|   testing::InitGoogleTest(&argc, argv);
 | |
|   return RUN_ALL_TESTS();
 | |
| }
 | 
