Skip to content

Commit a3d241f

Browse files
authored
Improve CI (vapor#40)
* improve ci * updates * formatting updates * fix typo * fix mariadb null * change log level * fix bit * fix mac commands * trim * trim * fix log level * slightly more logs * all tests * finalize tests
1 parent 11b69fe commit a3d241f

File tree

5 files changed

+152
-107
lines changed

5 files changed

+152
-107
lines changed

.github/workflows/test.yml

Lines changed: 123 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -1,105 +1,141 @@
11
name: test
2-
on:
3-
- pull_request
2+
on:
3+
- pull_request
4+
defaults:
5+
run:
6+
shell: bash
47
jobs:
5-
mysql-nio:
6-
container:
7-
image: vapor/swift:5.2
8+
dependents:
9+
runs-on: ubuntu-latest
810
services:
9-
mysql:
10-
image: mysql
11-
env:
12-
MYSQL_ALLOW_EMPTY_PASSWORD: true
13-
MYSQL_DATABASE: vapor_database
11+
mysql-a:
12+
image: ${{ matrix.dbimage }}
13+
env:
14+
MYSQL_ALLOW_EMPTY_PASSWORD: "true"
1415
MYSQL_USER: vapor_username
1516
MYSQL_PASSWORD: vapor_password
16-
runs-on: ubuntu-latest
17-
steps:
18-
- uses: actions/checkout@v1
19-
- run: swift test --enable-test-discovery --sanitize=thread
20-
env:
21-
MYSQL_HOSTNAME: mysql
22-
mysql-nio-8_0:
23-
container:
24-
image: vapor/swift:5.2
25-
services:
26-
mysql:
27-
image: mysql:8.0
28-
env:
29-
MYSQL_ALLOW_EMPTY_PASSWORD: true
3017
MYSQL_DATABASE: vapor_database
18+
mysql-b:
19+
image: ${{ matrix.dbimage }}
20+
env:
21+
MYSQL_ALLOW_EMPTY_PASSWORD: "true"
3122
MYSQL_USER: vapor_username
3223
MYSQL_PASSWORD: vapor_password
33-
runs-on: ubuntu-latest
24+
MYSQL_DATABASE: vapor_database
25+
container: swift:5.2-bionic
26+
strategy:
27+
fail-fast: false
28+
matrix:
29+
dbimage:
30+
- mysql:5.7
31+
- mysql:8.0
32+
- mariadb:latest
33+
dependent:
34+
- mysql-kit
35+
- fluent-mysql-driver
3436
steps:
35-
- uses: actions/checkout@v1
36-
- run: swift test --enable-test-discovery --sanitize=thread
37-
env:
38-
MYSQL_HOSTNAME: mysql
39-
mysql-nio-5_7:
40-
container:
41-
image: vapor/swift:5.2
42-
services:
43-
mysql:
44-
image: mysql:5.7
37+
- name: Check out package
38+
uses: actions/checkout@v2
39+
with:
40+
path: package
41+
- name: Check out dependent
42+
uses: actions/checkout@v2
43+
with:
44+
repository: vapor/${{ matrix.dependent }}
45+
path: dependent
46+
- name: Use local package
47+
run: swift package edit mysql-nio --path ../package
48+
working-directory: dependent
49+
- name: Run tests with Thread Sanitizer
50+
run: swift test --enable-test-discovery --sanitize=thread
51+
working-directory: dependent
4552
env:
46-
MYSQL_ALLOW_EMPTY_PASSWORD: true
47-
MYSQL_DATABASE: vapor_database
48-
MYSQL_USER: vapor_username
49-
MYSQL_PASSWORD: vapor_password
53+
MYSQL_HOSTNAME: mysql-a
54+
MYSQL_HOSTNAME_A: mysql-a
55+
MYSQL_HOSTNAME_B: mysql-b
56+
LOG_LEVEL: error
57+
linux:
58+
strategy:
59+
fail-fast: false
60+
matrix:
61+
dbimage:
62+
- mysql:5.7
63+
- mysql:8.0
64+
- mariadb:latest
65+
runner:
66+
# 5.2 Stable
67+
- swift:5.2-xenial
68+
- swift:5.2-bionic
69+
# 5.2 Unstable
70+
- swiftlang/swift:nightly-5.2-xenial
71+
- swiftlang/swift:nightly-5.2-bionic
72+
# 5.3 Unstable
73+
- swiftlang/swift:nightly-5.3-xenial
74+
- swiftlang/swift:nightly-5.3-bionic
75+
# Master Unsable
76+
- swiftlang/swift:nightly-master-xenial
77+
- swiftlang/swift:nightly-master-bionic
78+
- swiftlang/swift:nightly-master-focal
79+
- swiftlang/swift:nightly-master-centos8
80+
- swiftlang/swift:nightly-master-amazonlinux2
81+
exclude:
82+
- runner: swiftlang/swift:nightly-master-amazonlinux2
83+
dbimage: mysql:8.0
84+
container: ${{ matrix.runner }}
5085
runs-on: ubuntu-latest
51-
steps:
52-
- uses: actions/checkout@v1
53-
- run: swift test --enable-test-discovery --sanitize=thread
54-
env:
55-
MYSQL_HOSTNAME: mysql
56-
mysql-kit:
57-
container:
58-
image: vapor/swift:5.2
5986
services:
6087
mysql:
61-
image: mysql
62-
env:
63-
MYSQL_ALLOW_EMPTY_PASSWORD: true
64-
MYSQL_DATABASE: vapor_database
88+
image: ${{ matrix.dbimage }}
89+
env:
90+
MYSQL_ALLOW_EMPTY_PASSWORD: "true"
6591
MYSQL_USER: vapor_username
6692
MYSQL_PASSWORD: vapor_password
67-
runs-on: ubuntu-latest
68-
steps:
69-
- run: git clone -b master https://github.com/vapor/mysql-kit.git
70-
working-directory: ./
71-
- run: swift package edit mysql-nio --revision ${{ github.sha }}
72-
working-directory: ./mysql-kit
73-
- run: swift test --enable-test-discovery --sanitize=thread
74-
working-directory: ./mysql-kit
75-
env:
76-
MYSQL_HOSTNAME: mysql
77-
fluent-mysql-driver:
78-
container:
79-
image: vapor/swift:5.2
80-
services:
81-
mysql-a:
82-
image: mysql
83-
env:
84-
MYSQL_ALLOW_EMPTY_PASSWORD: true
8593
MYSQL_DATABASE: vapor_database
86-
MYSQL_USER: vapor_username
87-
MYSQL_PASSWORD: vapor_password
88-
mysql-b:
89-
image: mysql
94+
steps:
95+
- name: Check out code
96+
uses: actions/checkout@v2
97+
- name: Run tests with Thread Sanitizer
98+
run: swift test --enable-test-discovery --sanitize=thread
9099
env:
91-
MYSQL_ALLOW_EMPTY_PASSWORD: true
92-
MYSQL_DATABASE: vapor_database
93-
MYSQL_USER: vapor_username
94-
MYSQL_PASSWORD: vapor_password
95-
runs-on: ubuntu-latest
100+
MYSQL_HOSTNAME: mysql
101+
LOG_LEVEL: error
102+
macOS:
103+
strategy:
104+
fail-fast: false
105+
matrix:
106+
formula:
107+
- mysql@8.0
108+
- mysql@5.7
109+
- mariadb
110+
include:
111+
- username: root
112+
- formula: mariadb
113+
username: runner
114+
runs-on: macos-latest
96115
steps:
97-
- run: git clone -b master https://github.com/vapor/fluent-mysql-driver.git
98-
working-directory: ./
99-
- run: swift package edit mysql-nio --revision ${{ github.sha }}
100-
working-directory: ./fluent-mysql-driver
101-
- run: swift test --enable-test-discovery --sanitize=thread
102-
working-directory: ./fluent-mysql-driver
103-
env:
104-
MYSQL_HOSTNAME_A: mysql-a
105-
MYSQL_HOSTNAME_B: mysql-b
116+
- name: Select latest available Xcode
117+
uses: maxim-lobanov/setup-xcode@1.0
118+
with:
119+
xcode-version: latest
120+
- name: Install MySQL server from Homebrew
121+
run: brew install ${{ matrix.formula }} && brew link --force ${{ matrix.formula }}
122+
- name: Start MySQL server
123+
run: brew services start ${{ matrix.formula }}
124+
- name: Wait for MySQL server to be ready
125+
run: until echo | mysql -u${{ matrix.username }}; do sleep 1; done
126+
timeout-minutes: 5
127+
- name: Set up MySQL databases and privileges
128+
run: |
129+
mysql -u${{ matrix.username }} --batch <<-'SQL'
130+
CREATE USER vapor_username@localhost IDENTIFIED BY 'vapor_password';
131+
CREATE DATABASE vapor_database;
132+
GRANT ALL PRIVILEGES ON vapor_database.* TO vapor_username@localhost;
133+
SQL
134+
- name: Check out code
135+
uses: actions/checkout@v2
136+
- name: Run tests with Thread Sanitizer
137+
run: swift test --enable-test-discovery --sanitize=thread
138+
env:
139+
MYSQL_HOSTNAME: '127.0.0.1'
140+
MYSQL_DATABASE: vapor_database
141+
LOG_LEVEL: error

Sources/MySQLNIO/MySQLData.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ public struct MySQLData: CustomStringConvertible, ExpressibleByStringLiteral, Ex
185185
return buffer.readString(length: buffer.readableBytes)
186186
default:
187187
switch self.type {
188-
case .varchar, .varString, .string, .blob, .tinyBlob, .mediumBlob, .longBlob:
188+
case .varchar, .varString, .string, .blob, .tinyBlob, .mediumBlob, .longBlob, .null:
189189
return buffer.readString(length: buffer.readableBytes)
190190
case .longlong, .long, .int24, .short, .tiny, .bit:
191191
return self.int?.description

Sources/MySQLNIO/Protocol/MySQLProtocol+DataType.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,10 +96,11 @@ extension MySQLProtocol {
9696

9797
/// Length that this type encodes to. If `nil`, the encoded
9898
/// value is prefixed by a length-encoded integer.
99+
/// https://dev.mysql.com/doc/refman/8.0/en/c-api-prepared-statement-type-codes.html
99100
internal var encodingLength: Int? {
100101
let length: Int?
101102
switch self {
102-
case .string, .varchar, .varString, .enum, .set, .longBlob, .mediumBlob, .blob, .tinyBlob, .geometry, .bit, .decimal, .newdecimal, .json:
103+
case .string, .varchar, .varString, .enum, .set, .longBlob, .mediumBlob, .blob, .tinyBlob, .geometry, .bit, .decimal, .newdecimal, .json, .null:
103104
length = nil
104105
case .longlong:
105106
length = 8

Tests/MySQLNIOTests/MySQLNIOTests.swift

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -303,33 +303,33 @@ final class MySQLNIOTests: XCTestCase {
303303
self.data = value
304304
self.match = { data, file, line in
305305
if let data = data {
306-
XCTAssertEqual(data.description, value.description, name, file: file, line: line)
306+
if data.type == .bit {
307+
XCTAssertEqual(data.bool, value.bool, name, file: file, line: line)
308+
} else {
309+
XCTAssertEqual(data.description, value.description, name, file: file, line: line)
310+
}
307311
} else {
308312
XCTFail("Data null", file: file, line: line)
309313
}
310314
}
311315
}
312316
}
313-
var hello3 = ByteBufferAllocator().buffer(capacity: 0)
314-
hello3.writeString("hello3")
315317

316-
var bit = ByteBufferAllocator().buffer(capacity: 1)
317-
bit.writeInteger(1, as: UInt8.self)
318318
let tests: [TestColumn] = [
319319
.init("xchar", "CHAR(60)", "hello1"),
320320
.init("xvarchar", "VARCHAR(61)", "hello2"),
321-
.init("xtext", "TEXT(62)", MySQLData(type: .blob, buffer: hello3)),
321+
.init("xtext", "TEXT(62)", MySQLData(type: .blob, buffer: .init(string: "hello3"))),
322322
.init("xbinary", "BINARY(6)", "hello4"),
323323
.init("xvarbinary", "VARBINARY(66)", "hello5"),
324-
.init("xbit", "BIT", MySQLData(type: .bit, buffer: bit)),
325-
.init("xtinyint", "TINYINT(1)", 5),
326-
.init("xsmallint", "SMALLINT(1)", 252),
327-
.init("xvarcharnull", "VARCHAR(10)", MySQLData(type: .varString, buffer: nil)),
328-
.init("xmediumint", "MEDIUMINT(1)", 1024),
329-
.init("xinteger", "INTEGER(1)", 1024293),
330-
.init("xbigint", "BIGINT(1)", 234234234),
324+
.init("xbit", "BIT", MySQLData(bool: true)),
325+
.init("xtinyint", "TINYINT(1)", 127),
326+
.init("xsmallint", "SMALLINT(1)", 32767),
327+
.init("xvarcharnull", "VARCHAR(10)", MySQLData(type: .null, buffer: nil)),
328+
.init("xmediumint", "MEDIUMINT(1)", 8388607),
329+
.init("xinteger", "INTEGER(1)", 2147483647),
330+
.init("xbigint", "BIGINT(1)", MySQLData(int: .max)),
331331
.init("xdecimal", "DECIMAL(12,5)", MySQLData(decimal: Decimal(string:"-12.34567")!)),
332-
.init("name", "VARCHAR(10) NOT NULL", "vapor"),
332+
.init("xname", "VARCHAR(10) NOT NULL", "vapor"),
333333
]
334334

335335
let conn = try MySQLConnection.test(on: self.eventLoop).wait()
@@ -349,7 +349,7 @@ final class MySQLNIOTests: XCTestCase {
349349
XCTAssertEqual(insertResults.count, 0)
350350

351351
// select data
352-
let selectResults = try conn.query("SELECT * FROM kitchen_sink WHERE name = ?;", ["vapor"]).wait()
352+
let selectResults = try conn.query("SELECT * FROM kitchen_sink WHERE xname = ?;", ["vapor"]).wait()
353353
XCTAssertEqual(selectResults.count, 1)
354354

355355
for test in tests {

docker-compose.yml

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,22 @@
11
version: '3'
22

33
services:
4-
test:
5-
image: mysql:5.7
4+
mariadb:
5+
image: mariadb
6+
environment:
7+
MYSQL_ALLOW_EMPTY_PASSWORD: "true"
8+
MYSQL_DATABASE: vapor_database
9+
MYSQL_USER: vapor_username
10+
MYSQL_PASSWORD: vapor_password
11+
ports:
12+
- 3306:3306
13+
mysql:
14+
image: mysql
615
environment:
716
MYSQL_ALLOW_EMPTY_PASSWORD: "true"
817
MYSQL_DATABASE: vapor_database
918
MYSQL_USER: vapor_username
1019
MYSQL_PASSWORD: vapor_password
11-
MYSQL_ROOT_PASSWORD: secret
1220
ports:
1321
- 3306:3306
1422
mysql-8_0:

0 commit comments

Comments
 (0)