@@ -5,17 +5,23 @@ module Main where
5import qualified Test.QuickCheck.Monadic as QCM
5import qualified Test.QuickCheck.Monadic as QCM
6import Test.Tasty
6import Test.Tasty
7import Test.Tasty.HUnit
7import Test.Tasty.HUnit
8−import qualified Test.Tasty.QuickCheck as QC
8+import Test.Tasty.QuickCheck (testProperty)
10import Control.Concurrent (threadDelay)
10import Control.Concurrent (threadDelay)
11+import Control.Lens ((^.), (^?))
11import Control.Monad.IO.Class
12import Control.Monad.IO.Class
12import Control.Monad.Trans.Class (MonadTrans, lift)
13import Control.Monad.Trans.Class (MonadTrans, lift)
14+import qualified Data.Aeson as JSON
15+import Data.Aeson.Lens (key, _Object, _String, _Value)
13import qualified Data.ByteString as B
16import qualified Data.ByteString as B
14import qualified Data.ByteString.Char8 as C
17import qualified Data.ByteString.Char8 as C
15import qualified Data.ByteString.Lazy as BL
18import qualified Data.ByteString.Lazy as BL
19+import qualified Data.HashMap.Strict as HM
21+import qualified Data.Map as M
16import Data.Maybe (fromJust, isJust)
22import Data.Maybe (fromJust, isJust)
17import Data.Monoid
23import Data.Monoid
18−import Data.Text (unpack)
24+import Data.Text (Text, unpack)
19import Network.Connection (TLSSettings (..))
25import Network.Connection (TLSSettings (..))
20import Network.HTTP.Client (newManager)
26import Network.HTTP.Client (newManager)
21import Network.HTTP.Client.TLS
27import Network.HTTP.Client.TLS
@@ -38,19 +44,19 @@ runDocker f = do
38 -- mgr <- newManager settings
44 -- mgr <- newManager settings
39 runDockerT (defaultClientOpts, defaultHttpHandler) f
45 runDockerT (defaultClientOpts, defaultHttpHandler) f
41−checkDockerVersion :: IO ()
47+testDockerVersion :: IO ()
42−checkDockerVersion = runDocker $ do
48+testDockerVersion = runDocker $ do
43 v <- getDockerVersion
49 v <- getDockerVersion
44 lift $ assert $ isRight v
50 lift $ assert $ isRight v
46−findTestImage :: IO ()
52+testFindImage :: IO ()
47−findTestImage = runDocker $ do
53+testFindImage = runDocker $ do
48 images <- listImages defaultListOpts >>= fromRight
54 images <- listImages defaultListOpts >>= fromRight
49 let x = filter ((== [testImageName<>":latest"]) . imageRepoTags) images
55 let x = filter ((== [testImageName<>":latest"]) . imageRepoTags) images
50 lift $ assert $ length x == 1
56 lift $ assert $ length x == 1
52−runAndReadLog :: IO ()
58+testRunAndReadLog :: IO ()
53−runAndReadLog = runDocker $ do
59+testRunAndReadLog = runDocker $ do
54 containerId <- createContainer (defaultCreateOpts (testImageName <> ":latest"))
60 containerId <- createContainer (defaultCreateOpts (testImageName <> ":latest"))
55 c <- fromRight containerId
61 c <- fromRight containerId
56 status1 <- startContainer defaultStartOpts c
62 status1 <- startContainer defaultStartOpts c
@@ -64,20 +70,27 @@ runAndReadLog = runDocker $ do
64 lift $ assert $ status3 == Right ()
70 lift $ assert $ status3 == Right ()
73+sampleEP = ExposedPorts $ M.fromList [(80, TCP), (1337, UDP)]
75+testExposedPorts :: TestTree
76+testExposedPorts = testGroup "Testing ExposedPorts JSON" [ testTCP, testUDP ]
78+ testTCP = testCase "tcp port" $ assert $ JSON.toJSON sampleEP ^. key "80/tcp" . _Object == HM.empty
79+ testUDP = testCase "udp port" $ assert $ JSON.toJSON sampleEP ^. key "1337/tcp" . _Object == HM.empty
67−tests :: TestTree
82+integrationTests :: TestTree
68−tests = testGroup "Metrics tests" [
83+integrationTests = testGroup "Integration Tests" [
69− testCase "Get docker version" checkDockerVersion,
84+ testCase "Get docker version" testDockerVersion,
70− testCase "Find image by name" findTestImage,
85+ testCase "Find image by name" testFindImage,
71− testCase "Run a dummy container and read its log" runAndReadLog]
86+ testCase "Run a dummy container and read its log" testRunAndReadLog]
89+jsonTests = testGroup "JSON Tests" [testExposedPorts]
73setup :: IO ()
91setup :: IO ()
74setup = system ("docker build -t "++unpack testImageName++" tests") >> return ()
92setup = system ("docker build -t "++unpack testImageName++" tests") >> return ()
81isRight (Left _) = False
94isRight (Left _) = False
82isRight (Right _) = True
95isRight (Right _) = True
@@ -86,3 +99,9 @@ fromRight (Left l) = do
86 liftIO $ assertFailure $ "Left: " ++ show l
99 liftIO $ assertFailure $ "Left: " ++ show l
87 undefined
100 undefined
88fromRight (Right r) = return r
101fromRight (Right r) = return r
106+ defaultMain $ testGroup "Tests" [jsonTests, integrationTests]