Skip to content

Commit 1e5aa93

Browse files
committed
Cloud Haskell tests for QUIC
1 parent d1b134e commit 1e5aa93

File tree

6 files changed

+132
-5
lines changed

6 files changed

+132
-5
lines changed

cabal.project

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
packages: packages/*/**.cabal
22

33
package distributed-process-tests
4-
flags: +tcp
4+
-- There is also the +quic flag, but for some reason,
5+
-- QUIC-based tests aren't running correctly in CI at this time
6+
flags: +tcp

packages/distributed-process-tests/distributed-process-tests.cabal

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ maintainer: The Distributed Haskell team
1111
copyright: Well-Typed LLP
1212
category: Control, Cloud Haskell
1313
build-type: Simple
14+
extra-source-files: tests/credentials/*
1415

1516
source-repository head
1617
Type: git
@@ -21,6 +22,10 @@ flag tcp
2122
Description: build and run TCP tests
2223
Default: False
2324

25+
flag quic
26+
Description: build and run QUIC tests
27+
Default: False
28+
2429
common warnings
2530
ghc-options: -Wall
2631
-Wcompat
@@ -99,6 +104,21 @@ Test-Suite TestCHInTCP
99104
ghc-options: -threaded -rtsopts -with-rtsopts=-N -fno-warn-unused-do-bind
100105
HS-Source-Dirs: tests
101106

107+
Test-Suite TestCHInQUIC
108+
import: warnings
109+
Type: exitcode-stdio-1.0
110+
Main-Is: runQUIC.hs
111+
if flag(quic)
112+
Build-Depends: base >= 4.14 && < 5,
113+
distributed-process-tests,
114+
filepath,
115+
network-transport-quic,
116+
tasty >= 1.5 && <1.6,
117+
else
118+
Buildable: False
119+
default-language: Haskell2010
120+
ghc-options: -threaded -rtsopts -with-rtsopts=-N
121+
HS-Source-Dirs: tests
102122

103123
Test-Suite TestClosure
104124
import: warnings

packages/distributed-process-tests/src/Control/Distributed/Process/Tests/CH.hs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ import Control.Distributed.Process.Tests.Internal.Utils (pause)
4343
import Control.Distributed.Process.Serializable (Serializable)
4444
import Data.Maybe (isNothing, isJust)
4545
import Test.Tasty (TestTree, testGroup)
46-
import Test.Tasty.HUnit (Assertion, assertBool, assertEqual, testCase)
46+
import Test.Tasty.HUnit (Assertion, assertBool, assertEqual, testCase, assertFailure)
4747

4848
newtype Ping = Ping ProcessId
4949
deriving (Typeable, Binary, Show)
@@ -220,11 +220,11 @@ testPing TestTransport{..} = do
220220
p <- expectTimeout 3000000
221221
case p of
222222
Just (Ping _) -> return ()
223-
Nothing -> die "Failed to receive Ping"
223+
Nothing -> let msg = "Failed to receive Ping" in liftIO (putMVar clientDone (Left msg)) >> die msg
224224

225-
putMVar clientDone ()
225+
putMVar clientDone (Right ())
226226

227-
takeMVar clientDone
227+
takeMVar clientDone >>= either assertFailure pure
228228

229229
-- | Monitor a process on an unreachable node
230230
testMonitorUnreachable :: TestTransport -> Bool -> Bool -> Assertion
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIDoTCCAomgAwIBAgIUVp3lTRQWZSOwolWHNaghO6gR68owDQYJKoZIhvcNAQEL
3+
BQAwRTESMBAGA1UEAwwJMTI3LjAuMC4xMQswCQYDVQQGEwJDQTEPMA0GA1UECAwG
4+
UXVlYmVjMREwDwYDVQQHDAhNb250cmVhbDAgFw0yNTA4MTgwMDU1MDRaGA8yMTI1
5+
MDcyNTAwNTUwNFowRTESMBAGA1UEAwwJMTI3LjAuMC4xMQswCQYDVQQGEwJDQTEP
6+
MA0GA1UECAwGUXVlYmVjMREwDwYDVQQHDAhNb250cmVhbDCCASIwDQYJKoZIhvcN
7+
AQEBBQADggEPADCCAQoCggEBAORALZlg9Qmu+A2HT4MUjF1iGUdWF6tlRgF6+zLZ
8+
uvuSM+eR0yH+EJZB2xqanzkXHVAkAnHPWRZ2HWqTS7TLOMyRdPEkiCg+WmW2f0t0
9+
hNCjZVMviahQgOwHkbTZbfsUHTv65cEk4XCgvQXFteMC+Q3lCeXWGoeMOt7AZ3ld
10+
vf7jgmPTQXOQFhqa9q5Qcxn+b1+2NBgQXqEQTVARBLPbCB4M0SKLZ4fWK4VHZsbe
11+
k8fUJBGgz/gTDNNClUiVBhBiv/9uvunZRpU1QBN5tZYXAPc0hX608L33R+LFsoDM
12+
cO5+j+XIjvxWNk94cmM/cb4PLlZBeNBlXxWxY1lKAxjja58CAwEAAaOBhjCBgzAd
13+
BgNVHQ4EFgQUGj/6Vt/0fjbTGBHPZNRIxJywRnkwHwYDVR0jBBgwFoAUGj/6Vt/0
14+
fjbTGBHPZNRIxJywRnkwDgYDVR0PAQH/BAQDAgWgMCAGA1UdJQEB/wQWMBQGCCsG
15+
AQUFBwMBBggrBgEFBQcDAjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUA
16+
A4IBAQA+AuoFBODpWaWrVSjdGZPHP4DtlhB9jDy0WmUBJ8BxeB8SooJoyTsBXVhq
17+
7ACKp11rxJPk9Tv9JOsRrWi+YLzgs+QsKpUKb6RK5nszz17K1md8BavGzE4n/e0F
18+
tzYvWAeyIazHW551GMB1MkpSVcsJNqe91z35qmykmwIo8h+BgqTFzUFiln6bLnqP
19+
KxrWKdlVh2BGEVbH5APClQii0bX1qEn0A8CkAMbldC1GNFbfhyxk1v+8CVK1M6Nx
20+
BrTe15/CVTw/ceCfFZra4DinsflyCP+CcitGOUhWKgrUSiyN8xtr+Wopq4+ntm/Z
21+
ku6j3frrSJnT9A+nZyyGvZlSPrxf
22+
-----END CERTIFICATE-----
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
-----BEGIN PRIVATE KEY-----
2+
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDkQC2ZYPUJrvgN
3+
h0+DFIxdYhlHVherZUYBevsy2br7kjPnkdMh/hCWQdsamp85Fx1QJAJxz1kWdh1q
4+
k0u0yzjMkXTxJIgoPlpltn9LdITQo2VTL4moUIDsB5G02W37FB07+uXBJOFwoL0F
5+
xbXjAvkN5Qnl1hqHjDrewGd5Xb3+44Jj00FzkBYamvauUHMZ/m9ftjQYEF6hEE1Q
6+
EQSz2wgeDNEii2eH1iuFR2bG3pPH1CQRoM/4EwzTQpVIlQYQYr//br7p2UaVNUAT
7+
ebWWFwD3NIV+tPC990fixbKAzHDufo/lyI78VjZPeHJjP3G+Dy5WQXjQZV8VsWNZ
8+
SgMY42ufAgMBAAECggEAGfwodM6x9tFBkiC2b6DWPgdeA14Mwcl8x8xdbrOU8vD5
9+
EcLrO3J2JvUGYaf6uoAkKSyATr6hUMpPnQN52fJM3BUvMAjNq2810WCOa2OvfyUq
10+
8uZ1kIDhvH08HE+okq3+igaNQ4jUVYMnIdIZW+fJvMg3cUAHsyjGxvc2kH2YlLzQ
11+
3zxEFacnTb2K/Sxa/rFC7O3r2M6casTVsqfLyeShnSLEwLLk8tzCZZc6Sap9rVgh
12+
CIcUhZFGxLYWMBJwRs68rmgT7rvQvh8NxzDMGM9Z/AQzeeHAvjAkb4gZBu+W69vD
13+
CYjMi3cchdG/2ouYqijdv9DcqRDfz6BDwf8fT96dyQKBgQD0rGreqY7E8Wnt3EjF
14+
TYwi6Hj7r6gMw3kdIIJ49st2lTvOmeZpvJX7DOh43NNidx9q2Ai1XCCEDQlpPS7i
15+
UnqOLwX0gGYZjYkI8QSdNbJ9T4wepfSeox7dte/xnglEkfipHV3tLqhurgw+wvGW
16+
52hBB6DVSumzjcG/hrvkDth31QKBgQDu0SMH5mg4L4KaT9+qZm3IW+Xey3vwPFES
17+
w4bGsmAddzxXRIw6+ut2+AX/WSccUnZmgtiKKzS1yrBXGa98dqzjGRcDnbchkm+6
18+
Ka1s3ZSx7cjgya43jLIZ9ycwva8+OPPfzrOB6zLgIauwi5B7JsB1Qt81AXeo5/jb
19+
S64FRXkjowKBgChebj+QoEK0RjL9nnAXTGDSFGwKXmLEua3pmD1XEtjc5IJA+DhH
20+
6kMCrTSL0sCzQNbDECTEL4U6FWxssNicnSXqckQWD0J2DL8R7R33JxzvzAGehg7K
21+
gSQ5iX5HAeZzYyCb/MxOX3Hre4+7YFrykUvxc0Ld2lNKt0XfeA63uFWFAoGAOMfk
22+
ylYP5Xv2U3Y2Oa+M3pxq9SPwXdgZdpqiis+SZq8Y267ioItUPL8PvfyWffdlS05E
23+
6eUH7Uk50Bu9S5xz0rL+c8+l4QeOJPcP0tiEKCHfJwMMtwxutBm9aatP5T1pToc4
24+
yuT+/adDyQAF5CH8lGTH6TRmHPS6iHlf8MTp3n0CgYEAwUWjiimBoPQV3X2mHYp5
25+
yXBKGrsEItOmZUKYpl9UGVdGHHuZqzKi5ckOUK+vfd2uH9toUBMFK5aBM3VmFWPb
26+
3IpTrYe/Zu545dZszESjpl9JeiiSOVvPllCh0BrOAK1TwRapWUTsS8ut5pt5zLuo
27+
VbKNvUzMHtq6vp511AD0zCY=
28+
-----END PRIVATE KEY-----
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
{-# LANGUAGE LambdaCase #-}
2+
-- Run tests using the QUIC transport.
3+
--
4+
module Main where
5+
6+
import Control.Exception (throwIO)
7+
import Data.List.NonEmpty (NonEmpty(..))
8+
import Network.Transport.QUIC
9+
( createTransport,
10+
credentialLoadX509,
11+
QUICTransportConfig(..) )
12+
import Network.Transport.Test (TestTransport (..))
13+
import System.IO
14+
( hSetBuffering, stderr, stdout, BufferMode(LineBuffering) )
15+
import Control.Distributed.Process.Tests.CH (tests)
16+
import Test.Tasty (defaultMain, localOption)
17+
import Test.Tasty.Runners (NumThreads)
18+
import System.FilePath ((</>))
19+
20+
main :: IO ()
21+
main = do
22+
hSetBuffering stdout LineBuffering
23+
hSetBuffering stderr LineBuffering
24+
credentialLoadX509
25+
-- Generate a self-signed x509v3 certificate using this nifty tool:
26+
-- https://certificatetools.com/
27+
("tests" </> "credentials" </> "cert.crt")
28+
("tests" </> "credentials" </> "cert.key")
29+
>>= \case
30+
Left errmsg -> throwIO (userError errmsg)
31+
Right creds -> do
32+
transport <-
33+
createTransport
34+
( QUICTransportConfig
35+
{ hostName = "127.0.0.1",
36+
serviceName = "0",
37+
credentials = creds :| [],
38+
validateCredentials = False -- self-signed certificates cannot be validated
39+
}
40+
)
41+
ts <-
42+
tests
43+
TestTransport
44+
{ testTransport = transport,
45+
testBreakConnection = \_ _ -> pure () -- I'm not sure how to break the connection at this time
46+
}
47+
-- Tests are time sensitive. Running the tests concurrently can slow them
48+
-- down enough that threads using threadDelay would wake up later than
49+
-- expected, thus changing the order in which messages were expected.
50+
-- Therefore we run the tests sequentially
51+
--
52+
-- The problem was first detected with
53+
-- 'Control.Distributed.Process.Tests.CH.testMergeChannels'
54+
-- in particular.
55+
defaultMain (localOption (1 :: NumThreads) ts)

0 commit comments

Comments
 (0)