1/**
2 * Copyright 2021 Alibaba, Inc. and its affiliates. All Rights Reserved.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *
16 * \author hongqing.hu
17 * \date Dec 2020
18 * \brief
19 */
20
21#include <mysql.h>
22#include <gtest/gtest.h>
23#define private public
24#include "repository/binlog/binlog_event.h"
25#undef private
26#include "common/error_code.h"
27#include "proto/common.pb.h"
28#include "event_builder.h"
29
30using namespace ::proxima::be;
31using namespace proxima::be::repository;
32
33class BinlogEventTest : public testing::Test {
34 protected:
35 void SetUp() {}
36
37 void TearDown() {}
38
39 protected:
40};
41
42
43TEST_F(BinlogEventTest, TestTableMapEvent) {
44 uint64_t table_id = 1000;
45 std::string db("test_db");
46 std::string table_name("table1");
47 {
48 size_t column_count = 1;
49 std::vector<bool> column_nulls(column_count, false);
50 std::vector<enum_field_types> column_types(column_count, MYSQL_TYPE_LONG);
51 std::vector<int32_t> column_metas(column_count, 0);
52 std::string table_map = EventBuilder::BuildTableMapEvent(
53 table_id, db, table_name, column_types, column_metas, column_nulls);
54 TableMapEventPtr event =
55 std::make_shared<TableMapEvent>(table_map.c_str(), table_map.size());
56 ASSERT_TRUE(event->is_valid());
57 }
58}
59
60TEST_F(BinlogEventTest, TestDecodeMetaData) {
61 char buf[1024];
62 TableMapEvent event(buf, 1);
63 std::vector<ColumnInfo> &columns = event.column_info_;
64 std::vector<int32_t> types = {
65 MYSQL_TYPE_TINY_BLOB, MYSQL_TYPE_BLOB, MYSQL_TYPE_MEDIUM_BLOB,
66 MYSQL_TYPE_LONG_BLOB, MYSQL_TYPE_DOUBLE, MYSQL_TYPE_FLOAT,
67 MYSQL_TYPE_GEOMETRY, MYSQL_TYPE_JSON, MYSQL_TYPE_SET,
68 MYSQL_TYPE_ENUM, MYSQL_TYPE_STRING, MYSQL_TYPE_BIT,
69 MYSQL_TYPE_VARCHAR, MYSQL_TYPE_NEWDECIMAL, MYSQL_TYPE_TIME2,
70 MYSQL_TYPE_DATETIME2, MYSQL_TYPE_TIMESTAMP2, MYSQL_TYPE_LONG};
71 columns.resize(types.size());
72 for (size_t i = 0; i < types.size(); ++i) {
73 columns[i].type = types[i];
74 columns[i].meta = 0;
75 }
76 event.column_count_ = columns.size();
77
78 std::vector<uint8_t> values;
79 for (size_t i = 0; i < 8; ++i) {
80 values.emplace_back(i + 1);
81 }
82 // string
83 values.emplace_back(1);
84 values.emplace_back(1);
85 // bit
86 values.emplace_back(2);
87 values.emplace_back(1);
88 // varchar
89 values.emplace_back(1);
90 values.emplace_back(2);
91 // new decimal
92 values.emplace_back(2);
93 values.emplace_back(2);
94 // time/datatime/timestamp
95 values.emplace_back(1);
96 values.emplace_back(1);
97 values.emplace_back(1);
98
99 event.decode_meta_data((const char *)values.data());
100
101 for (size_t i = 0; i < 8; ++i) {
102 ASSERT_EQ(columns[i].meta, i + 1);
103 }
104 ASSERT_EQ(columns[8].meta, 0);
105 ASSERT_EQ(columns[9].meta, 0);
106 ASSERT_EQ(columns[10].meta, 257);
107 ASSERT_EQ(columns[11].meta, 258);
108 ASSERT_EQ(columns[12].meta, 513);
109 ASSERT_EQ(columns[13].meta, 514);
110 ASSERT_EQ(columns[14].meta, 1);
111 ASSERT_EQ(columns[15].meta, 1);
112 ASSERT_EQ(columns[16].meta, 1);
113 ASSERT_EQ(columns[17].meta, 0);
114}
115