Coverage for tests/test_commonMetrics.py : 27%

Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1# This file is part of verify.
2#
3# Developed for the LSST Data Management System.
4# This product includes software developed by the LSST Project
5# (https://www.lsst.org).
6# See the COPYRIGHT file at the top-level directory of this distribution
7# for details of code ownership.
8#
9# This program is free software: you can redistribute it and/or modify
10# it under the terms of the GNU General Public License as published by
11# the Free Software Foundation, either version 3 of the License, or
12# (at your option) any later version.
13#
14# This program is distributed in the hope that it will be useful,
15# but WITHOUT ANY WARRANTY; without even the implied warranty of
16# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17# GNU General Public License for more details.
18#
19# You should have received a copy of the GNU General Public License
20# along with this program. If not, see <https://www.gnu.org/licenses/>.
22import time
23import unittest
24import warnings
26import astropy.units as u
28import lsst.utils.tests
29from lsst.pex.config import Config
30from lsst.pipe.base import Task, timeMethod
32from lsst.verify import Measurement, Name
33from lsst.verify.gen2tasks.testUtils import MetricTaskTestCase
34from lsst.verify.tasks import MetricComputationError, TimingMetricTask, \
35 MemoryMetricTask
36from lsst.verify.tasks.testUtils import MetadataMetricTestCase
39class DummyTask(Task):
40 ConfigClass = Config
41 _DefaultName = "NotARealTask"
42 taskLength = 0.1
44 @timeMethod
45 def run(self):
46 time.sleep(self.taskLength)
49class TimingMetricTestSuite(MetadataMetricTestCase):
50 @classmethod
51 def makeTask(cls):
52 return TimingMetricTask(config=cls._standardConfig())
54 @staticmethod
55 def _standardConfig():
56 config = TimingMetricTask.ConfigClass()
57 config.connections.labelName = DummyTask._DefaultName
58 config.target = DummyTask._DefaultName + ".run"
59 config.connections.package = "verify"
60 config.connections.metric = "DummyTime"
61 return config
63 def setUp(self):
64 super().setUp()
65 self.config = TimingMetricTestSuite._standardConfig()
66 self.metric = Name("verify.DummyTime")
68 self.scienceTask = DummyTask()
69 self.scienceTask.run()
71 def testValid(self):
72 result = self.task.run(self.scienceTask.getFullMetadata())
73 meas = result.measurement
75 self.assertIsInstance(meas, Measurement)
76 self.assertEqual(meas.metric_name, self.metric)
77 self.assertGreater(meas.quantity, 0.0 * u.second)
78 self.assertLess(meas.quantity, 2 * DummyTask.taskLength * u.second)
80 def testNoMetric(self):
81 self.config.connections.package = "foo.bar"
82 self.config.connections.metric = "FooBarTime"
83 task = TimingMetricTask(config=self.config)
84 with self.assertRaises(TypeError):
85 task.run(self.scienceTask.getFullMetadata())
87 def testMissingData(self):
88 result = self.task.run(None)
89 meas = result.measurement
90 self.assertIsNone(meas)
92 def testRunDifferentMethod(self):
93 self.config.target = DummyTask._DefaultName + ".runDataRef"
94 task = TimingMetricTask(config=self.config)
95 result = task.run(self.scienceTask.getFullMetadata())
96 meas = result.measurement
97 self.assertIsNone(meas)
99 def testNonsenseKeys(self):
100 metadata = self.scienceTask.getFullMetadata()
101 startKeys = [key
102 for key in metadata.paramNames(topLevelOnly=False)
103 if "StartCpuTime" in key]
104 for key in startKeys:
105 metadata.remove(key)
107 task = TimingMetricTask(config=self.config)
108 with self.assertRaises(MetricComputationError):
109 task.run(metadata)
111 def testBadlyTypedKeys(self):
112 metadata = self.scienceTask.getFullMetadata()
113 endKeys = [key
114 for key in metadata.paramNames(topLevelOnly=False)
115 if "EndCpuTime" in key]
116 for key in endKeys:
117 metadata.set(key, str(metadata.getAsDouble(key)))
119 task = TimingMetricTask(config=self.config)
120 with self.assertRaises(MetricComputationError):
121 task.run(metadata)
123 def testDeprecated(self):
124 self.config.metric = "verify.DummyTime"
125 self.config.connections.package = ""
126 self.config.connections.metric = ""
127 with warnings.catch_warnings(record=True) as emitted:
128 self.config.validate()
129 self.assertEqual(len(emitted), 1)
130 self.assertEqual(emitted[0].category, FutureWarning)
131 self.assertEqual(self.config.connections.package, "verify")
132 self.assertEqual(self.config.connections.metric, "DummyTime")
135class MemoryMetricTestSuite(MetadataMetricTestCase):
136 @classmethod
137 def makeTask(cls):
138 return MemoryMetricTask(config=cls._standardConfig())
140 @staticmethod
141 def _standardConfig():
142 config = MemoryMetricTask.ConfigClass()
143 config.connections.labelName = DummyTask._DefaultName
144 config.target = DummyTask._DefaultName + ".run"
145 config.connections.package = "verify"
146 config.connections.metric = "DummyMemory"
147 return config
149 def setUp(self):
150 super().setUp()
151 self.config = self._standardConfig()
152 self.metric = Name("verify.DummyMemory")
154 self.scienceTask = DummyTask()
155 self.scienceTask.run()
157 def testValid(self):
158 result = self.task.run(self.scienceTask.getFullMetadata())
159 meas = result.measurement
161 self.assertIsInstance(meas, Measurement)
162 self.assertEqual(meas.metric_name, self.metric)
163 self.assertGreater(meas.quantity, 0.0 * u.byte)
165 def testNoMetric(self):
166 self.config.connections.package = "foo.bar"
167 self.config.connections.metric = "FooBarMemory"
168 task = MemoryMetricTask(config=self.config)
169 with self.assertRaises(TypeError):
170 task.run(self.scienceTask.getFullMetadata())
172 def testMissingData(self):
173 result = self.task.run(None)
174 meas = result.measurement
175 self.assertIsNone(meas)
177 def testRunDifferentMethod(self):
178 self.config.target = DummyTask._DefaultName + ".runDataRef"
179 task = MemoryMetricTask(config=self.config)
180 result = task.run(self.scienceTask.getFullMetadata())
181 meas = result.measurement
182 self.assertIsNone(meas)
184 def testBadlyTypedKeys(self):
185 metadata = self.scienceTask.getFullMetadata()
186 endKeys = [key
187 for key in metadata.paramNames(topLevelOnly=False)
188 if "EndMaxResidentSetSize" in key]
189 for key in endKeys:
190 metadata.set(key, str(metadata.getAsDouble(key)))
192 task = MemoryMetricTask(config=self.config)
193 with self.assertRaises(MetricComputationError):
194 task.run(metadata)
196 def testDeprecated(self):
197 self.config.metric = "verify.DummyMemory"
198 self.config.connections.package = ""
199 self.config.connections.metric = ""
200 with warnings.catch_warnings(record=True) as emitted:
201 self.config.validate()
202 self.assertEqual(len(emitted), 1)
203 self.assertEqual(emitted[0].category, FutureWarning)
204 self.assertEqual(self.config.connections.package, "verify")
205 self.assertEqual(self.config.connections.metric, "DummyMemory")
208# Hack around unittest's hacky test setup system
209del MetricTaskTestCase
210del MetadataMetricTestCase
213class MemoryTester(lsst.utils.tests.MemoryTestCase):
214 pass
217def setup_module(module):
218 lsst.utils.tests.init()
221if __name__ == "__main__": 221 ↛ 222line 221 didn't jump to line 222, because the condition on line 221 was never true
222 lsst.utils.tests.init()
223 unittest.main()