From 733aaaa073a92a316ba888b6992f1172550dd469 Mon Sep 17 00:00:00 2001 From: Adrian Negreanu Date: Wed, 29 Jan 2014 00:58:43 +0200 Subject: testsqlite3: a test for sqlite3gen This verifies the 'memberdef' table against the generated XMLs. It accomplishes this by executing a sql query, constructed by iterating through the children and attributes of the memberdef XML element. The information translated from xml to sql, is then removed from the DOM, and the unprocessed bits are printed as warning messages. usage: testing/testsqlite3.py -d /.../doxygen_sqlite3.db -x /.../xml/test__x11_8cpp.xml output: WARNING: 'location' has unprocessed attr 'bodyend' WARNING: 'memberdef' has unprocessed child elem 'briefdescription' WARNING: 'memberdef' has unprocessed child elem 'detaileddescription' WARNING: 'memberdef' has unprocessed child elem 'inbodydescription' WARNING: 'memberdef' has unprocessed child elem 'location' WARNING: 'memberdef' has unprocessed attr 'kind' WARNING: 'memberdef' has unprocessed attr 'prot' WARNING: 'memberdef' has unprocessed attr 'static' WARNING: 'memberdef' has unprocessed attr 'id' --- testing/testsqlite3.py | 146 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 146 insertions(+) create mode 100755 testing/testsqlite3.py diff --git a/testing/testsqlite3.py b/testing/testsqlite3.py new file mode 100755 index 0000000..e8ab16c --- /dev/null +++ b/testing/testsqlite3.py @@ -0,0 +1,146 @@ +#! /usr/bin/python +from xml.etree import cElementTree as ET +import os +import sqlite3 +import sys +import getopt + +# map XML attributes/elements to SQL rows +# --POC: iterate through the children and attributes of the memberdef elelement +# and search it in doxygen_sqlite3.db + +g_conn=None +val=[] +def print_unprocessed_attributes(node): + for key in node.attrib: + print "WARNING: '%s' has unprocessed attr '%s'" % (node.tag,key) + +def extract_attribute(node,attribute,pnl): + if not attribute in node.attrib: + return + pnl.append("%s = ?" % attribute) + val.append(node.attrib[attribute]) + node.attrib.pop(attribute) + +def extract_element(node,chld,pnl): + # deal with + if chld.text == None: + if len(chld.attrib)==0: + node.remove(chld) + return + + a=chld.text.strip() + if not a == "": + pnl.append("%s =?" % chld.tag) + val.append(chld.text.strip()) + else: + pnl.append("%s IS NULL OR %s = ''" % (chld.tag,chld.tag)) + node.remove(chld) + +def process_memberdef(node): + q=[] + for chld in node.getchildren(): + if chld.tag == "referencedby": + continue + if chld.tag == "references": + continue + if chld.tag == "param": + continue + if chld.tag == "type": + continue + if chld.tag == "location": + extract_attribute(chld,"line",q) + extract_attribute(chld,"column",q) + extract_attribute(chld,"bodystart",q) + extract_attribute(chld,"bodyend",q) + + q.append("id_bodyfile=(select id from files where name=?)") + val.append(chld.attrib["bodyfile"]) + chld.attrib.pop("bodyfile") + + q.append("id_file=(select id from files where name=?)") + val.append(chld.attrib["file"]) + chld.attrib.pop("file") + + print_unprocessed_attributes(chld) + if len(chld.attrib) == 0: + node.remove(chld) + else: + extract_element(node,chld,q) + + for chld in node.getchildren(): + print "WARNING: '%s' has unprocessed child elem '%s'" % (node.tag,chld.tag) + + extract_attribute(node,"kind",q) + extract_attribute(node,"prot",q) + extract_attribute(node,"static",q) + extract_attribute(node,"mutable",q) + extract_attribute(node,"const",q) + extract_attribute(node,"virt",q) + extract_attribute(node,"explicit",q) + extract_attribute(node,"inline",q) + + q.append("refid=?") + val.append(node.attrib['id']) + node.attrib.pop('id') + + print_unprocessed_attributes(node) + + query="SELECT * FROM memberdef WHERE %s" % " AND ".join(q) + r=[] + try: + r = g_conn.execute(query,val).fetchall() + except sqlite3.OperationalError,e: + print "SQL_ERROR:%s"%e + + del val[:] + if not len(r) > 0: + print "TEST_ERROR: Member not found in SQL DB" + + +def load_xml(name): + context = ET.iterparse(name, events=("start", "end")) + event, root = context.next() + for event, elem in context: + if event == "end" and elem.tag == "memberdef": + process_memberdef(elem) + print "\n== Unprocessed XML ==" +# ET.dump(root) + + +def open_db(dbname): + global g_conn + + if dbname == None: + dbname = "doxygen_sqlite3.db" + + if not os.path.isfile(dbname): + raise BaseException("No such file %s" % dbname ) + + g_conn = sqlite3.connect(dbname) + g_conn.execute('PRAGMA temp_store = MEMORY;') + g_conn.row_factory = sqlite3.Row + +def main(argv): + try: + opts, args = getopt.getopt(argv, "hd:x:",["help"]) + except getopt.GetoptError: + sys.exit(1) + + dbname=None + xmlfile=None + + for a, o in opts: + if a in ('-h', '--help'): + sys.exit(0) + elif a in ('-d'): + dbname=o + continue + elif a in ('-x'): + xmlfile=o + continue + open_db(dbname) + load_xml(xmlfile) + +if __name__ == '__main__': + main(sys.argv[1:]) -- cgit v0.12