Hide keyboard shortcuts

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/>. 

21 

22import time 

23import unittest 

24import warnings 

25 

26import astropy.units as u 

27 

28import lsst.utils.tests 

29from lsst.pex.config import Config 

30from lsst.pipe.base import Task, timeMethod 

31 

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 

37 

38 

39class DummyTask(Task): 

40 ConfigClass = Config 

41 _DefaultName = "NotARealTask" 

42 taskLength = 0.1 

43 

44 @timeMethod 

45 def run(self): 

46 time.sleep(self.taskLength) 

47 

48 

49class TimingMetricTestSuite(MetadataMetricTestCase): 

50 @classmethod 

51 def makeTask(cls): 

52 return TimingMetricTask(config=cls._standardConfig()) 

53 

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 

62 

63 def setUp(self): 

64 super().setUp() 

65 self.config = TimingMetricTestSuite._standardConfig() 

66 self.metric = Name("verify.DummyTime") 

67 

68 self.scienceTask = DummyTask() 

69 self.scienceTask.run() 

70 

71 def testValid(self): 

72 result = self.task.run(self.scienceTask.getFullMetadata()) 

73 meas = result.measurement 

74 

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) 

79 

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()) 

86 

87 def testMissingData(self): 

88 result = self.task.run(None) 

89 meas = result.measurement 

90 self.assertIsNone(meas) 

91 

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) 

98 

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) 

106 

107 task = TimingMetricTask(config=self.config) 

108 with self.assertRaises(MetricComputationError): 

109 task.run(metadata) 

110 

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))) 

118 

119 task = TimingMetricTask(config=self.config) 

120 with self.assertRaises(MetricComputationError): 

121 task.run(metadata) 

122 

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") 

133 

134 

135class MemoryMetricTestSuite(MetadataMetricTestCase): 

136 @classmethod 

137 def makeTask(cls): 

138 return MemoryMetricTask(config=cls._standardConfig()) 

139 

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 

148 

149 def setUp(self): 

150 super().setUp() 

151 self.config = self._standardConfig() 

152 self.metric = Name("verify.DummyMemory") 

153 

154 self.scienceTask = DummyTask() 

155 self.scienceTask.run() 

156 

157 def testValid(self): 

158 result = self.task.run(self.scienceTask.getFullMetadata()) 

159 meas = result.measurement 

160 

161 self.assertIsInstance(meas, Measurement) 

162 self.assertEqual(meas.metric_name, self.metric) 

163 self.assertGreater(meas.quantity, 0.0 * u.byte) 

164 

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()) 

171 

172 def testMissingData(self): 

173 result = self.task.run(None) 

174 meas = result.measurement 

175 self.assertIsNone(meas) 

176 

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) 

183 

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))) 

191 

192 task = MemoryMetricTask(config=self.config) 

193 with self.assertRaises(MetricComputationError): 

194 task.run(metadata) 

195 

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") 

206 

207 

208# Hack around unittest's hacky test setup system 

209del MetricTaskTestCase 

210del MetadataMetricTestCase 

211 

212 

213class MemoryTester(lsst.utils.tests.MemoryTestCase): 

214 pass 

215 

216 

217def setup_module(module): 

218 lsst.utils.tests.init() 

219 

220 

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()