From 57a7e9a4e9b67db153a459874cd09c72f58f10bf Mon Sep 17 00:00:00 2001 From: lre12 Date: Fri, 28 Jul 2023 23:47:08 +0900 Subject: [PATCH 1/3] add docker compose for local test --- docker-compose-test.yml | 54 ++++++++++++++++++++++++++ pymysqlreplication/tests/base.py | 4 +- pymysqlreplication/tests/test_basic.py | 4 ++ test.Dockerfile | 16 ++++++++ 4 files changed, 75 insertions(+), 3 deletions(-) create mode 100644 docker-compose-test.yml create mode 100644 test.Dockerfile diff --git a/docker-compose-test.yml b/docker-compose-test.yml new file mode 100644 index 00000000..7de45a21 --- /dev/null +++ b/docker-compose-test.yml @@ -0,0 +1,54 @@ +version: '3.2' +services: + percona-5.7: + platform: linux/amd64 + image: percona:5.7 + environment: + MYSQL_ALLOW_EMPTY_PASSWORD: true + MYSQL_DATABASE: pymysqlreplication_test + ports: + - 3306:3306 + command: mysqld --log-bin=mysql-bin.log --server-id 1 --binlog-format=row --gtid_mode=on --enforce-gtid-consistency=on --log_slave_updates + restart: always + networks: + - default + + percona-5.7-ctl: + image: percona:5.7 + environment: + MYSQL_ALLOW_EMPTY_PASSWORD: true + MYSQL_DATABASE: pymysqlreplication_test + ports: + - 3307:3307 + command: mysqld --log-bin=mysql-bin.log --server-id 1 --binlog-format=row --gtid_mode=on --enforce-gtid-consistency=on --log_slave_updates -P 3307 + + pymysqlreplication: + build: + context: . + dockerfile: test.Dockerfile + args: + BASE_IMAGE: python:3.11-alpine + MYSQL_5_7: percona-5.7 + MYSQL_5_7_CTL: percona-5.7-ctl + + command: + - /bin/sh + - -ce + - | + echo "wait mysql server" + for i in $$(seq 1 40); do + echo "retry: $$i/40" && sleep 1 + if mysql -h percona-5.7 --user=root --execute "USE pymysqlreplication_test;" 2>&1 >/dev/null; then break; fi + done + + echo "run pytest" + pytest -k "not test_no_trailing_rotate_event and not test_end_log_pos" + + working_dir: /pymysqlreplication + networks: + - default + depends_on: + - percona-5.7 + +networks: + default: {} \ No newline at end of file diff --git a/pymysqlreplication/tests/base.py b/pymysqlreplication/tests/base.py index 037c6d9d..8354a343 100644 --- a/pymysqlreplication/tests/base.py +++ b/pymysqlreplication/tests/base.py @@ -19,11 +19,9 @@ def ignoredEvents(self): return [] def setUp(self): - - db = os.environ.get('DB') # default self.database = { - "host": "localhost", + "host": os.environ.get("MYSQL_5_7") or "localhost", "user": "root", "passwd": "", "port": 3306, diff --git a/pymysqlreplication/tests/test_basic.py b/pymysqlreplication/tests/test_basic.py index 0db8a264..043a688f 100644 --- a/pymysqlreplication/tests/test_basic.py +++ b/pymysqlreplication/tests/test_basic.py @@ -1,4 +1,6 @@ # -*- coding: utf-8 -*- +import os + import pymysql import copy import time @@ -768,6 +770,8 @@ def setUp(self): ctl_db = copy.copy(self.database) ctl_db["db"] = None ctl_db["port"] = 3307 + if ctl_host := os.environ.get("MYSQL_5_7_CTL"): + ctl_db["host"] = ctl_host self.ctl_conn_control = pymysql.connect(**ctl_db) self.ctl_conn_control.cursor().execute("DROP DATABASE IF EXISTS pymysqlreplication_test") self.ctl_conn_control.cursor().execute("CREATE DATABASE pymysqlreplication_test") diff --git a/test.Dockerfile b/test.Dockerfile new file mode 100644 index 00000000..6aa2e34a --- /dev/null +++ b/test.Dockerfile @@ -0,0 +1,16 @@ +ARG BASE_IMAGE=${BASE_IMAGE:-python:3.11-alpine} +FROM ${BASE_IMAGE} + +COPY pymysqlreplication pymysqlreplication +COPY README.md README.md +COPY setup.py setup.py +RUN apk add bind-tools +RUN apk add mysql-client +RUN pip install . +RUN pip install pytest + +ARG MYSQL_5_7 +ENV MYSQL_5_7 ${MYSQL_5_7} + +ARG MYSQL_5_7_CTL +ENV MYSQL_5_7_CTL ${MYSQL_5_7_CTL} \ No newline at end of file From 240e54c004e6cee5682df24cdee7964b33316efd Mon Sep 17 00:00:00 2001 From: lre12 Date: Fri, 28 Jul 2023 23:58:02 +0900 Subject: [PATCH 2/3] fix test for python 3.7 --- docker-compose-test.yml | 2 +- pymysqlreplication/tests/test_basic.py | 4 ++-- test.Dockerfile | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docker-compose-test.yml b/docker-compose-test.yml index 7de45a21..a8532df7 100644 --- a/docker-compose-test.yml +++ b/docker-compose-test.yml @@ -51,4 +51,4 @@ services: - percona-5.7 networks: - default: {} \ No newline at end of file + default: {} diff --git a/pymysqlreplication/tests/test_basic.py b/pymysqlreplication/tests/test_basic.py index 043a688f..f661fc75 100644 --- a/pymysqlreplication/tests/test_basic.py +++ b/pymysqlreplication/tests/test_basic.py @@ -770,8 +770,8 @@ def setUp(self): ctl_db = copy.copy(self.database) ctl_db["db"] = None ctl_db["port"] = 3307 - if ctl_host := os.environ.get("MYSQL_5_7_CTL"): - ctl_db["host"] = ctl_host + if os.environ.get("MYSQL_5_7_CTL") is not None: + ctl_db["host"] = os.environ.get("MYSQL_5_7_CTL") self.ctl_conn_control = pymysql.connect(**ctl_db) self.ctl_conn_control.cursor().execute("DROP DATABASE IF EXISTS pymysqlreplication_test") self.ctl_conn_control.cursor().execute("CREATE DATABASE pymysqlreplication_test") diff --git a/test.Dockerfile b/test.Dockerfile index 6aa2e34a..8dc74660 100644 --- a/test.Dockerfile +++ b/test.Dockerfile @@ -13,4 +13,4 @@ ARG MYSQL_5_7 ENV MYSQL_5_7 ${MYSQL_5_7} ARG MYSQL_5_7_CTL -ENV MYSQL_5_7_CTL ${MYSQL_5_7_CTL} \ No newline at end of file +ENV MYSQL_5_7_CTL ${MYSQL_5_7_CTL} From 6e2aa82ff73500892f2b4d5d82ff9cb8bd9d503f Mon Sep 17 00:00:00 2001 From: lre12 Date: Sat, 29 Jul 2023 13:57:29 +0900 Subject: [PATCH 3/3] add all instance connection check --- docker-compose-test.yml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/docker-compose-test.yml b/docker-compose-test.yml index a8532df7..78ac55b3 100644 --- a/docker-compose-test.yml +++ b/docker-compose-test.yml @@ -36,9 +36,12 @@ services: - -ce - | echo "wait mysql server" - for i in $$(seq 1 40); do - echo "retry: $$i/40" && sleep 1 - if mysql -h percona-5.7 --user=root --execute "USE pymysqlreplication_test;" 2>&1 >/dev/null; then break; fi + + while : + do + if mysql -h percona-5.7 --user=root --execute "USE pymysqlreplication_test;" 2>&1 >/dev/null && mysql -h percona-5.7-ctl --port=3307 --user=root --execute "USE pymysqlreplication_test;" 2>&1 >/dev/null; then + break + fi done echo "run pytest"