2 # -*- coding: utf-8; mode: python; -*-
4 # GStreamer Debug Viewer - View and analyze GStreamer debug log files
6 # Copyright (C) 2007 René Stadler <mail@renestadler.de>
8 # This program is free software; you can redistribute it and/or modify it
9 # under the terms of the GNU General Public License as published by the Free
10 # Software Foundation; either version 3 of the License, or (at your option)
13 # This program is distributed in the hope that it will be useful, but WITHOUT
14 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
18 # You should have received a copy of the GNU General Public License along with
19 # this program. If not, see <http://www.gnu.org/licenses/>.
21 """GStreamer Debug Viewer test suite for the custom tree models."""
28 from unittest import TestCase, main as test_main
30 from .. import Common, Data
31 from .. GUI.filters import CategoryFilter, Filter
32 from .. GUI.models import (FilteredLogModel,
37 class TestSubRange (TestCase):
41 values = list(range(20))
43 sr = SubRange(values, 0, 20)
44 self.assertEqual(len(sr), 20)
46 sr = SubRange(values, 10, 20)
47 self.assertEqual(len(sr), 10)
49 sr = SubRange(values, 0, 10)
50 self.assertEqual(len(sr), 10)
52 sr = SubRange(values, 5, 15)
53 self.assertEqual(len(sr), 10)
57 values = list(range(20))
59 sr = SubRange(values, 0, 20)
60 self.assertEqual(list(sr), values)
62 sr = SubRange(values, 10, 20)
63 self.assertEqual(list(sr), list(range(10, 20)))
65 sr = SubRange(values, 0, 10)
66 self.assertEqual(list(sr), list(range(0, 10)))
68 sr = SubRange(values, 5, 15)
69 self.assertEqual(list(sr), list(range(5, 15)))
72 class Model (LogModelBase):
76 LogModelBase.__init__(self)
79 self.line_offsets.append(i * 100)
80 self.line_levels.append(Data.debug_level_debug)
82 def ensure_cached(self, line_offset):
84 pid = line_offset // 100
90 line_fmt = (b"0:00:00.000000000 %5i 0x0000000 DEBUG "
91 b"%20s dummy.c:1:dummy: dummy")
92 line_str = line_fmt % (pid, category,)
93 log_line = Data.LogLine.parse_full(line_str)
94 self.line_cache[line_offset] = log_line
96 def access_offset(self, line_offset):
101 class IdentityFilter (Filter):
105 def filter_func(row):
107 self.filter_func = filter_func
110 class RandomFilter (Filter):
112 def __init__(self, seed):
115 rand = random.Random()
118 def filter_func(row):
119 return rand.choice((True, False,))
120 self.filter_func = filter_func
123 class TestDynamicFilter (TestCase):
125 def test_unset_filter_rerange(self):
128 filtered_model = FilteredLogModel(full_model)
129 row_list = self.__row_list
131 self.assertEqual(row_list(full_model), list(range(20)))
132 self.assertEqual(row_list(filtered_model), list(range(20)))
134 filtered_model.set_range(5, 16)
136 self.assertEqual(row_list(filtered_model), list(range(5, 16)))
138 def test_identity_filter_rerange(self):
141 filtered_model = FilteredLogModel(full_model)
142 row_list = self.__row_list
144 self.assertEqual(row_list(full_model), list(range(20)))
145 self.assertEqual(row_list(filtered_model), list(range(20)))
147 filtered_model.add_filter(IdentityFilter(),
148 Common.Data.DefaultDispatcher())
149 filtered_model.set_range(5, 16)
151 self.assertEqual(row_list(filtered_model), list(range(5, 16)))
153 def test_filtered_range_refilter_skip(self):
156 filtered_model = FilteredLogModel(full_model)
158 row_list = self.__row_list
160 filtered_model.add_filter(CategoryFilter("EVEN"),
161 Common.Data.DefaultDispatcher())
162 self.__dump_model(filtered_model, "filtered")
164 self.assertEqual(row_list(filtered_model), list(range(1, 20, 2)))
165 self.assertEqual([filtered_model.line_index_from_super(i)
166 for i in range(1, 20, 2)],
168 self.assertEqual([filtered_model.line_index_to_super(i)
170 list(range(1, 20, 2)))
172 filtered_model.set_range(1, 20)
173 self.__dump_model(filtered_model, "ranged (1, 20)")
174 self.__dump_model(filtered_model, "filtered range")
176 self.assertEqual([filtered_model.line_index_from_super(i)
177 for i in range(0, 19, 2)],
179 self.assertEqual([filtered_model.line_index_to_super(i)
181 list(range(1, 20, 2)))
183 filtered_model.set_range(2, 20)
184 self.__dump_model(filtered_model, "ranged (2, 20)")
186 self.assertEqual(row_list(filtered_model), list(range(3, 20, 2)))
188 def test_filtered_range_refilter(self):
191 filtered_model = FilteredLogModel(full_model)
193 row_list = self.__row_list
194 rows = row_list(full_model)
195 rows_filtered = row_list(filtered_model)
197 self.__dump_model(full_model, "full model")
199 self.assertEqual(rows, rows_filtered)
201 self.assertEqual([filtered_model.line_index_from_super(i)
204 self.assertEqual([filtered_model.line_index_to_super(i)
208 filtered_model.set_range(5, 16)
209 self.__dump_model(filtered_model, "ranged model (5, 16)")
211 rows_ranged = row_list(filtered_model)
212 self.assertEqual(rows_ranged, list(range(5, 16)))
214 self.__dump_model(filtered_model, "filtered model (nofilter, 5, 15)")
216 filtered_model.add_filter(CategoryFilter("EVEN"),
217 Common.Data.DefaultDispatcher())
218 rows_filtered = row_list(filtered_model)
219 self.assertEqual(rows_filtered, list(range(5, 16, 2)))
221 self.__dump_model(filtered_model, "filtered model")
223 def test_random_filtered_range_refilter(self):
226 filtered_model = FilteredLogModel(full_model)
227 row_list = self.__row_list
229 self.assertEqual(row_list(full_model), list(range(20)))
230 self.assertEqual(row_list(filtered_model), list(range(20)))
232 filtered_model.add_filter(RandomFilter(538295943),
233 Common.Data.DefaultDispatcher())
234 random_rows = row_list(filtered_model)
236 self.__dump_model(filtered_model)
238 filtered_model = FilteredLogModel(full_model)
239 filtered_model.add_filter(RandomFilter(538295943),
240 Common.Data.DefaultDispatcher())
241 self.__dump_model(filtered_model, "filtered model")
242 self.assertEqual(row_list(filtered_model), random_rows)
244 filtered_model.set_range(1, 10)
245 self.__dump_model(filtered_model)
246 self.assertEqual(row_list(filtered_model), [
247 x for x in range(0, 10) if x in random_rows])
249 def __row_list(self, model):
251 return [row[Model.COL_PID] for row in model]
253 def __dump_model(self, model, comment=None):
255 # TODO: Provide a command line option to turn this on and off.
259 if not hasattr(model, "super_model"):
261 print("\t(%s)" % ("|".join([str(i).rjust(2)
262 for i in self.__row_list(model)]),), end=' ')
264 top_model = model.super_model
265 if hasattr(top_model, "super_model"):
266 top_model = top_model.super_model
267 top_indices = self.__row_list(top_model)
268 positions = self.__row_list(model)
269 output = [" "] * len(top_indices)
270 for i, position in enumerate(positions):
271 output[position] = str(i).rjust(2)
272 print("\t(%s)" % ("|".join(output),), end=' ')
280 if __name__ == "__main__":