Skip to content

Commit 3b0ff8c

Browse files
authored
Merge pull request #32 from sy-c/master
added infoLoggerTester command line tool
2 parents bed7ad8 + 8504ede commit 3b0ff8c

File tree

3 files changed

+249
-1
lines changed

3 files changed

+249
-1
lines changed

CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -408,6 +408,7 @@ foreach (t ${INSTALL_TARGETS})
408408
endforeach()
409409

410410
install(PROGRAMS src/infoBrowser.tcl DESTINATION ${CMAKE_INSTALL_BINDIR} RENAME infoBrowser)
411+
install(PROGRAMS src/infoLoggerTester.tcl DESTINATION ${CMAKE_INSTALL_BINDIR} RENAME infoLoggerTester)
411412
install(PROGRAMS newMysql.sh DESTINATION ${CMAKE_INSTALL_BINDIR})
412413

413414
#####################################

doc/releaseNotes.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,6 @@ This file describes the main feature changes for each InfoLogger released versio
2020
- Compatibility with mysql v8.
2121
- Code cleanup (Warnings, clang-format, copyright).
2222

23-
## next version
23+
## v1.3.5 - 06/09/2019
2424
- added process stdout/stderr capture and redirection to infologger
25+
- added infoLoggerTester to check full message pipeline from client to server and database.

src/infoLoggerTester.tcl

