diff options
-rw-r--r-- | coverage.xml | 3820 | ||||
-rw-r--r-- | tools/cover.awk | 25 | ||||
-rw-r--r-- | tools/cover.sh | 80 | ||||
-rw-r--r-- | vnftest/common/utils.py | 13 | ||||
-rw-r--r-- | vnftest/contexts/base.py | 14 | ||||
-rw-r--r-- | vnftest/core/task.py | 53 | ||||
-rw-r--r-- | vnftest/tests/unit/onap/test_rest_call.py | 2 |
7 files changed, 3866 insertions, 141 deletions
diff --git a/coverage.xml b/coverage.xml new file mode 100644 index 0000000..eb42172 --- /dev/null +++ b/coverage.xml @@ -0,0 +1,3820 @@ +<?xml version="1.0" ?> +<coverage branch-rate="0.3672" branches-covered="217" branches-valid="591" complexity="0" line-rate="0.5961" lines-covered="1936" lines-valid="3248" timestamp="1551614713461" version="4.4.2"> + <!-- Generated by coverage.py: https://coverage.readthedocs.io --> + <!-- Based on https://raw.githubusercontent.com/cobertura/web/master/htdocs/xml/coverage-04.dtd --> + <sources> + <source>/home/devel/dev/onap/vnfsdk/dovetail-integration/vnftest</source> + </sources> + <packages> + <package branch-rate="0.01316" complexity="0" line-rate="0.2819" name="."> + <classes> + <class branch-rate="0.25" complexity="0" filename="__init__.py" line-rate="0.6389" name="__init__.py"> + <methods/> + <lines> + <line hits="1" number="15"/> + <line hits="1" number="16"/> + <line hits="1" number="17"/> + <line hits="1" number="18"/> + <line hits="1" number="23"/> + <line hits="1" number="24"/> + <line hits="1" number="26"/> + <line hits="1" number="30"/> + <line hits="1" number="31"/> + <line branch="true" condition-coverage="50% (1/2)" hits="1" missing-branches="33" number="32"/> + <line hits="0" number="33"/> + <line hits="1" number="35"/> + <line hits="1" number="36"/> + <line hits="1" number="38"/> + <line hits="1" number="39"/> + <line hits="1" number="40"/> + <line hits="1" number="42"/> + <line hits="1" number="45"/> + <line hits="0" number="46"/> + <line hits="0" number="47"/> + <line hits="0" number="49"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="51,53" number="50"/> + <line hits="0" number="51"/> + <line hits="0" number="53"/> + <line hits="0" number="56"/> + <line hits="0" number="57"/> + <line hits="0" number="59"/> + <line hits="0" number="60"/> + <line hits="0" number="61"/> + <line hits="0" number="62"/> + <line hits="1" number="64"/> + <line hits="1" number="65"/> + <line hits="1" number="66"/> + <line hits="1" number="67"/> + <line hits="1" number="68"/> + <line hits="1" number="69"/> + </lines> + </class> + <class branch-rate="0" complexity="0" filename="main.py" line-rate="0" name="main.py"> + <methods/> + <lines> + <line hits="0" number="17"/> + <line hits="0" number="46"/> + <line hits="0" number="47"/> + <line hits="0" number="49"/> + <line hits="0" number="52"/> + <line hits="0" number="54"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="exit,57" number="56"/> + <line hits="0" number="57"/> + </lines> + </class> + <class branch-rate="0" complexity="0" filename="ssh.py" line-rate="0.2402" name="ssh.py"> + <methods/> + <lines> + <line hits="1" number="16"/> + <line hits="1" number="63"/> + <line hits="1" number="64"/> + <line hits="1" number="65"/> + <line hits="1" number="66"/> + <line hits="1" number="67"/> + <line hits="1" number="68"/> + <line hits="1" number="69"/> + <line hits="1" number="71"/> + <line hits="1" number="73"/> + <line hits="1" number="74"/> + <line hits="1" number="75"/> + <line hits="1" number="76"/> + <line hits="1" number="77"/> + <line hits="1" number="78"/> + <line hits="1" number="81"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="83,84" number="82"/> + <line hits="0" number="83"/> + <line hits="0" number="84"/> + <line hits="0" number="85"/> + <line hits="0" number="86"/> + <line hits="1" number="89"/> + <line hits="1" number="90"/> + <line hits="1" number="93"/> + <line hits="1" number="94"/> + <line hits="1" number="97"/> + <line hits="1" number="100"/> + <line hits="1" number="102"/> + <line hits="1" number="103"/> + <line hits="0" number="104"/> + <line hits="0" number="105"/> + <line hits="0" number="106"/> + <line hits="0" number="107"/> + <line hits="0" number="108"/> + <line hits="0" number="109"/> + <line hits="0" number="110"/> + <line hits="0" number="111"/> + <line hits="1" number="113"/> + <line hits="0" number="117"/> + <line hits="1" number="119"/> + <line hits="0" number="130"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="132,134" number="131"/> + <line hits="0" number="132"/> + <line hits="0" number="134"/> + <line hits="0" number="136"/> + <line hits="0" number="137"/> + <line hits="0" number="139"/> + <line hits="0" number="142"/> + <line hits="0" number="143"/> + <line hits="0" number="144"/> + <line hits="0" number="145"/> + <line hits="0" number="146"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="151,153" number="150"/> + <line hits="0" number="151"/> + <line hits="0" number="153"/> + <line hits="1" number="155"/> + <line hits="1" number="156"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="158,159" number="157"/> + <line hits="0" number="158"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="160,161" number="159"/> + <line hits="0" number="160"/> + <line hits="0" number="161"/> + <line hits="0" number="162"/> + <line hits="1" number="172"/> + <line hits="1" number="173"/> + <line hits="0" number="174"/> + <line hits="1" number="176"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="178,179" number="177"/> + <line hits="0" number="178"/> + <line hits="0" number="179"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="181,185" number="180"/> + <line hits="0" number="181"/> + <line hits="0" number="182"/> + <line hits="0" number="183"/> + <line hits="0" number="184"/> + <line hits="0" number="185"/> + <line hits="1" number="187"/> + <line hits="0" number="189"/> + <line hits="1" number="191"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="193,194" number="192"/> + <line hits="0" number="193"/> + <line hits="0" number="194"/> + <line hits="0" number="195"/> + <line hits="0" number="196"/> + <line hits="0" number="197"/> + <line hits="0" number="203"/> + <line hits="0" number="204"/> + <line hits="0" number="205"/> + <line hits="0" number="207"/> + <line hits="0" number="208"/> + <line hits="1" number="211"/> + <line hits="0" number="212"/> + <line hits="1" number="222"/> + <line hits="0" number="223"/> + <line hits="1" number="225"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="exit,227" number="226"/> + <line hits="0" number="227"/> + <line hits="0" number="228"/> + <line hits="1" number="230"/> + <line hits="0" number="252"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="255,257" number="254"/> + <line hits="0" number="255"/> + <line hits="0" number="257"/> + <line hits="1" number="262"/> + <line hits="0" number="266"/> + <line hits="0" number="267"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="269,270" number="268"/> + <line hits="0" number="269"/> + <line hits="0" number="270"/> + <line hits="0" number="271"/> + <line hits="0" number="274"/> + <line hits="0" number="275"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="280,282" number="279"/> + <line hits="0" number="280"/> + <line hits="0" number="282"/> + <line hits="0" number="284"/> + <line hits="0" number="286"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="289,295" number="288"/> + <line hits="0" number="289"/> + <line hits="0" number="290"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="292,293" number="291"/> + <line hits="0" number="292"/> + <line hits="0" number="293"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="296,303" number="295"/> + <line hits="0" number="296"/> + <line hits="0" number="298"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="300,301" number="299"/> + <line hits="0" number="300"/> + <line hits="0" number="301"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="304,322" number="303"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="305,322" number="304"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="306,317" number="305"/> + <line hits="0" number="306"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="308,309" number="307"/> + <line hits="0" number="308"/> + <line hits="0" number="309"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="313,317" number="311"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="314,317" number="313"/> + <line hits="0" number="314"/> + <line hits="0" number="315"/> + <line hits="0" number="316"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="318,322" number="317"/> + <line hits="0" number="318"/> + <line hits="0" number="320"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="323,325" number="322"/> + <line hits="0" number="323"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="326,329" number="325"/> + <line hits="0" number="326"/> + <line hits="0" number="327"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="284,330" number="329"/> + <line hits="0" number="330"/> + <line hits="0" number="332"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="334,339" number="333"/> + <line hits="0" number="334"/> + <line hits="0" number="335"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="337,338" number="336"/> + <line hits="0" number="337"/> + <line hits="0" number="338"/> + <line hits="0" number="339"/> + <line hits="1" number="341"/> + <line hits="0" number="350"/> + <line hits="0" number="351"/> + <line hits="0" number="353"/> + <line hits="0" number="356"/> + <line hits="0" number="357"/> + <line hits="0" number="358"/> + <line hits="1" number="360"/> + <line hits="0" number="362"/> + <line hits="0" number="363"/> + <line hits="0" number="364"/> + <line hits="0" number="365"/> + <line hits="0" number="366"/> + <line hits="0" number="367"/> + <line hits="0" number="368"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="363,370" number="369"/> + <line hits="0" number="370"/> + <line hits="1" number="372"/> + <line hits="0" number="373"/> + <line hits="0" number="375"/> + <line hits="0" number="376"/> + <line hits="1" number="378"/> + <line hits="0" number="379"/> + <line hits="0" number="381"/> + <line hits="0" number="382"/> + <line hits="1" number="385"/> + <line hits="0" number="386"/> + <line hits="0" number="387"/> + <line hits="1" number="389"/> + <line hits="0" number="390"/> + <line hits="0" number="392"/> + <line hits="0" number="393"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="395,396" number="394"/> + <line hits="0" number="395"/> + <line hits="0" number="396"/> + <line hits="1" number="398"/> + <line hits="1" number="400"/> + <line hits="0" number="402"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="404,405" number="403"/> + <line hits="0" number="404"/> + <line hits="0" number="405"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="408,410" number="406"/> + <line hits="0" number="408"/> + <line hits="0" number="410"/> + <line hits="0" number="412"/> + <line hits="1" number="414"/> + <line hits="0" number="421"/> + <line hits="0" number="422"/> + <line hits="0" number="423"/> + <line hits="0" number="424"/> + <line hits="1" number="426"/> + <line hits="0" number="427"/> + <line hits="0" number="429"/> + <line hits="0" number="430"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="exit,432" number="431"/> + <line hits="0" number="432"/> + <line hits="1" number="434"/> + <line hits="0" number="435"/> + <line hits="0" number="437"/> + <line hits="0" number="438"/> + <line hits="1" number="441"/> + <line hits="1" number="444"/> + <line hits="0" number="446"/> + <line hits="0" number="447"/> + <line hits="1" number="449"/> + <line hits="0" number="450"/> + <line hits="0" number="451"/> + <line hits="0" number="454"/> + <line hits="1" number="456"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="exit,458" number="457"/> + <line hits="0" number="458"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="exit,460" number="459"/> + <line hits="0" number="460"/> + <line hits="1" number="462"/> + <line hits="0" number="464"/> + <line hits="1" number="466"/> + <line hits="0" number="467"/> + <line hits="0" number="468"/> + <line hits="1" number="470"/> + <line hits="0" number="473"/> + <line hits="0" number="474"/> + <line hits="1" number="477"/> + <line hits="0" number="478"/> + <line hits="0" number="479"/> + <line hits="1" number="481"/> + <line hits="0" number="482"/> + <line hits="0" number="483"/> + <line hits="1" number="485"/> + <line hits="0" number="486"/> + <line hits="0" number="487"/> + <line hits="1" number="489"/> + <line hits="0" number="490"/> + <line hits="0" number="491"/> + <line hits="1" number="493"/> + <line hits="0" number="497"/> + </lines> + </class> + </classes> + </package> + <package branch-rate="0" complexity="0" line-rate="0" name="cmd"> + <classes> + <class branch-rate="1" complexity="0" filename="cmd/__init__.py" line-rate="1" name="__init__.py"> + <methods/> + <lines/> + </class> + <class branch-rate="0" complexity="0" filename="cmd/cli.py" line-rate="0" name="cli.py"> + <methods/> + <lines> + <line hits="0" number="17"/> + <line hits="0" number="21"/> + <line hits="0" number="22"/> + <line hits="0" number="23"/> + <line hits="0" number="24"/> + <line hits="0" number="26"/> + <line hits="0" number="27"/> + <line hits="0" number="28"/> + <line hits="0" number="30"/> + <line hits="0" number="31"/> + <line hits="0" number="32"/> + <line hits="0" number="33"/> + <line hits="0" number="34"/> + <line hits="0" number="35"/> + <line hits="0" number="36"/> + <line hits="0" number="37"/> + <line hits="0" number="39"/> + <line hits="0" number="40"/> + <line hits="0" number="46"/> + <line hits="0" number="48"/> + <line hits="0" number="53"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="55,60" number="54"/> + <line hits="0" number="55"/> + <line hits="0" number="56"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="54,58" number="57"/> + <line hits="0" number="58"/> + <line hits="0" number="60"/> + </lines> + </class> + </classes> + </package> + <package branch-rate="0.2143" complexity="0" line-rate="0.178" name="cmd.commands"> + <classes> + <class branch-rate="0.5" complexity="0" filename="cmd/commands/__init__.py" line-rate="0.75" name="__init__.py"> + <methods/> + <lines> + <line hits="1" number="1"/> + <line hits="1" number="2"/> + <line hits="1" number="5"/> + <line hits="1" number="6"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="7"/> + <line branch="true" condition-coverage="50% (1/2)" hits="1" missing-branches="9" number="8"/> + <line hits="0" number="9"/> + <line hits="1" number="10"/> + <line hits="1" number="13"/> + <line hits="1" number="15"/> + <line hits="0" number="16"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="exit,exit" number="17"/> + </lines> + </class> + <class branch-rate="0" complexity="0" filename="cmd/commands/env.py" line-rate="0" name="env.py"> + <methods/> + <lines> + <line hits="0" number="16"/> + <line hits="0" number="17"/> + <line hits="0" number="19"/> + <line hits="0" number="20"/> + <line hits="0" number="21"/> + <line hits="0" number="23"/> + <line hits="0" number="25"/> + <line hits="0" number="26"/> + <line hits="0" number="29"/> + <line hits="0" number="35"/> + <line hits="0" number="36"/> + <line hits="0" number="37"/> + <line hits="0" number="39"/> + <line hits="0" number="40"/> + <line hits="0" number="42"/> + <line hits="0" number="43"/> + <line hits="0" number="44"/> + <line hits="0" number="46"/> + <line hits="0" number="47"/> + <line hits="0" number="49"/> + <line hits="0" number="50"/> + <line hits="0" number="51"/> + <line hits="0" number="53"/> + <line hits="0" number="54"/> + <line hits="0" number="56"/> + <line hits="0" number="57"/> + <line hits="0" number="58"/> + <line hits="0" number="60"/> + <line hits="0" number="61"/> + <line hits="0" number="62"/> + <line hits="0" number="64"/> + <line hits="0" number="65"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="68,77" number="67"/> + <line hits="0" number="68"/> + <line hits="0" number="69"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="72,75" number="71"/> + <line hits="0" number="72"/> + <line hits="0" number="75"/> + <line hits="0" number="77"/> + <line hits="0" number="82"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="84,86" number="83"/> + <line hits="0" number="84"/> + <line hits="0" number="85"/> + <line hits="0" number="86"/> + <line hits="0" number="88"/> + <line hits="0" number="89"/> + <line hits="0" number="90"/> + <line hits="0" number="91"/> + <line hits="0" number="92"/> + <line hits="0" number="93"/> + <line hits="0" number="94"/> + <line hits="0" number="95"/> + </lines> + </class> + <class branch-rate="1" complexity="0" filename="cmd/commands/plugin.py" line-rate="0" name="plugin.py"> + <methods/> + <lines> + <line hits="0" number="16"/> + <line hits="0" number="18"/> + <line hits="0" number="20"/> + <line hits="0" number="21"/> + <line hits="0" number="22"/> + <line hits="0" number="23"/> + </lines> + </class> + <class branch-rate="1" complexity="0" filename="cmd/commands/report.py" line-rate="0" name="report.py"> + <methods/> + <lines> + <line hits="0" number="12"/> + <line hits="0" number="14"/> + <line hits="0" number="16"/> + <line hits="0" number="18"/> + <line hits="0" number="19"/> + <line hits="0" number="20"/> + </lines> + </class> + <class branch-rate="1" complexity="0" filename="cmd/commands/runner.py" line-rate="1" name="runner.py"> + <methods/> + <lines> + <line hits="1" number="16"/> + <line hits="1" number="18"/> + <line hits="1" number="20"/> + <line hits="1" number="21"/> + <line hits="1" number="22"/> + <line hits="1" number="23"/> + </lines> + </class> + <class branch-rate="1" complexity="0" filename="cmd/commands/step.py" line-rate="1" name="step.py"> + <methods/> + <lines> + <line hits="1" number="16"/> + <line hits="1" number="18"/> + <line hits="1" number="19"/> + <line hits="1" number="20"/> + <line hits="1" number="21"/> + <line hits="1" number="22"/> + </lines> + </class> + <class branch-rate="1" complexity="0" filename="cmd/commands/task.py" line-rate="0" name="task.py"> + <methods/> + <lines> + <line hits="0" number="11"/> + <line hits="0" number="12"/> + <line hits="0" number="13"/> + <line hits="0" number="15"/> + <line hits="0" number="17"/> + <line hits="0" number="18"/> + <line hits="0" number="19"/> + <line hits="0" number="20"/> + <line hits="0" number="22"/> + <line hits="0" number="24"/> + </lines> + </class> + <class branch-rate="0" complexity="0" filename="cmd/commands/testcase.py" line-rate="0" name="testcase.py"> + <methods/> + <lines> + <line hits="0" number="16"/> + <line hits="0" number="17"/> + <line hits="0" number="19"/> + <line hits="0" number="21"/> + <line hits="0" number="22"/> + <line hits="0" number="23"/> + <line hits="0" number="24"/> + <line hits="0" number="27"/> + <line hits="0" number="33"/> + <line hits="0" number="34"/> + <line hits="0" number="35"/> + <line hits="0" number="37"/> + <line hits="0" number="40"/> + <line hits="0" number="41"/> + <line hits="0" number="43"/> + <line hits="0" number="45"/> + <line hits="0" number="46"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="48,49" number="47"/> + <line hits="0" number="48"/> + <line hits="0" number="49"/> + </lines> + </class> + </classes> + </package> + <package branch-rate="0.565" complexity="0" line-rate="0.6741" name="common"> + <classes> + <class branch-rate="1" complexity="0" filename="common/__init__.py" line-rate="1" name="__init__.py"> + <methods/> + <lines/> + </class> + <class branch-rate="0.5833" complexity="0" filename="common/constants.py" line-rate="0.8571" name="constants.py"> + <methods/> + <lines> + <line hits="1" number="16"/> + <line hits="1" number="17"/> + <line hits="1" number="18"/> + <line hits="1" number="20"/> + <line hits="1" number="22"/> + <line hits="1" number="27"/> + <line hits="1" number="29"/> + <line hits="1" number="30"/> + <line hits="1" number="31"/> + <line hits="1" number="33"/> + <line hits="1" number="34"/> + <line hits="1" number="35"/> + <line hits="1" number="37"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="39"/> + <line hits="1" number="41"/> + <line hits="1" number="42"/> + <line hits="1" number="47"/> + <line hits="1" number="48"/> + <line hits="1" number="49"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="51,52" number="50"/> + <line hits="0" number="51"/> + <line hits="0" number="52"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="54,57" number="53"/> + <line hits="0" number="54"/> + <line hits="1" number="56"/> + <line hits="1" number="57"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="58"/> + <line hits="1" number="59"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="60"/> + <line hits="1" number="61"/> + <line hits="1" number="62"/> + <line hits="1" number="65"/> + <line hits="1" number="66"/> + <line hits="1" number="67"/> + <line hits="1" number="68"/> + <line hits="1" number="69"/> + <line hits="0" number="70"/> + <line hits="0" number="71"/> + <line hits="1" number="73"/> + <line hits="1" number="74"/> + <line hits="1" number="75"/> + <line hits="0" number="76"/> + <line hits="0" number="78"/> + <line branch="true" condition-coverage="50% (1/2)" hits="1" missing-branches="81" number="80"/> + <line hits="0" number="81"/> + <line hits="1" number="85"/> + <line hits="1" number="86"/> + <line hits="1" number="87"/> + <line hits="1" number="88"/> + <line hits="1" number="89"/> + <line hits="1" number="90"/> + <line hits="1" number="91"/> + <line hits="1" number="93"/> + <line hits="1" number="94"/> + <line hits="1" number="95"/> + <line hits="1" number="96"/> + <line hits="1" number="97"/> + <line hits="1" number="100"/> + <line hits="1" number="101"/> + <line hits="1" number="102"/> + <line hits="1" number="104"/> + <line hits="1" number="105"/> + <line hits="1" number="106"/> + <line hits="1" number="107"/> + <line hits="1" number="108"/> + <line hits="1" number="110"/> + <line hits="1" number="111"/> + <line hits="1" number="112"/> + <line hits="1" number="115"/> + <line hits="1" number="116"/> + </lines> + </class> + <class branch-rate="1" complexity="0" filename="common/exceptions.py" line-rate="0.8421" name="exceptions.py"> + <methods/> + <lines> + <line hits="1" number="18"/> + <line hits="1" number="19"/> + <line hits="1" number="20"/> + <line hits="1" number="21"/> + <line hits="1" number="24"/> + <line hits="1" number="25"/> + <line hits="1" number="27"/> + <line hits="0" number="28"/> + <line hits="0" number="29"/> + <line hits="1" number="31"/> + <line hits="0" number="32"/> + <line hits="1" number="35"/> + <line hits="1" number="36"/> + <line hits="1" number="40"/> + <line hits="1" number="41"/> + <line hits="1" number="44"/> + <line hits="1" number="45"/> + <line hits="1" number="48"/> + <line hits="1" number="49"/> + </lines> + </class> + <class branch-rate="1" complexity="0" filename="common/html_template.py" line-rate="1" name="html_template.py"> + <methods/> + <lines> + <line hits="1" number="13"/> + <line hits="1" number="137"/> + </lines> + </class> + <class branch-rate="0" complexity="0" filename="common/httpClient.py" line-rate="0.8" name="httpClient.py"> + <methods/> + <lines> + <line hits="1" number="17"/> + <line hits="1" number="19"/> + <line hits="1" number="20"/> + <line hits="1" number="22"/> + <line hits="1" number="23"/> + <line hits="1" number="25"/> + <line hits="1" number="28"/> + <line hits="1" number="30"/> + <line hits="1" number="31"/> + <line hits="1" number="32"/> + <line hits="1" number="33"/> + <line hits="1" number="34"/> + <line hits="1" number="35"/> + <line hits="1" number="36"/> + <line hits="1" number="37"/> + <line hits="1" number="38"/> + <line hits="1" number="39"/> + <line hits="0" number="40"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="42,44" number="41"/> + <line hits="0" number="42"/> + <line hits="0" number="43"/> + <line hits="0" number="44"/> + <line hits="1" number="46"/> + <line hits="1" number="47"/> + <line hits="1" number="48"/> + </lines> + </class> + <class branch-rate="1" complexity="0" filename="common/import_utils.py" line-rate="1" name="import_utils.py"> + <methods/> + <lines> + <line hits="1" number="14"/> + <line hits="1" number="16"/> + <line hits="1" number="17"/> + <line hits="1" number="18"/> + <line hits="1" number="21"/> + <line hits="1" number="25"/> + <line hits="1" number="26"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="27"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="28"/> + <line hits="1" number="30"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="32"/> + <line hits="1" number="36"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="37"/> + <line hits="1" number="38"/> + </lines> + </class> + <class branch-rate="0" complexity="0" filename="common/openstack_utils.py" line-rate="0.4038" name="openstack_utils.py"> + <methods/> + <lines> + <line hits="1" number="17"/> + <line hits="1" number="19"/> + <line hits="1" number="20"/> + <line hits="1" number="21"/> + <line hits="1" number="22"/> + <line hits="1" number="24"/> + <line hits="1" number="25"/> + <line hits="1" number="26"/> + <line hits="1" number="27"/> + <line hits="1" number="28"/> + <line hits="1" number="29"/> + <line hits="1" number="30"/> + <line hits="1" number="32"/> + <line hits="1" number="34"/> + <line hits="1" number="35"/> + <line hits="1" number="37"/> + <line hits="1" number="43"/> + <line hits="0" number="44"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="47,50" number="46"/> + <line hits="0" number="47"/> + <line hits="0" number="48"/> + <line hits="0" number="50"/> + <line hits="0" number="51"/> + <line hits="0" number="52"/> + <line hits="0" number="54"/> + <line hits="0" number="55"/> + <line hits="0" number="56"/> + <line hits="0" number="57"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="exit,60" number="59"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="61,64" number="60"/> + <line hits="0" number="61"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="exit,65" number="64"/> + <line hits="0" number="65"/> + <line hits="1" number="70"/> + <line hits="0" number="71"/> + <line hits="1" number="74"/> + <line hits="0" number="75"/> + <line hits="0" number="76"/> + <line hits="0" number="77"/> + <line hits="0" number="78"/> + <line hits="1" number="81"/> + <line hits="0" number="82"/> + <line hits="0" number="83"/> + <line hits="0" number="84"/> + <line hits="0" number="85"/> + <line hits="0" number="86"/> + <line hits="0" number="88"/> + <line hits="0" number="89"/> + <line hits="0" number="90"/> + <line hits="1" number="93"/> + <line hits="0" number="94"/> + <line hits="0" number="97"/> + </lines> + </class> + <class branch-rate="0.8571" complexity="0" filename="common/process.py" line-rate="0.9412" name="process.py"> + <methods/> + <lines> + <line hits="1" number="17"/> + <line hits="1" number="18"/> + <line hits="1" number="19"/> + <line hits="1" number="20"/> + <line hits="1" number="21"/> + <line hits="1" number="23"/> + <line hits="1" number="24"/> + <line hits="1" number="26"/> + <line hits="1" number="27"/> + <line hits="1" number="30"/> + <line hits="1" number="33"/> + <line branch="true" condition-coverage="50% (1/2)" hits="1" missing-branches="exit" number="34"/> + <line hits="1" number="35"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="37"/> + <line hits="1" number="38"/> + <line hits="1" number="41"/> + <line hits="1" number="42"/> + <line hits="1" number="43"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="44"/> + <line hits="1" number="45"/> + <line hits="1" number="46"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="47"/> + <line hits="1" number="48"/> + <line hits="1" number="50"/> + <line hits="1" number="51"/> + <line hits="1" number="52"/> + <line hits="1" number="53"/> + <line branch="true" condition-coverage="50% (1/2)" hits="1" missing-branches="55" number="54"/> + <line hits="0" number="55"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="56"/> + <line hits="1" number="57"/> + <line hits="1" number="61"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="63"/> + <line hits="1" number="64"/> + <line hits="1" number="65"/> + <line hits="1" number="68"/> + <line hits="0" number="71"/> + <line hits="1" number="74"/> + <line hits="0" number="76"/> + <line hits="1" number="81"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="87"/> + <line hits="1" number="88"/> + <line hits="1" number="89"/> + <line branch="true" condition-coverage="50% (1/2)" hits="1" missing-branches="93" number="90"/> + <line hits="0" number="93"/> + <line hits="1" number="94"/> + <line hits="1" number="95"/> + <line hits="1" number="97"/> + <line hits="1" number="100"/> + <line hits="1" number="103"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="104"/> + <line hits="1" number="105"/> + <line hits="1" number="107"/> + <line hits="1" number="111"/> + <line hits="1" number="113"/> + <line hits="1" number="114"/> + <line hits="1" number="115"/> + <line hits="1" number="116"/> + <line hits="1" number="117"/> + <line hits="1" number="119"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="120"/> + <line hits="1" number="121"/> + <line branch="true" condition-coverage="50% (1/2)" hits="1" missing-branches="130" number="128"/> + <line hits="1" number="129"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="130"/> + <line hits="1" number="131"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="138"/> + <line hits="1" number="140"/> + </lines> + </class> + <class branch-rate="0" complexity="0" filename="common/rest_client.py" line-rate="0.2321" name="rest_client.py"> + <methods/> + <lines> + <line hits="1" number="16"/> + <line hits="1" number="17"/> + <line hits="1" number="18"/> + <line hits="1" number="19"/> + <line hits="1" number="20"/> + <line hits="1" number="21"/> + <line hits="1" number="22"/> + <line hits="1" number="23"/> + <line hits="1" number="25"/> + <line hits="1" number="26"/> + <line hits="1" number="29"/> + <line hits="0" number="30"/> + <line hits="1" number="33"/> + <line hits="0" number="34"/> + <line hits="0" number="35"/> + <line hits="0" number="36"/> + <line hits="0" number="37"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="exit,39" number="38"/> + <line hits="0" number="39"/> + <line hits="0" number="40"/> + <line hits="0" number="41"/> + <line hits="0" number="42"/> + <line hits="0" number="44"/> + <line hits="0" number="45"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="47,48" number="46"/> + <line hits="0" number="47"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="49,51" number="48"/> + <line hits="0" number="49"/> + <line hits="0" number="51"/> + <line hits="0" number="52"/> + <line hits="0" number="53"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="55,58" number="54"/> + <line hits="0" number="55"/> + <line hits="0" number="56"/> + <line hits="0" number="57"/> + <line hits="0" number="58"/> + <line hits="0" number="59"/> + <line hits="0" number="60"/> + <line hits="0" number="61"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="exit,64" number="63"/> + <line hits="0" number="64"/> + <line hits="1" number="67"/> + <line hits="0" number="68"/> + <line hits="0" number="69"/> + <line hits="0" number="70"/> + <line hits="0" number="71"/> + <line hits="0" number="72"/> + <line hits="0" number="73"/> + <line hits="0" number="74"/> + <line hits="0" number="75"/> + <line hits="0" number="76"/> + <line hits="0" number="77"/> + <line hits="0" number="78"/> + <line hits="0" number="79"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="exit,82" number="81"/> + <line hits="0" number="82"/> + </lines> + </class> + <class branch-rate="0.5" complexity="0" filename="common/task_template.py" line-rate="0.7586" name="task_template.py"> + <methods/> + <lines> + <line hits="1" number="17"/> + <line hits="1" number="18"/> + <line hits="1" number="19"/> + <line hits="1" number="20"/> + <line hits="1" number="21"/> + <line hits="1" number="24"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="28"/> + <line hits="1" number="29"/> + <line branch="true" condition-coverage="50% (1/2)" hits="1" missing-branches="35" number="32"/> + <line hits="0" number="35"/> + <line hits="1" number="36"/> + <line hits="1" number="39"/> + <line hits="1" number="41"/> + <line hits="1" number="50"/> + <line hits="1" number="52"/> + <line hits="1" number="53"/> + <line hits="1" number="55"/> + <line hits="1" number="56"/> + <line branch="true" condition-coverage="50% (1/2)" hits="1" missing-branches="60" number="59"/> + <line hits="0" number="60"/> + <line hits="0" number="61"/> + <line hits="0" number="62"/> + <line hits="1" number="64"/> + <line hits="1" number="67"/> + <line branch="true" condition-coverage="50% (1/2)" hits="1" missing-branches="76" number="71"/> + <line hits="1" number="73"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="77,78" number="76"/> + <line hits="0" number="77"/> + <line hits="0" number="78"/> + </lines> + </class> + <class branch-rate="0.6" complexity="0" filename="common/template_format.py" line-rate="0.84" name="template_format.py"> + <methods/> + <lines> + <line hits="1" number="17"/> + <line hits="1" number="19"/> + <line hits="1" number="20"/> + <line branch="true" condition-coverage="50% (1/2)" hits="1" missing-branches="24" number="22"/> + <line hits="0" number="24"/> + <line hits="1" number="26"/> + <line branch="true" condition-coverage="50% (1/2)" hits="1" missing-branches="29" number="28"/> + <line hits="0" number="29"/> + <line hits="1" number="31"/> + <line hits="1" number="36"/> + <line hits="1" number="39"/> + <line hits="1" number="41"/> + <line hits="1" number="46"/> + <line hits="1" number="50"/> + <line branch="true" condition-coverage="50% (1/2)" hits="1" missing-branches="57" number="56"/> + <line hits="0" number="57"/> + <line hits="1" number="59"/> + <line hits="1" number="61"/> + <line hits="1" number="62"/> + <line hits="1" number="63"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="65"/> + <line hits="1" number="66"/> + <line branch="true" condition-coverage="50% (1/2)" hits="1" missing-branches="72" number="68"/> + <line hits="1" number="71"/> + <line hits="0" number="72"/> + </lines> + </class> + <class branch-rate="0.5736" complexity="0" filename="common/utils.py" line-rate="0.6408" name="utils.py"> + <methods/> + <lines> + <line hits="1" number="17"/> + <line hits="1" number="18"/> + <line hits="1" number="19"/> + <line hits="1" number="20"/> + <line hits="1" number="21"/> + <line hits="1" number="23"/> + <line hits="1" number="24"/> + <line hits="1" number="25"/> + <line hits="1" number="26"/> + <line hits="1" number="27"/> + <line hits="1" number="28"/> + <line hits="1" number="30"/> + <line hits="1" number="31"/> + <line hits="1" number="32"/> + <line hits="1" number="33"/> + <line hits="1" number="34"/> + <line hits="1" number="35"/> + <line hits="1" number="37"/> + <line hits="1" number="39"/> + <line hits="1" number="40"/> + <line hits="1" number="42"/> + <line hits="1" number="46"/> + <line hits="1" number="47"/> + <line hits="1" number="48"/> + <line hits="1" number="49"/> + <line hits="1" number="50"/> + <line hits="1" number="53"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="54"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="56"/> + <line branch="true" condition-coverage="50% (1/2)" hits="1" missing-branches="58" number="57"/> + <line hits="0" number="58"/> + <line hits="0" number="59"/> + <line hits="1" number="61"/> + <line hits="1" number="62"/> + <line hits="1" number="64"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="65"/> + <line hits="1" number="66"/> + <line hits="1" number="67"/> + <line hits="1" number="69"/> + <line hits="1" number="70"/> + <line hits="1" number="73"/> + <line hits="0" number="74"/> + <line hits="0" number="75"/> + <line hits="0" number="76"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="exit,78" number="77"/> + <line hits="0" number="78"/> + <line hits="1" number="81"/> + <line hits="1" number="82"/> + <line hits="1" number="83"/> + <line hits="1" number="84"/> + <line branch="true" condition-coverage="50% (1/2)" hits="1" missing-branches="86" number="85"/> + <line hits="0" number="86"/> + <line hits="1" number="89"/> + <line hits="0" number="90"/> + <line hits="0" number="91"/> + <line hits="0" number="93"/> + <line hits="0" number="95"/> + <line hits="1" number="98"/> + <line hits="0" number="99"/> + <line hits="0" number="101"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="exit,103" number="102"/> + <line hits="0" number="103"/> + <line hits="0" number="104"/> + <line hits="1" number="107"/> + <line hits="0" number="108"/> + <line hits="0" number="109"/> + <line hits="0" number="111"/> + <line hits="1" number="114"/> + <line hits="0" number="115"/> + <line hits="0" number="116"/> + <line hits="1" number="119"/> + <line hits="0" number="120"/> + <line hits="0" number="121"/> + <line hits="1" number="124"/> + <line hits="0" number="125"/> + <line hits="0" number="127"/> + <line hits="0" number="128"/> + <line hits="0" number="129"/> + <line hits="0" number="130"/> + <line hits="0" number="131"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="134,136" number="133"/> + <line hits="0" number="134"/> + <line hits="0" number="136"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="exit,141" number="137"/> + <line hits="0" number="138"/> + <line hits="0" number="139"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="exit,145" number="141"/> + <line hits="0" number="145"/> + <line hits="1" number="148"/> + <line hits="0" number="149"/> + <line hits="0" number="150"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="153,154" number="152"/> + <line hits="0" number="153"/> + <line hits="0" number="154"/> + <line hits="1" number="157"/> + <line hits="0" number="158"/> + <line hits="0" number="160"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="163,164" number="162"/> + <line hits="0" number="163"/> + <line hits="0" number="164"/> + <line hits="1" number="167"/> + <line hits="1" number="168"/> + <line branch="true" condition-coverage="100% (3/3)" hits="1" number="171"/> + <line hits="1" number="173"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="175"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="176"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="177"/> + <line hits="1" number="178"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="180"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="181"/> + <line hits="1" number="182"/> + <line hits="1" number="184"/> + <line hits="1" number="186"/> + <line hits="1" number="189"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="190"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="191"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="192"/> + <line hits="1" number="193"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="194"/> + <line hits="1" number="195"/> + <line hits="1" number="196"/> + <line hits="1" number="199"/> + <line hits="0" number="200"/> + <line hits="0" number="204"/> + <line hits="1" number="207"/> + <line hits="1" number="208"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="209"/> + <line hits="1" number="210"/> + <line hits="1" number="211"/> + <line hits="1" number="212"/> + <line hits="1" number="213"/> + <line hits="1" number="214"/> + <line hits="1" number="217"/> + <line hits="1" number="218"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="220"/> + <line hits="1" number="221"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="222"/> + <line hits="1" number="223"/> + <line hits="1" number="225"/> + <line hits="1" number="226"/> + <line hits="1" number="229"/> + <line hits="0" number="230"/> + <line hits="0" number="231"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="233,234" number="232"/> + <line hits="0" number="233"/> + <line hits="0" number="234"/> + <line hits="1" number="237"/> + <line hits="1" number="238"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="239"/> + <line hits="1" number="240"/> + <line hits="1" number="243"/> + <line hits="1" number="245"/> + <line hits="1" number="246"/> + <line hits="1" number="247"/> + <line hits="1" number="248"/> + <line hits="1" number="249"/> + <line hits="1" number="252"/> + <line hits="1" number="254"/> + <line hits="1" number="255"/> + <line hits="1" number="256"/> + <line hits="1" number="257"/> + <line hits="1" number="258"/> + <line hits="1" number="260"/> + <line hits="1" number="263"/> + <line hits="1" number="264"/> + <line hits="1" number="265"/> + <line hits="1" number="266"/> + <line hits="1" number="267"/> + <line hits="1" number="268"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="270"/> + <line hits="1" number="271"/> + <line branch="true" condition-coverage="50% (1/2)" hits="1" missing-branches="276" number="273"/> + <line hits="1" number="274"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="exit,exit" number="276"/> + <line hits="1" number="279"/> + <line hits="1" number="281"/> + <line hits="1" number="282"/> + <line hits="1" number="283"/> + <line hits="1" number="284"/> + <line hits="1" number="287"/> + <line hits="1" number="289"/> + <line hits="1" number="291"/> + <line hits="1" number="293"/> + <line hits="1" number="295"/> + <line hits="1" number="296"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="297"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="298"/> + <line hits="1" number="299"/> + <line hits="1" number="300"/> + <line hits="1" number="302"/> + <line hits="1" number="303"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="305"/> + <line hits="1" number="306"/> + <line hits="1" number="310"/> + <line hits="1" number="312"/> + <line hits="1" number="313"/> + <line hits="1" number="315"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="316"/> + <line hits="1" number="318"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="319"/> + <line hits="1" number="324"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="exit,exit" number="325"/> + <line hits="1" number="329"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="334,335" number="333"/> + <line hits="0" number="334"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="336,337" number="335"/> + <line hits="0" number="336"/> + <line hits="0" number="337"/> + <line hits="1" number="340"/> + <line hits="0" number="341"/> + <line hits="0" number="342"/> + <line hits="0" number="343"/> + <line hits="0" number="344"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="exit,exit" number="345"/> + <line hits="1" number="348"/> + <line branch="true" condition-coverage="50% (1/2)" hits="1" missing-branches="351" number="350"/> + <line hits="0" number="351"/> + <line hits="1" number="352"/> + <line hits="1" number="355"/> + <line hits="1" number="357"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="exit,359" number="358"/> + <line hits="0" number="359"/> + <line hits="1" number="361"/> + <line hits="0" number="362"/> + <line hits="1" number="365"/> + <line hits="1" number="366"/> + <line hits="0" number="367"/> + <line hits="0" number="368"/> + <line hits="1" number="370"/> + <line hits="0" number="371"/> + <line hits="0" number="372"/> + <line hits="1" number="374"/> + <line hits="0" number="375"/> + <line hits="1" number="377"/> + <line hits="0" number="378"/> + <line hits="1" number="381"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="391"/> + <line hits="1" number="392"/> + <line hits="1" number="393"/> + <line hits="0" number="394"/> + <line hits="1" number="395"/> + <line hits="1" number="396"/> + <line hits="1" number="397"/> + <line hits="1" number="400"/> + <line hits="1" number="401"/> + <line hits="1" number="402"/> + <line hits="1" number="403"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="404"/> + <line hits="1" number="405"/> + <line hits="1" number="406"/> + <line hits="1" number="409"/> + <line hits="1" number="411"/> + <line hits="1" number="412"/> + <line hits="1" number="413"/> + <line hits="1" number="416"/> + <line branch="true" condition-coverage="50% (1/2)" hits="1" missing-branches="418" number="417"/> + <line hits="0" number="418"/> + <line branch="true" condition-coverage="50% (1/2)" hits="1" missing-branches="420" number="419"/> + <line hits="0" number="420"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="422,424" number="421"/> + <line hits="0" number="422"/> + <line hits="0" number="423"/> + <line hits="0" number="424"/> + <line branch="true" condition-coverage="50% (1/2)" hits="1" missing-branches="426" number="425"/> + <line hits="0" number="426"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="428,430" number="427"/> + <line hits="0" number="428"/> + <line hits="0" number="429"/> + <line hits="0" number="430"/> + <line hits="1" number="431"/> + <line hits="1" number="434"/> + <line hits="1" number="435"/> + <line hits="1" number="438"/> + <line hits="1" number="439"/> + <line branch="true" condition-coverage="50% (1/2)" hits="1" missing-branches="441" number="440"/> + <line hits="0" number="441"/> + <line hits="1" number="442"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="443"/> + <line hits="1" number="444"/> + <line hits="1" number="445"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="446"/> + <line hits="1" number="447"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="448"/> + <line branch="true" condition-coverage="50% (1/2)" hits="1" missing-branches="453" number="449"/> + <line hits="1" number="450"/> + <line hits="1" number="453"/> + <line hits="1" number="455"/> + <line hits="1" number="457"/> + <line hits="1" number="458"/> + <line hits="1" number="460"/> + <line branch="true" condition-coverage="50% (1/2)" hits="1" missing-branches="462" number="461"/> + <line hits="0" number="462"/> + <line hits="1" number="464"/> + <line hits="1" number="466"/> + <line hits="1" number="469"/> + <line hits="0" number="470"/> + <line hits="0" number="471"/> + <line hits="1" number="474"/> + <line hits="1" number="475"/> + <line hits="1" number="476"/> + <line hits="0" number="477"/> + <line hits="0" number="478"/> + <line hits="0" number="479"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="481,482" number="480"/> + <line hits="0" number="481"/> + <line hits="0" number="482"/> + <line hits="1" number="485"/> + <line hits="0" number="486"/> + <line hits="0" number="487"/> + <line hits="0" number="488"/> + <line hits="0" number="489"/> + <line hits="0" number="490"/> + <line hits="0" number="491"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="493,494" number="492"/> + <line hits="0" number="493"/> + <line hits="0" number="494"/> + <line hits="1" number="497"/> + <line branch="true" condition-coverage="50% (1/2)" hits="1" missing-branches="499" number="498"/> + <line hits="0" number="499"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="501,503" number="500"/> + <line hits="0" number="501"/> + <line hits="0" number="502"/> + <line hits="0" number="503"/> + <line branch="true" condition-coverage="50% (1/2)" hits="1" missing-branches="505" number="504"/> + <line hits="0" number="505"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="507,509" number="506"/> + <line hits="0" number="507"/> + <line hits="0" number="508"/> + <line hits="0" number="509"/> + <line branch="true" condition-coverage="50% (1/2)" hits="1" missing-branches="511" number="510"/> + <line hits="0" number="511"/> + <line hits="1" number="513"/> + <line hits="1" number="514"/> + <line hits="1" number="515"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="516"/> + <line branch="true" condition-coverage="50% (1/2)" hits="1" missing-branches="519" number="518"/> + <line hits="0" number="519"/> + <line hits="1" number="521"/> + <line hits="1" number="522"/> + <line hits="1" number="523"/> + <line hits="0" number="524"/> + <line hits="0" number="525"/> + <line hits="0" number="526"/> + <line hits="0" number="527"/> + <line branch="true" condition-coverage="50% (1/2)" hits="1" missing-branches="531" number="528"/> + <line hits="1" number="529"/> + <line hits="0" number="531"/> + <line hits="1" number="532"/> + </lines> + </class> + <class branch-rate="0.5" complexity="0" filename="common/yaml_loader.py" line-rate="0.8" name="yaml_loader.py"> + <methods/> + <lines> + <line hits="1" number="17"/> + <line hits="1" number="19"/> + <line branch="true" condition-coverage="50% (1/2)" hits="1" missing-branches="24" number="22"/> + <line hits="0" number="24"/> + <line hits="1" number="26"/> + <line branch="true" condition-coverage="50% (1/2)" hits="1" missing-branches="29" number="28"/> + <line hits="0" number="29"/> + <line hits="1" number="31"/> + <line hits="1" number="34"/> + <line hits="1" number="35"/> + </lines> + </class> + </classes> + </package> + <package branch-rate="0.8333" complexity="0" line-rate="0.8393" name="contexts"> + <classes> + <class branch-rate="1" complexity="0" filename="contexts/__init__.py" line-rate="1" name="__init__.py"> + <methods/> + <lines/> + </class> + <class branch-rate="0.8333" complexity="0" filename="contexts/base.py" line-rate="0.8966" name="base.py"> + <methods/> + <lines> + <line hits="1" number="14"/> + <line hits="1" number="15"/> + <line hits="1" number="16"/> + <line hits="1" number="18"/> + <line hits="1" number="19"/> + <line hits="1" number="20"/> + <line hits="1" number="21"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="24"/> + <line hits="1" number="25"/> + <line hits="1" number="27"/> + <line hits="1" number="29"/> + <line hits="1" number="30"/> + <line hits="1" number="31"/> + <line hits="1" number="32"/> + <line hits="1" number="34"/> + <line hits="1" number="35"/> + <line hits="1" number="36"/> + <line hits="1" number="38"/> + <line branch="true" condition-coverage="50% (1/2)" hits="1" missing-branches="44" number="41"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="42"/> + <line hits="1" number="43"/> + <line hits="0" number="44"/> + <line hits="1" number="46"/> + <line hits="1" number="50"/> + <line hits="1" number="52"/> + <line hits="0" number="53"/> + <line hits="1" number="55"/> + <line hits="1" number="59"/> + <line hits="0" number="62"/> + </lines> + </class> + <class branch-rate="1" complexity="0" filename="contexts/csar.py" line-rate="0.8462" name="csar.py"> + <methods/> + <lines> + <line hits="1" number="15"/> + <line hits="1" number="17"/> + <line hits="1" number="19"/> + <line hits="1" number="22"/> + <line hits="1" number="25"/> + <line hits="1" number="27"/> + <line hits="1" number="28"/> + <line hits="1" number="30"/> + <line hits="1" number="31"/> + <line hits="1" number="33"/> + <line hits="0" number="35"/> + <line hits="1" number="37"/> + <line hits="0" number="39"/> + </lines> + </class> + <class branch-rate="1" complexity="0" filename="contexts/dummy.py" line-rate="0.7143" name="dummy.py"> + <methods/> + <lines> + <line hits="1" number="15"/> + <line hits="1" number="16"/> + <line hits="1" number="18"/> + <line hits="1" number="21"/> + <line hits="1" number="24"/> + <line hits="1" number="27"/> + <line hits="1" number="29"/> + <line hits="0" number="30"/> + <line hits="1" number="32"/> + <line hits="0" number="33"/> + <line hits="1" number="35"/> + <line hits="0" number="37"/> + <line hits="1" number="39"/> + <line hits="0" number="41"/> + </lines> + </class> + </classes> + </package> + <package branch-rate="0.5263" complexity="0" line-rate="0.7595" name="core"> + <classes> + <class branch-rate="1" complexity="0" filename="core/__init__.py" line-rate="1" name="__init__.py"> + <methods/> + <lines> + <line hits="1" number="16"/> + <line hits="1" number="20"/> + <line hits="1" number="23"/> + <line hits="1" number="26"/> + <line hits="1" number="28"/> + <line hits="1" number="29"/> + <line hits="1" number="30"/> + <line hits="1" number="31"/> + <line hits="1" number="32"/> + <line hits="1" number="33"/> + <line hits="1" number="34"/> + <line hits="1" number="35"/> + <line hits="1" number="36"/> + <line hits="1" number="39"/> + <line hits="1" number="42"/> + <line hits="1" number="45"/> + </lines> + </class> + <class branch-rate="0.8333" complexity="0" filename="core/plugin.py" line-rate="0.8977" name="plugin.py"> + <methods/> + <lines> + <line hits="1" number="16"/> + <line hits="1" number="18"/> + <line hits="1" number="19"/> + <line hits="1" number="20"/> + <line hits="1" number="21"/> + <line hits="1" number="22"/> + <line hits="1" number="23"/> + <line hits="1" number="24"/> + <line hits="1" number="25"/> + <line hits="1" number="27"/> + <line hits="1" number="28"/> + <line hits="1" number="30"/> + <line hits="1" number="33"/> + <line hits="1" number="39"/> + <line hits="1" number="42"/> + <line hits="1" number="43"/> + <line hits="1" number="45"/> + <line hits="1" number="46"/> + <line hits="1" number="47"/> + <line hits="1" number="49"/> + <line hits="1" number="50"/> + <line hits="1" number="52"/> + <line hits="1" number="53"/> + <line hits="1" number="55"/> + <line hits="1" number="56"/> + <line hits="1" number="59"/> + <line hits="1" number="61"/> + <line hits="1" number="64"/> + <line hits="1" number="65"/> + <line hits="1" number="67"/> + <line hits="1" number="68"/> + <line hits="1" number="69"/> + <line hits="1" number="71"/> + <line hits="1" number="72"/> + <line hits="1" number="74"/> + <line hits="1" number="75"/> + <line hits="1" number="77"/> + <line hits="1" number="78"/> + <line hits="1" number="81"/> + <line hits="1" number="83"/> + <line hits="1" number="85"/> + <line hits="1" number="86"/> + <line hits="1" number="89"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="91"/> + <line hits="1" number="92"/> + <line hits="1" number="97"/> + <line hits="1" number="98"/> + <line hits="1" number="101"/> + <line hits="1" number="103"/> + <line hits="1" number="104"/> + <line hits="1" number="106"/> + <line hits="1" number="108"/> + <line hits="1" number="109"/> + <line hits="1" number="112"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="114"/> + <line hits="1" number="115"/> + <line hits="1" number="120"/> + <line hits="1" number="121"/> + <line hits="1" number="124"/> + <line hits="1" number="126"/> + <line hits="1" number="127"/> + <line hits="1" number="129"/> + <line hits="0" number="131"/> + <line hits="0" number="133"/> + <line hits="0" number="134"/> + <line hits="1" number="137"/> + <line hits="1" number="140"/> + <line hits="1" number="141"/> + <line hits="1" number="143"/> + <line hits="1" number="148"/> + <line hits="1" number="150"/> + <line hits="1" number="151"/> + <line hits="1" number="152"/> + <line hits="1" number="153"/> + <line hits="1" number="154"/> + <line hits="1" number="155"/> + <line hits="0" number="156"/> + <line hits="0" number="157"/> + <line hits="0" number="159"/> + <line hits="1" number="160"/> + <line hits="1" number="162"/> + <line hits="0" number="163"/> + <line hits="0" number="164"/> + <line hits="1" number="166"/> + <line hits="1" number="168"/> + <line hits="1" number="170"/> + <line branch="true" condition-coverage="50% (1/2)" hits="1" missing-branches="174" number="173"/> + <line hits="0" number="174"/> + </lines> + </class> + <class branch-rate="0.75" complexity="0" filename="core/report.py" line-rate="0.925" name="report.py"> + <methods/> + <lines> + <line hits="1" number="16"/> + <line hits="1" number="18"/> + <line hits="1" number="19"/> + <line hits="1" number="22"/> + <line hits="1" number="23"/> + <line hits="1" number="24"/> + <line hits="1" number="26"/> + <line hits="1" number="27"/> + <line hits="1" number="28"/> + <line hits="1" number="30"/> + <line hits="1" number="32"/> + <line hits="1" number="33"/> + <line hits="1" number="34"/> + <line hits="1" number="36"/> + <line hits="1" number="39"/> + <line hits="1" number="43"/> + <line hits="1" number="44"/> + <line hits="1" number="45"/> + <line hits="1" number="46"/> + <line hits="1" number="48"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="49"/> + <line hits="1" number="50"/> + <line hits="1" number="52"/> + <line branch="true" condition-coverage="50% (1/2)" hits="1" missing-branches="55" number="54"/> + <line hits="0" number="55"/> + <line hits="0" number="56"/> + <line hits="0" number="57"/> + <line hits="1" number="59"/> + <line hits="1" number="79"/> + <line hits="1" number="80"/> + <line hits="1" number="83"/> + <line hits="1" number="90"/> + <line hits="1" number="91"/> + <line hits="1" number="119"/> + <line hits="1" number="120"/> + <line hits="1" number="124"/> + <line hits="1" number="125"/> + <line hits="1" number="126"/> + <line hits="1" number="127"/> + <line hits="1" number="129"/> + </lines> + </class> + <class branch-rate="1" complexity="0" filename="core/runner.py" line-rate="1" name="runner.py"> + <methods/> + <lines> + <line hits="1" number="16"/> + <line hits="1" number="18"/> + <line hits="1" number="20"/> + <line hits="1" number="22"/> + </lines> + </class> + <class branch-rate="1" complexity="0" filename="core/step.py" line-rate="1" name="step.py"> + <methods/> + <lines> + <line hits="1" number="17"/> + <line hits="1" number="19"/> + <line hits="1" number="20"/> + <line hits="1" number="22"/> + </lines> + </class> + <class branch-rate="0.4286" complexity="0" filename="core/task.py" line-rate="0.6739" name="task.py"> + <methods/> + <lines> + <line hits="1" number="17"/> + <line hits="1" number="19"/> + <line hits="1" number="20"/> + <line hits="1" number="22"/> + <line hits="1" number="23"/> + <line hits="1" number="24"/> + <line hits="1" number="25"/> + <line hits="1" number="26"/> + <line hits="1" number="27"/> + <line hits="1" number="28"/> + <line hits="1" number="30"/> + <line hits="1" number="31"/> + <line hits="1" number="32"/> + <line hits="1" number="33"/> + <line hits="1" number="34"/> + <line hits="1" number="35"/> + <line hits="1" number="37"/> + <line hits="1" number="38"/> + <line hits="1" number="39"/> + <line hits="1" number="40"/> + <line hits="1" number="41"/> + <line hits="1" number="42"/> + <line hits="1" number="43"/> + <line hits="1" number="44"/> + <line hits="1" number="45"/> + <line hits="1" number="46"/> + <line hits="1" number="47"/> + <line hits="1" number="48"/> + <line hits="1" number="49"/> + <line hits="1" number="50"/> + <line hits="1" number="52"/> + <line hits="1" number="53"/> + <line hits="1" number="486"/> + <line hits="1" number="488"/> + <line hits="1" number="489"/> + <line hits="1" number="490"/> + <line hits="1" number="491"/> + <line hits="1" number="492"/> + <line hits="1" number="493"/> + <line hits="1" number="494"/> + <line hits="1" number="495"/> + <line hits="1" number="496"/> + <line hits="1" number="498"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="exit,500" number="499"/> + <line hits="0" number="500"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="502,505" number="501"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="501,503" number="502"/> + <line hits="0" number="503"/> + <line hits="0" number="504"/> + <line hits="0" number="505"/> + <line hits="0" number="506"/> + <line hits="1" number="508"/> + <line hits="0" number="509"/> + <line hits="0" number="510"/> + <line hits="1" number="512"/> + <line hits="0" number="513"/> + <line hits="0" number="514"/> + <line hits="0" number="515"/> + <line hits="1" number="517"/> + <line hits="1" number="518"/> + <line hits="1" number="519"/> + <line hits="1" number="520"/> + <line hits="1" number="522"/> + <line hits="1" number="523"/> + <line branch="true" condition-coverage="50% (1/2)" hits="1" missing-branches="exit" number="524"/> + <line hits="1" number="525"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="526"/> + <line branch="true" condition-coverage="50% (1/2)" hits="1" missing-branches="528" number="527"/> + <line hits="0" number="528"/> + <line hits="0" number="529"/> + <line hits="1" number="530"/> + <line hits="1" number="531"/> + <line hits="1" number="533"/> + <line hits="1" number="534"/> + <line hits="1" number="535"/> + <line hits="1" number="536"/> + <line hits="1" number="537"/> + <line hits="1" number="538"/> + <line hits="1" number="539"/> + <line hits="1" number="540"/> + <line hits="1" number="542"/> + <line hits="1" number="543"/> + <line hits="1" number="544"/> + <line hits="1" number="546"/> + <line hits="1" number="547"/> + <line hits="1" number="548"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="549"/> + <line hits="1" number="550"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="556"/> + <line hits="1" number="557"/> + <line branch="true" condition-coverage="50% (1/2)" hits="1" missing-branches="560" number="559"/> + <line hits="0" number="560"/> + <line hits="0" number="561"/> + <line hits="1" number="562"/> + <line branch="true" condition-coverage="50% (1/2)" hits="1" missing-branches="564" number="563"/> + <line hits="0" number="564"/> + <line hits="1" number="566"/> + <line hits="1" number="567"/> + <line hits="1" number="569"/> + <line hits="1" number="570"/> + <line hits="1" number="573"/> + <line hits="0" number="575"/> + <line hits="0" number="576"/> + <line hits="0" number="577"/> + <line hits="0" number="578"/> + <line hits="0" number="580"/> + <line hits="0" number="581"/> + <line hits="0" number="582"/> + <line hits="0" number="583"/> + <line hits="0" number="585"/> + <line hits="1" number="588"/> + <line branch="true" condition-coverage="50% (1/2)" hits="1" missing-branches="590" number="589"/> + <line hits="0" number="590"/> + <line hits="1" number="592"/> + <line hits="1" number="595"/> + <line branch="true" condition-coverage="50% (1/2)" hits="1" missing-branches="597" number="596"/> + <line hits="0" number="597"/> + <line hits="0" number="598"/> + <line hits="1" number="599"/> + <line hits="1" number="600"/> + <line hits="1" number="601"/> + <line hits="1" number="604"/> + <line hits="0" number="605"/> + <line hits="1" number="609"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="611,613" number="610"/> + <line hits="0" number="611"/> + <line hits="0" number="613"/> + <line hits="0" number="614"/> + <line hits="0" number="615"/> + <line hits="0" number="616"/> + <line hits="0" number="617"/> + <line hits="0" number="618"/> + <line hits="0" number="620"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="623,627" number="622"/> + <line hits="0" number="623"/> + <line hits="0" number="624"/> + <line hits="0" number="626"/> + <line hits="0" number="627"/> + </lines> + </class> + <class branch-rate="1" complexity="0" filename="core/testcase.py" line-rate="0.7869" name="testcase.py"> + <methods/> + <lines> + <line hits="1" number="17"/> + <line hits="1" number="18"/> + <line hits="1" number="19"/> + <line hits="1" number="21"/> + <line hits="1" number="23"/> + <line hits="1" number="24"/> + <line hits="1" number="26"/> + <line hits="1" number="27"/> + <line hits="1" number="28"/> + <line hits="1" number="30"/> + <line hits="1" number="33"/> + <line hits="1" number="39"/> + <line hits="1" number="42"/> + <line hits="1" number="43"/> + <line hits="1" number="45"/> + <line hits="1" number="47"/> + <line hits="1" number="48"/> + <line hits="1" number="49"/> + <line hits="0" number="50"/> + <line hits="0" number="51"/> + <line hits="0" number="52"/> + <line hits="1" number="54"/> + <line hits="1" number="56"/> + <line hits="1" number="58"/> + <line hits="1" number="59"/> + <line hits="1" number="60"/> + <line hits="1" number="61"/> + <line hits="0" number="62"/> + <line hits="0" number="63"/> + <line hits="0" number="64"/> + <line hits="1" number="66"/> + <line hits="1" number="69"/> + <line hits="1" number="75"/> + <line hits="1" number="77"/> + <line hits="1" number="78"/> + <line hits="1" number="79"/> + <line hits="1" number="80"/> + <line hits="1" number="82"/> + <line hits="1" number="83"/> + <line hits="1" number="84"/> + <line hits="1" number="85"/> + <line hits="1" number="87"/> + <line hits="1" number="88"/> + <line hits="1" number="89"/> + <line hits="0" number="90"/> + <line hits="0" number="91"/> + <line hits="1" number="93"/> + <line hits="1" number="94"/> + <line hits="0" number="95"/> + <line hits="0" number="96"/> + <line hits="1" number="98"/> + <line hits="1" number="100"/> + <line hits="1" number="101"/> + <line hits="1" number="103"/> + <line hits="1" number="104"/> + <line hits="1" number="105"/> + <line hits="0" number="106"/> + <line hits="0" number="107"/> + <line hits="0" number="108"/> + <line hits="1" number="110"/> + <line hits="1" number="111"/> + </lines> + </class> + <class branch-rate="1" complexity="0" filename="core/testsuite.py" line-rate="0" name="testsuite.py"> + <methods/> + <lines> + <line hits="0" number="17"/> + <line hits="0" number="18"/> + <line hits="0" number="19"/> + <line hits="0" number="21"/> + <line hits="0" number="23"/> + <line hits="0" number="24"/> + <line hits="0" number="26"/> + <line hits="0" number="28"/> + <line hits="0" number="31"/> + <line hits="0" number="37"/> + <line hits="0" number="40"/> + <line hits="0" number="42"/> + <line hits="0" number="44"/> + <line hits="0" number="45"/> + <line hits="0" number="46"/> + <line hits="0" number="47"/> + <line hits="0" number="48"/> + <line hits="0" number="49"/> + <line hits="0" number="51"/> + </lines> + </class> + </classes> + </package> + <package branch-rate="0" complexity="0" line-rate="0.3617" name="crawlers"> + <classes> + <class branch-rate="1" complexity="0" filename="crawlers/__init__.py" line-rate="1" name="__init__.py"> + <methods/> + <lines/> + </class> + <class branch-rate="0" complexity="0" filename="crawlers/base.py" line-rate="0.36" name="base.py"> + <methods/> + <lines> + <line hits="1" number="15"/> + <line hits="1" number="16"/> + <line hits="1" number="18"/> + <line hits="1" number="20"/> + <line hits="1" number="23"/> + <line hits="1" number="25"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="29,31" number="28"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="28,30" number="29"/> + <line hits="0" number="30"/> + <line hits="0" number="31"/> + <line hits="1" number="33"/> + <line hits="0" number="34"/> + <line hits="1" number="36"/> + <line hits="0" number="37"/> + <line hits="1" number="39"/> + <line hits="0" number="41"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="43,50" number="42"/> + <line hits="0" number="43"/> + <line hits="0" number="44"/> + <line hits="0" number="45"/> + <line hits="0" number="46"/> + <line hits="0" number="47"/> + <line hits="0" number="48"/> + <line hits="0" number="49"/> + <line hits="0" number="50"/> + </lines> + </class> + <class branch-rate="0" complexity="0" filename="crawlers/default.py" line-rate="0.3636" name="default.py"> + <methods/> + <lines> + <line hits="1" number="15"/> + <line hits="1" number="17"/> + <line hits="1" number="19"/> + <line hits="1" number="20"/> + <line hits="1" number="22"/> + <line hits="1" number="25"/> + <line hits="1" number="26"/> + <line hits="1" number="28"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="30,32" number="29"/> + <line hits="0" number="30"/> + <line hits="0" number="32"/> + <line hits="0" number="33"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="35,41" number="34"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="36,37" number="35"/> + <line hits="0" number="36"/> + <line hits="0" number="37"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="39,40" number="38"/> + <line hits="0" number="39"/> + <line hits="0" number="40"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="42,43" number="41"/> + <line hits="0" number="42"/> + <line hits="0" number="43"/> + </lines> + </class> + </classes> + </package> + <package branch-rate="0.2" complexity="0" line-rate="0.4937" name="dispatcher"> + <classes> + <class branch-rate="1" complexity="0" filename="dispatcher/__init__.py" line-rate="1" name="__init__.py"> + <methods/> + <lines> + <line hits="1" number="17"/> + <line hits="1" number="18"/> + <line hits="1" number="20"/> + <line hits="1" number="22"/> + <line hits="1" number="24"/> + <line hits="1" number="25"/> + <line hits="1" number="30"/> + </lines> + </class> + <class branch-rate="0.3333" complexity="0" filename="dispatcher/base.py" line-rate="0.5882" name="base.py"> + <methods/> + <lines> + <line hits="1" number="17"/> + <line hits="1" number="18"/> + <line hits="1" number="19"/> + <line hits="1" number="21"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="24"/> + <line hits="1" number="25"/> + <line hits="1" number="27"/> + <line hits="0" number="28"/> + <line hits="1" number="30"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="34,36" number="33"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="33,35" number="34"/> + <line hits="0" number="35"/> + <line hits="0" number="36"/> + <line hits="1" number="38"/> + <line hits="0" number="42"/> + <line hits="0" number="46"/> + <line hits="1" number="48"/> + </lines> + </class> + <class branch-rate="1" complexity="0" filename="dispatcher/file.py" line-rate="0.6923" name="file.py"> + <methods/> + <lines> + <line hits="1" number="17"/> + <line hits="1" number="19"/> + <line hits="1" number="21"/> + <line hits="1" number="22"/> + <line hits="1" number="23"/> + <line hits="1" number="26"/> + <line hits="1" number="30"/> + <line hits="1" number="32"/> + <line hits="0" number="33"/> + <line hits="1" number="35"/> + <line hits="0" number="36"/> + <line hits="0" number="37"/> + <line hits="0" number="38"/> + </lines> + </class> + <class branch-rate="0" complexity="0" filename="dispatcher/http.py" line-rate="0.3095" name="http.py"> + <methods/> + <lines> + <line hits="1" number="17"/> + <line hits="1" number="19"/> + <line hits="1" number="20"/> + <line hits="1" number="21"/> + <line hits="1" number="23"/> + <line hits="1" number="24"/> + <line hits="1" number="26"/> + <line hits="1" number="28"/> + <line hits="1" number="31"/> + <line hits="1" number="35"/> + <line hits="1" number="37"/> + <line hits="0" number="38"/> + <line hits="0" number="39"/> + <line hits="0" number="40"/> + <line hits="0" number="41"/> + <line hits="0" number="42"/> + <line hits="1" number="44"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="47,51" number="45"/> + <line hits="0" number="47"/> + <line hits="0" number="49"/> + <line hits="0" number="51"/> + <line hits="0" number="52"/> + <line hits="0" number="53"/> + <line hits="0" number="54"/> + <line hits="0" number="55"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="exit,58" number="57"/> + <line hits="0" number="58"/> + <line hits="1" number="60"/> + <line hits="0" number="61"/> + <line hits="0" number="62"/> + <line hits="0" number="63"/> + <line hits="0" number="64"/> + <line hits="0" number="65"/> + <line hits="0" number="67"/> + <line hits="0" number="68"/> + <line hits="0" number="70"/> + <line hits="0" number="82"/> + <line hits="0" number="83"/> + <line hits="0" number="84"/> + <line hits="0" number="88"/> + <line hits="0" number="90"/> + <line hits="0" number="91"/> + </lines> + </class> + </classes> + </package> + <package branch-rate="1" complexity="0" line-rate="1" name="onap"> + <classes> + <class branch-rate="1" complexity="0" filename="onap/__init__.py" line-rate="1" name="__init__.py"> + <methods/> + <lines/> + </class> + </classes> + </package> + <package branch-rate="0" complexity="0" line-rate="0.5" name="onap.common"> + <classes> + <class branch-rate="1" complexity="0" filename="onap/common/__init__.py" line-rate="1" name="__init__.py"> + <methods/> + <lines/> + </class> + <class branch-rate="0" complexity="0" filename="onap/common/vf_module_crawler.py" line-rate="0.5" name="vf_module_crawler.py"> + <methods/> + <lines> + <line hits="1" number="15"/> + <line hits="1" number="16"/> + <line hits="1" number="17"/> + <line hits="1" number="19"/> + <line hits="1" number="22"/> + <line hits="1" number="23"/> + <line hits="1" number="25"/> + <line hits="0" number="26"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="28,35" number="27"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="27,32" number="28"/> + <line hits="0" number="32"/> + <line hits="0" number="33"/> + <line hits="0" number="34"/> + <line hits="0" number="35"/> + </lines> + </class> + </classes> + </package> + <package branch-rate="1" complexity="0" line-rate="1" name="onap.lifecycle"> + <classes> + <class branch-rate="1" complexity="0" filename="onap/lifecycle/__init__.py" line-rate="1" name="__init__.py"> + <methods/> + <lines/> + </class> + </classes> + </package> + <package branch-rate="1" complexity="0" line-rate="1" name="onap.onboard"> + <classes> + <class branch-rate="1" complexity="0" filename="onap/onboard/__init__.py" line-rate="1" name="__init__.py"> + <methods/> + <lines/> + </class> + </classes> + </package> + <package branch-rate="1" complexity="0" line-rate="1" name="onap.onboard.v1"> + <classes> + <class branch-rate="1" complexity="0" filename="onap/onboard/v1/__init__.py" line-rate="1" name="__init__.py"> + <methods/> + <lines/> + </class> + </classes> + </package> + <package branch-rate="1" complexity="0" line-rate="1" name="onap.onboard.v2"> + <classes> + <class branch-rate="1" complexity="0" filename="onap/onboard/v2/__init__.py" line-rate="1" name="__init__.py"> + <methods/> + <lines/> + </class> + </classes> + </package> + <package branch-rate="1" complexity="0" line-rate="1" name="onap.steps"> + <classes> + <class branch-rate="1" complexity="0" filename="onap/steps/__init__.py" line-rate="1" name="__init__.py"> + <methods/> + <lines/> + </class> + </classes> + </package> + <package branch-rate="0" complexity="0" line-rate="0.3529" name="onap.steps.validation"> + <classes> + <class branch-rate="1" complexity="0" filename="onap/steps/validation/__init__.py" line-rate="1" name="__init__.py"> + <methods/> + <lines/> + </class> + <class branch-rate="0" complexity="0" filename="onap/steps/validation/vf_module_validator.py" line-rate="0.3529" name="vf_module_validator.py"> + <methods/> + <lines> + <line hits="1" number="15"/> + <line hits="1" number="17"/> + <line hits="1" number="19"/> + <line hits="1" number="21"/> + <line hits="1" number="22"/> + <line hits="1" number="24"/> + <line hits="1" number="27"/> + <line hits="1" number="28"/> + <line hits="1" number="30"/> + <line hits="0" number="31"/> + <line hits="0" number="32"/> + <line hits="0" number="33"/> + <line hits="0" number="34"/> + <line hits="0" number="35"/> + <line hits="1" number="37"/> + <line hits="0" number="38"/> + <line hits="0" number="39"/> + <line hits="0" number="40"/> + <line hits="0" number="41"/> + <line hits="0" number="42"/> + <line hits="1" number="44"/> + <line hits="0" number="45"/> + <line hits="0" number="46"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="exit,48" number="47"/> + <line hits="0" number="48"/> + <line hits="1" number="51"/> + <line hits="0" number="52"/> + <line hits="0" number="53"/> + <line hits="0" number="54"/> + <line hits="0" number="59"/> + <line hits="0" number="60"/> + <line hits="0" number="61"/> + <line hits="0" number="62"/> + <line hits="0" number="63"/> + </lines> + </class> + </classes> + </package> + <package branch-rate="1" complexity="0" line-rate="1" name="openstack"> + <classes> + <class branch-rate="1" complexity="0" filename="openstack/__init__.py" line-rate="1" name="__init__.py"> + <methods/> + <lines/> + </class> + </classes> + </package> + <package branch-rate="0" complexity="0" line-rate="0.3871" name="openstack.steps"> + <classes> + <class branch-rate="1" complexity="0" filename="openstack/steps/__init__.py" line-rate="1" name="__init__.py"> + <methods/> + <lines/> + </class> + <class branch-rate="1" complexity="0" filename="openstack/steps/heat.py" line-rate="0.4138" name="heat.py"> + <methods/> + <lines> + <line hits="1" number="15"/> + <line hits="1" number="17"/> + <line hits="1" number="19"/> + <line hits="1" number="21"/> + <line hits="1" number="23"/> + <line hits="1" number="25"/> + <line hits="1" number="28"/> + <line hits="1" number="29"/> + <line hits="1" number="31"/> + <line hits="0" number="32"/> + <line hits="0" number="33"/> + <line hits="0" number="34"/> + <line hits="0" number="35"/> + <line hits="0" number="36"/> + <line hits="0" number="37"/> + <line hits="1" number="39"/> + <line hits="0" number="40"/> + <line hits="0" number="41"/> + <line hits="0" number="42"/> + <line hits="0" number="43"/> + <line hits="0" number="44"/> + <line hits="1" number="46"/> + <line hits="0" number="47"/> + <line hits="0" number="48"/> + <line hits="0" number="49"/> + <line hits="0" number="50"/> + <line hits="0" number="51"/> + <line hits="1" number="53"/> + <line hits="0" number="54"/> + </lines> + </class> + <class branch-rate="0" complexity="0" filename="openstack/steps/nova.py" line-rate="0.3636" name="nova.py"> + <methods/> + <lines> + <line hits="1" number="15"/> + <line hits="1" number="17"/> + <line hits="1" number="19"/> + <line hits="1" number="21"/> + <line hits="1" number="23"/> + <line hits="1" number="25"/> + <line hits="1" number="28"/> + <line hits="1" number="29"/> + <line hits="1" number="31"/> + <line hits="0" number="32"/> + <line hits="0" number="33"/> + <line hits="0" number="34"/> + <line hits="0" number="35"/> + <line hits="0" number="36"/> + <line hits="0" number="37"/> + <line hits="1" number="39"/> + <line hits="0" number="40"/> + <line hits="0" number="41"/> + <line hits="0" number="42"/> + <line hits="0" number="43"/> + <line hits="0" number="44"/> + <line hits="1" number="46"/> + <line hits="0" number="47"/> + <line hits="0" number="48"/> + <line hits="0" number="49"/> + <line hits="0" number="50"/> + <line hits="0" number="51"/> + <line hits="1" number="53"/> + <line hits="0" number="54"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="exit,56" number="55"/> + <line hits="0" number="56"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="55,58" number="57"/> + <line hits="0" number="58"/> + </lines> + </class> + </classes> + </package> + <package branch-rate="1" complexity="0" line-rate="1" name="resources"> + <classes> + <class branch-rate="1" complexity="0" filename="resources/__init__.py" line-rate="1" name="__init__.py"> + <methods/> + <lines/> + </class> + </classes> + </package> + <package branch-rate="0.1379" complexity="0" line-rate="0.3347" name="runners"> + <classes> + <class branch-rate="1" complexity="0" filename="runners/__init__.py" line-rate="1" name="__init__.py"> + <methods/> + <lines/> + </class> + <class branch-rate="0.381" complexity="0" filename="runners/base.py" line-rate="0.503" name="base.py"> + <methods/> + <lines> + <line hits="1" number="17"/> + <line hits="1" number="19"/> + <line hits="1" number="20"/> + <line hits="1" number="21"/> + <line hits="1" number="22"/> + <line hits="1" number="23"/> + <line hits="1" number="24"/> + <line hits="1" number="25"/> + <line hits="1" number="27"/> + <line hits="1" number="28"/> + <line hits="1" number="30"/> + <line hits="1" number="33"/> + <line hits="0" number="35"/> + <line hits="0" number="36"/> + <line hits="0" number="37"/> + <line hits="0" number="38"/> + <line hits="0" number="39"/> + <line hits="0" number="40"/> + <line hits="0" number="41"/> + <line hits="0" number="42"/> + <line hits="0" number="44"/> + <line hits="1" number="47"/> + <line hits="0" number="49"/> + <line hits="0" number="50"/> + <line hits="0" number="51"/> + <line hits="0" number="52"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="54,57" number="53"/> + <line hits="0" number="54"/> + <line hits="0" number="55"/> + <line hits="0" number="56"/> + <line hits="0" number="57"/> + <line hits="0" number="58"/> + <line hits="1" number="61"/> + <line hits="0" number="63"/> + <line hits="0" number="64"/> + <line hits="0" number="65"/> + <line hits="0" number="66"/> + <line hits="0" number="67"/> + <line hits="0" number="68"/> + <line hits="0" number="69"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="71,74" number="70"/> + <line hits="0" number="71"/> + <line hits="0" number="72"/> + <line hits="0" number="73"/> + <line hits="0" number="74"/> + <line hits="0" number="75"/> + <line hits="1" number="78"/> + <line hits="1" number="79"/> + <line hits="1" number="81"/> + <line branch="true" condition-coverage="50% (1/2)" hits="1" missing-branches="87" number="84"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="85"/> + <line hits="1" number="86"/> + <line hits="0" number="87"/> + <line hits="1" number="89"/> + <line hits="1" number="92"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="93"/> + <line hits="1" number="94"/> + <line hits="1" number="95"/> + <line hits="1" number="97"/> + <line hits="1" number="101"/> + <line hits="1" number="103"/> + <line branch="true" condition-coverage="50% (1/2)" hits="1" missing-branches="exit" number="106"/> + <line hits="1" number="107"/> + <line hits="1" number="109"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="exit,113" number="112"/> + <line hits="0" number="113"/> + <line hits="1" number="115"/> + <line hits="0" number="118"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="122,124" number="121"/> + <line hits="0" number="122"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="exit,125" number="124"/> + <line hits="0" number="125"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="127,129" number="126"/> + <line hits="0" number="127"/> + <line hits="0" number="128"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="130,133" number="129"/> + <line hits="0" number="130"/> + <line hits="0" number="131"/> + <line hits="0" number="132"/> + <line hits="0" number="133"/> + <line hits="1" number="135"/> + <line hits="1" number="136"/> + <line hits="1" number="137"/> + <line hits="1" number="138"/> + <line hits="1" number="139"/> + <line hits="1" number="140"/> + <line hits="1" number="141"/> + <line hits="1" number="142"/> + <line hits="1" number="144"/> + <line branch="true" condition-coverage="50% (1/2)" hits="1" missing-branches="147" number="146"/> + <line hits="0" number="147"/> + <line hits="0" number="148"/> + <line hits="0" number="149"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="151,154" number="150"/> + <line hits="0" number="151"/> + <line hits="0" number="152"/> + <line hits="0" number="153"/> + <line hits="0" number="154"/> + <line hits="0" number="155"/> + <line hits="1" number="157"/> + <line hits="0" number="158"/> + <line hits="1" number="160"/> + <line hits="1" number="161"/> + <line hits="1" number="162"/> + <line hits="1" number="163"/> + <line hits="1" number="164"/> + <line hits="1" number="165"/> + <line hits="1" number="166"/> + <line hits="1" number="168"/> + <line hits="1" number="169"/> + <line branch="true" condition-coverage="50% (1/2)" hits="1" missing-branches="173" number="172"/> + <line hits="0" number="173"/> + <line hits="0" number="174"/> + <line hits="0" number="175"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="177,180" number="176"/> + <line hits="0" number="177"/> + <line hits="0" number="178"/> + <line hits="0" number="179"/> + <line hits="0" number="180"/> + <line hits="0" number="181"/> + <line branch="true" condition-coverage="50% (1/2)" hits="1" missing-branches="184" number="183"/> + <line hits="0" number="184"/> + <line hits="0" number="190"/> + <line branch="true" condition-coverage="50% (1/2)" hits="1" missing-branches="193" number="192"/> + <line hits="0" number="193"/> + <line hits="0" number="199"/> + <line hits="1" number="201"/> + <line hits="1" number="203"/> + <line hits="0" number="205"/> + <line hits="1" number="207"/> + <line hits="1" number="209"/> + <line hits="1" number="210"/> + <line hits="1" number="211"/> + <line hits="1" number="213"/> + <line branch="true" condition-coverage="50% (1/2)" hits="1" missing-branches="216" number="214"/> + <line hits="0" number="216"/> + <line hits="0" number="217"/> + <line hits="0" number="218"/> + <line hits="1" number="220"/> + <line hits="1" number="221"/> + <line hits="1" number="223"/> + <line branch="true" condition-coverage="50% (1/2)" hits="1" missing-branches="225" number="224"/> + <line hits="0" number="225"/> + <line hits="0" number="226"/> + <line hits="0" number="227"/> + <line hits="1" number="229"/> + <line hits="1" number="230"/> + <line hits="1" number="232"/> + <line hits="1" number="233"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="234"/> + <line hits="1" number="235"/> + <line hits="1" number="236"/> + <line hits="1" number="237"/> + <line hits="0" number="238"/> + <line hits="0" number="239"/> + <line hits="1" number="240"/> + <line hits="1" number="242"/> + <line hits="1" number="243"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="244"/> + <line hits="1" number="245"/> + <line hits="1" number="246"/> + <line hits="1" number="247"/> + <line hits="0" number="248"/> + <line hits="0" number="249"/> + <line hits="1" number="250"/> + </lines> + </class> + <class branch-rate="0" complexity="0" filename="runners/duration.py" line-rate="0.2188" name="duration.py"> + <methods/> + <lines> + <line hits="1" number="17"/> + <line hits="1" number="20"/> + <line hits="1" number="22"/> + <line hits="1" number="23"/> + <line hits="1" number="24"/> + <line hits="1" number="25"/> + <line hits="1" number="27"/> + <line hits="1" number="29"/> + <line hits="1" number="31"/> + <line hits="1" number="34"/> + <line hits="1" number="37"/> + <line hits="0" number="40"/> + <line hits="0" number="42"/> + <line hits="0" number="44"/> + <line hits="0" number="45"/> + <line hits="0" number="46"/> + <line hits="0" number="47"/> + <line hits="0" number="49"/> + <line hits="0" number="51"/> + <line hits="0" number="52"/> + <line hits="0" number="53"/> + <line hits="0" number="55"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="57,59" number="56"/> + <line hits="0" number="57"/> + <line hits="0" number="59"/> + <line hits="0" number="60"/> + <line hits="0" number="61"/> + <line hits="0" number="63"/> + <line hits="0" number="66"/> + <line hits="0" number="67"/> + <line hits="0" number="69"/> + <line hits="0" number="70"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="73,80" number="71"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="74,75" number="73"/> + <line hits="0" number="74"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="76,89" number="75"/> + <line hits="0" number="76"/> + <line hits="0" number="77"/> + <line hits="0" number="80"/> + <line hits="0" number="81"/> + <line hits="0" number="82"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="87,89" number="84"/> + <line hits="0" number="87"/> + <line hits="0" number="89"/> + <line hits="0" number="91"/> + <line hits="0" number="98"/> + <line hits="0" number="100"/> + <line hits="0" number="103"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="61,106" number="105"/> + <line hits="0" number="106"/> + <line hits="0" number="107"/> + <line hits="0" number="109"/> + <line hits="0" number="110"/> + <line hits="0" number="111"/> + <line hits="0" number="116"/> + <line hits="0" number="117"/> + <line hits="0" number="119"/> + <line hits="0" number="120"/> + <line hits="1" number="123"/> + <line hits="1" number="138"/> + <line hits="1" number="140"/> + <line hits="0" number="141"/> + <line hits="0" number="142"/> + <line hits="0" number="147"/> + </lines> + </class> + <class branch-rate="1" complexity="0" filename="runners/dynamictp.py" line-rate="0.7857" name="dynamictp.py"> + <methods/> + <lines> + <line hits="1" number="17"/> + <line hits="1" number="20"/> + <line hits="1" number="21"/> + <line hits="1" number="22"/> + <line hits="1" number="23"/> + <line hits="1" number="25"/> + <line hits="1" number="27"/> + <line hits="1" number="29"/> + <line hits="1" number="155"/> + <line hits="1" number="170"/> + <line hits="1" number="172"/> + <line hits="0" number="173"/> + <line hits="0" number="174"/> + <line hits="0" number="179"/> + </lines> + </class> + <class branch-rate="0" complexity="0" filename="runners/iteration.py" line-rate="0.2169" name="iteration.py"> + <methods/> + <lines> + <line hits="1" number="17"/> + <line hits="1" number="20"/> + <line hits="1" number="22"/> + <line hits="1" number="23"/> + <line hits="1" number="24"/> + <line hits="1" number="25"/> + <line hits="1" number="27"/> + <line hits="1" number="29"/> + <line hits="1" number="30"/> + <line hits="1" number="32"/> + <line hits="1" number="35"/> + <line hits="1" number="38"/> + <line hits="0" number="41"/> + <line hits="0" number="43"/> + <line hits="0" number="45"/> + <line hits="0" number="46"/> + <line hits="0" number="47"/> + <line hits="0" number="49"/> + <line hits="0" number="50"/> + <line hits="0" number="52"/> + <line hits="0" number="54"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="56,58" number="55"/> + <line hits="0" number="56"/> + <line hits="0" number="58"/> + <line hits="0" number="60"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="62,63" number="61"/> + <line hits="0" number="62"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="64,126" number="63"/> + <line hits="0" number="64"/> + <line hits="0" number="66"/> + <line hits="0" number="70"/> + <line hits="0" number="71"/> + <line hits="0" number="72"/> + <line hits="0" number="74"/> + <line hits="0" number="75"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="79,105" number="76"/> + <line hits="0" number="79"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="81,99" number="80"/> + <line hits="0" number="81"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="84,86" number="83"/> + <line hits="0" number="84"/> + <line hits="0" number="85"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="87,89" number="86"/> + <line hits="0" number="87"/> + <line hits="0" number="88"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="90,105" number="89"/> + <line hits="0" number="90"/> + <line hits="0" number="91"/> + <line hits="0" number="92"/> + <line hits="0" number="93"/> + <line hits="0" number="94"/> + <line hits="0" number="96"/> + <line hits="0" number="97"/> + <line hits="0" number="98"/> + <line hits="0" number="99"/> + <line hits="0" number="100"/> + <line hits="0" number="101"/> + <line hits="0" number="102"/> + <line hits="0" number="103"/> + <line hits="0" number="105"/> + <line hits="0" number="107"/> + <line hits="0" number="114"/> + <line hits="0" number="116"/> + <line hits="0" number="120"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="64,124" number="122"/> + <line hits="0" number="124"/> + <line hits="0" number="125"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="127,137" number="126"/> + <line hits="0" number="127"/> + <line hits="0" number="128"/> + <line hits="0" number="129"/> + <line hits="0" number="134"/> + <line hits="0" number="135"/> + <line hits="0" number="137"/> + <line hits="0" number="138"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="exit,140" number="139"/> + <line hits="0" number="140"/> + <line hits="1" number="143"/> + <line hits="1" number="158"/> + <line hits="1" number="160"/> + <line hits="1" number="161"/> + <line hits="1" number="162"/> + <line hits="1" number="167"/> + </lines> + </class> + <class branch-rate="0" complexity="0" filename="runners/search.py" line-rate="0.25" name="search.py"> + <methods/> + <lines> + <line hits="1" number="17"/> + <line hits="1" number="20"/> + <line hits="1" number="22"/> + <line hits="1" number="23"/> + <line hits="1" number="24"/> + <line hits="1" number="25"/> + <line hits="1" number="26"/> + <line hits="1" number="27"/> + <line hits="1" number="28"/> + <line hits="1" number="30"/> + <line hits="1" number="31"/> + <line hits="1" number="33"/> + <line hits="1" number="35"/> + <line hits="1" number="38"/> + <line hits="1" number="40"/> + <line hits="0" number="41"/> + <line hits="0" number="42"/> + <line hits="0" number="43"/> + <line hits="0" number="44"/> + <line hits="0" number="45"/> + <line hits="0" number="46"/> + <line hits="0" number="47"/> + <line hits="0" number="48"/> + <line hits="0" number="49"/> + <line hits="0" number="50"/> + <line hits="0" number="51"/> + <line hits="0" number="52"/> + <line hits="1" number="54"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="56,57" number="55"/> + <line hits="0" number="56"/> + <line hits="0" number="57"/> + <line hits="1" number="59"/> + <line hits="0" number="61"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="64,66" number="63"/> + <line hits="0" number="64"/> + <line hits="0" number="66"/> + <line hits="0" number="67"/> + <line hits="0" number="68"/> + <line hits="0" number="69"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="exit,72" number="71"/> + <line hits="0" number="72"/> + <line hits="1" number="74"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="76,78" number="75"/> + <line hits="0" number="76"/> + <line hits="0" number="78"/> + <line hits="0" number="80"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="exit,83" number="81"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="exit,84" number="83"/> + <line hits="0" number="84"/> + <line hits="0" number="85"/> + <line hits="1" number="88"/> + <line hits="1" number="103"/> + <line hits="1" number="105"/> + <line hits="0" number="106"/> + <line hits="0" number="107"/> + <line hits="0" number="108"/> + <line hits="0" number="109"/> + <line hits="0" number="110"/> + <line hits="1" number="112"/> + <line hits="0" number="113"/> + <line hits="0" number="115"/> + <line hits="0" number="116"/> + <line hits="0" number="118"/> + <line hits="0" number="119"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="122,127" number="120"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="123,124" number="122"/> + <line hits="0" number="123"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="125,131" number="124"/> + <line hits="0" number="125"/> + <line hits="0" number="126"/> + <line hits="0" number="127"/> + <line hits="0" number="128"/> + <line hits="0" number="129"/> + <line hits="0" number="131"/> + <line hits="0" number="141"/> + <line hits="0" number="143"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="exit,148" number="146"/> + <line hits="0" number="148"/> + <line hits="1" number="150"/> + <line hits="0" number="151"/> + <line hits="0" number="152"/> + <line hits="0" number="154"/> + <line hits="0" number="157"/> + <line hits="0" number="158"/> + <line hits="0" number="159"/> + <line hits="0" number="160"/> + <line hits="0" number="162"/> + <line hits="0" number="168"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="exit,170" number="169"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="169,171" number="170"/> + <line hits="0" number="171"/> + <line hits="0" number="172"/> + <line hits="1" number="174"/> + <line hits="0" number="175"/> + <line hits="0" number="176"/> + <line hits="0" number="180"/> + </lines> + </class> + <class branch-rate="0" complexity="0" filename="runners/sequence.py" line-rate="0.2" name="sequence.py"> + <methods/> + <lines> + <line hits="1" number="17"/> + <line hits="1" number="21"/> + <line hits="1" number="23"/> + <line hits="1" number="24"/> + <line hits="1" number="25"/> + <line hits="1" number="26"/> + <line hits="1" number="28"/> + <line hits="1" number="30"/> + <line hits="1" number="32"/> + <line hits="1" number="35"/> + <line hits="0" number="38"/> + <line hits="0" number="40"/> + <line hits="0" number="42"/> + <line hits="0" number="43"/> + <line hits="0" number="44"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="47,49" number="46"/> + <line hits="0" number="47"/> + <line hits="0" number="49"/> + <line hits="0" number="51"/> + <line hits="0" number="53"/> + <line hits="0" number="56"/> + <line hits="0" number="57"/> + <line hits="0" number="58"/> + <line hits="0" number="60"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="62,64" number="61"/> + <line hits="0" number="62"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="65,108" number="64"/> + <line hits="0" number="65"/> + <line hits="0" number="67"/> + <line hits="0" number="70"/> + <line hits="0" number="71"/> + <line hits="0" number="73"/> + <line hits="0" number="74"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="77,82" number="75"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="78,79" number="77"/> + <line hits="0" number="78"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="80,89" number="79"/> + <line hits="0" number="80"/> + <line hits="0" number="81"/> + <line hits="0" number="82"/> + <line hits="0" number="83"/> + <line hits="0" number="84"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="87,89" number="86"/> + <line hits="0" number="87"/> + <line hits="0" number="89"/> + <line hits="0" number="91"/> + <line hits="0" number="98"/> + <line hits="0" number="100"/> + <line hits="0" number="103"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="64,106" number="105"/> + <line hits="0" number="106"/> + <line hits="0" number="108"/> + <line hits="0" number="109"/> + <line hits="0" number="110"/> + <line hits="0" number="115"/> + <line hits="0" number="116"/> + <line hits="0" number="117"/> + <line hits="0" number="118"/> + <line hits="0" number="119"/> + <line hits="1" number="122"/> + <line hits="1" number="140"/> + <line hits="1" number="142"/> + <line hits="0" number="143"/> + <line hits="0" number="144"/> + <line hits="0" number="149"/> + </lines> + </class> + </classes> + </package> + <package branch-rate="0.1667" complexity="0" line-rate="0.3355" name="steps"> + <classes> + <class branch-rate="1" complexity="0" filename="steps/__init__.py" line-rate="1" name="__init__.py"> + <methods/> + <lines/> + </class> + <class branch-rate="0.5" complexity="0" filename="steps/base.py" line-rate="0.6667" name="base.py"> + <methods/> + <lines> + <line hits="1" number="17"/> + <line hits="1" number="20"/> + <line hits="1" number="21"/> + <line hits="1" number="24"/> + <line hits="1" number="26"/> + <line hits="0" number="28"/> + <line hits="1" number="30"/> + <line hits="0" number="32"/> + <line hits="1" number="34"/> + <line hits="0" number="36"/> + <line hits="1" number="38"/> + <line hits="1" number="41"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="42"/> + <line hits="1" number="43"/> + <line hits="1" number="44"/> + <line hits="1" number="46"/> + <line branch="true" condition-coverage="50% (1/2)" hits="1" missing-branches="53" number="49"/> + <line branch="true" condition-coverage="50% (1/2)" hits="1" missing-branches="49" number="50"/> + <line hits="1" number="51"/> + <line hits="0" number="53"/> + <line hits="1" number="55"/> + <line branch="true" condition-coverage="50% (1/2)" hits="1" missing-branches="63" number="59"/> + <line branch="true" condition-coverage="50% (1/2)" hits="1" missing-branches="59" number="60"/> + <line hits="1" number="61"/> + <line hits="0" number="63"/> + <line hits="1" number="65"/> + <line hits="1" number="68"/> + <line hits="1" number="70"/> + <line hits="1" number="77"/> + <line hits="1" number="79"/> + <line hits="0" number="80"/> + <line hits="1" number="82"/> + <line hits="0" number="83"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="85,89" number="84"/> + <line hits="0" number="85"/> + <line hits="0" number="86"/> + <line hits="0" number="87"/> + <line hits="0" number="88"/> + <line hits="0" number="89"/> + </lines> + </class> + <class branch-rate="0" complexity="0" filename="steps/rest_call.py" line-rate="0.2212" name="rest_call.py"> + <methods/> + <lines> + <line hits="1" number="14"/> + <line hits="1" number="15"/> + <line hits="1" number="16"/> + <line hits="1" number="17"/> + <line hits="1" number="18"/> + <line hits="1" number="19"/> + <line hits="1" number="20"/> + <line hits="1" number="21"/> + <line hits="1" number="22"/> + <line hits="1" number="23"/> + <line hits="1" number="24"/> + <line hits="1" number="25"/> + <line hits="1" number="26"/> + <line hits="1" number="28"/> + <line hits="1" number="31"/> + <line hits="1" number="34"/> + <line hits="1" number="36"/> + <line hits="0" number="37"/> + <line hits="0" number="38"/> + <line hits="0" number="39"/> + <line hits="0" number="40"/> + <line hits="0" number="41"/> + <line hits="0" number="43"/> + <line hits="0" number="44"/> + <line hits="0" number="45"/> + <line hits="1" number="47"/> + <line hits="0" number="48"/> + <line hits="0" number="49"/> + <line hits="0" number="50"/> + <line hits="0" number="51"/> + <line hits="0" number="52"/> + <line hits="0" number="53"/> + <line hits="0" number="54"/> + <line hits="1" number="56"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="exit,58" number="57"/> + <line hits="0" number="58"/> + <line hits="0" number="59"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="61,63" number="60"/> + <line hits="0" number="61"/> + <line hits="0" number="62"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="64,65" number="63"/> + <line hits="0" number="64"/> + <line hits="0" number="65"/> + <line hits="1" number="67"/> + <line hits="0" number="68"/> + <line hits="0" number="69"/> + <line hits="0" number="70"/> + <line hits="0" number="71"/> + <line hits="0" number="72"/> + <line hits="0" number="73"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="75,80" number="74"/> + <line hits="0" number="75"/> + <line hits="0" number="76"/> + <line hits="0" number="77"/> + <line hits="0" number="78"/> + <line hits="0" number="80"/> + <line hits="0" number="81"/> + <line hits="1" number="83"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="85,86" number="84"/> + <line hits="0" number="85"/> + <line hits="0" number="86"/> + <line hits="0" number="87"/> + <line hits="0" number="88"/> + <line hits="0" number="89"/> + <line hits="0" number="90"/> + <line hits="0" number="91"/> + <line hits="0" number="92"/> + <line hits="1" number="94"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="96,97" number="95"/> + <line hits="0" number="96"/> + <line hits="0" number="97"/> + <line hits="0" number="98"/> + <line hits="0" number="99"/> + <line hits="0" number="100"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="102,107" number="101"/> + <line hits="0" number="102"/> + <line hits="0" number="103"/> + <line hits="0" number="104"/> + <line hits="0" number="105"/> + <line hits="0" number="107"/> + <line hits="1" number="109"/> + <line hits="0" number="110"/> + <line hits="0" number="111"/> + <line hits="0" number="112"/> + <line hits="0" number="113"/> + <line hits="0" number="114"/> + <line hits="0" number="115"/> + <line hits="0" number="116"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="118,129" number="117"/> + <line hits="0" number="118"/> + <line hits="0" number="119"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="121,127" number="120"/> + <line hits="0" number="121"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="123,125" number="122"/> + <line hits="0" number="123"/> + <line hits="0" number="125"/> + <line hits="0" number="126"/> + <line hits="0" number="127"/> + <line hits="0" number="129"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="134,136" number="133"/> + <line hits="0" number="134"/> + <line hits="0" number="136"/> + <line hits="0" number="137"/> + <line hits="1" number="139"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="exit,141" number="140"/> + <line hits="0" number="141"/> + <line hits="0" number="142"/> + <line hits="0" number="143"/> + <line hits="0" number="144"/> + <line hits="1" number="146"/> + <line hits="0" number="147"/> + <line hits="0" number="148"/> + <line hits="0" number="149"/> + </lines> + </class> + </classes> + </package> + <package branch-rate="0" complexity="0" line-rate="0.5294" name="steps.dummy"> + <classes> + <class branch-rate="1" complexity="0" filename="steps/dummy/__init__.py" line-rate="1" name="__init__.py"> + <methods/> + <lines/> + </class> + <class branch-rate="0" complexity="0" filename="steps/dummy/dummy.py" line-rate="0.5294" name="dummy.py"> + <methods/> + <lines> + <line hits="1" number="14"/> + <line hits="1" number="16"/> + <line hits="1" number="18"/> + <line hits="1" number="20"/> + <line hits="1" number="23"/> + <line hits="1" number="26"/> + <line hits="1" number="28"/> + <line hits="0" number="29"/> + <line hits="0" number="30"/> + <line hits="0" number="31"/> + <line hits="1" number="33"/> + <line hits="0" number="35"/> + <line hits="1" number="37"/> + <line branch="true" condition-coverage="0% (0/2)" hits="0" missing-branches="39,41" number="38"/> + <line hits="0" number="39"/> + <line hits="0" number="41"/> + <line hits="0" number="42"/> + </lines> + </class> + </classes> + </package> + <package branch-rate="1" complexity="0" line-rate="1" name="test_config"> + <classes> + <class branch-rate="1" complexity="0" filename="test_config/__init__.py" line-rate="1" name="__init__.py"> + <methods/> + <lines/> + </class> + </classes> + </package> + <package branch-rate="1" complexity="0" line-rate="1" name="test_config.onap"> + <classes> + <class branch-rate="1" complexity="0" filename="test_config/onap/__init__.py" line-rate="1" name="__init__.py"> + <methods/> + <lines/> + </class> + </classes> + </package> + <package branch-rate="1" complexity="0" line-rate="1" name="test_config.onap.test_cases"> + <classes> + <class branch-rate="1" complexity="0" filename="test_config/onap/test_cases/__init__.py" line-rate="1" name="__init__.py"> + <methods/> + <lines/> + </class> + </classes> + </package> + <package branch-rate="1" complexity="0" line-rate="1" name="test_config.onap.test_suites"> + <classes> + <class branch-rate="1" complexity="0" filename="test_config/onap/test_suites/__init__.py" line-rate="1" name="__init__.py"> + <methods/> + <lines/> + </class> + </classes> + </package> + <package branch-rate="1" complexity="0" line-rate="1" name="tests"> + <classes> + <class branch-rate="1" complexity="0" filename="tests/__init__.py" line-rate="1" name="__init__.py"> + <methods/> + <lines/> + </class> + <class branch-rate="1" complexity="0" filename="tests/fixture.py" line-rate="1" name="fixture.py"> + <methods/> + <lines> + <line hits="1" number="17"/> + <line hits="1" number="18"/> + <line hits="1" number="19"/> + <line hits="1" number="21"/> + <line hits="1" number="24"/> + <line hits="1" number="32"/> + <line hits="1" number="33"/> + <line hits="1" number="34"/> + <line hits="1" number="36"/> + <line hits="1" number="37"/> + <line hits="1" number="38"/> + <line hits="1" number="40"/> + <line hits="1" number="41"/> + <line hits="1" number="42"/> + <line hits="1" number="43"/> + <line hits="1" number="44"/> + <line hits="1" number="46"/> + <line hits="1" number="47"/> + <line hits="1" number="48"/> + </lines> + </class> + </classes> + </package> + <package branch-rate="1" complexity="0" line-rate="1" name="tests.unit"> + <classes> + <class branch-rate="1" complexity="0" filename="tests/unit/__init__.py" line-rate="1" name="__init__.py"> + <methods/> + <lines/> + </class> + </classes> + </package> + <package branch-rate="0.9706" complexity="0" line-rate="0.8512" name="tests.unit.common"> + <classes> + <class branch-rate="1" complexity="0" filename="tests/unit/common/__init__.py" line-rate="1" name="__init__.py"> + <methods/> + <lines/> + </class> + <class branch-rate="1" complexity="0" filename="tests/unit/common/test_httpClient.py" line-rate="1" name="test_httpClient.py"> + <methods/> + <lines> + <line hits="1" number="17"/> + <line hits="1" number="19"/> + <line hits="1" number="21"/> + <line hits="1" number="22"/> + <line hits="1" number="24"/> + <line hits="1" number="27"/> + <line hits="1" number="29"/> + <line hits="1" number="31"/> + <line hits="1" number="32"/> + <line hits="1" number="33"/> + <line hits="1" number="34"/> + <line hits="1" number="35"/> + <line hits="1" number="39"/> + <line hits="1" number="41"/> + <line hits="1" number="42"/> + <line hits="1" number="43"/> + </lines> + </class> + <class branch-rate="1" complexity="0" filename="tests/unit/common/test_process.py" line-rate="1" name="test_process.py"> + <methods/> + <lines> + <line hits="1" number="17"/> + <line hits="1" number="18"/> + <line hits="1" number="20"/> + <line hits="1" number="22"/> + <line hits="1" number="23"/> + <line hits="1" number="26"/> + <line hits="1" number="27"/> + <line hits="1" number="28"/> + <line hits="1" number="29"/> + <line hits="1" number="31"/> + <line hits="1" number="32"/> + <line hits="1" number="33"/> + <line hits="1" number="35"/> + <line hits="1" number="36"/> + <line hits="1" number="37"/> + <line hits="1" number="38"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="41"/> + <line hits="1" number="42"/> + <line hits="1" number="43"/> + <line hits="1" number="44"/> + <line hits="1" number="45"/> + <line hits="1" number="46"/> + <line hits="1" number="47"/> + <line hits="1" number="49"/> + <line hits="1" number="50"/> + <line hits="1" number="51"/> + <line hits="1" number="54"/> + <line hits="1" number="56"/> + <line hits="1" number="57"/> + <line hits="1" number="59"/> + <line hits="1" number="60"/> + <line hits="1" number="62"/> + <line hits="1" number="63"/> + <line hits="1" number="64"/> + <line hits="1" number="65"/> + <line hits="1" number="66"/> + <line hits="1" number="67"/> + <line hits="1" number="68"/> + <line hits="1" number="69"/> + <line hits="1" number="70"/> + <line hits="1" number="71"/> + <line hits="1" number="73"/> + <line hits="1" number="74"/> + <line hits="1" number="75"/> + <line hits="1" number="76"/> + <line hits="1" number="78"/> + <line hits="1" number="80"/> + <line hits="1" number="83"/> + <line hits="1" number="85"/> + <line hits="1" number="86"/> + <line hits="1" number="87"/> + <line hits="1" number="89"/> + <line hits="1" number="90"/> + <line hits="1" number="93"/> + <line hits="1" number="95"/> + <line hits="1" number="96"/> + <line hits="1" number="97"/> + <line hits="1" number="99"/> + <line hits="1" number="101"/> + <line hits="1" number="102"/> + <line hits="1" number="103"/> + <line hits="1" number="106"/> + <line hits="1" number="107"/> + <line hits="1" number="110"/> + <line hits="1" number="112"/> + <line hits="1" number="113"/> + <line hits="1" number="114"/> + <line hits="1" number="117"/> + <line hits="1" number="118"/> + <line hits="1" number="121"/> + <line hits="1" number="124"/> + <line hits="1" number="126"/> + <line hits="1" number="128"/> + <line hits="1" number="129"/> + <line hits="1" number="130"/> + <line hits="1" number="131"/> + <line hits="1" number="132"/> + <line hits="1" number="133"/> + <line hits="1" number="135"/> + <line hits="1" number="137"/> + <line hits="1" number="138"/> + <line hits="1" number="139"/> + <line hits="1" number="140"/> + <line hits="1" number="141"/> + <line hits="1" number="142"/> + <line hits="1" number="144"/> + <line hits="1" number="146"/> + <line hits="1" number="147"/> + <line hits="1" number="148"/> + <line hits="1" number="149"/> + <line hits="1" number="150"/> + <line hits="1" number="151"/> + <line hits="1" number="152"/> + </lines> + </class> + <class branch-rate="1" complexity="0" filename="tests/unit/common/test_template_format.py" line-rate="1" name="test_template_format.py"> + <methods/> + <lines> + <line hits="1" number="17"/> + <line hits="1" number="18"/> + <line hits="1" number="19"/> + <line hits="1" number="20"/> + <line hits="1" number="22"/> + <line hits="1" number="25"/> + <line hits="1" number="27"/> + <line hits="1" number="32"/> + <line hits="1" number="33"/> + <line hits="1" number="34"/> + <line hits="1" number="35"/> + <line hits="1" number="36"/> + <line hits="1" number="37"/> + <line hits="1" number="39"/> + <line hits="1" number="41"/> + <line hits="1" number="43"/> + <line hits="1" number="44"/> + <line hits="1" number="45"/> + <line hits="1" number="49"/> + </lines> + </class> + <class branch-rate="1" complexity="0" filename="tests/unit/common/test_utils.py" line-rate="0.7965" name="test_utils.py"> + <methods/> + <lines> + <line hits="1" number="17"/> + <line hits="1" number="18"/> + <line hits="1" number="19"/> + <line hits="1" number="20"/> + <line hits="1" number="21"/> + <line hits="1" number="22"/> + <line hits="1" number="23"/> + <line hits="1" number="24"/> + <line hits="1" number="25"/> + <line hits="1" number="26"/> + <line hits="1" number="28"/> + <line hits="1" number="29"/> + <line hits="1" number="30"/> + <line hits="1" number="31"/> + <line hits="1" number="32"/> + <line hits="1" number="35"/> + <line hits="1" number="40"/> + <line hits="1" number="41"/> + <line hits="1" number="42"/> + <line hits="1" number="44"/> + <line hits="1" number="45"/> + <line hits="1" number="47"/> + <line hits="1" number="48"/> + <line hits="1" number="50"/> + <line hits="1" number="51"/> + <line hits="1" number="53"/> + <line hits="1" number="56"/> + <line hits="1" number="58"/> + <line hits="1" number="60"/> + <line hits="1" number="61"/> + <line hits="1" number="66"/> + <line hits="1" number="68"/> + <line hits="1" number="69"/> + <line hits="1" number="72"/> + <line hits="1" number="73"/> + <line hits="1" number="77"/> + <line hits="1" number="78"/> + <line hits="1" number="81"/> + <line hits="1" number="83"/> + <line hits="1" number="85"/> + <line hits="1" number="86"/> + <line hits="1" number="87"/> + <line hits="1" number="88"/> + <line hits="1" number="89"/> + <line hits="1" number="91"/> + <line hits="1" number="92"/> + <line hits="1" number="93"/> + <line hits="1" number="94"/> + <line hits="1" number="97"/> + <line hits="1" number="99"/> + <line hits="1" number="100"/> + <line hits="1" number="118"/> + <line hits="1" number="119"/> + <line hits="1" number="122"/> + <line hits="1" number="123"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="125"/> + <line hits="1" number="127"/> + <line hits="1" number="129"/> + <line hits="1" number="131"/> + <line hits="1" number="133"/> + <line hits="1" number="134"/> + <line hits="1" number="136"/> + <line hits="1" number="138"/> + <line hits="1" number="140"/> + <line hits="1" number="141"/> + <line hits="1" number="143"/> + <line hits="1" number="145"/> + <line hits="1" number="146"/> + <line hits="1" number="147"/> + <line hits="1" number="148"/> + <line hits="1" number="150"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="151"/> + <line hits="1" number="152"/> + <line hits="1" number="153"/> + <line hits="1" number="155"/> + <line hits="1" number="156"/> + <line hits="1" number="158"/> + <line hits="1" number="159"/> + <line hits="1" number="160"/> + <line hits="1" number="161"/> + <line hits="1" number="164"/> + <line hits="1" number="165"/> + <line hits="1" number="167"/> + <line hits="1" number="169"/> + <line hits="1" number="170"/> + <line hits="1" number="171"/> + <line hits="1" number="172"/> + <line hits="1" number="175"/> + <line hits="1" number="176"/> + <line hits="1" number="177"/> + <line hits="1" number="179"/> + <line hits="1" number="180"/> + <line hits="1" number="183"/> + <line hits="1" number="185"/> + <line hits="1" number="186"/> + <line hits="1" number="190"/> + <line hits="1" number="192"/> + <line hits="1" number="193"/> + <line hits="1" number="194"/> + <line hits="1" number="196"/> + <line hits="1" number="197"/> + <line hits="1" number="199"/> + <line hits="1" number="200"/> + <line hits="1" number="203"/> + <line hits="1" number="205"/> + <line hits="1" number="208"/> + <line hits="1" number="210"/> + <line hits="1" number="211"/> + <line hits="1" number="212"/> + <line hits="1" number="213"/> + <line hits="1" number="216"/> + <line hits="1" number="218"/> + <line hits="1" number="219"/> + <line hits="1" number="302"/> + <line hits="1" number="303"/> + <line hits="1" number="304"/> + <line hits="1" number="306"/> + <line hits="1" number="307"/> + <line hits="1" number="390"/> + <line hits="1" number="391"/> + <line hits="1" number="392"/> + <line hits="1" number="393"/> + <line hits="1" number="394"/> + <line hits="1" number="395"/> + <line hits="1" number="397"/> + <line hits="1" number="398"/> + <line hits="1" number="589"/> + <line hits="1" number="590"/> + <line hits="1" number="591"/> + <line hits="1" number="592"/> + <line hits="1" number="593"/> + <line hits="1" number="594"/> + <line hits="1" number="595"/> + <line hits="1" number="596"/> + <line hits="1" number="597"/> + <line hits="1" number="598"/> + <line hits="1" number="600"/> + <line hits="1" number="601"/> + <line hits="1" number="792"/> + <line hits="1" number="793"/> + <line hits="1" number="794"/> + <line hits="1" number="795"/> + <line hits="1" number="796"/> + <line hits="1" number="797"/> + <line hits="1" number="798"/> + <line hits="1" number="801"/> + <line hits="1" number="803"/> + <line hits="1" number="804"/> + <line hits="1" number="805"/> + <line hits="1" number="806"/> + <line hits="1" number="808"/> + <line hits="1" number="809"/> + <line hits="1" number="810"/> + <line hits="1" number="811"/> + <line hits="1" number="814"/> + <line hits="1" number="816"/> + <line hits="1" number="817"/> + <line hits="1" number="820"/> + <line hits="1" number="821"/> + <line hits="1" number="824"/> + <line hits="1" number="826"/> + <line hits="1" number="827"/> + <line hits="1" number="828"/> + <line hits="0" number="829"/> + <line hits="0" number="831"/> + <line hits="1" number="834"/> + <line hits="1" number="836"/> + <line hits="0" number="838"/> + <line hits="1" number="840"/> + <line hits="0" number="842"/> + <line hits="0" number="843"/> + <line hits="1" number="845"/> + <line hits="0" number="847"/> + <line hits="0" number="848"/> + <line hits="0" number="849"/> + <line hits="1" number="851"/> + <line hits="0" number="853"/> + <line hits="0" number="855"/> + <line hits="0" number="856"/> + <line hits="1" number="858"/> + <line hits="1" number="859"/> + <line hits="0" number="861"/> + <line hits="0" number="862"/> + <line hits="0" number="863"/> + <line hits="0" number="864"/> + <line hits="0" number="865"/> + <line hits="0" number="866"/> + <line hits="1" number="868"/> + <line hits="0" number="870"/> + <line hits="0" number="871"/> + <line hits="0" number="872"/> + <line hits="0" number="873"/> + <line hits="1" number="875"/> + <line hits="0" number="877"/> + <line hits="0" number="878"/> + <line hits="0" number="879"/> + <line hits="0" number="884"/> + <line hits="0" number="885"/> + <line hits="0" number="886"/> + <line hits="0" number="887"/> + <line hits="0" number="888"/> + <line hits="0" number="889"/> + <line hits="1" number="891"/> + <line hits="0" number="893"/> + <line hits="0" number="897"/> + <line hits="0" number="901"/> + <line hits="0" number="906"/> + <line hits="0" number="907"/> + <line hits="0" number="908"/> + <line hits="0" number="909"/> + <line hits="0" number="915"/> + <line hits="0" number="920"/> + <line hits="0" number="921"/> + <line hits="1" number="923"/> + <line hits="0" number="925"/> + <line hits="0" number="926"/> + <line hits="0" number="929"/> + <line hits="0" number="930"/> + <line hits="1" number="932"/> + <line hits="0" number="934"/> + <line hits="0" number="935"/> + <line hits="0" number="936"/> + <line hits="0" number="937"/> + <line hits="1" number="939"/> + <line hits="0" number="941"/> + <line hits="0" number="945"/> + <line hits="0" number="950"/> + <line hits="0" number="951"/> + <line hits="0" number="952"/> + <line hits="0" number="953"/> + <line hits="0" number="959"/> + <line hits="0" number="964"/> + <line hits="0" number="965"/> + <line hits="1" number="967"/> + <line hits="0" number="968"/> + <line hits="0" number="969"/> + <line hits="0" number="970"/> + <line hits="0" number="971"/> + <line hits="0" number="972"/> + <line hits="1" number="974"/> + <line hits="0" number="975"/> + <line hits="0" number="976"/> + <line hits="0" number="977"/> + <line hits="0" number="979"/> + <line hits="0" number="980"/> + <line hits="0" number="982"/> + <line hits="0" number="983"/> + <line hits="1" number="986"/> + <line hits="1" number="988"/> + <line hits="1" number="998"/> + <line hits="1" number="1007"/> + <line hits="1" number="1013"/> + <line hits="1" number="1022"/> + <line hits="1" number="1029"/> + <line hits="1" number="1030"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="1031"/> + <line hits="1" number="1033"/> + <line hits="1" number="1034"/> + <line hits="1" number="1036"/> + <line hits="1" number="1037"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="1038"/> + <line hits="1" number="1040"/> + <line hits="1" number="1041"/> + <line hits="1" number="1043"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="1046"/> + <line hits="1" number="1047"/> + <line hits="1" number="1049"/> + <line hits="1" number="1050"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="1051"/> + <line hits="1" number="1052"/> + <line hits="1" number="1053"/> + <line hits="1" number="1055"/> + <line hits="1" number="1056"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="1057"/> + <line hits="1" number="1058"/> + <line hits="1" number="1059"/> + <line hits="1" number="1061"/> + <line hits="1" number="1062"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="1063"/> + <line hits="1" number="1065"/> + <line hits="1" number="1067"/> + <line hits="1" number="1068"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="1069"/> + <line hits="1" number="1071"/> + <line hits="1" number="1073"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="1076"/> + <line hits="1" number="1077"/> + <line hits="1" number="1079"/> + <line hits="1" number="1080"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="1081"/> + <line hits="1" number="1082"/> + <line hits="1" number="1083"/> + <line hits="1" number="1085"/> + <line hits="1" number="1086"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="1087"/> + <line hits="1" number="1088"/> + <line hits="1" number="1089"/> + <line hits="1" number="1091"/> + <line hits="1" number="1092"/> + <line hits="1" number="1093"/> + <line hits="1" number="1094"/> + <line hits="1" number="1095"/> + <line hits="1" number="1096"/> + <line hits="1" number="1097"/> + <line hits="1" number="1099"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="1100"/> + <line hits="1" number="1101"/> + <line hits="1" number="1103"/> + <line hits="1" number="1106"/> + <line hits="1" number="1107"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="1108"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="1109"/> + <line hits="1" number="1110"/> + <line hits="1" number="1113"/> + <line hits="1" number="1115"/> + <line hits="1" number="1121"/> + <line hits="1" number="1129"/> + <line hits="1" number="1131"/> + <line hits="1" number="1132"/> + <line hits="1" number="1133"/> + <line hits="1" number="1134"/> + <line hits="1" number="1136"/> + <line hits="1" number="1137"/> + <line hits="1" number="1138"/> + <line hits="1" number="1139"/> + <line hits="1" number="1140"/> + <line hits="1" number="1142"/> + <line hits="1" number="1143"/> + <line hits="1" number="1144"/> + <line hits="1" number="1145"/> + <line hits="1" number="1147"/> + <line hits="1" number="1148"/> + <line hits="1" number="1149"/> + <line hits="1" number="1150"/> + <line hits="1" number="1153"/> + <line hits="1" number="1154"/> + <line hits="1" number="1155"/> + <line hits="1" number="1156"/> + <line hits="1" number="1157"/> + </lines> + </class> + <class branch-rate="0.5" complexity="0" filename="tests/unit/common/test_yaml_loader.py" line-rate="0.8" name="test_yaml_loader.py"> + <methods/> + <lines> + <line hits="1" number="17"/> + <line hits="1" number="18"/> + <line hits="1" number="20"/> + <line hits="1" number="23"/> + <line hits="1" number="25"/> + <line hits="1" number="27"/> + <line hits="1" number="30"/> + <line hits="0" number="31"/> + <line branch="true" condition-coverage="50% (1/2)" hits="1" missing-branches="34" number="33"/> + <line hits="0" number="34"/> + </lines> + </class> + </classes> + </package> + <package branch-rate="0.8333" complexity="0" line-rate="0.9961" name="tests.unit.core"> + <classes> + <class branch-rate="1" complexity="0" filename="tests/unit/core/__init__.py" line-rate="1" name="__init__.py"> + <methods/> + <lines/> + </class> + <class branch-rate="0.8333" complexity="0" filename="tests/unit/core/test_commands.py" line-rate="1" name="test_commands.py"> + <methods/> + <lines> + <line hits="1" number="17"/> + <line hits="1" number="18"/> + <line hits="1" number="19"/> + <line hits="1" number="21"/> + <line hits="1" number="22"/> + <line hits="1" number="23"/> + <line hits="1" number="24"/> + <line hits="1" number="25"/> + <line hits="1" number="28"/> + <line hits="1" number="30"/> + <line hits="1" number="31"/> + <line hits="1" number="32"/> + <line hits="1" number="33"/> + <line hits="1" number="35"/> + <line hits="1" number="36"/> + <line hits="1" number="37"/> + <line hits="1" number="38"/> + <line hits="1" number="41"/> + <line hits="1" number="43"/> + <line hits="1" number="44"/> + <line hits="1" number="46"/> + <line hits="1" number="47"/> + <line hits="1" number="48"/> + <line hits="1" number="49"/> + <line hits="1" number="50"/> + <line hits="1" number="52"/> + <line hits="1" number="53"/> + <line hits="1" number="54"/> + <line hits="1" number="55"/> + <line hits="1" number="56"/> + <line hits="1" number="58"/> + <line hits="1" number="59"/> + <line hits="1" number="60"/> + <line hits="1" number="61"/> + <line hits="1" number="62"/> + <line hits="1" number="63"/> + <line hits="1" number="65"/> + <line hits="1" number="66"/> + <line hits="1" number="67"/> + <line hits="1" number="68"/> + <line hits="1" number="69"/> + <line hits="1" number="70"/> + <line hits="1" number="72"/> + <line hits="1" number="73"/> + <line hits="1" number="74"/> + <line hits="1" number="75"/> + <line hits="1" number="76"/> + <line hits="1" number="77"/> + <line hits="1" number="79"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="80"/> + <line hits="1" number="81"/> + <line branch="true" condition-coverage="50% (1/2)" hits="1" missing-branches="86" number="82"/> + <line branch="true" condition-coverage="100% (2/2)" hits="1" number="83"/> + <line hits="1" number="84"/> + <line hits="1" number="85"/> + <line hits="1" number="86"/> + </lines> + </class> + <class branch-rate="1" complexity="0" filename="tests/unit/core/test_plugin.py" line-rate="1" name="test_plugin.py"> + <methods/> + <lines> + <line hits="1" number="17"/> + <line hits="1" number="18"/> + <line hits="1" number="19"/> + <line hits="1" number="21"/> + <line hits="1" number="22"/> + <line hits="1" number="24"/> + <line hits="1" number="25"/> + <line hits="1" number="26"/> + <line hits="1" number="29"/> + <line hits="1" number="31"/> + <line hits="1" number="43"/> + <line hits="1" number="44"/> + <line hits="1" number="46"/> + <line hits="1" number="47"/> + <line hits="1" number="48"/> + <line hits="1" number="49"/> + <line hits="1" number="50"/> + <line hits="1" number="52"/> + <line hits="1" number="53"/> + <line hits="1" number="54"/> + <line hits="1" number="55"/> + <line hits="1" number="56"/> + <line hits="1" number="57"/> + <line hits="1" number="59"/> + <line hits="1" number="61"/> + <line hits="1" number="62"/> + <line hits="1" number="64"/> + <line hits="1" number="65"/> + <line hits="1" number="66"/> + <line hits="1" number="67"/> + <line hits="1" number="70"/> + <line hits="1" number="71"/> + <line hits="1" number="73"/> + <line hits="1" number="75"/> + <line hits="1" number="76"/> + <line hits="1" number="77"/> + <line hits="1" number="78"/> + <line hits="1" number="81"/> + <line hits="1" number="82"/> + <line hits="1" number="84"/> + <line hits="1" number="86"/> + <line hits="1" number="89"/> + <line hits="1" number="90"/> + <line hits="1" number="91"/> + <line hits="1" number="93"/> + <line hits="1" number="95"/> + <line hits="1" number="96"/> + <line hits="1" number="99"/> + <line hits="1" number="101"/> + <line hits="1" number="104"/> + <line hits="1" number="105"/> + <line hits="1" number="106"/> + <line hits="1" number="107"/> + <line hits="1" number="108"/> + <line hits="1" number="109"/> + <line hits="1" number="112"/> + <line hits="1" number="114"/> + <line hits="1" number="115"/> + <line hits="1" number="118"/> + <line hits="1" number="121"/> + <line hits="1" number="122"/> + <line hits="1" number="123"/> + <line hits="1" number="126"/> + <line hits="1" number="128"/> + <line hits="1" number="129"/> + <line hits="1" number="132"/> + <line hits="1" number="134"/> + <line hits="1" number="137"/> + <line hits="1" number="138"/> + <line hits="1" number="139"/> + <line hits="1" number="140"/> + <line hits="1" number="141"/> + <line hits="1" number="142"/> + <line hits="1" number="145"/> + <line hits="1" number="147"/> + <line hits="1" number="148"/> + </lines> + </class> + <class branch-rate="1" complexity="0" filename="tests/unit/core/test_report.py" line-rate="1" name="test_report.py"> + <methods/> + <lines> + <line hits="1" number="17"/> + <line hits="1" number="19"/> + <line hits="1" number="21"/> + <line hits="1" number="22"/> + <line hits="1" number="24"/> + <line hits="1" number="25"/> + <line hits="1" number="26"/> + <line hits="1" number="27"/> + <line hits="1" number="29"/> + <line hits="1" number="30"/> + <line hits="1" number="32"/> + <line hits="1" number="33"/> + <line hits="1" number="34"/> + <line hits="1" number="37"/> + <line hits="1" number="39"/> + <line hits="1" number="40"/> + <line hits="1" number="41"/> + <line hits="1" number="42"/> + <line hits="1" number="43"/> + <line hits="1" number="44"/> + <line hits="1" number="46"/> + <line hits="1" number="48"/> + <line hits="1" number="49"/> + <line hits="1" number="52"/> + <line hits="1" number="53"/> + <line hits="1" number="57"/> + <line hits="1" number="58"/> + </lines> + </class> + <class branch-rate="1" complexity="0" filename="tests/unit/core/test_task.py" line-rate="0.9875" name="test_task.py"> + <methods/> + <lines> + <line hits="1" number="17"/> + <line hits="1" number="19"/> + <line hits="1" number="20"/> + <line hits="1" number="22"/> + <line hits="1" number="23"/> + <line hits="1" number="26"/> + <line hits="1" number="28"/> + <line hits="1" number="29"/> + <line hits="1" number="30"/> + <line hits="1" number="31"/> + <line hits="1" number="32"/> + <line hits="1" number="34"/> + <line hits="1" number="36"/> + <line hits="1" number="37"/> + <line hits="1" number="39"/> + <line hits="1" number="40"/> + <line hits="1" number="42"/> + <line hits="1" number="43"/> + <line hits="1" number="45"/> + <line hits="1" number="47"/> + <line hits="1" number="49"/> + <line hits="1" number="50"/> + <line hits="1" number="52"/> + <line hits="1" number="62"/> + <line hits="1" number="63"/> + <line hits="1" number="64"/> + <line hits="1" number="65"/> + <line hits="1" number="66"/> + <line hits="1" number="67"/> + <line hits="1" number="68"/> + <line hits="1" number="69"/> + <line hits="1" number="71"/> + <line hits="1" number="72"/> + <line hits="1" number="73"/> + <line hits="1" number="74"/> + <line hits="1" number="76"/> + <line hits="1" number="78"/> + <line hits="1" number="79"/> + <line hits="1" number="80"/> + <line hits="1" number="81"/> + <line hits="1" number="83"/> + <line hits="1" number="84"/> + <line hits="1" number="85"/> + <line hits="1" number="86"/> + <line hits="1" number="88"/> + <line hits="1" number="90"/> + <line hits="1" number="91"/> + <line hits="1" number="93"/> + <line hits="1" number="94"/> + <line hits="1" number="96"/> + <line hits="1" number="97"/> + <line hits="1" number="98"/> + <line hits="1" number="99"/> + <line hits="1" number="101"/> + <line hits="1" number="103"/> + <line hits="1" number="104"/> + <line hits="1" number="105"/> + <line hits="1" number="106"/> + <line hits="1" number="108"/> + <line hits="1" number="109"/> + <line hits="1" number="110"/> + <line hits="1" number="111"/> + <line hits="1" number="113"/> + <line hits="1" number="115"/> + <line hits="1" number="116"/> + <line hits="1" number="118"/> + <line hits="1" number="119"/> + <line hits="1" number="121"/> + <line hits="1" number="122"/> + <line hits="1" number="123"/> + <line hits="1" number="125"/> + <line hits="1" number="126"/> + <line hits="1" number="127"/> + <line hits="1" number="128"/> + <line hits="1" number="130"/> + <line hits="1" number="131"/> + <line hits="1" number="132"/> + <line hits="1" number="133"/> + <line hits="1" number="135"/> + <line hits="0" number="136"/> + </lines> + </class> + <class branch-rate="1" complexity="0" filename="tests/unit/core/test_testcase.py" line-rate="1" name="test_testcase.py"> + <methods/> + <lines> + <line hits="1" number="17"/> + <line hits="1" number="18"/> + <line hits="1" number="20"/> + <line hits="1" number="23"/> + <line hits="1" number="25"/> + <line hits="1" number="26"/> + <line hits="1" number="29"/> + <line hits="1" number="31"/> + <line hits="1" number="32"/> + <line hits="1" number="33"/> + <line hits="1" number="34"/> + <line hits="1" number="36"/> + <line hits="1" number="37"/> + <line hits="1" number="38"/> + <line hits="1" number="39"/> + <line hits="1" number="40"/> + </lines> + </class> + </classes> + </package> + <package branch-rate="1" complexity="0" line-rate="1" name="tests.unit.onap"> + <classes> + <class branch-rate="1" complexity="0" filename="tests/unit/onap/__init__.py" line-rate="1" name="__init__.py"> + <methods/> + <lines/> + </class> + <class branch-rate="1" complexity="0" filename="tests/unit/onap/test_rest_call.py" line-rate="1" name="test_rest_call.py"> + <methods/> + <lines> + <line hits="1" number="15"/> + <line hits="1" number="16"/> + <line hits="1" number="17"/> + <line hits="1" number="18"/> + <line hits="1" number="21"/> + <line hits="1" number="23"/> + <line hits="1" number="45"/> + <line hits="1" number="47"/> + <line hits="1" number="48"/> + <line hits="1" number="50"/> + <line hits="1" number="52"/> + <line hits="1" number="53"/> + <line hits="1" number="54"/> + <line hits="1" number="55"/> + <line hits="1" number="56"/> + <line hits="1" number="57"/> + <line hits="1" number="58"/> + <line hits="1" number="59"/> + </lines> + </class> + </classes> + </package> + </packages> +</coverage> diff --git a/tools/cover.awk b/tools/cover.awk deleted file mode 100644 index e4bb816..0000000 --- a/tools/cover.awk +++ /dev/null @@ -1,25 +0,0 @@ -BEGIN{ - template = "%6s %-75s\n" - printf template, "Delta", "Module Path" -} - -/^-/{ - s = substr($1, 2) - x[s] = $3; -}; - -/^+/{ - s = substr($1, 2) - d = $3 - if (s in x) - d = d - x[s] - y[s" "d] = d -} - -END{ - asorti(y, z1, "@val_num_asc") - for (i=1; i <= length(z1); i++){ - split(z1[i], z2, " ") - printf template, z2[2], z2[1] - } -} diff --git a/tools/cover.sh b/tools/cover.sh index fd9e9fe..e9b9cc5 100644 --- a/tools/cover.sh +++ b/tools/cover.sh @@ -23,94 +23,16 @@ else COVER_DIR_NAME=$( dirname $0 ) fi -show_diff () { - diff -U 0 $1 $2 | awk -f $COVER_DIR_NAME/cover.awk -} - run_coverage_test() { - ALLOWED_EXTRA_MISSING=150 # enable debugging set -x - # Stash uncommitted changes, checkout master and save coverage report - uncommited=$(git status --porcelain | grep -v "^??") - [[ -n ${uncommited} ]] && git stash > /dev/null - git checkout HEAD^ - - baseline_report=$(mktemp -t vnftest_coverageXXXXXXX) - - find . -type f -name "*.pyc" -delete - - coverage run -p -m unittest discover ./vnftest/tests/unit/core - coverage run -p -m unittest discover ./vnftest/tests/unit/onap - coverage run -p -m unittest discover ./vnftest/tests/unit/common - coverage combine - - coverage report > ${baseline_report} - coverage erase - - # debug awk - tail -1 ${baseline_report} - baseline_missing=$(awk 'END { if (int($3) > 0) print $3 }' ${baseline_report}) - - if [[ -z $baseline_missing ]]; then - echo "Failed to determine baseline missing" - exit 1 - fi - - # Checkout back and unstash uncommitted changes (if any) - git checkout - - [[ -n ${uncommited} ]] && git stash pop > /dev/null - - # Generate and save coverage report - current_report=$(mktemp -t vnftest_coverageXXXXXXX) - - find . -type f -name "*.pyc" -delete - coverage run -p -m unittest discover ./vnftest/tests/unit/core coverage run -p -m unittest discover ./vnftest/tests/unit/onap coverage run -p -m unittest discover ./vnftest/tests/unit/common coverage combine - - coverage report > ${current_report} + coverage xml coverage erase - rm -rf cover-$PY_VER - coverage html -d cover-$PY_VER - - # debug awk - tail -1 ${current_report} - current_missing=$(awk 'END { if (int($3) > 0) print $3 }' ${current_report}) - - if [[ -z $current_missing ]]; then - echo "Failed to determine current missing" - exit 1 - fi - - # Show coverage details - new_missing=$((current_missing - baseline_missing)) - - echo "Missing lines allowed to introduce : ${ALLOWED_EXTRA_MISSING}" - echo "Missing lines introduced : ${new_missing}" - echo "Missing lines in master : ${baseline_missing}" - echo "Missing lines in proposed change : ${current_missing}" - - if [[ ${new_missing} -gt ${ALLOWED_EXTRA_MISSING} ]]; - then - show_diff ${baseline_report} ${current_report} - echo "Please write more unit tests, we should keep our test coverage :( " - rm ${baseline_report} ${current_report} - exit 1 - - elif [[ ${new_missing} -gt 0 ]]; - then - show_diff ${baseline_report} ${current_report} - echo "I believe you can cover all your code with 100% coverage!" - - else - echo "Thank you! You are awesome! Keep writing unit tests! :)" - fi - - rm ${baseline_report} ${current_report} } diff --git a/vnftest/common/utils.py b/vnftest/common/utils.py index 882403f..dfd32d5 100644 --- a/vnftest/common/utils.py +++ b/vnftest/common/utils.py @@ -475,7 +475,6 @@ def load_resource(path, mode="r"): try: return open(path, mode) except Exception: - logger.info("path not loaded as file, trying load as package") split_path = os.path.split(path) package = split_path[0].replace("/", ".") if not pkg_resources.resource_exists(package, split_path[1]): @@ -483,6 +482,18 @@ def load_resource(path, mode="r"): return pkg_resources.resource_stream(package, split_path[1]) +def resource_abs_path(path, mode="r"): + try: + open(path, mode) + return path + except Exception: + split_path = os.path.split(path) + package = split_path[0].replace("/", ".") + if not pkg_resources.resource_exists(package, split_path[1]): + raise ResourceNotFound(resource=path) + return pkg_resources.resource_filename(package, split_path[1]) + + def format(in_obj, params): if isinstance(in_obj, list): ret_list = [] diff --git a/vnftest/contexts/base.py b/vnftest/contexts/base.py index 538a2d6..29e3a19 100644 --- a/vnftest/contexts/base.py +++ b/vnftest/contexts/base.py @@ -26,20 +26,14 @@ class Context(object): """Class that represents a context in the logical model""" list = [] - @staticmethod - def split_name(name, sep='.'): - try: - name_iter = iter(name.split(sep)) - except AttributeError: - # name is not a string - return None, None - return next(name_iter), next(name_iter, None) - def __init__(self): Context.list.append(self) + self._task_id = None + self._name = None def init(self, attrs): - pass + self._task_id = attrs['task_id'] + self._name = attrs['name'] @staticmethod def get_cls(context_type): diff --git a/vnftest/core/task.py b/vnftest/core/task.py index da18441..a9718bb 100644 --- a/vnftest/core/task.py +++ b/vnftest/core/task.py @@ -35,7 +35,6 @@ from six.moves import filter from vnftest.runners import base as base_runner from vnftest.contexts.base import Context -from vnftest.contexts.csar import CSARContext from vnftest.runners import base as base_runner from vnftest.runners.duration import DurationRunner from vnftest.runners.iteration import IterationRunner @@ -61,7 +60,7 @@ class Task(object): # pragma: no cover """ def __init__(self, args): - self.context = None + self.contexts = None self.outputs = {} self.args = args or {} task_id = getattr(args, 'task_id', None) @@ -129,10 +128,10 @@ class Task(object): # pragma: no cover except TypeError: raise TypeError() parser.path = task_files[i] - steps, run_in_parallel, meet_precondition, ret_context = \ + steps, run_in_parallel, meet_precondition, ret_contexts = \ parser.parse_task(self.task_id, inputs) - self.context = ret_context + self.contexts = ret_contexts if not meet_precondition: LOG.info("meet_precondition is %s, please check envrionment", @@ -150,10 +149,12 @@ class Task(object): # pragma: no cover if self.args.keep_deploy: # keep deployment, forget about stack # (hide it for exit handler) - self.context = None + self.contexts = None else: - self.context.undeploy() - self.context = None + if self.contexts is not None: + for context in self.contexts: + context.undeploy() + self.contexts = None one_task_end_time = time.time() LOG.info("Task %s finished in %d secs", task_files[i], one_task_end_time - one_task_start_time) @@ -229,8 +230,10 @@ class Task(object): # pragma: no cover def _run(self, steps, case_name, run_in_parallel, output_file, inputs): """Deploys context and calls runners""" - if self.context: - self.context.deploy() + if self.contexts is not None: + for context in self.contexts: + context.deploy() + try: self.task_info.testcase_start(case_name) for step in steps: @@ -284,9 +287,10 @@ class Task(object): # pragma: no cover """handler for process termination""" base_runner.Runner.terminate_all() - if self.context: + if self.contexts: LOG.info("Undeploying context") - self.context.undeploy() + for context in self.contexts: + context.undeploy() def _parse_options(self, op): if isinstance(op, dict): @@ -312,7 +316,7 @@ class Task(object): # pragma: no cover LOG.info("Starting runner of type '%s'", runner_cfg["type"]) # Previous steps output is the input of the next step. inputs.update(self.outputs) - runner.run(step_cfg, self.context, inputs) + runner.run(step_cfg, self.contexts, inputs) return runner def finalize_step(self, step, runner, result): @@ -420,20 +424,19 @@ class TaskParser(object): # pragma: no cover meet_precondition = self._check_precondition(cfg) if "context" in cfg: - context_cfg = cfg["context"] + context_cfgs = [cfg["context"]] + elif "contexts" in cfg: + context_cfgs = cfg["contexts"] else: - context_cfg = {"type": "Dummy"} + context_cfgs = [{"type": "Dummy"}] - name_suffix = '-{}'.format(task_id[:8]) - try: - context_cfg['name'] = '{}{}'.format(context_cfg['name'], - name_suffix) - except KeyError: - pass - # default to CSAR context - context_type = context_cfg.get("type", "CSAR") - context = Context.get(context_type) - context.init(context_cfg) + _contexts = [] + for cfg_attrs in context_cfgs: + cfg_attrs['task_id'] = task_id + context_type = cfg_attrs.get("type") + context = Context.get(context_type) + context.init(cfg_attrs) + _contexts.append(context) run_in_parallel = cfg.get("run_in_parallel", False) @@ -447,7 +450,7 @@ class TaskParser(object): # pragma: no cover step["task_path"] = os.path.dirname(self.path) # TODO we need something better here, a class that represent the file - return cfg["steps"], run_in_parallel, meet_precondition, context + return cfg["steps"], run_in_parallel, meet_precondition, _contexts def _check_schema(self, cfg_schema, schema_type): """Check if config file is using the correct schema type""" diff --git a/vnftest/tests/unit/onap/test_rest_call.py b/vnftest/tests/unit/onap/test_rest_call.py index 6735774..8e6b402 100644 --- a/vnftest/tests/unit/onap/test_rest_call.py +++ b/vnftest/tests/unit/onap/test_rest_call.py @@ -51,7 +51,7 @@ class RestCallTestCase(testtools.TestCase): def test_run(self, mock_execute_operation): mock_execute_operation.return_value = {'body': {'value': 'output1'}} t = task.Task({}) - context_cfg = {} + context_cfg = {'task_id': '123', 'name': 'dummy'} context = Context.get("CSAR") context.init(context_cfg) t.context = context |