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