- From: Olivier Thereaux via cvs-syncmail <cvsmail@w3.org>
- Date: Mon, 28 Jan 2008 02:09:42 +0000
- To: www-validator-cvs@w3.org
Update of /sources/public/2008/link-testsuite/harness/lib
In directory hutz:/tmp/cvs-serv25508
Added Files:
LinkTestCase.py W3CLinkCheckerClient.py
Log Message:
python class to manage the link testsuite harness
--- NEW FILE: LinkTestCase.py ---
#!/usr/bin/env python
# encoding: utf-8
"""
W3CLikCheckerClient.py
Simple client lib to interact with the W3C Link Checker
Created by olivier Thereaux on 2008-01-22.
Copyright (c) 2008 W3C. Licensed under the W3C Software License
http://www.w3.org/Consortium/Legal/copyright-software
"""
import sys
import os
import re
import unittest
from W3CLinkCheckerClient import W3CLinkCheckerClient
class LinkTestCase(unittest.TestCase):
"""Atomic Test Case for the link checker suite"""
def __init__(self, title=None, description=None, docURI=None, runOptions=None, expectResults=None, checker=None):
if title:
self.title = title
else:
self.title = u''
if docURI:
self.docURI = docURI
else:
self.docURI = ""
if description:
self.description = description
else:
self.description = u""
if isinstance(runOptions, dict):
self.runOptions = runOptions
else:
self.runOptions = dict()
if isinstance(expectResults, dict):
self.expectResults = expectResults
else:
self.expectResults = dict()
if checker != None:
self.checker = checker
else:
self.checker = W3CLinkCheckerClient()
self._testMethodName= "run_testcase"
def shortDescription(self):
return self.title
def run_testcase(self):
"""run a link checker test case"""
self.assertEqual(self.checker.parse_checklink(self.checker.call_checklink(self.docURI)), self.expectResults)
class LinkTestCollection():
"""Collection of Link Checker Test Cases"""
def __init__(self, title=None, description=None, cases=None):
if title != None:
self.title = title
else:
self.title = u""
if description != None:
self.description = description
else:
self.description = u""
if (isinstance(cases, list)):
self.cases = cases
else:
self.cases = list()
class LinkTestCase_UT(unittest.TestCase):
"""Sanity Check for TestCase and TestCollection classes"""
def test_1_init_default(self):
"""Test initialization of a default LinkTestCase Object"""
default_tc = LinkTestCase()
self.assertEqual(
[default_tc.title, default_tc.description, default_tc.docURI, default_tc.runOptions, default_tc.expectResults],
[u'', u'', '', dict(), dict()]
)
if __name__ == '__main__':
unittest.main()
--- NEW FILE: W3CLinkCheckerClient.py ---
#!/usr/bin/env python
# encoding: utf-8
"""
W3CLikCheckerClient.py
Simple client lib to interact with the W3C Link Checker
Created by olivier Thereaux on 2008-01-22.
Copyright (c) 2008 W3C. Licensed under the W3C Software License
http://www.w3.org/Consortium/Legal/copyright-software
"""
import sys
import os
import re
import unittest
import urllib, urllib2
import xml.etree.cElementTree as ET
class W3CLinkCheckerClient():
"""Fetch and parse results from W3C Link Checker"""
def __init__(self, checklink_cgi=None):
if checklink_cgi != None:
self.checklink_cgi= checklink_cgi
else:
self.checklink_cgi= 'http://qa-dev.w3.org/wlc/checklink'
def call_checklink(self, TC_uri, TC_options=None):
"""Make a request to the link checker and store its response"""
data = urllib.quote(TC_uri, "")
try:
response = urllib2.urlopen(self.checklink_cgi+"?uri="+data)
return response
except (urllib2.HTTPError, urllib2.URLError):
return None
def parse_checklink(self, response):
"""Parse a W3C Link Checker response (HTML-scraping. baååååd.)"""
try:
tree = ET.parse(response)
except SyntaxError, v:
raise v
#reports = tree.find(".//dl[@class=’report’]")
# won't be available before ET v1.3
reports = dict()
for dl_elt in tree.findall(".//{http://www.w3.org/1999/xhtml}dl"):
# don't forget to look for elements in the xhtml namespace
if dl_elt.attrib.has_key("class"):
if dl_elt.attrib["class"] == 'report':
for dt_elt in dl_elt.findall("./{http://www.w3.org/1999/xhtml}dt"):
message_class = None
if dt_elt.attrib.has_key("id"):
message_class = re.sub(r'.*\_', '', dt_elt.attrib["id"])
message_uri = dt_elt.find("./{http://www.w3.org/1999/xhtml}a").attrib["href"]
if reports.has_key(message_class):
reports[message_class].append(message_uri)
else:
reports[message_class] = (message_uri)
return reports
class W3CLinkCheckerClient_UT(unittest.TestCase):
"""Unit testing for sanity of W3CLinkCheckerClient code"""
def setUp(self):
pass
def test_1_init_default(self):
"""Test initialization of a default W3CLinkCheckerClient Object"""
default_wlc = W3CLinkCheckerClient()
self.assertEqual(default_wlc.checklink_cgi, 'http://qa-dev.w3.org/wlc/checklink')
def test_2_contact_checklink(self):
"""Check whether our link checker can be contacted"""
default_wlc = W3CLinkCheckerClient()
try:
hello_checker = urllib2.urlopen(default_wlc.checklink_cgi)
hello_checker_info = hello_checker.info()
assert 1
except (urllib2.HTTPError, urllib2.URLError):
assert 0, "could not contact link checker"
def test_3_contact_checklink(self):
"""Check whether our link checker can be asked to check a simple page"""
default_wlc = W3CLinkCheckerClient()
wlc_response = default_wlc.call_checklink("http://validator.w3.org/dev/tests/html20.html")
assert wlc_response != None, "got no response from a test run of WLC"
self.assertEqual(wlc_response.geturl(), "http://qa-dev.w3.org/wlc/checklink?uri=http%3A%2F%2Fvalidator.w3.org%2Fdev%2Ftests%2Fhtml20.html" )
def test_4_elementtree(self):
"""Check whether ElementTree parses basic XML and XPath support is high enough"""
tree = ET.fromstring('<foo />')
try:
tree.find(".//dl")
except SyntaxError:
assert 0, "could not compile xpath for all dl"
def test_5_parse_checklink(self):
"""Parse a Controlled link checker response"""
default_wlc = W3CLinkCheckerClient()
wlc_response = default_wlc.call_checklink("http://qa-dev.w3.org/link-testsuite/base-2.php")
wlc_reports = default_wlc.parse_checklink(wlc_response)
self.assert_(isinstance(wlc_reports, dict), "parsing result should be a dict")
self.assertEqual( len(wlc_reports.keys()), 1, "for this case, there should be one key-value pair in the parse dict")
self.assertEqual( wlc_reports.keys()[0], '404', "for this case, there should be one 404 in the parse dict")
if __name__ == '__main__':
unittest.main()
Received on Monday, 28 January 2008 02:09:52 UTC