Skip to content

Commit 942a0b5

Browse files
mjs1995heehehe
andauthored
Enhance Testing with MySQL8 & Update GitHub Actions (#484)
Co-authored-by: Heeseon Cheon <[email protected]>
1 parent 8b23b9a commit 942a0b5

File tree

7 files changed

+106
-10
lines changed

7 files changed

+106
-10
lines changed

.github/workflows/pytest.yml

+3-3
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,14 @@ jobs:
1313
- {name: 'Pypy 3.9', python: 'pypy-3.9'}
1414
name: ${{ matrix.name }}
1515
runs-on: ubuntu-latest
16-
timeout-minutes: 2
16+
timeout-minutes: 3
1717

1818
steps:
1919
- name: Check out code
20-
uses: actions/checkout@v2
20+
uses: actions/checkout@v4
2121

2222
- name: Setup Python
23-
uses: actions/setup-python@v2
23+
uses: actions/setup-python@v4
2424
with:
2525
python-version: ${{ matrix.python }}
2626

docker-compose-test.yml

+13-1
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,15 @@ services:
3737
networks:
3838
- default
3939

40+
percona-8.0:
41+
<<: *mysql
42+
image: percona:8.0
43+
platform: linux/amd64
44+
ports:
45+
- "3309:3306"
46+
networks:
47+
- default
48+
4049
mariadb-10.6:
4150
<<: *mariadb
4251
image: mariadb:10.6
@@ -61,6 +70,8 @@ services:
6170
MYSQL_5_7: percona-5.7
6271
MYSQL_5_7_CTL: percona-5.7-ctl
6372
MYSQL_5_7_CTL_PORT: 3306
73+
MYSQL_8_0: percona-8.0
74+
MYSQL_8_0_PORT: 3306
6475
MARIADB_10_6: mariadb-10.6
6576
MARIADB_10_6_PORT: 3306
6677

@@ -72,7 +83,7 @@ services:
7283
7384
while :
7485
do
75-
if mysql -h percona-5.7 --user=root --execute "SELECT version();" 2>&1 >/dev/null && mysql -h percona-5.7-ctl --user=root --execute "SELECT version();" 2>&1 >/dev/null; then
86+
if mysql -h percona-5.7 --user=root --execute "SELECT version();" 2>&1 >/dev/null && mysql -h percona-5.7-ctl --user=root --execute "SELECT version();" 2>&1 >/dev/null && mysql -h percona-8.0 --user=root --execute "SELECT version();" 2>&1 >/dev/null; then
7687
break
7788
fi
7889
sleep 1
@@ -87,6 +98,7 @@ services:
8798
depends_on:
8899
- percona-5.7
89100
- percona-5.7-ctl
101+
- percona-8.0
90102

91103
networks:
92104
default:

docker-compose.yml

+6
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,12 @@ services:
3333
ports:
3434
- "3307:3306"
3535

36+
percona-8.0:
37+
<<: *mysql
38+
image: percona:8.0
39+
ports:
40+
- "3309:3306"
41+
3642
mariadb-10.6:
3743
<<: *mariadb
3844
image: mariadb:10.6

pymysqlreplication/tests/base.py

+28
Original file line numberDiff line numberDiff line change
@@ -160,3 +160,31 @@ def bin_log_basename(self):
160160
bin_log_basename = cursor.fetchone()[0]
161161
bin_log_basename = bin_log_basename.split("/")[-1]
162162
return bin_log_basename
163+
164+
165+
class PyMySQLReplicationVersion8TestCase(PyMySQLReplicationTestCase):
166+
def setUp(self):
167+
super().setUp()
168+
# default
169+
self.database = {
170+
"host": os.environ.get("MYSQL_8_0") or "localhost",
171+
"user": "root",
172+
"passwd": "",
173+
"port": int(os.environ.get("MYSQL_8_0_PORT") or 3309),
174+
"use_unicode": True,
175+
"charset": "utf8",
176+
"db": "pymysqlreplication_test",
177+
}
178+
179+
self.conn_control = None
180+
db = copy.copy(self.database)
181+
db["db"] = None
182+
self.connect_conn_control(db)
183+
self.execute("DROP DATABASE IF EXISTS pymysqlreplication_test")
184+
self.execute("CREATE DATABASE pymysqlreplication_test")
185+
db = copy.copy(self.database)
186+
self.connect_conn_control(db)
187+
self.stream = None
188+
self.resetBinLog()
189+
self.isMySQL80AndMore()
190+
self.__is_mariaDB = None

pymysqlreplication/tests/test_basic.py

+5-5
Original file line numberDiff line numberDiff line change
@@ -1478,7 +1478,7 @@ def test_query_event_latin1(self):
14781478
assert event.query == r"CREATE TABLE test_latin1_\xd6\xc6\xdb (a INT)"
14791479

14801480

1481-
class TestOptionalMetaData(base.PyMySQLReplicationTestCase):
1481+
class TestOptionalMetaData(base.PyMySQLReplicationVersion8TestCase):
14821482
def setUp(self):
14831483
super(TestOptionalMetaData, self).setUp()
14841484
self.stream.close()
@@ -1703,7 +1703,7 @@ def test_sync_drop_table_map_event_table_schema(self):
17031703

17041704
event = self.stream.fetchone()
17051705
self.assertIsInstance(event, TableMapEvent)
1706-
self.assertEqual(event.table_obj.data["columns"][0].name, "name")
1706+
self.assertEqual(event.table_obj.data["columns"][0].name, None)
17071707
self.assertEqual(len(column_schemas), 0)
17081708

17091709
def test_sync_column_drop_event_table_schema(self):
@@ -1734,9 +1734,9 @@ def test_sync_column_drop_event_table_schema(self):
17341734
self.assertEqual(len(event.table_obj.data["columns"]), 3)
17351735
self.assertEqual(column_schemas[0][0], "drop_column1")
17361736
self.assertEqual(column_schemas[1][0], "drop_column3")
1737-
self.assertEqual(event.table_obj.data["columns"][0].name, "drop_column1")
1738-
self.assertEqual(event.table_obj.data["columns"][1].name, "drop_column2")
1739-
self.assertEqual(event.table_obj.data["columns"][2].name, "drop_column3")
1737+
self.assertEqual(event.table_obj.data["columns"][0].name, None)
1738+
self.assertEqual(event.table_obj.data["columns"][1].name, None)
1739+
self.assertEqual(event.table_obj.data["columns"][2].name, None)
17401740

17411741
def tearDown(self):
17421742
self.execute("SET GLOBAL binlog_row_metadata='MINIMAL';")

pymysqlreplication/tests/test_data_type.py

+45-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
from pymysqlreplication._compat import text_type
2222

2323

24-
__all__ = ["TestDataType"]
24+
__all__ = ["TestDataType", "TestDataTypeVersion8"]
2525

2626

2727
def to_binary_dict(d):
@@ -954,5 +954,49 @@ def test_varbinary(self):
954954
self.assertEqual(event.rows[0]["values"]["b"], b"\xff\x01\x00\x00")
955955

956956

957+
class TestDataTypeVersion8(base.PyMySQLReplicationVersion8TestCase):
958+
def ignoredEvents(self):
959+
return [GtidEvent, PreviousGtidsEvent]
960+
961+
def create_and_insert_value(self, create_query, insert_query):
962+
self.execute(create_query)
963+
self.execute(insert_query)
964+
self.execute("COMMIT")
965+
966+
self.assertIsInstance(self.stream.fetchone(), RotateEvent)
967+
self.assertIsInstance(self.stream.fetchone(), FormatDescriptionEvent)
968+
# QueryEvent for the Create Table
969+
self.assertIsInstance(self.stream.fetchone(), QueryEvent)
970+
971+
# QueryEvent for the BEGIN
972+
self.assertIsInstance(self.stream.fetchone(), QueryEvent)
973+
974+
self.assertIsInstance(self.stream.fetchone(), TableMapEvent)
975+
976+
event = self.stream.fetchone()
977+
if self.isMySQL56AndMore():
978+
self.assertEqual(event.event_type, WRITE_ROWS_EVENT_V2)
979+
else:
980+
self.assertEqual(event.event_type, WRITE_ROWS_EVENT_V1)
981+
self.assertIsInstance(event, WriteRowsEvent)
982+
return event
983+
984+
def test_partition_id(self):
985+
if not self.isMySQL80AndMore():
986+
self.skipTest("Not supported in this version of MySQL")
987+
create_query = "CREATE TABLE test (id INTEGER) \
988+
PARTITION BY RANGE (id) ( \
989+
PARTITION p0 VALUES LESS THAN (1), \
990+
PARTITION p1 VALUES LESS THAN (2), \
991+
PARTITION p2 VALUES LESS THAN (3), \
992+
PARTITION p3 VALUES LESS THAN (4), \
993+
PARTITION p4 VALUES LESS THAN (5) \
994+
)"
995+
insert_query = "INSERT INTO test (id) VALUES(3)"
996+
event = self.create_and_insert_value(create_query, insert_query)
997+
self.assertEqual(event.extra_data_type, 1)
998+
self.assertEqual(event.partition_id, 3)
999+
1000+
9571001
if __name__ == "__main__":
9581002
unittest.main()

test.Dockerfile

+6
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,12 @@ ENV MYSQL_5_7_CTL ${MYSQL_5_7_CTL}
1919
ARG MYSQL_5_7_CTL_PORT
2020
ENV MYSQL_5_7_CTL_PORT ${MYSQL_5_7_CTL_PORT}
2121

22+
ARG MYSQL_8_0
23+
ENV MYSQL_8_0 ${MYSQL_8_0}
24+
25+
ARG MYSQL_8_0_PORT
26+
ENV MYSQL_8_0_PORT ${MYSQL_8_0_PORT}
27+
2228
ARG MARIADB_10_6
2329
ENV MARIADB_10_6 ${MARIADB_10_6}
2430

0 commit comments

Comments
 (0)