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 | |
30 | using namespace ::proxima::be; |
31 | using namespace proxima::be::repository; |
32 | |
33 | class BinlogEventTest : public testing::Test { |
34 | protected: |
35 | void SetUp() {} |
36 | |
37 | void TearDown() {} |
38 | |
39 | protected: |
40 | }; |
41 | |
42 | |
43 | TEST_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 | |
60 | TEST_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 | |