blob: 9136906e89f28522b5bddef003a83ae53671aeff [file] [log] [blame]
Neels Hofmeyrdae3d3c2017-03-28 12:16:58 +02001#!/usr/bin/env python3
2
3# osmo_gsm_tester: logging tests
4#
5# Copyright (C) 2016-2017 by sysmocom - s.f.m.c. GmbH
6#
7# Author: Neels Hofmeyr <neels@hofmeyr.de>
8#
9# This program is free software: you can redistribute it and/or modify
Harald Welte27205342017-06-03 09:51:45 +020010# it under the terms of the GNU General Public License as
Neels Hofmeyrdae3d3c2017-03-28 12:16:58 +020011# published by the Free Software Foundation, either version 3 of the
12# License, or (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
Harald Welte27205342017-06-03 09:51:45 +020017# GNU General Public License for more details.
Neels Hofmeyrdae3d3c2017-03-28 12:16:58 +020018#
Harald Welte27205342017-06-03 09:51:45 +020019# You should have received a copy of the GNU General Public License
Neels Hofmeyrdae3d3c2017-03-28 12:16:58 +020020# along with this program. If not, see <http://www.gnu.org/licenses/>.
21
22import _prep
23
24import sys
25import os
26
27from osmo_gsm_tester import log
28
29#log.targets[0].get_time_str = lambda: '01:02:03'
30fake_time = '01:02:03'
31log.style_change(time=True, time_fmt=fake_time)
Neels Hofmeyr3531a192017-03-28 14:30:28 +020032log.set_all_levels(None)
Neels Hofmeyrdae3d3c2017-03-28 12:16:58 +020033
34print('- Testing global log functions')
Neels Hofmeyr1a7a3f02017-06-10 01:18:27 +020035log.log('from log.log()', _origin='<origin>', _category=log.C_TST)
36log.dbg('from log.dbg(), not seen', _origin='<origin>', _category=log.C_TST)
Neels Hofmeyrdae3d3c2017-03-28 12:16:58 +020037log.set_level(log.C_TST, log.L_DBG)
Neels Hofmeyr1a7a3f02017-06-10 01:18:27 +020038log.dbg('from log.dbg()', _origin='<origin>', _category=log.C_TST)
Neels Hofmeyrdae3d3c2017-03-28 12:16:58 +020039log.set_level(log.C_TST, log.L_LOG)
Neels Hofmeyr1a7a3f02017-06-10 01:18:27 +020040log.err('from log.err()', _origin='<origin>', _category=log.C_TST)
Neels Hofmeyrdae3d3c2017-03-28 12:16:58 +020041
42print('- Testing log.Origin functions')
43class LogTest(log.Origin):
Neels Hofmeyr1a7a3f02017-06-10 01:18:27 +020044 def __init__(self, *name_items, **detail_items):
45 super().__init__(log.C_TST, *name_items, **detail_items)
Neels Hofmeyrdae3d3c2017-03-28 12:16:58 +020046
Neels Hofmeyr1a7a3f02017-06-10 01:18:27 +020047t = LogTest('some', 'name', some="detail")
48
Neels Hofmeyrdae3d3c2017-03-28 12:16:58 +020049
50t.log("hello log")
51t.err("hello err")
52t.dbg("hello dbg not visible")
53
54t.log("message", int=3, tuple=('foo', 42), none=None, str='str\n')
55
56log.set_level(log.C_TST, log.L_DBG)
57t.dbg("hello dbg")
58
59print('- Testing log.style()')
60
61log.style(time=True, category=False, level=False, origin=False, src=False, time_fmt=fake_time)
62t.dbg("only time")
63log.style(time=False, category=True, level=False, origin=False, src=False, time_fmt=fake_time)
64t.dbg("only category")
65log.style(time=False, category=False, level=True, origin=False, src=False, time_fmt=fake_time)
66t.dbg("only level")
67log.style(time=False, category=False, level=False, origin=True, src=False, time_fmt=fake_time)
68t.dbg("only origin")
69log.style(time=False, category=False, level=False, origin=False, src=True, time_fmt=fake_time)
70t.dbg("only src")
71
72print('- Testing log.style_change()')
73log.style(time=False, category=False, level=False, origin=False, src=False, time_fmt=fake_time)
74t.dbg("no log format")
75log.style_change(time=True)
76t.dbg("add time")
77log.style_change(time=True, time_fmt=0)
78t.dbg("but no time format")
79log.style_change(time=True, time_fmt=fake_time)
80log.style_change(level=True)
81t.dbg("add level")
82log.style_change(category=True)
83t.dbg("add category")
84log.style_change(src=True)
85t.dbg("add src")
86log.style_change(origin=True)
87t.dbg("add origin")
88
Neels Hofmeyr1a7a3f02017-06-10 01:18:27 +020089# some space to keep source line numbers identical to previous code
90
Neels Hofmeyrdae3d3c2017-03-28 12:16:58 +020091print('- Testing origin_width')
Neels Hofmeyr1a7a3f02017-06-10 01:18:27 +020092t = LogTest('shortname')
Neels Hofmeyrdae3d3c2017-03-28 12:16:58 +020093log.style(origin_width=23, time_fmt=fake_time)
94t.log("origin str set to 23 chars")
95t.set_name('very long name', some='details', and_some=(3, 'things', 'in a tuple'))
96t.log("long origin str")
97t.dbg("long origin str dbg")
98t.err("long origin str err")
99
Neels Hofmeyr1a7a3f02017-06-10 01:18:27 +0200100
Neels Hofmeyrdae3d3c2017-03-28 12:16:58 +0200101print('- Testing log.Origin with omitted info')
102t = LogTest()
Neels Hofmeyrdae3d3c2017-03-28 12:16:58 +0200103t.log("hello log, name implicit from class name")
104
Neels Hofmeyr1a7a3f02017-06-10 01:18:27 +0200105t = LogTest('explicit_name')
106t._set_log_category(None)
Neels Hofmeyrdae3d3c2017-03-28 12:16:58 +0200107t.log("hello log, no category set")
Neels Hofmeyrdae3d3c2017-03-28 12:16:58 +0200108t = LogTest()
Neels Hofmeyr1a7a3f02017-06-10 01:18:27 +0200109t._set_log_category(None)
Neels Hofmeyrdae3d3c2017-03-28 12:16:58 +0200110t.log("hello log, no category nor name set")
111t.dbg("hello log, no category nor name set, not seen")
112log.set_level(log.C_DEFAULT, log.L_DBG)
113t.dbg("debug message, no category nor name set")
114
115print('- Testing logging of Exceptions, tracing origins')
Neels Hofmeyr532126a2017-05-05 19:51:40 +0200116log.style(time_fmt=fake_time, origin_width=0)
Neels Hofmeyrdae3d3c2017-03-28 12:16:58 +0200117
118class Thing(log.Origin):
119 def __init__(self, some_path):
Neels Hofmeyr1a7a3f02017-06-10 01:18:27 +0200120 super().__init__(log.C_TST, some_path)
Neels Hofmeyrdae3d3c2017-03-28 12:16:58 +0200121
122 def say(self, msg):
123 print(msg)
124
Neels Hofmeyr1a7a3f02017-06-10 01:18:27 +0200125 def l1(self):
126 level2 = Thing('level2')
127 level2.l2()
Neels Hofmeyrdae3d3c2017-03-28 12:16:58 +0200128
Neels Hofmeyr1a7a3f02017-06-10 01:18:27 +0200129 def l2(self):
130 level3 = Thing('level3')
131 level3.l3(self)
Neels Hofmeyrdae3d3c2017-03-28 12:16:58 +0200132
Neels Hofmeyr1a7a3f02017-06-10 01:18:27 +0200133 def l3(self, level2):
Neels Hofmeyrdae3d3c2017-03-28 12:16:58 +0200134 print('nested print just prints')
Neels Hofmeyr1a7a3f02017-06-10 01:18:27 +0200135 self.log('nested log()')
Neels Hofmeyrdae3d3c2017-03-28 12:16:58 +0200136 level2.log('nested l2 log() from within l3 scope')
137 raise ValueError('bork')
138
139try:
Neels Hofmeyr1a7a3f02017-06-10 01:18:27 +0200140 level1 = Thing('level1')
141 level1.l1()
Neels Hofmeyrdae3d3c2017-03-28 12:16:58 +0200142except Exception:
143 log.log_exn()
144
Neels Hofmeyr1a7a3f02017-06-10 01:18:27 +0200145print('- Disallow origin loops')
Neels Hofmeyr6ccda112017-06-06 19:41:17 +0200146try:
147 t = Thing('foo')
Neels Hofmeyr1a7a3f02017-06-10 01:18:27 +0200148 t._set_parent(t)
149 raise RuntimeError('this should not be reached')
150except log.OriginLoopError:
Neels Hofmeyr6ccda112017-06-06 19:41:17 +0200151 print('disallowed successfully')
152 pass
Neels Hofmeyrdae3d3c2017-03-28 12:16:58 +0200153
154# vim: expandtab tabstop=4 shiftwidth=4