Commit 78358388 authored by Raphael Defosseux's avatar Raphael Defosseux

CI: improved HTML reporting on OAI UE

Signed-off-by: default avatarRaphael Defosseux <raphael.defosseux@eurecom.fr>
parent 27a8abfe
...@@ -43,6 +43,8 @@ ENB_PROCESS_ASSERTION = -12 ...@@ -43,6 +43,8 @@ ENB_PROCESS_ASSERTION = -12
ENB_PROCESS_REALTIME_ISSUE = -13 ENB_PROCESS_REALTIME_ISSUE = -13
ENB_PROCESS_NOLOGFILE_TO_ANALYZE = -14 ENB_PROCESS_NOLOGFILE_TO_ANALYZE = -14
UE_PROCESS_NOLOGFILE_TO_ANALYZE = -20 UE_PROCESS_NOLOGFILE_TO_ANALYZE = -20
UE_PROCESS_COULD_NOT_SYNC = -21
UE_PROCESS_ASSERTION = -22
HSS_PROCESS_FAILED = -2 HSS_PROCESS_FAILED = -2
HSS_PROCESS_OK = +2 HSS_PROCESS_OK = +2
MME_PROCESS_FAILED = -3 MME_PROCESS_FAILED = -3
...@@ -332,8 +334,6 @@ class SSHConnection(): ...@@ -332,8 +334,6 @@ class SSHConnection():
self.command('mkdir -p build_log_' + self.testCase_id, '\$', 5) self.command('mkdir -p build_log_' + self.testCase_id, '\$', 5)
self.command('mv log/* ' + 'build_log_' + self.testCase_id, '\$', 5) self.command('mv log/* ' + 'build_log_' + self.testCase_id, '\$', 5)
self.command('mv compile_oai_enb.log ' + 'build_log_' + self.testCase_id, '\$', 5) self.command('mv compile_oai_enb.log ' + 'build_log_' + self.testCase_id, '\$', 5)
# Workaround to run with develop-nr
self.command('if [ -e ran_build ]; then cp -rf ran_build lte_build_oai; fi', '\$', 30)
self.close() self.close()
self.CreateHtmlTestRow(self.Build_eNB_args, 'OK', ALL_PROCESSES_OK) self.CreateHtmlTestRow(self.Build_eNB_args, 'OK', ALL_PROCESSES_OK)
...@@ -2086,6 +2086,9 @@ class SSHConnection(): ...@@ -2086,6 +2086,9 @@ class SSHConnection():
pdcpFailure = 0 pdcpFailure = 0
ulschFailure = 0 ulschFailure = 0
no_cell_sync_found = False no_cell_sync_found = False
mib_found = False
frequency_found = False
self.htmlUEFailureMsg = ''
for line in ue_log_file.readlines(): for line in ue_log_file.readlines():
result = re.search('[Ss]egmentation [Ff]ault', str(line)) result = re.search('[Ss]egmentation [Ff]ault', str(line))
if result is not None: if result is not None:
...@@ -2105,66 +2108,78 @@ class SSHConnection(): ...@@ -2105,66 +2108,78 @@ class SSHConnection():
result = re.search('uci->stat', str(line)) result = re.search('uci->stat', str(line))
if result is not None: if result is not None:
uciStatMsgCount += 1 uciStatMsgCount += 1
# full pattern
# No cell synchronization found, abandoning # No cell synchronization found, abandoning
result = re.search('No cell synchronization found, abandoning', str(line)) result = re.search('No cell synchronization found, abandoning', str(line))
if result is not None: if result is not None:
no_cell_sync_found = True no_cell_sync_found = True
# MIB Information => FDD, NORMAL, NidCell 421, N_RB_DL 50, PHICH DURATION 0, PHICH RESOURCE 1/6, TX_ANT 2
# mask --> FDD NORMAL 421 50 0 1/6 2
result = re.search("MIB Information => ([a-zA-Z]{1,10}), ([a-zA-Z]{1,10}), NidCell (?P<nidcell>\d{1,3}), N_RB_DL (?P<n_rb_dl>\d{1,3}), PHICH DURATION (?P<phich_duration>\d), PHICH RESOURCE (?P<phich_resource>.{1,4}), TX_ANT (?P<tx_ant>\d)", str(line)) result = re.search("MIB Information => ([a-zA-Z]{1,10}), ([a-zA-Z]{1,10}), NidCell (?P<nidcell>\d{1,3}), N_RB_DL (?P<n_rb_dl>\d{1,3}), PHICH DURATION (?P<phich_duration>\d), PHICH RESOURCE (?P<phich_resource>.{1,4}), TX_ANT (?P<tx_ant>\d)", str(line))
if result is not None: if result is not None and (not mib_found):
try: try:
print('\033[94m' + "MIB Information: " + result.group(1) + ', ' + result.group(2) + '\033[0m') mibMsg = "MIB Information: " + result.group(1) + ', ' + result.group(2)
print('\033[94m' + "nidcell = " + result.group('nidcell') + '\033[0m') self.htmlUEFailureMsg += mibMsg + '\n'
print('\033[94m' + "n_rb_dl = " + result.group('n_rb_dl') + '\033[0m') logging.debug('\033[94m' + mibMsg + '\033[0m')
print('\033[94m' + "phich_duration = " + result.group('phich_duration') + '\033[0m') mibMsg = " nidcell = " + result.group('nidcell')
print('\033[94m' + "phich_resource = " + result.group('phich_resource') + '\033[0m') self.htmlUEFailureMsg += mibMsg
print('\033[94m' + "tx_ant = " + result.group('tx_ant') + '\033[0m') logging.debug('\033[94m' + mibMsg + '\033[0m')
mibMsg = " n_rb_dl = " + result.group('n_rb_dl')
self.htmlUEFailureMsg += mibMsg + '\n'
logging.debug('\033[94m' + mibMsg + '\033[0m')
mibMsg = " phich_duration = " + result.group('phich_duration')
self.htmlUEFailureMsg += mibMsg
logging.debug('\033[94m' + mibMsg + '\033[0m')
mibMsg = " phich_resource = " + result.group('phich_resource')
self.htmlUEFailureMsg += mibMsg + '\n'
logging.debug('\033[94m' + mibMsg + '\033[0m')
mibMsg = " tx_ant = " + result.group('tx_ant')
self.htmlUEFailureMsg += mibMsg + '\n'
logging.debug('\033[94m' + mibMsg + '\033[0m')
mib_found = True
except Exception as e: except Exception as e:
print('\033[91m' + "a marker was not found" + '\033[0m') logging.error('\033[91m' + "MIB marker was not found" + '\033[0m')
# Measured Carrier Frequency 816000688 Hz (offset 12 Hz)
# mask --> 816000688i
result = re.search("Measured Carrier Frequency (?P<measured_carrier_frequency>\d{1,15}) Hz", str(line)) result = re.search("Measured Carrier Frequency (?P<measured_carrier_frequency>\d{1,15}) Hz", str(line))
if result is not None: if result is not None and (not frequency_found):
try: try:
print('\033[94m' + "Measured Carrier Frequency = " + result.group('measured_carrier_frequency') + '\033[0m') mibMsg = "Measured Carrier Frequency = " + result.group('measured_carrier_frequency') + ' Hz'
self.htmlUEFailureMsg += mibMsg + '\n'
logging.debug('\033[94m' + mibMsg + '\033[0m')
frequency_found = True
except Exception as e: except Exception as e:
print('\033[91m' + "Measured Carrier Frequency not found" + '\033[0m') logging.error('\033[91m' + "Measured Carrier Frequency not found" + '\033[0m')
# Found Orange FR (name from internal table)
# mask Orange FR
result = re.search("Found (?P<operator>[\w,\s]{1,15}) \(name from internal table\)", str(line)) result = re.search("Found (?P<operator>[\w,\s]{1,15}) \(name from internal table\)", str(line))
if result is not None: if result is not None:
try: try:
print('\033[94m' + "The operator is: " + result.group('operator') + '\033[0m') mibMsg = "The operator is: " + result.group('operator')
self.htmlUEFailureMsg += mibMsg + '\n'
logging.debug('\033[94m' + mibMsg + '\033[0m')
except Exception as e: except Exception as e:
print('\033[91m' + "Operator name not found" + '\033[0m') logging.error('\033[91m' + "Operator name not found" + '\033[0m')
# SIB5 InterFreqCarrierFreq element 0/3
# mask -- 0 and 3
result = re.search("SIB5 InterFreqCarrierFreq element (.{1,4})/(.{1,4})", str(line)) result = re.search("SIB5 InterFreqCarrierFreq element (.{1,4})/(.{1,4})", str(line))
if result is not None: if result is not None:
try: try:
print('\033[94m' + "SIB5 InterFreqCarrierFreq element " + result.group(1) + '/' + result.group(2) + '\033[0m') mibMsg = "SIB5 InterFreqCarrierFreq element " + result.group(1) + '/' + result.group(2)
self.htmlUEFailureMsg += mibMsg + ' -> '
logging.debug('\033[94m' + mibMsg + '\033[0m')
except Exception as e: except Exception as e:
print('\033[91m' + "SIB5 InterFreqCarrierFreq element not found" + '\033[0m') logging.error('\033[91m' + "SIB5 InterFreqCarrierFreq element not found" + '\033[0m')
# DL Carrier Frequency/ARFCN : 2645000000/3000 result = re.search("DL Carrier Frequency/ARFCN : (?P<carrier_frequency>\d{1,15}/\d{1,4})", str(line))
# mask 2645000000
result = re.search("DL Carrier Frequency/ARFCN : (?P<carrier_frequency>)\d{1,15}/\d{1,4}", str(line))
if result is not None: if result is not None:
try: try:
print('\033[94m' + "DL Carrier Frequency is: " + result.group('carrier_frequency') + '\033[0m') freq = result.group('carrier_frequency')
new_freq = re.sub('/[0-9]+','',freq)
float_freq = float(new_freq) / 1000000
self.htmlUEFailureMsg += 'DL Freq: ' + ('%.1f' % float_freq) + ' MHz'
logging.debug('\033[94m' + " DL Carrier Frequency is: " + freq + '\033[0m')
except Exception as e: except Exception as e:
print('\033[91m' + "DL Carrier Frequency not found" + '\033[0m') logging.error('\033[91m' + " DL Carrier Frequency not found" + '\033[0m')
# AllowedMeasBandwidth : 100
# mask 100
result = re.search("AllowedMeasBandwidth : (?P<allowed_bandwidth>\d{1,7})", str(line)) result = re.search("AllowedMeasBandwidth : (?P<allowed_bandwidth>\d{1,7})", str(line))
if result is not None: if result is not None:
try: try:
print('\033[94m' + "AllowedMeasBandwidth: " + result.group('allowed_bandwidth') + '\033[0m') prb = result.group('allowed_bandwidth')
self.htmlUEFailureMsg += ' -- PRB: ' + prb + '\n'
logging.debug('\033[94m' + " AllowedMeasBandwidth: " + prb + '\033[0m')
except Exception as e: except Exception as e:
print('\033[91m' + "AllowedMeasBandwidth not found" + '\033[0m') logging.error('\033[91m' + " AllowedMeasBandwidth not found" + '\033[0m')
ue_log_file.close() ue_log_file.close()
self.htmlUEFailureMsg = ''
if uciStatMsgCount > 0: if uciStatMsgCount > 0:
statMsg = 'UE showed ' + str(uciStatMsgCount) + ' "uci->stat" message(s)' statMsg = 'UE showed ' + str(uciStatMsgCount) + ' "uci->stat" message(s)'
logging.debug('\u001B[1;30;43m ' + statMsg + ' \u001B[0m') logging.debug('\u001B[1;30;43m ' + statMsg + ' \u001B[0m')
...@@ -2186,12 +2201,19 @@ class SSHConnection(): ...@@ -2186,12 +2201,19 @@ class SSHConnection():
return ENB_PROCESS_SEG_FAULT return ENB_PROCESS_SEG_FAULT
if foundAssertion: if foundAssertion:
logging.debug('\u001B[1;37;43m UE ended with an assertion! \u001B[0m') logging.debug('\u001B[1;37;43m UE ended with an assertion! \u001B[0m')
self.htmlUEFailureMsg += msgAssertion # removed for esthetics
return ENB_PROCESS_ASSERTION #self.htmlUEFailureMsg += msgAssertion
self.htmlUEFailureMsg += 'UE ended with an assertion!\n'
if not mib_found or not frequency_found:
return UE_PROCESS_ASSERTION
if foundRealTimeIssue: if foundRealTimeIssue:
logging.debug('\u001B[1;37;41m UE faced real time issues! \u001B[0m') logging.debug('\u001B[1;37;41m UE faced real time issues! \u001B[0m')
self.htmlUEFailureMsg += 'UE faced real time issues!\n' self.htmlUEFailureMsg += 'UE faced real time issues!\n'
#return ENB_PROCESS_REALTIME_ISSUE #return ENB_PROCESS_REALTIME_ISSUE
if no_cell_sync_found and not mib_found:
logging.debug('\u001B[1;37;41m UE could not synchronize ! \u001B[0m')
self.htmlUEFailureMsg += 'UE could not synchronize!\n'
return UE_PROCESS_COULD_NOT_SYNC
if rlcDiscardBuffer > 0: if rlcDiscardBuffer > 0:
rlcMsg = 'UE RLC discarded ' + str(rlcDiscardBuffer) + ' buffer(s)' rlcMsg = 'UE RLC discarded ' + str(rlcDiscardBuffer) + ' buffer(s)'
logging.debug('\u001B[1;37;41m ' + rlcMsg + ' \u001B[0m') logging.debug('\u001B[1;37;41m ' + rlcMsg + ' \u001B[0m')
...@@ -2386,21 +2408,27 @@ class SSHConnection(): ...@@ -2386,21 +2408,27 @@ class SSHConnection():
copyin_res = self.copyin(self.UEIPAddress, self.UEUserName, self.UEPassword, self.UESourceCodePath + '/cmake_targets/' + self.UELogFile, '.') copyin_res = self.copyin(self.UEIPAddress, self.UEUserName, self.UEPassword, self.UESourceCodePath + '/cmake_targets/' + self.UELogFile, '.')
if (copyin_res == -1): if (copyin_res == -1):
logging.debug('\u001B[1;37;41m Could not copy UE logfile to analyze it! \u001B[0m') logging.debug('\u001B[1;37;41m Could not copy UE logfile to analyze it! \u001B[0m')
self.htmlUEFailureMsg = 'Could not copy UE logfile to analyze it!' optionsMsg = '<pre style="background-color:white">Could not copy UE logfile to analyze it!</pre>'
self.CreateHtmlTestRow('N/A', 'KO', UE_PROCESS_NOLOGFILE_TO_ANALYZE) self.CreateHtmlTestRow(optionsMsg, 'KO', UE_PROCESS_NOLOGFILE_TO_ANALYZE, 'UE')
self.UELogFile = '' self.UELogFile = ''
return return
logging.debug('\u001B[1m Analyzing UE logfile \u001B[0m') logging.debug('\u001B[1m Analyzing UE logfile \u001B[0m')
logStatus = self.AnalyzeLogFile_UE(self.UELogFile) logStatus = self.AnalyzeLogFile_UE(self.UELogFile)
if (logStatus < 0): if (logStatus < 0):
self.CreateHtmlTestRow('N/A', 'KO', logStatus) optionsMsg = '<pre style="background-color:white"><b>Sniffing Unsuccessful</b>\n'
optionsMsg += self.htmlUEFailureMsg
optionsMsg += '</pre>'
self.CreateHtmlTestRow(optionsMsg, 'KO', logStatus, 'UE')
self.CreateHtmlTabFooter(False) self.CreateHtmlTabFooter(False)
sys.exit(1) sys.exit(1)
else: else:
self.CreateHtmlTestRow('<pre style="background-color:white">sniffing successful</pre>', 'OK', ALL_PROCESSES_OK) optionsMsg = '<pre style="background-color:white"><b>Sniffing Successful</b>\n'
optionsMsg += self.htmlUEFailureMsg
optionsMsg += '</pre>'
self.CreateHtmlTestRow(optionsMsg, 'OK', ALL_PROCESSES_OK)
self.UELogFile = '' self.UELogFile = ''
else: else:
self.CreateHtmlTestRow('<pre style="background-color:white">sniffing successful</pre>', 'OK', ALL_PROCESSES_OK) self.CreateHtmlTestRow('<pre style="background-color:white">No Log File to analyze</pre>', 'OK', ALL_PROCESSES_OK)
def AutoTerminateUEandeNB(self): def AutoTerminateUEandeNB(self):
self.testCase_id = 'AUTO-KILL-UE' self.testCase_id = 'AUTO-KILL-UE'
...@@ -2574,6 +2602,9 @@ class SSHConnection(): ...@@ -2574,6 +2602,9 @@ class SSHConnection():
#----------------------------------------------------------- #-----------------------------------------------------------
def CreateHtmlHeader(self): def CreateHtmlHeader(self):
if (not self.htmlHeaderCreated): if (not self.htmlHeaderCreated):
logging.debug('\u001B[1m----------------------------------------\u001B[0m')
logging.debug('\u001B[1m Creating HTML header \u001B[0m')
logging.debug('\u001B[1m----------------------------------------\u001B[0m')
self.htmlFile = open('test_results.html', 'w') self.htmlFile = open('test_results.html', 'w')
self.htmlFile.write('<!DOCTYPE html>\n') self.htmlFile.write('<!DOCTYPE html>\n')
self.htmlFile.write('<html class="no-js" lang="en-US">\n') self.htmlFile.write('<html class="no-js" lang="en-US">\n')
...@@ -2720,6 +2751,9 @@ class SSHConnection(): ...@@ -2720,6 +2751,9 @@ class SSHConnection():
def CreateHtmlFooter(self, passStatus): def CreateHtmlFooter(self, passStatus):
if (os.path.isfile('test_results.html')): if (os.path.isfile('test_results.html')):
logging.debug('\u001B[1m----------------------------------------\u001B[0m')
logging.debug('\u001B[1m Creating HTML footer \u001B[0m')
logging.debug('\u001B[1m----------------------------------------\u001B[0m')
self.RetrieveSystemVersion() self.RetrieveSystemVersion()
self.htmlFile = open('test_results.html', 'a') self.htmlFile = open('test_results.html', 'a')
self.htmlFile.write('</div>\n') self.htmlFile.write('</div>\n')
...@@ -2777,12 +2811,14 @@ class SSHConnection(): ...@@ -2777,12 +2811,14 @@ class SSHConnection():
self.htmlFile.write(' <td bgcolor = "lightcoral" >KO - ' + machine + ' process not found</td>\n') self.htmlFile.write(' <td bgcolor = "lightcoral" >KO - ' + machine + ' process not found</td>\n')
elif (processesStatus == ENB_PROCESS_SEG_FAULT): elif (processesStatus == ENB_PROCESS_SEG_FAULT):
self.htmlFile.write(' <td bgcolor = "lightcoral" >KO - ' + machine + ' process ended in Segmentation Fault</td>\n') self.htmlFile.write(' <td bgcolor = "lightcoral" >KO - ' + machine + ' process ended in Segmentation Fault</td>\n')
elif (processesStatus == ENB_PROCESS_ASSERTION): elif (processesStatus == ENB_PROCESS_ASSERTION) or (processesStatus == UE_PROCESS_ASSERTION):
self.htmlFile.write(' <td bgcolor = "lightcoral" >KO - ' + machine + ' process ended in Assertion</td>\n') self.htmlFile.write(' <td bgcolor = "lightcoral" >KO - ' + machine + ' process ended in Assertion</td>\n')
elif (processesStatus == ENB_PROCESS_REALTIME_ISSUE): elif (processesStatus == ENB_PROCESS_REALTIME_ISSUE):
self.htmlFile.write(' <td bgcolor = "lightcoral" >KO - ' + machine + ' process faced Real Time issue(s)</td>\n') self.htmlFile.write(' <td bgcolor = "lightcoral" >KO - ' + machine + ' process faced Real Time issue(s)</td>\n')
elif (processesStatus == ENB_PROCESS_NOLOGFILE_TO_ANALYZE) or (processesStatus == UE_PROCESS_NOLOGFILE_TO_ANALYZE): elif (processesStatus == ENB_PROCESS_NOLOGFILE_TO_ANALYZE) or (processesStatus == UE_PROCESS_NOLOGFILE_TO_ANALYZE):
self.htmlFile.write(' <td bgcolor = "orange" >OK</td>\n') self.htmlFile.write(' <td bgcolor = "orange" >OK?</td>\n')
elif (processesStatus == UE_PROCESS_COULD_NOT_SYNC):
self.htmlFile.write(' <td bgcolor = "lightcoral" >KO - UE could not sync</td>\n')
elif (processesStatus == HSS_PROCESS_FAILED): elif (processesStatus == HSS_PROCESS_FAILED):
self.htmlFile.write(' <td bgcolor = "lightcoral" >KO - HSS process not found</td>\n') self.htmlFile.write(' <td bgcolor = "lightcoral" >KO - HSS process not found</td>\n')
elif (processesStatus == MME_PROCESS_FAILED): elif (processesStatus == MME_PROCESS_FAILED):
......
...@@ -25,16 +25,9 @@ ...@@ -25,16 +25,9 @@
<htmlTabName>Test-10Mhz-Orange</htmlTabName> <htmlTabName>Test-10Mhz-Orange</htmlTabName>
<htmlTabIcon>tasks</htmlTabIcon> <htmlTabIcon>tasks</htmlTabIcon>
<TestCaseRequestedList> <TestCaseRequestedList>
090101
090102 000001 090109 090102 000001 090109
</TestCaseRequestedList> </TestCaseRequestedList>
<TestCaseExclusionList>090101</TestCaseExclusionList> <TestCaseExclusionList></TestCaseExclusionList>
<testCase id="090101">
<class>Build_OAI_UE</class>
<desc>Build OAI UE</desc>
<Build_OAI_UE_args>-w USRP --UE</Build_OAI_UE_args>
</testCase>
<testCase id="090102"> <testCase id="090102">
<class>Initialize_OAI_UE</class> <class>Initialize_OAI_UE</class>
......
...@@ -25,16 +25,9 @@ ...@@ -25,16 +25,9 @@
<htmlTabName>Test-10MHz-SFR</htmlTabName> <htmlTabName>Test-10MHz-SFR</htmlTabName>
<htmlTabIcon>tasks</htmlTabIcon> <htmlTabIcon>tasks</htmlTabIcon>
<TestCaseRequestedList> <TestCaseRequestedList>
090101
090104 000001 090109 090104 000001 090109
</TestCaseRequestedList> </TestCaseRequestedList>
<TestCaseExclusionList>090101</TestCaseExclusionList> <TestCaseExclusionList></TestCaseExclusionList>
<testCase id="090101">
<class>Build_OAI_UE</class>
<desc>Build OAI UE</desc>
<Build_OAI_UE_args>-w USRP --UE</Build_OAI_UE_args>
</testCase>
<testCase id="090104"> <testCase id="090104">
<class>Initialize_OAI_UE</class> <class>Initialize_OAI_UE</class>
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment