Skip to content

Commit 6c7f795

Browse files
committed
test(LibPQ): run the async result test with both types of connections, and option to run all with any type
1 parent 4b6c77c commit 6c7f795

File tree

2 files changed

+52
-3
lines changed

2 files changed

+52
-3
lines changed

src/asyncresults.jl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,8 @@ function async_execute(
251251
string_params = string_parameters(parameters)
252252
pointer_params = parameter_pointers(string_params)
253253

254-
async_result = _async_execute(jl_conn; binary_format=binary_format, kwargs...) do jl_conn
254+
async_result =
255+
_async_execute(jl_conn; binary_format=binary_format, kwargs...) do jl_conn
255256
GC.@preserve string_params _async_submit(
256257
jl_conn, query, pointer_params; binary_format=binary_format
257258
)

test/runtests.jl

Lines changed: 50 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@ function count_allocs(f, args...)
4040
return Base.gc_alloc_count(stats.gcstats)
4141
end
4242

43-
@testset "LibPQ" begin
43+
usenonblocking = get(ENV, "usenonblocking", false)
44+
@testset "LibPQ $(usenonblocking ? "(nonblocking connection)" : "")" begin
4445

4546
@testset "ConninfoDisplay" begin
4647
@test parse(LibPQ.ConninfoDisplay, "") == LibPQ.Normal
@@ -82,6 +83,7 @@ end
8283

8384
@testset "Example SELECT" begin
8485
conn = LibPQ.Connection("dbname=postgres user=$DATABASE_USER"; throw_error=false)
86+
LibPQ.setnonblocking(conn, nonblock=usenonblocking)
8587
@test conn isa LibPQ.Connection
8688
@test isopen(conn)
8789
@test status(conn) == LibPQ.libpq_c.CONNECTION_OK
@@ -190,6 +192,7 @@ end
190192

191193
@testset "Example INSERT and DELETE" begin
192194
conn = LibPQ.Connection("dbname=postgres user=$DATABASE_USER")
195+
LibPQ.setnonblocking(conn, nonblock=usenonblocking)
193196

194197
result = execute(conn, """
195198
CREATE TEMPORARY TABLE libpqjl_test (
@@ -333,6 +336,7 @@ end
333336
@testset "load!" begin
334337
@testset "issue #204" begin
335338
conn = LibPQ.Connection("dbname=postgres user=$DATABASE_USER")
339+
LibPQ.setnonblocking(conn, nonblock=usenonblocking)
336340

337341
close(execute(conn, """
338342
CREATE TEMPORARY TABLE libpqjl_test (
@@ -357,6 +361,7 @@ end
357361
@testset "COPY FROM" begin
358362
@testset "Example COPY FROM" begin
359363
conn = LibPQ.Connection("dbname=postgres user=$DATABASE_USER")
364+
LibPQ.setnonblocking(conn, nonblock=usenonblocking)
360365

361366
result = execute(conn, """
362367
CREATE TEMPORARY TABLE libpqjl_test (
@@ -401,6 +406,7 @@ end
401406

402407
@testset "Wrong column order" begin
403408
conn = LibPQ.Connection("dbname=postgres user=$DATABASE_USER")
409+
LibPQ.setnonblocking(conn, nonblock=usenonblocking)
404410

405411
result = execute(conn, """
406412
CREATE TEMPORARY TABLE libpqjl_test (
@@ -458,6 +464,7 @@ end
458464
local saved_conn
459465

460466
was_open = LibPQ.Connection("dbname=postgres user=$DATABASE_USER"; throw_error=true) do jl_conn
467+
LibPQ.setnonblocking(jl_conn, nonblock=usenonblocking)
461468
saved_conn = jl_conn
462469
return isopen(jl_conn)
463470
end
@@ -466,6 +473,7 @@ end
466473
@test !isopen(saved_conn)
467474

468475
@test_throws LibPQ.Errors.PQConnectionError LibPQ.Connection("dbname=123fake user=$DATABASE_USER"; throw_error=true) do jl_conn
476+
LibPQ.setnonblocking(conn, nonblock=usenonblocking)
469477
saved_conn = jl_conn
470478
@test false
471479
end
@@ -475,13 +483,15 @@ end
475483

476484
@testset "Version Numbers" begin
477485
conn = LibPQ.Connection("dbname=postgres user=$DATABASE_USER"; throw_error=true)
486+
LibPQ.setnonblocking(conn, nonblock=usenonblocking)
478487

479488
# update this test before PostgreSQL 20.0 ;)
480489
@test LibPQ.pqv"7" <= LibPQ.server_version(conn) <= LibPQ.pqv"20"
481490
end
482491

483492
@testset "Encoding" begin
484493
conn = LibPQ.Connection("dbname=postgres user=$DATABASE_USER"; throw_error=true)
494+
LibPQ.setnonblocking(conn, nonblock=usenonblocking)
485495

486496
@test LibPQ.encoding(conn) == "UTF8"
487497

@@ -513,6 +523,7 @@ end
513523
throw_error=true,
514524
type_map=Dict(:interval => String),
515525
)
526+
LibPQ.setnonblocking(conn, nonblock=usenonblocking)
516527

517528
conn_info = LibPQ.conninfo(conn)
518529
options = first(filter(conn_info) do conn_opt
@@ -632,6 +643,8 @@ end
632643
@testset "Finalizer" begin
633644
closed_flags = map(1:50) do _
634645
conn = LibPQ.Connection("dbname=postgres user=$DATABASE_USER")
646+
LibPQ.setnonblocking(conn, nonblock=usenonblocking)
647+
635648
closed = conn.closed
636649
finalize(conn)
637650
return closed
@@ -646,6 +659,8 @@ end
646659

647660
closed_flags = map(1:50) do _
648661
conn = LibPQ.Connection("dbname=postgres user=$DATABASE_USER")
662+
LibPQ.setnonblocking(conn, nonblock=usenonblocking)
663+
649664
push!(results, execute(conn, "SELECT 1;"))
650665
return conn.closed
651666
end
@@ -661,6 +676,8 @@ end
661676
# with AsyncResults, which hold a reference to Connection
662677
closed_flags = asyncmap(1:50) do _
663678
conn = LibPQ.Connection("dbname=postgres user=$DATABASE_USER")
679+
LibPQ.setnonblocking(conn, nonblock=usenonblocking)
680+
664681
wait(async_execute(conn, "SELECT pg_sleep(1);"))
665682
return conn.closed
666683
end
@@ -707,6 +724,8 @@ end
707724

708725
@testset "throw_error=false" begin
709726
conn = LibPQ.Connection("dbname=123fake user=$DATABASE_USER"; throw_error=false)
727+
LibPQ.setnonblocking(conn, nonblock=usenonblocking)
728+
710729
@test conn isa LibPQ.Connection
711730
@test status(conn) == LibPQ.libpq_c.CONNECTION_BAD
712731
@test isopen(conn)
@@ -725,6 +744,8 @@ end
725744
@test_throws LibPQ.Errors.PQConnectionError LibPQ.Connection("dbname=123fake user=$DATABASE_USER"; throw_error=true)
726745

727746
conn = LibPQ.Connection("dbname=123fake user=$DATABASE_USER"; throw_error=false)
747+
LibPQ.setnonblocking(conn, nonblock=usenonblocking)
748+
728749
@test conn isa LibPQ.Connection
729750
@test status(conn) == LibPQ.libpq_c.CONNECTION_BAD
730751
@test isopen(conn)
@@ -740,6 +761,7 @@ end
740761
@testset "Results" begin
741762
@testset "Nulls" begin
742763
conn = LibPQ.Connection("dbname=postgres user=$DATABASE_USER"; throw_error=true)
764+
LibPQ.setnonblocking(conn, nonblock=usenonblocking)
743765

744766
result = execute(conn, "SELECT NULL"; throw_error=true)
745767
@test status(result) == LibPQ.libpq_c.PGRES_TUPLES_OK
@@ -824,6 +846,7 @@ end
824846

825847
@testset "Not Nulls" begin
826848
conn = LibPQ.Connection("dbname=postgres user=$DATABASE_USER"; throw_error=true)
849+
LibPQ.setnonblocking(conn, nonblock=usenonblocking)
827850

828851
result = execute(conn, "SELECT NULL"; not_null=[false], throw_error=true)
829852
@test status(result) == LibPQ.libpq_c.PGRES_TUPLES_OK
@@ -949,6 +972,7 @@ end
949972

950973
@testset "Tables.jl" begin
951974
conn = LibPQ.Connection("dbname=postgres user=$DATABASE_USER"; throw_error=true)
975+
LibPQ.setnonblocking(conn, nonblock=usenonblocking)
952976

953977
result = execute(conn, """
954978
SELECT no_nulls, yes_nulls FROM (
@@ -991,6 +1015,7 @@ end
9911015

9921016
@testset "Duplicate names" begin
9931017
conn = LibPQ.Connection("dbname=postgres user=$DATABASE_USER"; throw_error=true)
1018+
LibPQ.setnonblocking(conn, nonblock=usenonblocking)
9941019

9951020
result = execute(conn, "SELECT 1 AS col, 2 AS col;", not_null=true, throw_error=true)
9961021
columns = Tables.columns(result)
@@ -1007,6 +1032,7 @@ end
10071032

10081033
@testset "Uppercase Columns" begin
10091034
conn = LibPQ.Connection("dbname=postgres user=$DATABASE_USER"; throw_error=true)
1035+
LibPQ.setnonblocking(conn, nonblock=usenonblocking)
10101036

10111037
result = execute(conn, "SELECT 1 AS \"Column\";")
10121038
@test num_columns(result) == 1
@@ -1025,6 +1051,7 @@ end
10251051

10261052
@testset "PQResultError" begin
10271053
conn = LibPQ.Connection("dbname=postgres user=$DATABASE_USER"; throw_error=true)
1054+
LibPQ.setnonblocking(conn, nonblock=usenonblocking)
10281055

10291056
try
10301057
execute(conn, "SELECT log(-1);")
@@ -1072,6 +1099,7 @@ end
10721099
@testset "Type Conversions" begin
10731100
@testset "Deprecations" begin
10741101
conn = LibPQ.Connection("dbname=postgres user=$DATABASE_USER"; throw_error=true)
1102+
LibPQ.setnonblocking(conn, nonblock=usenonblocking)
10751103

10761104
result = execute(conn, "SELECT 'infinity'::timestamp;")
10771105

@@ -1089,6 +1117,7 @@ end
10891117

10901118
@testset "Automatic" begin
10911119
conn = LibPQ.Connection("dbname=postgres user=$DATABASE_USER"; throw_error=true)
1120+
LibPQ.setnonblocking(conn, nonblock=usenonblocking)
10921121

10931122
result = execute(conn, """
10941123
SELECT oid, typname, typlen, typbyval, typcategory
@@ -1120,6 +1149,7 @@ end
11201149

11211150
@testset "Overrides" begin
11221151
conn = LibPQ.Connection("dbname=postgres user=$DATABASE_USER"; throw_error=true)
1152+
LibPQ.setnonblocking(conn, nonblock=usenonblocking)
11231153

11241154
result = execute(conn, "SELECT 4::bigint;")
11251155
@test first(first(result)) === Int64(4)
@@ -1169,6 +1199,7 @@ end
11691199
@testset for binary_format in (LibPQ.TEXT, LibPQ.BINARY)
11701200
@testset "Default Types" begin
11711201
conn = LibPQ.Connection("dbname=postgres user=$DATABASE_USER"; throw_error=true)
1202+
LibPQ.setnonblocking(conn, nonblock=usenonblocking)
11721203

11731204
test_data = [
11741205
("3", Cint(3)),
@@ -1335,6 +1366,7 @@ end
13351366

13361367
@testset "Specified Types" begin
13371368
conn = LibPQ.Connection("dbname=postgres user=$DATABASE_USER"; throw_error=true)
1369+
LibPQ.setnonblocking(conn, nonblock=usenonblocking)
13381370

13391371
test_data = [
13401372
("3", UInt, UInt(3)),
@@ -1428,6 +1460,7 @@ end
14281460

14291461
@testset "Parameters" begin
14301462
conn = LibPQ.Connection("dbname=postgres user=$DATABASE_USER"; throw_error=true)
1463+
LibPQ.setnonblocking(conn, nonblock=usenonblocking)
14311464

14321465
@testset "Arrays" begin
14331466
tests = (
@@ -1542,6 +1575,7 @@ end
15421575

15431576
@testset "SQLString" begin
15441577
conn = LibPQ.Connection("dbname=postgres user=$DATABASE_USER")
1578+
LibPQ.setnonblocking(conn, nonblock=usenonblocking)
15451579

15461580
execute(conn, sql```
15471581
CREATE TEMPORARY TABLE libpq_test_users (
@@ -1577,6 +1611,7 @@ end
15771611
@testset "Query Errors" begin
15781612
@testset "Syntax Errors" begin
15791613
conn = LibPQ.Connection("dbname=postgres user=$DATABASE_USER"; throw_error=true)
1614+
LibPQ.setnonblocking(conn, nonblock=usenonblocking)
15801615

15811616
result = execute(conn, "SELORCT NUUL;"; throw_error=false)
15821617
@test status(result) == LibPQ.libpq_c.PGRES_FATAL_ERROR
@@ -1595,6 +1630,7 @@ end
15951630

15961631
@testset "Wrong No. Parameters" begin
15971632
conn = LibPQ.Connection("dbname=postgres user=$DATABASE_USER"; throw_error=true)
1633+
LibPQ.setnonblocking(conn, nonblock=usenonblocking)
15981634

15991635
result = execute(conn, "SELORCT \$1;", String[]; throw_error=false)
16001636
@test status(result) == LibPQ.libpq_c.PGRES_FATAL_ERROR
@@ -1619,6 +1655,7 @@ end
16191655

16201656
@testset "Interface Errors" begin
16211657
conn = LibPQ.Connection("dbname=postgres user=$DATABASE_USER"; throw_error=true)
1658+
LibPQ.setnonblocking(conn, nonblock=usenonblocking)
16221659

16231660
result = execute(
16241661
conn,
@@ -1652,6 +1689,7 @@ end
16521689

16531690
# Establish connection and construct temporary table.
16541691
conn = LibPQ.Connection("dbname=postgres user=$DATABASE_USER")
1692+
LibPQ.setnonblocking(conn, nonblock=usenonblocking)
16551693

16561694
# Get the column.
16571695
result = execute(
@@ -1678,6 +1716,7 @@ end
16781716
@testset "Statements" begin
16791717
@testset "No Params, Output" begin
16801718
conn = LibPQ.Connection("dbname=postgres user=$DATABASE_USER"; throw_error=true)
1719+
LibPQ.setnonblocking(conn, nonblock=usenonblocking)
16811720

16821721
stmt = prepare(conn, "SELECT oid, typname FROM pg_type")
16831722

@@ -1699,6 +1738,7 @@ end
16991738

17001739
@testset "Params, Output" begin
17011740
conn = LibPQ.Connection("dbname=postgres user=$DATABASE_USER"; throw_error=true)
1741+
LibPQ.setnonblocking(conn, nonblock=usenonblocking)
17021742

17031743
stmt = prepare(conn, "SELECT oid, typname FROM pg_type WHERE oid = \$1")
17041744

@@ -1723,11 +1763,13 @@ end
17231763
end
17241764
end
17251765

1726-
@testset "AsyncResults" begin
1766+
@testset "AsyncResults (usenonblocking connection=$usenonblocking)" for usenonblocking in [true, false]
1767+
@info "usenonblocking" usenonblocking
17271768
trywait(ar::LibPQ.AsyncResult) = (try wait(ar) catch end; nothing)
17281769

17291770
@testset "Basic" begin
17301771
conn = LibPQ.Connection("dbname=postgres user=$DATABASE_USER"; throw_error=true)
1772+
LibPQ.setnonblocking(conn, nonblock=usenonblocking)
17311773

17321774
ar = async_execute(conn, "SELECT pg_sleep(2);"; throw_error=false)
17331775
yield()
@@ -1750,6 +1792,7 @@ end
17501792

17511793
@testset "Parameters" begin
17521794
conn = LibPQ.Connection("dbname=postgres user=$DATABASE_USER"; throw_error=true)
1795+
LibPQ.setnonblocking(conn, nonblock=usenonblocking)
17531796

17541797
ar = async_execute(
17551798
conn,
@@ -1782,6 +1825,7 @@ end
17821825
# Ensures queries wait for previous query completion before starting
17831826
@testset "Wait in line to complete" begin
17841827
conn = LibPQ.Connection("dbname=postgres user=$DATABASE_USER"; throw_error=true)
1828+
LibPQ.setnonblocking(conn, nonblock=usenonblocking)
17851829

17861830
first_ar = async_execute(conn, "SELECT pg_sleep(4);")
17871831
yield()
@@ -1811,6 +1855,7 @@ end
18111855

18121856
@testset "Cancel" begin
18131857
conn = LibPQ.Connection("dbname=postgres user=$DATABASE_USER"; throw_error=true)
1858+
LibPQ.setnonblocking(conn, nonblock=usenonblocking)
18141859

18151860
# final query needs to be one that actually does something
18161861
# on Windows, first query also needs to do something
@@ -1843,6 +1888,7 @@ end
18431888

18441889
@testset "Canceled by closing connection" begin
18451890
conn = LibPQ.Connection("dbname=postgres user=$DATABASE_USER"; throw_error=true)
1891+
LibPQ.setnonblocking(conn, nonblock=usenonblocking)
18461892

18471893
# final query needs to be one that actually does something
18481894
# on Windows, first query also needs to do something
@@ -1875,6 +1921,7 @@ end
18751921

18761922
@testset "FDWatcher: bad file descriptor (EBADF)" begin
18771923
conn = LibPQ.Connection("dbname=postgres user=$DATABASE_USER"; throw_error=true)
1924+
LibPQ.setnonblocking(conn, nonblock=usenonblocking)
18781925

18791926
ar = async_execute(conn, "SELECT pg_sleep(3); SELECT * FROM pg_type;")
18801927
yield()
@@ -1898,6 +1945,7 @@ end
18981945
@testset "DBInterface integration" begin
18991946
conn = DBInterface.connect(LibPQ.Connection, "dbname=postgres user=$DATABASE_USER")
19001947
@test conn isa LibPQ.Connection
1948+
LibPQ.setnonblocking(conn, nonblock=usenonblocking)
19011949

19021950
result = DBInterface.execute(
19031951
conn,

0 commit comments

Comments
 (0)