Lines changed: 246 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,246 @@
1+
#!/usr/bin/tclsh
2+
3+
# This tool tests the infologger message pipeline
4+
# API -> infoLoggerD -> infoLoggerServer -> DB + online clients
5+
6+
puts "Testing infoLogger log messages pipeline...\n"
7+
8+
set now [clock seconds]
9+
set testString [format "Test message %X : $now" [expr int(rand()*1000000000)]]
10+
11+
# flag to notify errors
12+
set isError 0
13+
# list with description of errors
14+
set errorTxt {}
15+
16+
proc addError {errmsg} {
17+
global isError
18+
global errorTxt
19+
incr isError
20+
lappend errorTxt $errmsg
21+
}
22+
23+
if {[catch {
24+
25+
set configFile "/etc/infoLogger.cfg"
26+
catch {
27+
set configFile $env(INFOLOGGER_CONFIG)
28+
}
29+
set x 0
30+
while {[set opt [lindex $argv $x]] != ""} {
31+
switch -exact -- $opt {
32+
-z {
33+
set configFile [lindex $argv [expr $x + 1]]
34+
incr x
35+
}
36+
}
37+
incr x
38+
}
39+
40+
set configName "\[default config\]"
41+
set default_db_user ""
42+
set default_db_pwd ""
43+
set default_db_host ""
44+
set default_db_db ""
45+
set default_loghost "localhost"
46+
set default_logport "6102"
47+
48+
set configFileSection "\[infoBrowser\]"
49+
set configFileSectionFound 0
50+
if {$configFile!=""} {
51+
52+
puts -nonewline "Test config file: "
53+
54+
set fd [open $configFile "r"]
55+
set keyfound {}
56+
while {1} {
57+
gets $fd line
58+
if {[eof $fd]} {break}
59+
# remove leading/trailing blanks
60+
set line [string trim $line]
61+
if {$line==$configFileSection} {
62+
# entering infoBrowser section
63+
set configFileSectionFound 1
64+
} elseif {[regexp {^\[.*\]} $line]} {
65+
# entering another section
66+
set configFileSectionFound 0
67+
}
68+
if {!$configFileSectionFound} {
69+
continue
70+
}
71+
set lv [split [string trim $line] "="]
72+
set lkey [lindex $lv 0]
73+
if {[string range $lkey 0 1]=="#"} {continue}
74+
set lv [string trim [join [lrange $lv 1 end] "="]]
75+
76+
lappend keyfound $lkey
77+
set cfgvals($lkey) $lv
78+
}
79+
close $fd
80+
81+
set cfgok 1
82+
foreach {keyname isoptionnal varname defval} [list \
83+
dbUser 0 db_user "$default_db_user" \
84+
dbPassword 0 db_pwd "$default_db_pwd" \
85+
dbHost 0 db_host "$default_db_host" \
86+
dbName 0 db_db "$default_db_db" \
87+
serverHost 1 loghost "$default_loghost" \
88+
serverPortTx 1 logport "$default_logport" \
89+
configName 1 configName "$configFile" \
90+
] {
91+
set $varname $defval
92+
if {[catch { set $varname $cfgvals($keyname) }]} {
93+
if {!$isoptionnal} {
94+
addError "Configuration variable $keyname undefined"
95+
set cfgok 0
96+
}
97+
}
98+
}
99+
if {!$cfgok} {
100+
addError "Wrong configuration in $configFile, exiting"
101+
break
102+
}
103+
104+
puts "ok"
105+
106+
} else {
107+
puts -nonewline "Test environment : "
108+
109+
set envok 1
110+
foreach {envname isoptionnal varname defval} [list \
111+
INFOLOGGER_MYSQL_USER 1 db_user "$default_db_user" \
112+
INFOLOGGER_MYSQL_PWD 1 db_pwd "$default_db_pwd" \
113+
INFOLOGGER_MYSQL_HOST 1 db_host "$default_db_host" \
114+
INFOLOGGER_MYSQL_DB 1 db_db "$default_db_db" \
115+
INFOLOGGER_SERVER_HOST 1 loghost "${default_loghost}" \
116+
INFOLOGGER_SERVER_PORT_TX 1 logport "${default_logport}" \
117+
] {
118+
set $varname $defval
119+
if {[catch { set $varname $env($envname) }]} {
120+
if {!$isoptionnal} {
121+
addError "Environment variable $envname undefined"
122+
set envok 0
123+
}
124+
}
125+
}
126+
127+
if {!$envok} {
128+
addError "Wrong environment, exiting"
129+
break
130+
}
131+
132+
puts "ok"
133+
}
134+
135+
# connect database
136+
puts -nonewline "Test database access : "
137+
set db -1
138+
if [ catch {package require mysqltcl} ] {
139+
addError "Package mysqltcl required"
140+
}
141+
if [ catch {set db [mysql::connect -host "$db_host" -user $db_user -password $db_pwd -db $db_db]} err ] {
142+
addError "connect failed"
143+
}
144+
if {$db!=-1} {
145+
puts "ok"
146+
} else {
147+
puts "failed"
148+
}
149+
150+
# check infoLoggerD is listening
151+
puts -nonewline "Test infoLoggerD socket : "
152+
set nInfoLoggerD 0
153+
catch {set nInfoLoggerD [exec netstat -l -p | grep @infoLoggerD | wc -l]}
154+
if {$nInfoLoggerD==1} {
155+
puts "ok"
156+
} else {
157+
puts "failed"
158+
addError "infoLoggerD local socket not found"
159+
}
160+
161+
# check infoLoggerServer is listening
162+
puts -nonewline "Test infoLoggerServer socket : "
163+
set server_fd -1
164+
if {[catch {set server_fd [socket "$loghost" "$logport"]} err]} {
165+
puts "failed"
166+
incr isError
167+
lappend errorTxt "Failed to connect to infoLoggerServer online socket ($loghost:$logport): $err"
168+
} else {
169+
puts "ok"
170+
fconfigure $server_fd -blocking false
171+
}
172+
173+
# inject message
174+
puts -nonewline "Test message injection: "
175+
set status 0
176+
if {[catch {exec /opt/o2-InfoLogger/bin/log -s Debug -oFacility=test "$testString"} results]} {
177+
if {[lindex $::errorCode 0] eq "CHILDSTATUS"} {
178+
set status [lindex $::errorCode 2]
179+
} else {
180+
set status "$results"
181+
}
182+
}
183+
if {$status==0} {
184+
puts "ok"
185+
} else {
186+
puts "failed"
187+
incr isError
188+
lappend errorTxt "Message injection failed: $status"
189+
break
190+
}
191+
192+
# wait a bit
193+
after 1000 { set timeout 1}
194+
vwait timeout
195+
196+
# query DB for message
197+
puts -nonewline "Test database query: "
198+
set imsg [mysql::escape $testString]
199+
set query "SELECT count(*) from messages where timestamp>=${now} and message='$imsg'"
200+
set r [mysql::sel $db $query -list]
201+
if {$r==1} {
202+
puts "ok"
203+
} else {
204+
puts "failed"
205+
addError "Message not found in DB"
206+
}
207+
mysql::endquery $db
208+
209+
# query online messages
210+
puts -nonewline "Test online server query: "
211+
if {$server_fd!=-1} {
212+
set found 0
213+
while {1} {
214+
set nc [gets $server_fd line]
215+
if {$nc<=0} {
216+
break
217+
}
218+
if {[string first $testString $line]>=0} {
219+
set found 1
220+
break
221+
}
222+
}
223+
if {$found} {
224+
puts "ok"
225+
} else {
226+
puts "failed"
227+
addError "Message not found in infoLoggerServer online socket"
228+
}
229+
}
230+
231+
} err]} {
232+
puts "failed"
233+
addError "Exception : $err"
234+
}
235+
236+
if {$isError} {
237+
puts "\nSome errors were found:"
238+
foreach e $errorTxt {
239+
puts " - $e"
240+
}
241+
exit -1
242+
}
243+
244+
puts "\nAll tests successful"
245+
246+
exit 0

0 commit comments

Comments
 (0)