@@ -0,0 +1,62 @@
1+module Main where
2+
3+import Network.Docker
4+import Network.Docker.Types
5+
6+import Test.Tasty
7+import Test.Tasty.HUnit
8+import qualified Test.Tasty.QuickCheck as QC
9+import qualified Test.QuickCheck.Monadic as QCM
10+
11+import Data.Maybe (isJust, fromJust)
12+import System.Process (system)
13+import Data.Text (unpack)
14+import Control.Concurrent (threadDelay)
15+import Network.HTTP.Types.Status
16+import qualified Data.ByteString.Char8 as C
17+import qualified Data.ByteString as B
18+import qualified Data.ByteString.Lazy as BL
19+
20+opts = defaultClientOpts { baseUrl = "http://127.0.0.1:2375/" }
21+
22+test_image_name = "docker-hs-test"
23+
24+toStrict1 = B.concat . BL.toChunks
25+
26+checkDockerVersion :: IO ()
27+checkDockerVersion = do v <- getDockerVersion opts
28+ assert $ isJust v
29+
30+findTestImage :: IO ()
31+findTestImage = do images <- getDockerImages opts
32+ let x = fmap (filter ((== [test_image_name++":latest"]) . _repoTags)) images
33+ assert $ fmap length x == Just 1
34+
35+runAndReadLog :: IO ()
36+runAndReadLog = do containerId <- createContainer opts (defaultCreateOpts {_image = test_image_name++":latest"})
37+ assert $ isJust containerId
38+ let c = unpack $ fromJust containerId
39+ status1 <- startContainer opts c defaultStartOpts
40+ threadDelay 300000 -- give 300ms for the application to finish
41+ assert $ status1 == status204
42+ status2 <- killContainer opts c
43+ logs <- getContainerLogs opts c
44+ assert $ status2 == status204
45+ assert $ (C.pack "123") `C.isInfixOf` (toStrict1 logs)
46+ status3 <- deleteContainer opts c
47+ assert $ status3 == status204
48+
49+
50+tests :: TestTree
51+tests = testGroup "Metrics tests" [
52+ testCase "Get docker version" checkDockerVersion,
53+ testCase "Find image by name" findTestImage,
54+ testCase "Run a dummy container and read its log" runAndReadLog]
55+
56+setup :: IO()
57+setup = system ("docker build -t "++test_image_name++" tests") >> return ()
58+
59+main :: IO()
60+main = do
61+ setup
62+ defaultMain tests