Στις 27 Σεπ 2013, 8:40 μ.μ., ο/η Michele Tartara <[email protected]> έγραψε:
> On Fri, Sep 27, 2013 at 1:11 PM, Spyros Trigazis <[email protected]> wrote: > > Στις 27 Σεπ 2013, 1:02 μ.μ., ο/η Spyros Trigazis <[email protected]> έγραψε: > > > Test if the input file imported with the --mond-data option is > > parsed properly. > > > > Signed-off-by: Spyros Trigazis <[email protected]> > > --- > > Makefile.am | 1 + > > src/Ganeti/HTools/ExtLoader.hs | 1 + > > test/data/mond-data.txt | 1 + > > test/hs/Test/Ganeti/HTools/ExtLoader.hs | 111 > > ++++++++++++++++++++++++ > > test/hs/Test/Ganeti/Hypervisor/Xen/XmParser.hs | 1 + > > 5 files changed, 115 insertions(+) > > create mode 100644 test/data/mond-data.txt > > create mode 100644 test/hs/Test/Ganeti/HTools/ExtLoader.hs > > > > diff --git a/Makefile.am b/Makefile.am > > index 016db5f..bd831a5 100644 > > --- a/Makefile.am > > +++ b/Makefile.am > > @@ -736,6 +736,7 @@ HS_TEST_SRCS = \ > > test/hs/Test/Ganeti/HTools/CLI.hs \ > > test/hs/Test/Ganeti/HTools/Cluster.hs \ > > test/hs/Test/Ganeti/HTools/Container.hs \ > > + test/hs/Test/Ganeti/HTools/ExtLoader.hs \ > > test/hs/Test/Ganeti/HTools/Graph.hs \ > > test/hs/Test/Ganeti/HTools/Instance.hs \ > > test/hs/Test/Ganeti/HTools/Loader.hs \ > > diff --git a/src/Ganeti/HTools/ExtLoader.hs b/src/Ganeti/HTools/ExtLoader.hs > > index 50b91c5..2b87574 100644 > > --- a/src/Ganeti/HTools/ExtLoader.hs > > +++ b/src/Ganeti/HTools/ExtLoader.hs > > @@ -34,6 +34,7 @@ module Ganeti.HTools.ExtLoader > > , commonSuffix > > , maybeSaveData > > , queryAllMonDDCs > > + , pMonDData > > ) where > > > > import Control.Monad > > diff --git a/test/data/mond-data.txt b/test/data/mond-data.txt > > new file mode 100644 > > index 0000000..0f5447c > > --- /dev/null > > +++ b/test/data/mond-data.txt > > @@ -0,0 +1 @@ > > +[{"node":"node1.example.com","reports":[{"name":"cpu-avg-load","version":"B","format_version":1,"timestamp":1379507272000000000,"category":null,"kind":0,"data":{"cpu_number":4,"cpus":[4.108859597350646e-2,4.456554528165781e-2,6.203619909502262e-2,5.595448881893895e-2],"cpu_total":0.203643517607712}}]},{"node":"node2.example.com","reports":[{"name":"cpu-avg-load","version":"B","format_version":1,"timestamp":1379507280000000000,"category":null,"kind":0,"data":{"cpu_number":2,"cpus":[4.155409618511363e-3,3.4586452012150787e-3],"cpu_total":7.614031289927129e-3}}]}] > > diff --git a/test/hs/Test/Ganeti/HTools/ExtLoader.hs > > b/test/hs/Test/Ganeti/HTools/ExtLoader.hs > > new file mode 100644 > > index 0000000..bc9d92f > > --- /dev/null > > +++ b/test/hs/Test/Ganeti/HTools/ExtLoader.hs > > @@ -0,0 +1,111 @@ > > +{-| Unittests for the MonD data parse function -} > > + > > +{- > > + > > +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.HTools.ExtLoader where > > + > > +import Data.Ratio > > + > > +import qualified Test.HUnit as HUnit > > +import qualified Text.JSON as J > > + > > +import qualified Ganeti.BasicTypes as BT > > +import qualified Ganeti.DataCollectors.CPUload as CPUload > > + > > +import Ganeti.Cpu.Types (CPUavgload(..)) > > +import Ganeti.DataCollectors.Types (DCReport(..)) > > +import Ganeti.HTools.ExtLoader (pMonDData) > > +import Ganeti.JSON > > +import Test.Ganeti.Hypervisor.Xen.XmParser (relativeError) > > +import Test.Ganeti.TestCommon > > + > > +-- | Test a MonD data file. > > +case_parseMonDData :: HUnit.Assertion > > +case_parseMonDData = do > > + let mond_data_file = "mond-data.txt" > > + n1 = "node1.example.com" > > + n2 = "node2.example.com" > > + t1 = 1379507272000000000 > > + t2 = 1379507280000000000 > > + cpu_number1 = 4 > > + cpu_number2 = 2 > > + cpus1 = [ 0.04108859597350646,0.04456554528165781 > > + , 0.06203619909502262,0.05595448881893895] > > + cpus2 = [0.004155409618511363,0.0034586452012150787] > > + cpu_total1 = 0.203643517607712 > > + cpu_total2 = 0.007614031289927129 > > + dcr1 = DCReport CPUload.dcName CPUload.dcVersion > > CPUload.dcFormatVersion > > + t1 CPUload.dcCategory CPUload.dcKind > > + (J.showJSON (CPUavgload cpu_number1 cpus1 cpu_total1)) > > + dcr2 = DCReport CPUload.dcName CPUload.dcVersion > > CPUload.dcFormatVersion > > + t2 CPUload.dcCategory CPUload.dcKind > > + (J.showJSON (CPUavgload cpu_number2 cpus2 cpu_total2)) > > + expected_list = [(n1,[dcr1]),(n2,[dcr2])] > > + ans <- readTestData mond_data_file > > + case pMonDData ans of > > + BT.Ok l -> HUnit.assertBool ("Parsing " ++ mond_data_file ++ " failed") > > + (isAlEqual expected_list l) > > + BT.Bad s -> HUnit.assertFailure $ "Parsing failed: " ++ s > > + > > +-- | Check for quality two list of tuples. > > s/quality/equality > > > +isAlEqual :: [(String, [DCReport])] -> [(String, [DCReport])] -> Bool > > +isAlEqual a b = and (zipWith tupleIsAlEqual a b) > > + > > +-- | Check a tuple for quality. > > s/quality/equality > > > +tupleIsAlEqual :: (String, [DCReport]) -> (String, [DCReport]) -> Bool > > +tupleIsAlEqual (na, a) (nb, b) = > > + na == nb > > + && and (zipWith dcReportIsAlmostEqual a b) > > + > > +-- | Check if two DCReports are equal. Only reports from CPUload Data > > +-- Collectors are supported. > > +dcReportIsAlmostEqual :: DCReport -> DCReport -> Bool > > +dcReportIsAlmostEqual a b = > > + dcReportName a == dcReportName b > > + && dcReportVersion a == dcReportVersion b > > + && dcReportFormatVersion a == dcReportFormatVersion b > > + && dcReportTimestamp a == dcReportTimestamp b > > + && dcReportCategory a == dcReportCategory b > > + && dcReportKind a == dcReportKind b > > + && case () of > > + _ | CPUload.dcName == dcReportName a -> > > + cpuavgloadDataIsAlmostEq (dcReportData a) (dcReportData b) > > + | otherwise -> False > > + > > +-- | Converts two JSValue objects and compares them. > > +cpuavgloadDataIsAlmostEq :: J.JSValue -> J.JSValue -> Bool > > +cpuavgloadDataIsAlmostEq a b = > > + case fromJVal a :: BT.Result CPUavgload of > > + BT.Bad _ -> False > > + BT.Ok cavA -> > > + case fromJVal b :: BT.Result CPUavgload of > > + BT.Bad _ -> False > > + BT.Ok cavB -> compareCPUavgload cavA cavB > > + > > +-- | Compares two CPuavgload objects. > > +compareCPUavgload :: CPUavgload -> CPUavgload -> Bool > > +compareCPUavgload a b = > > + let relError x y = relativeError x y <= 1e-9 > > + in cavCpuNumber a == cavCpuNumber b > > + && relError (cavCpuTotal a) (cavCpuTotal b) > > + && length (cavCpus a) == length (cavCpus b) > > + && and (zipWith relError (cavCpus a) (cavCpus b)) > > diff --git a/test/hs/Test/Ganeti/Hypervisor/Xen/XmParser.hs > > b/test/hs/Test/Ganeti/Hypervisor/Xen/XmParser.hs > > index 1951174..83b2f51 100644 > > --- a/test/hs/Test/Ganeti/Hypervisor/Xen/XmParser.hs > > +++ b/test/hs/Test/Ganeti/Hypervisor/Xen/XmParser.hs > > @@ -26,6 +26,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, > > Boston, MA > > > > module Test.Ganeti.Hypervisor.Xen.XmParser > > ( testHypervisor_Xen_XmParser > > + , relativeError > > ) where > > Just exporting relativeError from XmParser is not a good idea. It's not a > proper place for that function. Please, extract it from there and put it > elsewhere, like TestCommon.hs, and then import it in both places. ack > > > > > import Test.HUnit > > -- > > 1.7.10.4 > > > > Spyros > > Rest LGTM, thanks. > > Michele Thanks, Spyros > > -- > Google Germany GmbH > Dienerstr. 12 > 80331 München > > Registergericht und -nummer: Hamburg, HRB 86891 > Sitz der Gesellschaft: Hamburg > Geschäftsführer: Graham Law, Christine Elizabeth Flores
