Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 13 additions & 5 deletions dbbot/reader/database_writer.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Copyright 2013-2014 Nokia Solutions and Networks
# Copyright 2013-2014 Nokia Solutions and Networks
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
Expand All @@ -16,6 +16,10 @@
from sqlalchemy.sql import and_, select
from sqlalchemy.exc import IntegrityError
from dbbot import Logger
from sqlalchemy.dialects.mysql import LONGTEXT

import traceback
import sys


class DatabaseWriter(object):
Expand Down Expand Up @@ -86,7 +90,7 @@ def _create_table_suites(self):
Column('suite_id', Integer, ForeignKey('suites.id')),
Column('xml_id', String(64), nullable=False),
Column('name', String(256), nullable=False),
Column('source', String(1024)),
Column('source', String(256)),
Column('doc', Text)
), ('name', 'source'))

Expand All @@ -105,6 +109,7 @@ def _create_table_tests(self):
Column('suite_id', Integer, ForeignKey('suites.id'), nullable=False),
Column('xml_id', String(64), nullable=False),
Column('name', String(256), nullable=False),
# Column('message', Text, nullable=False),
Column('timeout', String(64)),
Column('doc', Text)
), ('suite_id', 'name'))
Expand Down Expand Up @@ -141,7 +146,7 @@ def _create_table_messages(self):
Column('keyword_id', Integer, ForeignKey('keywords.id'), nullable=False),
Column('level', String(64), nullable=False),
Column('timestamp', DateTime, nullable=False),
Column('content', Text, nullable=False),
Column('content', LONGTEXT, nullable=False),
Column('content_hash', String(64), nullable=False)
), ('keyword_id', 'level', 'content_hash'))

Expand Down Expand Up @@ -184,10 +189,13 @@ def insert(self, table_name, criteria):
def insert_or_ignore(self, table_name, criteria):
try:
self.insert(table_name, criteria)
except IntegrityError:
except IntegrityError as e:
# print(e)
# exc_type, exc_value, exc_tb = sys.exc_info()
# print(traceback.format_exception(exc_type, exc_value, exc_tb))
self._verbose('Failed insert to {table} with values {values}'.format(table=table_name,
values=list(criteria.values())))

def close(self):
self._verbose('- Closing database connection')
self._connection.close()
self._connection.close()
66 changes: 45 additions & 21 deletions dbbot/reader/robot_results_parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ def _parse_tag_stats(self, stat, test_run_id):
self._db.insert_or_ignore('tag_status', {
'test_run_id': test_run_id,
'name': stat.name,
'critical': int(stat.critical),
'critical': 0,
'elapsed': getattr(stat, 'elapsed', None),
'failed': stat.failed,
'passed': stat.passed
Expand Down Expand Up @@ -125,8 +125,8 @@ def _parse_suite_status(self, test_run_id, suite_id, suite):
self._db.insert_or_ignore('suite_status', {
'test_run_id': test_run_id,
'suite_id': suite_id,
'passed': suite.statistics.all.passed,
'failed': suite.statistics.all.failed,
'passed': suite.statistics.passed,
'failed': suite.statistics.failed,
'elapsed': suite.elapsedtime,
'status': suite.status
})
Expand Down Expand Up @@ -154,7 +154,7 @@ def _parse_test(self, test, test_run_id, suite_id):
})
self._parse_test_status(test_run_id, test_id, test)
self._parse_tags(test.tags, test_id)
self._parse_keywords(test.keywords, test_run_id, None, test_id)
self._parse_keywords(test.keywords, test_run_id, suite_id, test_id)

def _parse_test_status(self, test_run_id, test_id, test):
self._db.insert_or_ignore('test_status', {
Expand All @@ -173,6 +173,7 @@ def _parse_keywords(self, keywords, test_run_id, suite_id, test_id, keyword_id=N
[self._parse_keyword(keyword, test_run_id, suite_id, test_id, keyword_id) for keyword in keywords]

def _parse_keyword(self, keyword, test_run_id, suite_id, test_id, keyword_id):
# print('parsing keyword')
try:
keyword_id = self._db.insert('keywords', {
'suite_id': suite_id,
Expand All @@ -188,27 +189,48 @@ def _parse_keyword(self, keyword, test_run_id, suite_id, test_id, keyword_id):
'name': keyword.name,
'type': keyword.type
})
self._parse_keyword_status(test_run_id, keyword_id, keyword)
self._parse_messages(keyword.messages, keyword_id)
self._parse_arguments(keyword.args, keyword_id)
self._parse_keywords(keyword.keywords, test_run_id, None, None, keyword_id)
# print('parsing keyword done')
if keyword.status == 'FAIL':
self._parse_keyword_status(test_run_id, keyword_id, keyword)

try:
if type(keyword.messages) is list:
print('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%')
self._parse_messages(keyword.messages, keyword_id)
# self._parse_arguments(keyword.args, keyword_id)
self._parse_keywords(keyword.keywords, test_run_id, suite_id, test_id, keyword_id)
else:
print("No keyword called messages")

except AttributeError as e:
print('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!')
print(keyword)
print('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!')
pass

def _parse_keyword_status(self, test_run_id, keyword_id, keyword):
self._db.insert_or_ignore('keyword_status', {
'test_run_id': test_run_id,
'keyword_id': keyword_id,
'status': keyword.status,
'elapsed': keyword.elapsedtime
})
try:
self._db.insert_or_ignore('keyword_status', {
'test_run_id': test_run_id,
'keyword_id': keyword_id,
'status': keyword.status,
'elapsed': keyword.elapsedtime
})
except:
pass

def _parse_messages(self, messages, keyword_id):
for message in messages:
self._db.insert_or_ignore('messages', {
'keyword_id': keyword_id, 'level': message.level,
'timestamp': self._format_robot_timestamp(message.timestamp),
'content': message.message,
'content_hash': self._string_hash(message.message)
})
try:
if message.level == 'FAIL':
self._db.insert_or_ignore('messages', {
'keyword_id': keyword_id, 'level': message.level,
'timestamp': self._format_robot_timestamp(message.timestamp),
'content': message.message,
'content_hash': self._string_hash(message.message)
})
except:
pass

def _parse_arguments(self, args, keyword_id):
for arg in args:
Expand All @@ -224,4 +246,6 @@ def _format_robot_timestamp(timestamp):

@staticmethod
def _string_hash(string):
return sha1(string.encode()).hexdigest() if string else None
# return sha1(string.encode()).hexdigest() if string else None
return sha1(string.encode('utf-8')).hexdigest() if string else None