Commit ca7b4f48 authored by Iustin Pop's avatar Iustin Pop

Add some more Haskell/Python equivalence tests

This would have caught the log file problem fixed in the previous
patch (9411474b), for example. Also we test user/group equivalence,
name only.
Signed-off-by: default avatarIustin Pop <iustin@google.com>
Reviewed-by: default avatarGuido Trotter <ultrotter@google.com>
parent 9411474b
......@@ -572,6 +572,7 @@ HS_TEST_SRCS = \
test/hs/Test/Ganeti/Query/Language.hs \
test/hs/Test/Ganeti/Query/Query.hs \
test/hs/Test/Ganeti/Rpc.hs \
test/hs/Test/Ganeti/Runtime.hs \
test/hs/Test/Ganeti/Ssconf.hs \
test/hs/Test/Ganeti/THH.hs \
test/hs/Test/Ganeti/TestCommon.hs \
......
{-# 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_GROUP,\n\
\ constants.NODED_USER,\n\
\ constants.RAPI_USER,\n\
\ constants.CONFD_USER,\n\
\ ]\n\
\groups = [constants.MASTERD_GROUP,\n\
\ constants.NODED_GROUP,\n\
\ constants.RAPI_GROUP,\n\
\ constants.CONFD_GROUP,\n\
\ constants.DAEMONS_GROUP,\n\
\ constants.ADMIN_GROUP]\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
]
......@@ -4,7 +4,7 @@
{-
Copyright (C) 2009, 2011, 2012 Google Inc.
Copyright (C) 2009, 2011, 2012, 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
......@@ -62,6 +62,7 @@ import Test.Ganeti.Query.Filter
import Test.Ganeti.Query.Language
import Test.Ganeti.Query.Query
import Test.Ganeti.Rpc
import Test.Ganeti.Runtime
import Test.Ganeti.Ssconf
import Test.Ganeti.THH
import Test.Ganeti.Types
......@@ -113,6 +114,7 @@ allTests =
, testQuery_Language
, testQuery_Query
, testRpc
, testRuntime
, testSsconf
, testTHH
, testTypes
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment