blob: 9c3679b687b304f59db4e8a53c5d0b4b655d6f16 [file] [log] [blame]
{-# LANGUAGE TemplateHaskell #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
{-| Unittests for "Ganeti.Runtime".
-}
{-
Copyright (C) 2013 Google Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
-}
module Test.Ganeti.Runtime (testRuntime) where
import Test.HUnit
import qualified Text.JSON as J
import Test.Ganeti.TestHelper
import Test.Ganeti.TestCommon
import Ganeti.Runtime
{-# ANN module "HLint: ignore Use camelCase" #-}
-- | Tests the compatibility between Haskell and Python log files.
case_LogFiles :: Assertion
case_LogFiles = do
let daemons = [minBound..maxBound]::[GanetiDaemon]
dnames = map daemonName daemons
dfiles <- mapM daemonLogFile daemons
let serialized = J.encode dnames
py_stdout <-
runPython "from ganeti import constants\n\
\from ganeti import serializer\n\
\import sys\n\
\daemons = serializer.Load(sys.stdin.read())\n\
\logfiles = [constants.DAEMONS_LOGFILES[d] for d in daemons]\n\
\print serializer.Dump(logfiles)" serialized
>>= checkPythonResult
let deserialised = J.decode py_stdout::J.Result [String]
decoded <- case deserialised of
J.Ok ops -> return ops
J.Error msg ->
assertFailure ("Unable to decode log files: " ++ msg)
-- this already raised an expection, but we need it
-- for proper types
>> fail "Unable to decode log files"
assertEqual "Mismatch in number of returned log files"
(length decoded) (length daemons)
mapM_ (uncurry (assertEqual "Different result after encoding/decoding")
) $ zip decoded dfiles
-- | Tests the compatibility between Haskell and Python users.
case_UsersGroups :: Assertion
case_UsersGroups = do
-- note: we don't have here a programatic way to list all users, so
-- we harcode some parts of the two (hs/py) lists
let daemons = [minBound..maxBound]::[GanetiDaemon]
users = map daemonUser daemons
groups = map daemonGroup $
map DaemonGroup daemons ++ map ExtraGroup [minBound..maxBound]
py_stdout <-
runPython "from ganeti import constants\n\
\from ganeti import serializer\n\
\import sys\n\
\users = [constants.MASTERD_USER,\n\
\ constants.NODED_USER,\n\
\ constants.RAPI_USER,\n\
\ constants.CONFD_USER,\n\
\ constants.LUXID_USER,\n\
\ constants.MOND_USER,\n\
\ ]\n\
\groups = [constants.MASTERD_GROUP,\n\
\ constants.NODED_GROUP,\n\
\ constants.RAPI_GROUP,\n\
\ constants.CONFD_GROUP,\n\
\ constants.LUXID_GROUP,\n\
\ constants.MOND_GROUP,\n\
\ constants.DAEMONS_GROUP,\n\
\ constants.ADMIN_GROUP,\n\
\ ]\n\
\encoded = (users, groups)\n\
\print serializer.Dump(encoded)" ""
>>= checkPythonResult
let deserialised = J.decode py_stdout::J.Result ([String], [String])
(py_users, py_groups) <-
case deserialised of
J.Ok ops -> return ops
J.Error msg ->
assertFailure ("Unable to decode users/groups: " ++ msg)
-- this already raised an expection, but we need it for proper
-- types
>> fail "Unable to decode users/groups"
assertEqual "Mismatch in number of returned users"
(length py_users) (length users)
assertEqual "Mismatch in number of returned users"
(length py_groups) (length groups)
mapM_ (uncurry (assertEqual "Different result for users")
) $ zip py_users users
mapM_ (uncurry (assertEqual "Different result for groups")
) $ zip py_groups groups
testSuite "Runtime"
[ 'case_LogFiles
, 'case_UsersGroups
]