pqi-conformance 1.0.7.0 → 1.0.8.0
raw patch · 4 files changed
+60/−1 lines, 4 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
Files
- CHANGELOG.md +6/−0
- pqi-conformance.cabal +2/−1
- src/library/Pqi/Conformance/Operation/Connectdb.hs +2/−0
- src/library/Pqi/Conformance/Operation/Connectdb/MissingUnixSocketDirectory.hs +50/−0
CHANGELOG.md view
@@ -1,3 +1,9 @@+# v1.0.8.0++## Non-breaking++- Added a `connectdb` spec covering a Unix-socket directory that doesn't exist, asserting `errorMessage` byte-for-byte against the reference. Found `pqi-native`'s failure message is the raw `Show`n `IOException`, which happens to contain `"could not connect to server"` - one of `Hasql.Connection`'s networking (transient) patterns - while libpq's message for the identical `ENOENT` doesn't, so the two adapters drive `Hasql.Connection.acquire` to opposite classifications of the same failure. Found via `hasql` issue #329.+ # v1.0.7.0 ## Non-breaking
pqi-conformance.cabal view
@@ -1,6 +1,6 @@ cabal-version: 3.0 name: pqi-conformance-version: 1.0.7.0+version: 1.0.8.0 category: Database, PostgreSQL, Testing synopsis: Differential conformance tests for pqi adapters description:@@ -94,6 +94,7 @@ Pqi.Conformance.Operation.CmdStatus Pqi.Conformance.Operation.CmdTuples Pqi.Conformance.Operation.Connectdb+ Pqi.Conformance.Operation.Connectdb.MissingUnixSocketDirectory Pqi.Conformance.Operation.Connectdb.Rejection Pqi.Conformance.Operation.Connectdb.UnixSocketUri Pqi.Conformance.Operation.ConnectionNeedsPassword
src/library/Pqi/Conformance/Operation/Connectdb.hs view
@@ -14,6 +14,7 @@ import qualified Pqi import Pqi.Conformance.Harness import Pqi.Conformance.Observation+import qualified Pqi.Conformance.Operation.Connectdb.MissingUnixSocketDirectory as MissingUnixSocketDirectory import qualified Pqi.Conformance.Operation.Connectdb.Rejection as Rejection import qualified Pqi.Conformance.Operation.Connectdb.UnixSocketUri as UnixSocketUri import Pqi.Conformance.Prelude@@ -25,6 +26,7 @@ spec adapter = do Rejection.spec adapter UnixSocketUri.spec adapter+ MissingUnixSocketDirectory.spec adapter describe "connectdb" do it "opens a usable connection" \conninfo ->
+ src/library/Pqi/Conformance/Operation/Connectdb/MissingUnixSocketDirectory.hs view
@@ -0,0 +1,50 @@+-- | Coverage for @connectdb@ against a Unix-socket directory that doesn't+-- exist on disk (as opposed to one that exists but has nothing listening).+--+-- Both adapters fail at the very same syscall here - a @connect(2)@ on a+-- Unix-domain socket path whose containing directory is absent, i.e.+-- @ENOENT@ - so unlike+-- 'Pqi.Conformance.Operation.Connectdb.UnixSocketUri' (whose two adapters+-- fail via genuinely unrelated machinery: DNS resolution vs. a filesystem+-- check), this spec does compare 'Pqi.errorMessage' byte-for-byte. It's+-- expected to fail on @pqi-native@ right now, and deliberately left that+-- way: the mismatch it demonstrates is exactly what confuses downstream+-- string-matching classifiers.+--+-- Found in @pqi-native@+-- (<https://github.com/nikita-volkov/hasql/issues/329>): the candidate's+-- 'Pqi.errorMessage' is the raw 'Show'n form of the underlying+-- 'System.IO.Error.IOException' (@could not connect to server:+-- Network.Socket.connect: ...@), which happens to contain the substring+-- @"could not connect to server"@ - one of @Hasql.Connection@'s+-- /networking/ (transient) patterns. libpq's own message for the identical+-- failure (@connection to server on socket "..." failed: No such file or+-- directory@) does not contain that phrase, so it falls through to+-- @OtherConnectionError@ (permanent misconfiguration) instead. The two+-- adapters therefore drive @Hasql.Connection.acquire@ to opposite+-- classifications of the same failure.+module Pqi.Conformance.Operation.Connectdb.MissingUnixSocketDirectory+ ( spec,+ )+where++import qualified Pqi+import Pqi.Conformance.Harness+import Pqi.Conformance.Prelude+import Test.Hspec++spec :: Pqi.Adapter -> SpecWith ByteString+spec adapter =+ describe "connectdb" do+ describe "a Unix-socket directory that doesn't exist" do+ it "reports a failure message shaped like the reference's" \_ ->+ differentialConnect adapter conninfo \adapter' conninfo' -> do+ connection <- Pqi.connectdb adapter' conninfo'+ observedStatus <- Pqi.status connection+ observedError <- Pqi.errorMessage connection+ Pqi.finish connection+ pure (observedStatus, observedError)+ where+ -- A directory that is guaranteed not to exist: this test is only about+ -- the shape of the failure, not about a real connection succeeding.+ conninfo = "host=/tmp/pqi-conformance-nonexistent-socket-dir"