blob: 7c3d7bd487feefc077b9e82161b33b9a716ef9dc [file] [log] [blame]
{-# LANGUAGE TemplateHaskell #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
{-| Unittests for the LV Parser -}
{-
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.Storage.Lvm.LVParser (testStorage_Lvm_LVParser) where
import Test.QuickCheck as QuickCheck hiding (Result)
import Test.HUnit
import Test.Ganeti.TestHelper
import Test.Ganeti.TestCommon
import Control.Applicative ((<$>), (<*>))
import Data.List (intercalate)
import Ganeti.Storage.Lvm.LVParser
import Ganeti.Storage.Lvm.Types
{-# ANN module "HLint: ignore Use camelCase" #-}
-- | Test parsing a LV @lvs@ output.
case_lvs_lv :: Assertion
case_lvs_lv = testParser lvParser "lvs_lv.txt"
[ LVInfo "nhasjL-cnZi-uqLS-WRLj-tkXI-nvCB-n0o2lj"
"df9ff3f6-a833-48ff-8bd5-bff2eaeab759.disk0_data" "-wi-ao" (negate 1)
(negate 1) 253 0 1073741824 1
"originstname+instance1.example.com" ""
"uZgXit-eiRr-vRqe-xpEo-e9nU-mTuR-9nfVIU" "xenvg" "linear" 0 0 1073741824
"" "/dev/sda5:0-15" "/dev/sda5(0)" Nothing
, LVInfo "5fW5mE-SBSs-GSU0-KZDg-hnwb-sZOC-zZt736"
"df9ff3f6-a833-48ff-8bd5-bff2eaeab759.disk0_meta" "-wi-ao" (negate 1)
(negate 1) 253 1 134217728 1
"originstname+instance1.example.com" ""
"uZgXit-eiRr-vRqe-xpEo-e9nU-mTuR-9nfVIU" "xenvg" "linear" 0 0 134217728 ""
"/dev/sda5:16-17" "/dev/sda5(16)" Nothing
]
-- | Serialize a LVInfo in the same format that is output by @lvs@.
-- The "instance" field is not serialized because it's not provided by @lvs@
-- so it is not part of this test.
serializeLVInfo :: LVInfo -> String
serializeLVInfo l = intercalate ";"
[ lviUuid l
, lviName l
, lviAttr l
, show $ lviMajor l
, show $ lviMinor l
, show $ lviKernelMajor l
, show $ lviKernelMinor l
, show (lviSize l) ++ "B"
, show $ lviSegCount l
, lviTags l
, lviModules l
, lviVgUuid l
, lviVgName l
, lviSegtype l
, show (lviSegStart l) ++ "B"
, show $ lviSegStartPe l
, show (lviSegSize l) ++ "B"
, lviSegTags l
, lviSegPeRanges l
, lviDevices l
] ++ "\n"
-- | Serialize a list of LVInfo in the same format that is output by @lvs@.
serializeLVInfos :: [LVInfo] -> String
serializeLVInfos = concatMap serializeLVInfo
-- | Arbitrary instance for LVInfo.
-- The instance is always Nothing because it is not part of the parsed data:
-- it is added afterwards from a different source.
instance Arbitrary LVInfo where
arbitrary =
LVInfo
<$> genUUID -- uuid
<*> genName -- name
<*> genName -- attr
<*> arbitrary -- major
<*> arbitrary -- minor
<*> arbitrary -- kernel_major
<*> arbitrary -- kernel_minor
<*> genNonNegative -- size
<*> arbitrary -- seg_cont
<*> genName -- tags
<*> genName -- modules
<*> genUUID -- vg_uuid
<*> genName -- vg_name
<*> genName -- segtype
<*> genNonNegative -- seg_start
<*> arbitrary -- seg_start_pe
<*> genNonNegative -- seg_size
<*> genName -- seg_tags
<*> genName -- seg_pe_ranges
<*> genName -- devices
<*> return Nothing -- instance
-- | Test if a randomly generated LV lvs output is properly parsed.
prop_parse_lvs_lv :: [LVInfo] -> Property
prop_parse_lvs_lv expected =
genPropParser lvParser (serializeLVInfos expected) expected
testSuite "Storage/Lvm/LVParser"
[ 'case_lvs_lv,
'prop_parse_lvs_lv
]