diff -Nru qatora-2011-07/AUTHORS qatora-2011-07/AUTHORS --- qatora-2011-07/AUTHORS 2011-07-07 12:48:56.000000000 +0000 +++ qatora-2011-07/AUTHORS 2011-07-12 13:33:13.000000000 +0000 @@ -1,2 +1,3 @@ -Copyright (C) Guillem Hernandez Sola guillemhs@gmail.com -Copyright (C) Xavier Francisco xavi.francisco@gmail.com +Copyright (C) Guillem Hernandez Sola +Copyright (C) Xavier Francisco +Copyright (C) Qatora-dev team Binary files /tmp/cFjkONjEmM/qatora-2011-07/data/media/background.png and /tmp/D4HGyIf3Td/qatora-2011-07/data/media/background.png differ Binary files /tmp/cFjkONjEmM/qatora-2011-07/data/media/icon_128x128.png and /tmp/D4HGyIf3Td/qatora-2011-07/data/media/icon_128x128.png differ Binary files /tmp/cFjkONjEmM/qatora-2011-07/data/media/icon.png and /tmp/D4HGyIf3Td/qatora-2011-07/data/media/icon.png differ Binary files /tmp/cFjkONjEmM/qatora-2011-07/data/media/logo.png and /tmp/D4HGyIf3Td/qatora-2011-07/data/media/logo.png differ diff -Nru qatora-2011-07/data/media/logo.svg qatora-2011-07/data/media/logo.svg --- qatora-2011-07/data/media/logo.svg 2011-07-07 12:48:56.000000000 +0000 +++ qatora-2011-07/data/media/logo.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,150 +0,0 @@ - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - diff -Nru qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/README qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/README --- qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/README 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/README 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,10 @@ +This is Checkbox which provides an extensible interface for system testing. + +See the following page for documentation: + +https://wiki.ubuntu.com/Testing/Automation/Checkbox + +# This script is from the Checkbox Interface +# This is Checkbox which provides an extensible interface for system testing. +# See the following page for documentation: +# https://wiki.ubuntu.com/Testing/Automation/Checkbox diff -Nru qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/alsa_record_playback qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/alsa_record_playback --- qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/alsa_record_playback 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/alsa_record_playback 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,12 @@ +#!/bin/sh +# This script is from the Checkbox Interface +# This is Checkbox which provides an extensible interface for system testing. +# See the following page for documentation: +# https://wiki.ubuntu.com/Testing/Automation/Checkbox + + +OUTPUT=`mktemp -d` +gst_pipeline_test -t 5 "alsasrc ! audioconvert ! level name=recordlevel interval=10000000 ! audioconvert ! wavenc ! filesink location=$OUTPUT/test.wav" +aplay $OUTPUT/test.wav +rm $OUTPUT/test.wav +rmdir $OUTPUT diff -Nru qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/ansi_parser qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/ansi_parser --- qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/ansi_parser 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/ansi_parser 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,164 @@ +#!/usr/bin/python +# This script is from the Checkbox Interface +# This is Checkbox which provides an extensible interface for system testing. +# See the following page for documentation: +# https://wiki.ubuntu.com/Testing/Automation/Checkbox + +import re +import sys + +from optparse import OptionParser + + +def parse_buffer(input): + output = [""] + row = -1 + col = 0 + escape = "" + saved = [0, 0] + + for ch in input: + if ord(ch) == 27 or len(escape) > 0: + # On ESC + if chr(27) in [escape, ch]: + escape = "" + if ch == "c": + output = [""] + row = -1 + col = 0 + saved = [0, 0] + elif ch == "D": + row += 1 + if row == 0: + row = -1 + output.append("") + elif ch == "M": + row -= 1 + if row < -len(output): + output = [""] + output + elif ch == "7": + saved = [row + len(output), col] + elif ch == "8": + [row, col] = saved + row -= len(output) + elif ord(ch) in [27, 91]: + escape = ch + continue + # Just after hitting the extended ESC marker + elif escape == "[": + escape = "" + + if ch in "0123456789;": + escape += ch + continue + elif ch in "Hf": + opts = escape.split(";")+["",""] + row = -len(output) + max(0,int("0"+opts[0])-1) + col = max(0,int("0"+opts[1])-1) + elif ch in "s": + saved = [row + len(output), col] + elif ch in "u": + [row, col] = saved + row -= len(output) + elif ch in "K": + if escape == "1": + output[row] = " " * (col+1) + output[row][col+1:] + elif escape == "2": + output[row] = "" + else: + output[row] = output[row][:col] + elif ch in "J": + if len(escape) == 0: + output = output[:row] + [""] + else: + for i in range(row+len(output)+1): + output[i] = "" + elif ch in "A": + row -= max(1,int("0"+escape.split(";")[0])) + if row <= len(output): + row = -len(output) + elif ch in "B": + row += max(1,int("0"+escape.split(";")[0])) + while row >= 0: + output.append("") + row -= 1 + elif ch in "C": + col += max(1,int("0"+escape.split(";")[0])) + elif ch in "D": + col = max(0, col - max(1,int("0"+escape.split(";")[0]))) + + escape = "" + continue + + # Control char + if ch in "\r\n\f\t\b": + if ch == "\r": + col = 0 + if ch in "\n\f": + row += 1 + if row == 0: + row = -1 + output.append("") + col = 0 + if ch == "\t": + col = (col + 8) &~ 7 + if ch == "\b": + col = max(0, col-1) + continue + + # Keep to ascii + if ord(ch) not in range(32, 127): + ch = "?" + if len(output[row]) < col: + output[row] += " " * (col-len(output[row])) + output[row] = output[row][:col] + ch + output[row][col+1:] + col += 1 + + return "\n".join(output) + +def parse_file(file): + output = file.read() + return parse_buffer(output) + +def parse_filename(filename): + file = open(filename) + try: + output = parse_file(file) + finally: + file.close() + + return output + +def main(args): + usage = "Usage: %prog [OPTIONS] [FILE...]" + parser = OptionParser(usage=usage) + parser.add_option("-o", "--output", + metavar="FILE", + help="File where to output the result.") + (options, args) = parser.parse_args(args) + + # Write to stdout + if not options.output or options.output == "-": + output = sys.stdout + + # Or from given option + else: + output = open(options.output, "w") + + # Read from sdin + if not args or (len(args) == 1 and args[0] == "-"): + output.write(parse_file(sys.stdin)) + + # Or from filenames given as arguments + else: + for arg in args: + output.write(parse_filename(arg)) + + if options.output and options.output != "-": + output.close() + + return 0 + + +if __name__ == "__main__": + sys.exit(main(sys.argv[1:])) diff -Nru qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/autotest_filter qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/autotest_filter --- qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/autotest_filter 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/autotest_filter 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,132 @@ +#!/usr/bin/python +# This script is from the Checkbox Interface +# This is Checkbox which provides an extensible interface for system testing. +# See the following page for documentation: +# https://wiki.ubuntu.com/Testing/Automation/Checkbox + +import re +import sys +import posixpath + +from optparse import OptionParser + + +autotest_to_checkbox_status = { + "TEST_NA": "unsupported", + "ABORT": "unresolved", + "ERROR": "unresolved", + "FAIL": "fail", + "WARN": "fail", + "GOOD": "pass", + "ALERT": "fail", + "RUNNING": "uninitiated", + "NOSTATUS": "untested"} + + +class FakeJob(): + + def run_test(self, name): + pass + + +def print_line(key, value): + print "%s: %s" % (key, value) + +def print_element(element): + for key, value in element.iteritems(): + print_line(key, value) + + print + +def parse_file(file): + log_pattern = re.compile(r"\d\d:\d\d:\d\d [A-Z ]{5}\| ") + persistent_pattern = re.compile(r"Persistent state file (?P.*) does not exist") + start_pattern = re.compile(r"\tSTART\t" + "(?P[^\t]+)\t" + "(?P[^\t]+)\t" + "timestamp=(?P[^\t]+)\t" + "localtime=(?P.*)") + end_pattern = re.compile(r"\tEND " + "(?P[^\t]+)\t" + "(?P[^\t]+)\t" + "(?P[^\t]+)\t" + "timestamp=(?P[^\t]+)\t" + "localtime=(?P.*)") + data_pattern = re.compile(r"\t") + + element = {} + elements = [] + for line in file.readlines(): + line = log_pattern.sub("", line) + + match = persistent_pattern.match(line) + if match: + persistent_path = match.group("path") + control_path = posixpath.splitext(persistent_path)[0] + globals = {"job": FakeJob()} + exec open(control_path) in globals + + element["description"] = globals["DOC"] + + match = start_pattern.match(line) + if match: + element["plugin"] = "shell" + element["requires"] = "package.alias == 'linux'" + element["data"] = "" + element["name"] = match.group("name1") + continue + + match = end_pattern.match(line) + if match: + element["status"] = autotest_to_checkbox_status[match.group("status")] + elements.append(element) + element = {} + continue + + if data_pattern.match(line): + element["data"] += line + continue + + return elements + +def parse_filename(filename): + if filename == "-": + file = sys.stdin + else: + file = open(filename, "r") + + return parse_file(file) + +def parse_filenames(filenames): + elements = [] + for filename in filenames: + elements.extend(parse_filename(filename)) + + return elements + +def main(args): + usage = "Usage: %prog [FILE...]" + parser = OptionParser(usage=usage) + parser.add_option("-s", "--suite", + help="Suite corresponding to the tests") + (options, args) = parser.parse_args(args) + + if not args: + filenames = ["-"] + else: + filenames = args + + elements = parse_filenames(filenames) + if not elements: + return 1 + + for element in elements: + if options.suite: + element["suite"] = options.suite + print_element(element) + + return 0 + + +if __name__ == "__main__": + sys.exit(main(sys.argv[1:])) diff -Nru qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/autotest_suite qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/autotest_suite --- qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/autotest_suite 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/autotest_suite 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,122 @@ +#!/usr/bin/python +# This script is from the Checkbox Interface +# This is Checkbox which provides an extensible interface for system testing. +# See the following page for documentation: +# https://wiki.ubuntu.com/Testing/Automation/Checkbox + +import os +import sys +import logging +import posixpath + +from optparse import OptionParser +from urlparse import urlparse + + +DEFAULT_DIRECTORY = "/var/cache/checkbox/autotest" +DEFAULT_LOCATION = "http://test.kernel.org/svn/autotest/trunk/client/" +DEFAULT_TIMEOUT = 900 + +COMMAND_TEMPLATE = "%(directory)s/bin/autotest %(directory)s/tests/%(test)s/control 2>/dev/null | autotest_filter --suite=autotest" + + +def print_line(key, value): + if type(value) is list: + print "%s:" % key + for v in value: + print " %s" % v + else: + print "%s: %s" % (key, value) + +def print_element(element): + for key, value in element.iteritems(): + print_line(key, value) + + print + +def fetch_autotest(location, directory): + if posixpath.exists(directory): + return + + dirname = posixpath.dirname(directory) + if not posixpath.exists(dirname): + os.makedirs(dirname) + + autotest_path = urlparse(location)[2] + cut_dirs = len(autotest_path.strip(posixpath.sep).split(posixpath.sep)) + + command = "wget -q -e robots=off -R index.html -np -nH --cut-dirs=%d -P %s -r %s" \ + % (cut_dirs, directory, location) + logging.info("Running command: %s" % command) + if os.system(command) != 0: + raise Exception, "Failed to run command: %s" % command + + # Change mode of binary files + directories = [posixpath.join(directory, d) + for d in "bin", "common_lib", "deps", "profilers", + "samples", "tests", "tools"] + while directories: + directory = directories.pop() + for name in os.listdir(directory): + path = posixpath.join(directory, name) + if posixpath.isfile(path) \ + and name is not "control": + os.chmod(path, 0755) + elif posixpath.isdir(path): + directories.append(path) + +def list_autotest(location, directory): + fetch_autotest(location, directory) + + directory = posixpath.join(directory, "tests") + return os.listdir(directory) + +def run_autotest(names, location, directory, timeout=None): + fetch_autotest(location, directory) + + for name in names: + path = posixpath.join(directory, "tests", name) + + # Initialize test structure + test = {} + test["plugin"] = "remote" + test["depends"] = "autotest" + test["timeout"] = timeout + test["name"] = name + test["user"] = "root" + test["command"] = COMMAND_TEMPLATE % { + "directory": directory, + "test": name} + + yield test + +def main(args): + usage = "Usage: %prog [OPTIONS] [NAMES]" + parser = OptionParser(usage=usage) + parser.add_option("-d", "--directory", + default=DEFAULT_DIRECTORY, + help="Directory where to branch autotest") + parser.add_option("-l", "--location", + default=DEFAULT_LOCATION, + help="Location from where to checkout autotest") + parser.add_option("-t", "--timeout", + default=DEFAULT_TIMEOUT, + type="int", + help="Timeout when running autotest") + (options, names) = parser.parse_args(args) + + if not names: + names = list_autotest(options.location, options.directory) + + suites = run_autotest(names, options.location, options.directory, options.timeout) + if not suites: + return 1 + + for suite in suites: + print_element(suite) + + return 0 + + +if __name__ == "__main__": + sys.exit(main(sys.argv[1:])) diff -Nru qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/cdimage_resource qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/cdimage_resource --- qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/cdimage_resource 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/cdimage_resource 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,100 @@ +#!/usr/bin/python +# +# This file is part of Checkbox. +# +# Copyright 2009 Canonical Ltd. +# +# Checkbox is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Checkbox is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Checkbox. If not, see . +# +# This script is from the Checkbox Interface +# This is Checkbox which provides an extensible interface for system testing. +# See the following page for documentation: +# https://wiki.ubuntu.com/Testing/Automation/Checkbox + +import re +import sys + + +# Filename containing casper logs +CASPER_FILENAME = "/var/log/installer/casper.log" + +# Filename containing media info +MEDIA_FILENAME = "/var/log/installer/media-info" + + +def get_disk_from_string(string): + # Ubuntu 8.04.1 "Hardy Heron" - Release amd64 (20080702.1) + distributor_regex = r"(?P[\w\-]+)" + release_regex = r"(?P[\d\.]+)" + codename_regex = r"(?P[^_\"]+)" + official_regex = r"(?P[\w ]+)" + architecture_regex = r"(?P[\w\+]+)" + type_regex = r"(?PBinary-\d+)" + date_regex = r"(?P[^\)]+)" + + string_regex = r"%s %s [_\"]%s[_\"] - %s %s (%s )?\(%s\)" % (distributor_regex, + release_regex, codename_regex, official_regex, architecture_regex, + type_regex, date_regex) + + disk = {} + match = re.match(string_regex, string) + if match: + disk = match.groupdict() + del disk["type"] + + return disk + +def get_disk_from_casper(filename): + disk = {} + + # Try to open the disk info file logged by the installer + try: + file = open(filename) + except IOError: + return disk + + line_regex = r"Found label '(?P[^']+)'" + line_pattern = re.compile(line_regex) + + for line in file.readlines(): + match = line_pattern.match(line) + if match: + string = match.group("string") + disk = get_disk_from_string(string) + break + + return disk + +def get_disk_from_media(filename): + try: + file = open(filename) + except IOError: + return {} + + string = file.readline() + return get_disk_from_string(string) + +def main(): + disk = get_disk_from_media(MEDIA_FILENAME) + if not disk: + disk = get_disk_from_casper(CASPER_FILENAME) + + for key, value in disk.iteritems(): + print "%s: %s" % (key, value) + + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff -Nru qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/compiz-check qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/compiz-check --- qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/compiz-check 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/compiz-check 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,973 @@ +#!/bin/bash +# Compiz-Check -- script to test if your system is able to run Compiz +# +# Copyright (c) 2008 Nick Bauermeister +# +# This program is free software. Feel free to redistribute and/or +# modify it under the terms of the GNU General Public License v3 +# as published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful +# but comes WITHOUT ANY WARRANTY; without even the implied warranty +# of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU General Public License for more details. + +# This script is from the Checkbox Interface +# This is Checkbox which provides an extensible interface for system testing. +# See the following page for documentation: +# https://wiki.ubuntu.com/Testing/Automation/Checkbox + +VERSION="0.4.5-4" + +usage() +{ + printf "\nAbout:\n" + printf "%6s Compiz-Check will check if your system satisfies all requirements to\n" + printf "%6s run Compiz properly.\n" + printf "%6s It will also help you trace back the problem(s) you may be facing.\n\n" + printf "%6s Visit\033[1m http://forlong.blogage.de/article/pages/Compiz-Check \033[0m\n" + printf "%6s for further information.\n\n" + printf "Usage:\n" + printf "%6s Run this script without any arguments.\n\n" + printf "Available arguments:\n" + printf " -h or --help %8s List available arguments and usage (this message).\n" + printf " -v or --version %5s Print version of Compiz-Check in use.\n\n" +} + +banana() +{ + printf "//\\ \nV%2s\\ \n \\%2s\\ \n%2s\\ \033[1;33m.\`-.\n%3s|\\ \`. \`.\n%3s( \\%2s\`. \`-.%24s_,.-:\\ \n%4s\\ \\%3s\`.%2s\`-._%13s__..--' ,-';/\n%5s\\ \`.%3s\`-.%3s\`-..___..---'%3s_.--' ,'/\n%6s\`. \`.%4s\`-._%8s__..--'%4s,' /\n%8s\`. \`-_%4s \`\`--..''%6s _.-' ,'\n%10s\`-_ \`-.___%8s__,--'%3s,'\n%13s\`-.__%2s\`----'''%4s__.-'\n%18s\`--..____..--'\033[0m\n\n" +} + +if [ $# != 0 ]; then + case $1 in + -h | --help) + usage + exit 0 + ;; + -v | --version) + echo $VERSION + exit 0 + ;; + --banana) + banana + exit 0 + ;; + *) + printf "Error, unknown option: \"$1\"\nRun \033[1m$0 --help\033[0m for details.\n" + exit 1 + ;; + esac +fi + +# Exit when running as root +if [ "$(whoami)" = root ]; then + printf "\n Do not run this script as root, because it might distort its outcome.\n Aborting.\n\n" + exit 1 +fi + +# Needed for lspci, because it's not in the $PATH of every distro +export PATH=$PATH:/sbin:/usr/sbin + +# Can't handle more than one graphics card or X server at a time +if [ $(lspci | grep VGA -c) -gt 1 ]; then + ERROR_DEVICE="graphics chip" +elif [ $(xdpyinfo | grep -i dimensions: -c) -gt 1 ]; then + ERROR_DEVICE="running X server" +fi + +if [ ! -z "$ERROR_DEVICE" ]; then + printf "\n More than one $ERROR_DEVICE detected -- sorry, the script can not handle that.\n Aborting.\n\n" + exit 1 +fi + +# Skip system checks if they are harmful or useless +SKIP=yes + +# Coloured output (there are other emphases hardcoded in the script, so +# it would be pretty useless changing those here) +UNKNOWN="\033[1;31mUnknown\033[0m" +OK=" \033[1;32mOK\033[0m " +FAIL="\033[1;31mFAIL\033[0m" +SKIPPING="\033[33mSKIP\033[0m" +WARN="\033[33mWARN\033[0m" + +# General distribution info file +DIST_INFO="/etc/lsb-release" + +# Detect distribution +# If your distro is not on this list, contact me. +detect_distro() +{ + if [ -d /etc/linuxmint ]; then + DISTRIB_ID="Linux Mint" + return 0 + elif [ -r $DIST_INFO ]; then + . $DIST_INFO + fi + + if [ -z $DISTRIB_ID ]; then + unset DISTRIB_RELEASE + if [ -f /etc/arch-release ]; then + DISTRIB_ID="Arch Linux" + elif [ -r /etc/knoppix-version ]; then + DISTRIB_ID="Knoppix" + DISTRIB_RELEASE="($(cat /etc/knoppix_version))" + elif [ -r /etc/sidux-version ]; then + DISTRIB_ID="Sidux" + DISTRIB_RELEASE="($(cat /etc/sidux-version | awk '{print $4}'))" + elif [ -r /etc/debian_version ]; then + DISTRIB_ID="Debian GNU/Linux" + DISTRIB_RELEASE="($(cat /etc/debian_version))" + elif [ -r /etc/fedora-release ]; then + DISTRIB_ID="$(cat /etc/redhat-release)" + elif [ -r /etc/gentoo-release ]; then + DISTRIB_ID="Gentoo" + DISTRIB_RELEASE="($(cat /etc/gentoo-release | awk '{print $5}'))" + elif [ -f /etc/lfs-version ]; then + DISTRIB_ID="Linux from scratch" + elif [ -r /etc/pclinuxos-release ]; then + DISTRIB_ID="PCLinuxOS" + elif [ -f /etc/mandriva-release ] || [ -f /etc/mandrake-release ]; then + DISTRIB_ID="Mandriva" + elif [ -f /etc/redhat-release ]; then + DISTRIB_ID="RedHat" + elif [ -r /etc/vector-version ]; then + DISTRIB_ID="VectorLinux" + DISTRIB_RELEASE="($(cat /etc/vector-version))" + elif [ -r /etc/slackware-version ]; then + DISTRIB_ID="$(cat /etc/slackware-version)" + elif [ -f /etc/release ]; then + DISTRIB_ID="Solaris" + elif [ -r /etc/SuSE-release ]; then + DISTRIB_ID="$(grep -i suse /etc/SuSE-release)" + elif [ -f /etc/yellowdog-release ]; then + DISTRIB_ID="YellowDog Linux" + elif [ -f /etc/zenwalk-version ]; then + DISTRIB_ID="Zenwalk" + else + DISTRIB_ID="Unknown" + fi + fi +} + +# Detect desktop environment in use +detect_de() +{ + if [ ! -z $GNOME_DESKTOP_SESSION_ID ]; then + DE=GNOME + elif [ "$KDE_SESSION_VERSION" = 4 ]; then + DE=KDE4 + elif [ "$KDE_FULL_SESSION" = true ]; then + DE=KDE + elif xprop -root _DT_SAVE_MODE | grep ' = \"xfce4\"$' >/dev/null 2>&1 ; then + DE=Xfce + else + DE=Unknown + fi +} + +# Detect graphics card +detect_video() +{ + if lspci | grep -q VGA ; then + VIDEO=$(lspci | grep VGA | sed 's/.*: //') + else + VIDEO=$UNKNOWN # TODO abort? + fi +} + +XSET=$(command -v xset) + +# Detect location of the Xorg log file +if [ ! -z $XSET ]; then + XORG_LOG=$($XSET q | grep "Log file" | awk '{print $3}') +fi + +# Fallback Xorg log +if [ -z $XORG_LOG ]; then + if [ -f /var/log/Xorg.0.log ]; then + XORG_LOG=/var/log/Xorg.0.log + fi +fi + +# advise to look for proprietary drivers in Ubuntu +detect_driver_manager() +{ + if [ $(echo "$DISTRIB_RELEASE" | sed 's/\.//g') -gt 710 ] && [ $DE = GNOME ] || [ $DE = Xfce ]; then + DRVS_MNGR=hardy-gtk + elif [ $(echo "$DISTRIB_RELEASE" | sed 's/\.//g') -gt 710 ] && [ $DE = KDE ]; then + DRVS_MNGR=hardy-kde + elif [ "$DISTRIB_RELEASE" = "7.10" ] && [ $DE = GNOME ] || [ $DE = Xfce ]; then + DRVS_MNGR=gutsy-gtk + elif [ "$DISTRIB_RELEASE" = "7.10" ] && [ $DE = KDE ]; then + DRVS_MNGR=gutsy-kde + elif [ "$DISTRIB_RELEASE" = "7.04" ] && [ $DE = GNOME ] || [ $DE = Xfce ]; then + DRVS_MNGR=feisty-gtk + fi +} + +# Drivers known to work with Compiz +WHITELIST="nvidia intel i810 ati radeon fglrx" + +# Drivers taken from Hardy's /usr/lib/xorg/modules/drivers/ directory +# plus radeonhd, vboxvideo, nouveau and the proprietary one's. +# Contact me, if your driver is not on this list. +KNOWN_DRIVERS="$WHITELIST apm ark chips cirrus cyrix fbdev glint i128 + i740 imstt mga mtx neomagic newport nsc nv openchrome + rendition s3virge savage siliconmotion sis sisusb tdfx + tga trident tseng vesa vga via vmware vboxvideo voodoo + radeonhd s3 nouveau" + +# Detect driver in use. +# TODO not really satisfied with this. Just because the module is +# loaded doesn't necessarily mean the driver is properly working. +detect_driver() +{ + if [ -z $XORG_LOG ]; then + DRV=$SKIPPING + CHECKS=$SKIP + SKIP_MESSAGE="Unable to locate your Xorg log" + return 1 + elif [ ! -r $XORG_LOG ]; then + DRV=$SKIPPING + CHECKS=$SKIP + SKIP_MESSAGE="No permission to read $XORG_LOG" + return 1 + fi + + for i in $KNOWN_DRIVERS ; do + if grep Loading $XORG_LOG | grep -q "${i}_drv\.so" && + ! grep Unloading $XORG_LOG | grep -q "${i}_drv\.so" ; then + DRV=$i + fi + done + + if [ -z $DRV ]; then + DRV=$UNKNOWN + return 0 + fi + +# glxinfo might kill X if vesa or vga are in use (LP#119341) +# 'LIBGL_ALWAYS_INDIRECT=1 glxinfo' kills X on openchrome driver +# according to user feedback (same for unichrome) +# nv driver blocks AIGLX + case $DRV in + vesa | vga | nv) + CHECKS=$SKIP + SKIP_MESSAGE="$DRV driver in use" + ERROR_MESSAGE="The $DRV driver is not capable of running Compiz, you need to install\n the proper driver for your graphics card." + if [ "$DISTRIB_ID" = Ubuntu ]; then + detect_driver_manager + fi + ;; + unichrome | openchrome) + CHECKS=$SKIP + SKIP_MESSAGE="$DRV driver in use" #TODO ERROR_MESSAGE + ;; + esac +} + +# Detect rendering method +detect_rendering() +{ + XVINFO=$(command -v xvinfo) + + if [ ! -z $XVINFO ]; then + if $XVINFO | grep -q Xgl ; then + RENDER=Xgl + return 0 + fi + fi + + if xdpyinfo | grep -q NV-GLX ; then + RENDER=Nvidia + return 0 + fi + + AIGLX_STAT="AIGLX enabled\|AIGLX disabled" + + if [ -z $XORG_LOG ] || [ ! -r $XORG_LOG ]; then + RENDER=$SKIPPING + return 1 + elif grep "$AIGLX_STAT" $XORG_LOG | tail -1 | grep -q "AIGLX enabled" ; then + RENDER=AIGLX + return 0 + fi + + if [ -z $XVINFO ]; then + RENDER=$SKIPPING + CHECKS=$SKIP + SKIP_MESSAGE="Unable to check for Xgl, could not run xvinfo" + else + RENDER="\033[31mNone\033[0m" + CHECKS=$SKIP # Checks can be OK nonetheless + SKIP_MESSAGE="No rendering method in use (AIGLX, Xgl or Nvidia)" + fi +} + +GLXINFO=$(command -v glxinfo) + +# Check for texture_from_pixmap +check_tfp() +{ + if [ "$RENDER" = Xgl ]; then + TFP=$SKIPPING + return 0 + elif [ -z $GLXINFO ]; then + TFP=$SKIPPING + SKIP_MESSAGE="glxinfo not installed" + ERROR_MESSAGE="The program glxinfo is needed to perform a number of crucial tests." + if [ -e /etc/debian_version ]; then + DIST_HELP="You need to install the package \033[1mmesa-utils\033[0m\n Type e.g. \033[1msudo apt-get install mesa-utils\033[0m to install it." + elif [ -e /etc/mandriva-release ]; then + DIST_HELP="You need to install \033[1mmesa-demos\033[0m\n" + fi + return 0 + fi + + if [ $(glxinfo 2>/dev/null | grep GLX_EXT_texture_from_pixmap -c) -gt 2 ]; then + TFP=$OK + elif [ $(LIBGL_ALWAYS_INDIRECT=1 glxinfo 2>/dev/null | grep GLX_EXT_texture_from_pixmap -c) -gt 2 ]; then + TFP=$OK + else + TFP=$FAIL + fi +} + +# Check for non power of two texture support +check_npo2() +{ + if [ "$RENDER" = Xgl ] || [ -z $GLXINFO ]; then + NPO2=$SKIPPING + elif glxinfo 2>/dev/null | egrep -q '(GL_ARB_texture_non_power_of_two|GL_NV_texture_rectangle|GL_EXT_texture_rectangle|GL_ARB_texture_rectangle)' ; then + NPO2=$OK + else + NPO2=$FAIL + fi +} + +# Check for composite extension +check_composite() +{ + if xdpyinfo -queryExtensions | grep -q Composite ; then + COMP=$OK + else + COMP=$FAIL + fi +} + +# Check for FBConfig +check_fbconfig() +{ + if [ -z $GLXINFO ]; then + FBC=$SKIPPING + elif glxinfo 2>/dev/null | grep -q GLX.*fbconfig ; then + FBC=$OK + elif [ "$DRV" = via ]; then + FBC=$SKIPPING # 'glxinfo -i' kills X on some setups using the via driver + elif glxinfo -i 2>/dev/null | grep -q GLX.*fbconfig ; then + FBC=$OK + else + FBC=$FAIL + fi +} + +# Check if fglrx driver supports composite +check_fglrx() +{ + if [ "$DRV" = fglrx ]; then + FGLRXINFO=$(command -v fglrxinfo) + if [ ! -z "$FGLRXINFO" ]; then + if $FGLRXINFO | grep -q mesa ; then + STATUS=$FAIL + ERROR="Fglrx driver not properly installed, you are using the Mesa driver." + return 0 + else + DIGITS=$($FGLRXINFO | grep version | sed 's/[a-Z:(.)]//g') + for i in $DIGITS ; do + if [ $i -gt 100000 ]; then + FGLRX_VERSION=$i + fi + done + FGLRX_COMPOSITE=206958 # 2.0.6958 first release to support AIGLX + if [ ! -z $FGLRX_VERSION ]; then + if [ $FGLRX_VERSION -lt $FGLRX_COMPOSITE ] && [ "$RENDER" != Xgl ]; then + STATUS=$FAIL + ERROR="The version of fglrx in use needs Xgl to work with Compiz." + ERROR_MESSAGE="Older versions of fglrx do not support AIGLX, so you have to use Xgl in order\n to make Compiz run with this driver.\n You can either install Xgl or a newer version of the fglrx driver." + if [ "$DISTRIB_ID" = Ubuntu ]; then + if [ $(echo "$DISTRIB_RELEASE" | sed 's/\.//g') -gt 704 ]; then + DIST_HELP="Type \033[1msudo apt-get install xserver-xgl\033[0m to install Xgl." + fi + fi + return 0 + fi + return 1 + fi + STATUS=$SKIPPING + SKIP_MESSAGE="Unable to detect fglrx driver version in use." + return 0 + fi + fi + STATUS=$FAIL + ERROR="Fglrx driver not properly installed. Could not run fglrxinfo." + return 0 + fi + + return 1 +} + +if [ -z $XDG_CONFIG_DIRS ]; then + XDG_CONFIG_DIRS=/etc/xdg +fi + +if [ -z $XDG_CONFIG_HOME ]; then + XDG_CONFIG_HOME=$HOME/.config +fi + +COMPIZ_MNGR_HOME=$XDG_CONFIG_HOME/compiz/compiz-manager + +# Check if checks are skipped (by compiz-manager, not here!) +check_skip() +{ + OLD_IFS=$IFS + IFS=: + for m in $XDG_CONFIG_DIRS + do + test -r $m/compiz/compiz-manager && . $m/compiz/compiz-manager + done + IFS=$OLD_IFS + unset OLD_IFS + + if [ -r $COMPIZ_MNGR_HOME ]; then + . $COMPIZ_MNGR_HOME + fi + + if [ "$SKIP_CHECKS" = yes ]; then + return 1 + fi + + return 0 +} + +# Check max texture size compared to resolution in use +check_resolution() +{ + if [ -z $GLXINFO ]; then + STATUS=$SKIPPING + return 0 + fi + + TEXTURE_LIMIT=$(glxinfo -l 2>/dev/null | grep GL_MAX_TEXTURE_SIZE | sed 's/.*=[^0-9]//g') + RESOLUTION=$(xdpyinfo | grep -i dimensions: | sed 's/[^0-9]*pixels.*(.*).*//' | sed 's/[^0-9x]*//') + VRES=$(echo $RESOLUTION | sed 's/.*x//') + HRES=$(echo $RESOLUTION | sed 's/x.*//') + + if [ -z $TEXTURE_LIMIT ]; then + STATUS=$SKIPPING + SKIP_MESSAGE="Unable to detect maximum 3D texture size" + return 0 + elif [ $VRES -gt $TEXTURE_LIMIT ] || [ $HRES -gt $TEXTURE_LIMIT ]; then + STATUS=$FAIL + ERROR="Your current resolution is too high to run Compiz." + ERROR_MESSAGE="Your resolution is \033[1m${RESOLUTION}\033[0m but the maximum 3D texture size that your\n graphics card is capable of is \033[1m${TEXTURE_LIMIT}x${TEXTURE_LIMIT}\033[0m. Thus Compiz will not be able to run\n on this setup. You have to decrease the resolution first (in case you are\n using a dual-head setup, try disabling one monitor and run the script again)." + return 0 + fi + + return 1 +} + + +# Check if there is already another compositing manager running +check_compositor() +{ + XCOMPMGR_PID=$(ps -o pid= -C xcompmgr) + METACITY_PID=$(ps -o pid= -C metacity) + XFWM_PID=$(ps -o pid= -C xfwm4) + + if [ ! -z $XCOMPMGR_PID ]; then + OTHER_COMP=true + COMP_MSG="It has been detected, that you are currently running \033[1mxcompmgr\033[0m, which is a\n standalone compositing manager." + QUERY_XCOMPMGR=yes + elif [ ! -z $METACITY_PID ]; then + METACITY=$(command -v metacity) + if [ ! -z $METACITY ]; then + if [ $($METACITY --version | grep metacity | awk '{print $2}' | sed 's/\.//g') -gt 2200 ]; then + GCONFTOOL=$(command -v gconftool-2) + if [ ! -z $GCONFTOOL ]; then + if $GCONFTOOL -a /apps/metacity/general | grep -q compositing_manager && + [ "$($GCONFTOOL -g /apps/metacity/general/compositing_manager)" = true ]; then + OTHER_COMP=true + WM_COMP=GNOME + QUERY_METACITY=yes + fi + fi + fi + fi + elif [ ! -z $XFWM_PID ]; then + if [ -r $XDG_CONFIG_HOME/xfce4/mcs_settings/wmtweaks.xml ]; then + if grep UseCompositing $XDG_CONFIG_HOME/xfce4/mcs_settings/wmtweaks.xml | grep -q 'value="1"' && + ! ps -ef | grep xfwm4 | grep -q compositor=off ; then + OTHER_COMP=true + WM_COMP=Xfce + QUERY_XFWM=yes + fi + fi + fi + + if [ ! -z $OTHER_COMP ]; then + ERROR="Another compositing manager in use." + if [ ! -z $WM_COMP ]; then + COMP_MSG="The default window manager of $WM_COMP has its own compositing manager to\n provide basic desktop effects." + fi + ERROR_MESSAGE="${COMP_MSG}\n If this one is in use, Compiz will not be able to run." + return 0 + fi + + return 1 +} + +# Hardy blacklists laptops using ati/radeon driver (LP#201330) +check_laptop_ati() +{ + if [ "$DISTRIB_ID $DISTRIB_RELEASE" = "Ubuntu 8.04" ]; then + if [ "$DRV" = ati ] || [ "$DRV" = radeon ] ; then + if laptop-detect && check_skip ; then + ERROR="Laptop using $DRV driver." + ERROR_MESSAGE="It has been detected, that you are running a laptop with an ATI chip.\n The $DRV driver supports Compiz out-of-the-box but because of a nasty bug\n in the driver that causes X to freeze on some cards, this particular\n combination had to be blacklisted in Ubuntu \"Hardy Heron\".\n\n In case you already used Compiz successfully on Ubuntu 7.10 (Gutsy), it is\n safe to skip the blacklist." + QUERY_SKIP=yes + return 0 + fi + fi + fi + + return 1 +} + +# Check if "Composite" has been disabled in the xorg.conf +check_cmpst_xorg() +{ + if [ "$COMP" = "$OK" ]; then + return 1 + fi + + # Detect location of the Xorg log file + if [ ! -z $XSET ]; then + XORG_CONF=$($XSET q | grep "Config file" | awk '{print $3}') + fi + + # Fallback xorg.conf + if [ -z $XORG_CONF ]; then + if [ -f /etc/X11/xorg.conf ]; then + XORG_CONF=/etc/X11/xorg.conf + else + return 1 + fi + fi + + if [ ! -r $XORG_CONF ]; then + SKIP_MESSAGE="No permission to read $XORG_CONF" + return 1 + else + CMPST=$(grep -i "Composite" $XORG_CONF) + if echo $CMPST | grep -qi "0" ; then + COMPST_STAT='"0"' + COMPST_FIX='"1"' + elif echo $CMPST | grep -qi "Disable" ; then + COMPST_STAT='"Disable"' + COMPST_FIX='"Enable"' + elif echo $CMPST | grep -qi "false" ; then + COMPST_STAT='"false"' + COMPST_FIX='"true"' + fi + fi + + case $DE in + GNOME) + EDITOR=gedit + ;; + KDE4 | KDE) + EDITOR=kate + ;; + Xfce) + EDITOR=mousepad + ;; + esac + + if [ ! -z $COMPST_STAT ]; then + ERROR="Composite manually disabled" + ERROR_MESSAGE="It has been detected that the \"Composite\" option of your ${XORG_CONF}\n has been set to $COMPST_STAT" + if [ "$DRV" = fglrx ] && [ $FGLRX_VERSION -lt $FGLRX_COMPOSITE ]; then + return 0 + fi + if [ ! -z $EDITOR ] && [ -x $EDITOR ]; then + DIST_HELP="Open the file being root, e.g. \033[1msudo $EDITOR $XORG_CONF\033[0m\n Then change $COMPST_STAT to $COMPST_FIX and save. Finally restart X and try again." + else + DIST_HELP="Open the file being root and change $COMPST_STAT to $COMPST_FIX\n Then restart X and try again." + fi + return 0 + fi + + return 1 +} + +# Check for Software Rasterizer +check_rasterizer() +{ + if glxinfo 2>/dev/null | grep -q 'OpenGL renderer string: Software Rasterizer' ; then + ERROR="Software Rasterizer in use" #TODO add $ERROR_MESSAGE + return 0 + else + return 1 + fi +} + +DISCLAIMER="You can skip this blacklist -- but keep in mind that you did so.\n Do not complain if you encounter any problems with Compiz afterwards." + +# Check if driver in use is on the whitelist +check_whitelist() +{ + for i in $WHITELIST ; do + if [ "$DRV" = "$i" ]; then + return 1 + fi + done + + if [ "$DRV" = "$UNKNOWN" ]; then + DRV_MSG="Unknown driver in use." + else + DRV_MSG="Detected driver is not on the whitelist." + fi + + if [ "$TFP" = "$OK" -o "$SKIPPING" ] && [ "$NPO2" = "$OK" -o "$SKIPPING" ] && + [ "$COMP" = "$OK" ] && [ "$FBC" = "$OK" -o "$SKIPPING" ]; then + if ! check_skip ; then + return 1 + fi + STATUS=$WARN + WARNING=$DRV_MSG + ERROR_MESSAGE="Your driver is not widely known to work with Compiz and thus may be\n blacklisted on certain distributions.\n\n $DISCLAIMER" + QUERY_SKIP=yes + return 0 + elif [ "$DRV" = vmware ] || [ "$DRV" = vboxvideo ]; then + STATUS=$FAIL + ERROR="$DRV driver in use" + ERROR_MESSAGE="Compiz can not be run in a virtual environment." + return 0 + fi + + STATUS=$FAIL + ERROR=$DRV_MSG + ERROR_MESSAGE="Your driver is not known (most probably not able) to work with Compiz.\n See http://wiki.compiz-fusion.org/Hardware for details." + + if [ "$DISTRIB_ID" = Ubuntu ]; then + detect_driver_manager + fi + + return 0 +} + +# PCI IDs that may be blacklist on certain distributions +# List taken from Gutsy +GUTSY_BLACKLIST="1002:5954 1002:5854 1002:5955 1002:4153 8086:2982 8086:2992 + 8086:29a2 8086:2a02 8086:2a12 8086:2972 1002:3152 1002:3150 + 1002:5462 1002:5653" +# Blacklisted IDs on Intrepid +BLACKLISTED_PCIIDS="$GUTSY_BLACKLIST 8086:1132 8086:2e02 8086:3577 8086:2562" + +# My own private PCI IDs (added for testing reasons) +# Please let me know if I really was that stupid to let those in here. +#BLACKLISTED_PCIIDS="$BLACKLISTED_PCIIDS 1002:4152 1002:4e50" + +# Check if PCI ID in use is on the blacklist +check_pciid() +{ + if [ "$DISTRIB_ID" = Ubuntu ] && [ "$DISTRIB_RELEASE" = "8.04" ]; then + return 1 + fi + + for PCIID in $BLACKLISTED_PCIIDS ; do + if $(lspci -n | grep -q "$PCIID") && check_skip ; then + STATUS=$WARN + WARNING="PCI ID \033[1m${PCIID}\033[0m detected." + ERROR_MESSAGE="Your particular graphics chip may be blacklisted on certain distributions.\n However that does not necessarily mean you will not be able to run Compiz.\n\n $DISCLAIMER" + QUERY_SKIP=yes + return 0 + fi + done + + return 1 +} + +# Check for needed xdg files in Ubuntu +check_xdg() +{ + if [ "$DISTRIB_ID" = Ubuntu ]; then + if [ $(echo "$DISTRIB_RELEASE" | sed 's/\.//g') -gt 704 ]; then + XDG_COMPIZ=/etc/xdg/compiz + if [ ! -e $XDG_COMPIZ/compiz-manager ] && [ -e /usr/bin/compiz.real ]; then + check_skip + if [ "$COMPIZ_BIN_PATH" = /usr/bin/ ] && [ "$COMPIZ_NAME" = compiz.real ] && + [ "$PLUGIN_PATH" = /usr/lib/compiz/ ]; then + return 1 + else + STATUS=$WARN + WARNING="No path to Compiz found." + ERROR_MESSAGE="In case you did not compile Compiz manually, this will result in Compiz\n failing to run." + if [ -d $XDG_COMPIZ ]; then + BACKUP=$(echo $(ls $XDG_COMPIZ | grep "compiz-manager\.") | awk '{print $1}') + fi + if [ ! -z $BACKUP ] ; then + DIST_HELP="You can try to fix this, by typing the following command in the terminal:\n\033[1msudo mv $XDG_COMPIZ/$BACKUP $XDG_COMPIZ/compiz-manager\033[0m" + fi + return 0 + fi + fi + fi + fi + + return 1 +} + +# Check if Nvidia card in use has enough memory +check_nvidia_mem() +{ + if [ "$DRV" = nvidia ]; then + if [ "$RENDER" = Xgl ]; then + STATUS=$SKIPPING + SKIP_MESSAGE="Xgl on Nvidia chip." + return 0 + fi + NVIDIA_SETTINGS=$(command -v nvidia-settings) + if [ ! -z $NVIDIA_SETTINGS ] ; then + MEM=$($NVIDIA_SETTINGS -q VideoRam | egrep Attribute\ \'VideoRam\'\ .*: | cut -d: -f3 | sed 's/[^0-9]//g') + NVIDIA_MEMORY=65536 # 64MB + if [ "$MEM" -lt $NVIDIA_MEMORY ] && check_skip ; then + STATUS=$WARN + WARNING="Nvidia card has not enough memory ($MEM KB) to run Compiz properly." + ERROR_MESSAGE="It is not recommended to run Compiz on a Nvidia chip with such a low amount\n of memory. Because of that, your hardware may be blacklisted on certain\n distributions.\n\n $DISCLAIMER" + QUERY_SKIP=yes + return 0 + fi + return 1 + fi + STATUS=$SKIPPING + SKIP_MESSAGE="Could not check the amount of memory on your Nvidia chip." + ERROR_MESSAGE="That does \033[1mnot\033[0m mean, you will not be able to use Compiz.\n If everything else went OK you are most probably fine.\n\n In case you want the script to check this step as well, install the program\n \033[1mnvidia-settings\033[0m on your system." + return 0 + fi + + return 1 +} + +# Check for proprietary driver (Ubuntu only) +check_prop_driver() +{ + printf "Check if there's an alternate (proprietary) driver available? (Y/n) " + read REPLY + case $REPLY in + "" | y | Y | yes | Yes) + case $DRVS_MNGR in + hardy-gtk) + exec gksu jockey-gtk & exit 0 + ;; + hardy-kde) + exec kdesu jockey-kde & exit 0 + ;; + gutsy-gtk) + exec gksu restricted-manager & exit 0 + ;; + gutsy-kde) + exec kdesu resrticted-manager-kde & exit 0 + ;; + feisty-gtk) + exec gksu restricted-manager & exit 0 + ;; + esac + ;; + n | N | no | No) + exit 0 + ;; + *) + check_prop_driver + ;; + esac +} + +# Query if the user wants to skip checks in compiz-manager +query_skip_checks() +{ + printf "Do you want to skip blacklist checks by Compiz? (y/N) " + read REPLY + case $REPLY in + y | Y | yes | Yes) + mkdir -p $XDG_CONFIG_HOME/compiz + echo SKIP_CHECKS=yes >> $COMPIZ_MNGR_HOME + ;; + "" | n | N | no | No) + exit 0 + ;; + *) + query_skip_checks + ;; + esac +} + +# Query if the user wants to kill xcompmgr +query_xcompmgr() +{ + printf "Do you want to disable xcompmgr? (Y/n) " + read REPLY + case $REPLY in + "" | y | Y | yes | Yes) + kill $XCOMPMGR_PID + ;; + n | N | no | No) + exit 0 + ;; + *) + query_xcompmgr + ;; + esac +} + +# Query to disable Metacity's compositing manager +query_metacity_comp() +{ + printf "Do you want to disable GNOME's compositing manager? (Y/n) " + read REPLY + case $REPLY in + "" | y | Y | yes | Yes) + $GCONFTOOL -s -t bool /apps/metacity/general/compositing_manager false + kill -9 $METACITY_PID 2>/dev/null + exec $METACITY --replace & + ;; + n | N | no | No) + exit 0 + ;; + *) + query_metacity_comp + ;; + esac +} + +# Query if the user wants to disable Xfwm's compsitor +query_xfwm_comp() +{ + printf "Do you want to disable Xfce's compositing manager? (Y/n) " + read REPLY + case $REPLY in + "" | y | Y | yes | Yes) + kill $XFWM_PID + sleep 1 + exec xfwm4 --compositor=off --daemon & + exit 0 + ;; + n | N | no | No) + exit 0 + ;; + *) + query_xfwm_comp + ;; + esac +} + +# Ask user to print additional info (Starship Troopers style). +more_info() +{ + printf "Would you like to know more? (Y/n) " + read REPLY + case $REPLY in + "" | y | Y | yes | Yes) + return 0 + ;; + n | N | no | No) + return 1 + ;; + *) + more_info + ;; + esac +} + +# --- Output starts here --- + +# System info +printf "\nGathering information about your system...\n\n" +detect_distro +printf " Distribution: %9s\033[1m${DISTRIB_ID} ${DISTRIB_RELEASE}\033[0m\n" +detect_de +printf " Desktop environment: %2s\033[1m${DE}\033[0m\n" +detect_video +printf " Graphics chip: %8s\033[1m${VIDEO}\033[0m\n" +detect_driver +printf " Driver in use: %8s\033[1m${DRV}\033[0m\n" +detect_rendering +printf " Rendering method: %5s\033[1m${RENDER}\033[0m\n" + +# System checks +printf "\nChecking if it's possible to run Compiz on your system..." +if [ "$CHECKS" = yes ]; then + printf "%2s[${SKIPPING}]\n\n" +else + printf "\n\n Checking for texture_from_pixmap..." + check_tfp + printf "%15s[${TFP}]\n" + printf " Checking for non power of two support..." + check_npo2 + printf "%10s[${NPO2}]\n" + printf " Checking for composite extension..." + check_composite + printf "%15s[${COMP}]\n" + printf " Checking for FBConfig..." + check_fbconfig + printf "%26s[${FBC}]\n" +fi + +# Hardware checks +printf " Checking for hardware/setup problems..." +if [ "$CHECKS" = yes ]; then + printf "%11s[${SKIPPING}]\n\n" +elif check_compositor || check_laptop_ati || check_cmpst_xorg || check_rasterizer ; then + printf "%11s[${FAIL}]\n\n" +elif check_fglrx || check_whitelist || check_resolution || check_xdg || check_pciid || check_nvidia_mem ; then + printf "%11s[${STATUS}]\n\n" +else + printf "%11s[${OK}]\n\n" +fi + +# Print error or warning (if any) +# The $ERROR, $WARNING and $SKIP_MESSAGE outputs are supposed to be a +# short description of the respective error. +if [ "x$ERROR" != "x" ]; then + printf "There has been (at least) one error detected with your setup:\n \033[31mError:\033[0m $ERROR \n\n" +elif [ "x$WARNING" != "x" ]; then + printf "Something potential problematic has been detected with your setup:\n \033[33mWarning:\033[0m $WARNING \n\n" +elif [ "x$SKIP_MESSAGE" != "x" ]; then + printf "At least one check had to be skipped:\n \033[33mError:\033[0m $SKIP_MESSAGE \n\n" +fi + +# Interactive output begins here +if [ "x$ERROR_MESSAGE" != "x" ] && more_info ; then + printf "\n $ERROR_MESSAGE \n\n" + if [ ! -z $QUERY_SKIP ]; then + query_skip_checks + elif [ ! -z $QUERY_XCOMPMGR ]; then + query_xcompmgr + elif [ ! -z $QUERY_METACITY ]; then + query_metacity_comp + elif [ ! -z $QUERY_XFWM ]; then + query_xfwm_comp + elif [ "x$DRVS_MNGR" != "x" ]; then + check_prop_driver + elif [ "x$DIST_HELP" != "x" ]; then + printf " $DIST_HELP \n\n" + fi +fi + +# If there was an error, return an error code +if [ "x$ERROR" != "x" ]; then + exit 1 +fi +exit 0 diff -Nru qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/cpuinfo_resource qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/cpuinfo_resource --- qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/cpuinfo_resource 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/cpuinfo_resource 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,202 @@ +#!/usr/bin/python +# +# This file is part of Checkbox. +# +# Copyright 2009 Canonical Ltd. +# +# Checkbox is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Checkbox is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Checkbox. If not, see . +# + +# This script is from the Checkbox Interface +# This is Checkbox which provides an extensible interface for system testing. +# See the following page for documentation: +# https://wiki.ubuntu.com/Testing/Automation/Checkbox + +import os +import sys +import posixpath + +from checkbox.lib.conversion import string_to_type + + +# Filename where cpuinfo is stored. +CPUINFO_FILENAME = "/proc/cpuinfo" + +# Filename where maximum frequency is stored. +FREQUENCY_FILENAME = "/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq" + + +def cpuinfo_attributes(filename): + cpuinfo = open(filename, "r").read() + + count = 0 + attributes = {} + for block in cpuinfo.split("\n\n"): + if not block: + continue + + count += 1 + if count > 1: + continue + + for line in block.split("\n"): + if not line: + continue + + key, value = line.split(":") + key, value = key.strip(), value.strip() + + # Handle bogomips on sparc + if key.endswith("Bogo"): + key = "bogomips" + + attributes[key.lower()] = value + + attributes["count"] = count + return attributes + +def cpuinfo_to_processor(uname, cpuinfo): + # Default values + processor = { + "platform": uname, + "count": 1, + "type": uname, + "model": uname, + "model_number": "", + "model_version": "", + "model_revision": "", + "cache": 0, + "bogomips": 0, + "speed": -1, + "other": ""} + + # Conversion table + platform_to_conversion = { + ("i386", "i486", "i586", "i686", "x86_64",): { + "type": "vendor_id", + "model": "model name", + "model_number": "cpu family", + "model_version": "model", + "model_revision": "stepping", + "cache": "cache size", + "other": "flags", + "speed": "cpu mhz"}, + ("alpha", "alphaev6",): { + "count": "cpus detected", + "type": "cpu", + "model": "cpu model", + "model_number": "cpu variation", + "model_version": ("system type", "system variation",), + "model_revision": "cpu revision", + "other": "platform string", + "speed": "cycle frequency [Hz]"}, + ("armv7l",): { + "type": "hardware", + "model": "processor", + "model_number": "cpu variant", + "model_version": "cpu architecture", + "model_revision": "cpu revision", + "other": "features"}, + ("ia64",): { + "type": "vendor", + "model": "family", + "model_version": "archrev", + "model_revision": "revision", + "other": "features", + "speed": "cpu mhz"}, + ("ppc64", "ppc",): { + "type": "platform", + "model": "cpu", + "model_version": "revision", + "vendor": "machine", + "speed": "clock"}, + ("sparc64", "sparc",): { + "count": "ncpus probed", + "type": "type", + "model": "cpu", + "model_version": "type", + "speed": "bogomips"}} + + processor["count"] = cpuinfo.get("count", 1) + processor["bogomips"] = int(round(float(cpuinfo.get("bogomips", "0.0")))) + for platform, conversion in platform_to_conversion.iteritems(): + if uname in platform: + for pkey, ckey in conversion.iteritems(): + if isinstance(ckey, (list, tuple)): + processor[pkey] = "/".join([cpuinfo[k] for k in ckey]) + elif ckey in cpuinfo: + processor[pkey] = cpuinfo[ckey] + + # Adjust platform and vendor + if uname[0] == "i" and uname[-2:] == "86": + processor["platform"] = "i386" + elif uname[:5] == "alpha": + processor["platform"] = "alpha" + elif uname[:5] == "sparc": + processor["vendor"] = "sun" + + # Adjust cache + if processor["cache"]: + processor["cache"] = string_to_type(processor["cache"]) + + # Adjust speed + try: + if uname[:5] == "alpha": + speed = processor["speed"].split()[0] + processor["speed"] = int(round(float(speed))) / 1000000 + elif uname[:5] == "sparc": + speed = processor["speed"] + processor["speed"] = int(round(float(speed))) / 2 + else: + if uname[:3] == "ppc": + # String is appended with "mhz" + speed = processor["speed"][:-3] + else: + speed = processor["speed"] + processor["speed"] = int(round(float(speed)) - 1) + except ValueError: + processor["speed"] = -1 + + # Adjust count + try: + processor["count"] = int(processor["count"]) + except ValueError: + processor["count"] = 1 + else: + # There is at least one processor + if processor["count"] == 0: + processor["count"] = 1 + + return processor + + +def main(): + uname = os.uname()[4].lower() + attributes = cpuinfo_attributes(CPUINFO_FILENAME) + processor = cpuinfo_to_processor(uname, attributes) + + # Check for frequency scaling + if posixpath.exists(FREQUENCY_FILENAME): + speed = open(FREQUENCY_FILENAME).read().strip() + processor["speed"] = int(speed) / 1000 + + for key, value in processor.iteritems(): + if value is not None: + print "%s: %s" % (key, value) + + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff -Nru qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/cpu_scaling_test qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/cpu_scaling_test --- qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/cpu_scaling_test 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/cpu_scaling_test 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,530 @@ +#!/usr/bin/python + +# This script is from the Checkbox Interface +# This is Checkbox which provides an extensible interface for system testing. +# See the following page for documentation: +# https://wiki.ubuntu.com/Testing/Automation/Checkbox + +import decimal +import os +import re +import string +import sys +import time + +from optparse import OptionParser +from subprocess import check_call, CalledProcessError + +class CPUScalingTest(object): + + def __init__(self): + self.speedUpTolerance = 10.0 # percent + self.retryLimit = 5 + self.retryTolerance = 5.0 # percent + self.sysCPUDirectory = "/sys/devices/system/cpu" + self.cpufreqDirectory = os.path.join(self.sysCPUDirectory, "cpu0", "cpufreq") + self.idaFlag = "ida" + self.idaSpeedupFactor = 8.0 # percent + + def getCPUFreqDirectories(self): + if not os.path.exists(self.sysCPUDirectory): + print "Error: no file %s" % self.sysCPUDirectory + return None + # look for cpu subdirectories + pattern = re.compile("cpu(?P[0-9]+)") + self.cpufreqDirectories = list() + for subdirectory in os.listdir(self.sysCPUDirectory): + match = pattern.search(subdirectory) + if match and match.group("cpuNumber"): + cpufreqDirectory = os.path.join(self.sysCPUDirectory, + subdirectory, "cpufreq") + if not os.path.exists(cpufreqDirectory): + print "Error: cpu %s has no cpufreq directory %s" \ + % (match.group("cpuNumber"), cpufreqDirectory) + return None + # otherwise + self.cpufreqDirectories.append(cpufreqDirectory) + if len(self.cpufreqDirectories) is 0: + return None + # otherwise + return self.cpufreqDirectories + + def checkParameters(self, file): + current = None + for cpufreqDirectory in self.cpufreqDirectories: + parameters = self.getParameters(cpufreqDirectory, file) + if not parameters: + print "Error: could not determine cpu parameters from %s" \ + % os.path.join(cpufreqDirectory, file) + return None + if not current: + current = parameters + elif not current == parameters: + return None + return current + + + + def getParameters(self, cpufreqDirectory, file): + path = os.path.join(cpufreqDirectory, file) + file = open(path) + while 1: + line = file.readline() + if not line: + break + if len(line.strip()) > 0: + return line.strip().split() + return None + + def setParameter(self, setFile, readFile, value, skip=False): + if not skip: + path = os.path.join(self.cpufreqDirectory, setFile) + try: + check_call("echo \"%s\" > %s" % (value, path), shell=True) + except CalledProcessError, exception: + print "Error: command failed:" + print exception + return False + + # verify it has changed + path = os.path.join(self.cpufreqDirectory, readFile) + parameterFile = open(path) + line = parameterFile.readline() + if not line or line.strip() != str(value): + print "Error: could not verify that %s was set to %s" % (path, value) + if line: + print "Actual Value: %s" % line + else: + print "parameter file was empty" + return False + + return True + + def setParameterWithSelector(self, switch, setFile, readFile, value): + # Try the command for all CPUs + skip = True + try: + check_call("cpufreq-selector -%s %s" % (switch, value), shell=True) + except CalledProcessError, exception: + print "Note: command failed: %s" % exception.cmd + skip = False + + return self.setParameter(setFile, readFile, value, skip) + + def setFrequency(self, frequency): + return self.setParameterWithSelector("f", "scaling_setspeed", "scaling_cur_freq", frequency) + + def setGovernor(self, governor): + return self.setParameterWithSelector("g", "scaling_governor", "scaling_governor", governor) + + + def getParameter(self, parameter): + value = None + parameterFilePath = os.path.join(self.cpufreqDirectory, parameter) + try: + parameterFile = open(parameterFilePath) + line = parameterFile.readline() + if not line: + print "Error: failed to get %s for %s" % (parameter, self.cpufreqDirectory) + return None + value = line.strip() + return value + except IOError, exception: + print "Error: could not open %s" % parameterFilePath + print exception + + return None + + def getParameterList(self, parameter): + values = list() + for cpufreqDirectory in self.cpufreqDirectories: + path = os.path.join(cpufreqDirectory, parameter) + parameterFile = open(path) + line = parameterFile.readline() + if not line: + print "Error: failed to get %s for %s" % (parameter, cpufreqDirectory) + return None + values.append(line.strip()) + return values + + def runLoadTest(self): + print "Running CPU load test..." + try: + check_call("taskset -pc 0 %s" % os.getpid(), shell=True) + except CalledProcessError, exception: + print "Error: could not set task affinity" + print exception + return None + + runTime = None + tries = 0 + while tries < self.retryLimit: + sys.stdout.flush() + (start_utime, start_stime, start_cutime, start_cstime, start_elapsed_time) = os.times() + self.pi() + (stop_utime, stop_stime, stop_cutime, stop_cstime, stop_elapsed_time) = os.times() + if not runTime: + runTime = stop_elapsed_time - start_elapsed_time + else: + thisTime = stop_elapsed_time - start_elapsed_time + if (abs(thisTime-runTime)/runTime)*100 < self.retryTolerance: + return runTime + else: + runTime = thisTime + tries += 1 + + print "Error: could not repeat load test times within %.1f%%" % self.retryTolerance + return None + + def pi(self): + decimal.getcontext().prec = 500 + s = decimal.Decimal(1) + h = decimal.Decimal(3).sqrt()/2 + n = 6 + for i in range(170): + s2 = ((1-h)**2+s**2/4) + s = s2.sqrt() + h = (1-s2/4).sqrt() + n = 2*n + + return True + + def verifyMinimumFrequency(self, waitTime=5): + sys.stdout.write("Waiting %d seconds..." % waitTime) + sys.stdout.flush() + time.sleep(waitTime) + sys.stdout.write(" done.\n") + minimumFrequency = self.getParameter("scaling_min_freq") + currentFrequency = self.getParameter("scaling_cur_freq") + if not minimumFrequency or not currentFrequency or (minimumFrequency != currentFrequency): + return False + + # otherwise + return True + + def getSystemCapabilities(self): + print "" + print "System Capabilites:" + print "-------------------------------------------------" + + # Do the CPUs support scaling? + if not self.getCPUFreqDirectories(): + return False + if len (self.cpufreqDirectories) > 1: + print "System has %u cpus"% len(self.cpufreqDirectories) + + # Ensure all CPUs support the same frequencies + freqFileName = "scaling_available_frequencies" + self.frequencies = self.checkParameters(freqFileName) + if not self.frequencies: + return False + + print "" + print "Supported CPU Frequencies: " + for freq in self.frequencies: + f = string.atoi(freq)/1000 + print " %u MHz" % f + + # Check governors to verify all CPUs support the same control methods + governorFileName = "scaling_available_governors" + self.governors = self.checkParameters(governorFileName) + if not self.governors: + return False + + print "" + print "Supported Governors: " + for governor in self.governors: + print " %s" % governor + + self.originalGovernors = self.getParameterList("scaling_governor") + if self.originalGovernors: + print "" + print "Current governors:" + i = 0 + for g in self.originalGovernors: + print " cpu%u: %s" % (i, g) + i += 1 + else: + print "Error: could not determine current governor settings" + return False + + self.getCPUFlags() + + return True + + def getCPUFlags(self): + self.cpuFlags = None + try: + cpuinfo_file = open('/proc/cpuinfo', 'r') + cpuinfo = cpuinfo_file.read().split("\n") + cpuinfo_file.close() + + for line in cpuinfo: + if line.startswith('flags'): + pre, post = line.split(':') + self.cpuFlags = post.strip().split() + break + except: + print "Warning: could not read CPU flags" + + def runUserSpaceTests(self): + print "" + print "Userspace Governor Test:" + print "-------------------------------------------------" + self.minimumFrequencyTestTime = None + self.maximumFrequencyTestTime = None + + success = True + differenceSpeedUp = None + governor = "userspace" + if governor not in self.governors: + print "Note: %s governor not supported" % governor + else: + + # Set the governor to "userspace" and verify + print "Setting governor to %s" % governor + if not self.setGovernor(governor): + success = False + + # Set the the CPU speed to it's lowest value + frequency = self.frequencies[-1] + print "Setting CPU frequency to %u MHz" % (string.atoi(frequency)/1000) + if not self.setFrequency(frequency): + success = False + + # Verify the speed is set to the lowest value + minimumFrequency = self.getParameter("scaling_min_freq") + currentFrequency = self.getParameter("scaling_cur_freq") + if not minimumFrequency or not currentFrequency or (minimumFrequency != currentFrequency): + print "Error: Could not verify that cpu frequency is set to the minimum value of %s" % minimumFrequency + success = False + + # Run Load Test + self.minimumFrequencyTestTime = self.runLoadTest() + if not self.minimumFrequencyTestTime: + print "Error: Could not retrieve the minimum frequency test's execution time." + success = False + else: + print "Minimum frequency load test time: %.2f" % self.minimumFrequencyTestTime + + # Set the CPU speed to it's highest value as above. + frequency = self.frequencies[0] + print "Setting CPU frequency to %u MHz" % (string.atoi(frequency)/1000) + if not self.setFrequency(frequency): + success = False + + maximumFrequency = self.getParameter("scaling_max_freq") + currentFrequency = self.getParameter("scaling_cur_freq") + if not maximumFrequency or not currentFrequency or (maximumFrequency != currentFrequency): + print "Error: Could not verify that cpu frequency is set to the maximum value of %s" % maximumFrequency + success = False + + # Repeat workload test + self.maximumFrequencyTestTime = self.runLoadTest() + if not self.maximumFrequencyTestTime: + print "Error: Could not retrieve the maximum frequency test's execution time." + success = False + else: + print "Maximum frequency load test time: %.2f" % self.maximumFrequencyTestTime + + # Verify MHz increase is comparable to time % decrease + predictedSpeedup = string.atof(maximumFrequency)/string.atof(minimumFrequency) + + # If "ida" turbo thing, increase the expectation by 8% + if self.cpuFlags and self.idaFlag in self.cpuFlags: + print "Note: found %s flag, increasing expected speedup by %.1f%%" % (self.idaFlag, self.idaSpeedupFactor) + predictedSpeedup = predictedSpeedup*(1.0/(1.0-(self.idaSpeedupFactor/100.0))) + + if self.minimumFrequencyTestTime and self.maximumFrequencyTestTime: + measuredSpeedup = self.minimumFrequencyTestTime/self.maximumFrequencyTestTime + print "" + print "CPU Frequency Speed Up: %.2f" % predictedSpeedup + print "Measured Speed Up: %.2f" % measuredSpeedup + differenceSpeedUp = (abs(measuredSpeedup-predictedSpeedup)/predictedSpeedup)*100 + print "Percentage Difference %.1f%%" % differenceSpeedUp + if differenceSpeedUp > self.speedUpTolerance: + print "Error: measured speedup vs expected speedup is %.1f%% and is not within %.1f%% margin. " % (differenceSpeedUp, self.speedUpTolerance) + success = False + else: + print "Error: Not enough timing data to calculate speed differences." + + return success + + def runOnDemandTests(self): + print "" + print "On Demand Governor Test:" + print "-------------------------------------------------" + differenceOnDemandVsMaximum = None + onDemandTestTime = None + governor = "ondemand" + success = True + if governor not in self.governors: + print "Note: %s governor not supported" % governor + else: + # Set the governor to "ondemand" + print "Setting governor to %s" % governor + if not self.setGovernor(governor): + success = False + + # Wait a fixed period of time, then verify current speed is the slowest in as before + if not self.verifyMinimumFrequency(): + print "Error: Could not verify that cpu frequency has settled to the minimum value" + success = False + + # Repeat workload test + onDemandTestTime = self.runLoadTest() + if not onDemandTestTime: + print "Error: No On Demand load test time available." + success = False + else: + print "On Demand load test time: %.2f" % onDemandTestTime + + if onDemandTestTime and self.maximumFrequencyTestTime: + # Compare the timing to the max results from earlier, again time should be within self.speedUpTolerance + differenceOnDemandVsMaximum = (abs(onDemandTestTime-self.maximumFrequencyTestTime)/self.maximumFrequencyTestTime)*100 + print "Percentage Difference vs. maximum frequency: %.1f%%" % differenceOnDemandVsMaximum + if differenceOnDemandVsMaximum > self.speedUpTolerance: + print "Error: on demand performance vs maximum of %.1f%% is not within %.1f%% margin" % (differenceOnDemandVsMaximum, self.speedUpTolerance) + success = False + else: + print "Error: Not enough timing data to calculate speed differences." + + # Verify the current speed has returned to the lowest speed again + if not self.verifyMinimumFrequency(): + print "Error: Could not verify that cpu frequency has settled to the minimum value" + success = False + + return success + + def runPerformanceTests(self): + print "" + print "Performance Governor Test:" + print "-------------------------------------------------" + differencePerformanceVsMaximum = None + governor = "performance" + success = True + if governor not in self.governors: + print "Note: %s governor not supported" % governor + else: + # Set the governor to "performance" + print "Setting governor to %s" % governor + if not self.setGovernor(governor): + success = False + + # Verify the current speed is the same as scaling_max_freq + maximumFrequency = self.getParameter("scaling_max_freq") + currentFrequency = self.getParameter("scaling_cur_freq") + if not maximumFrequency or not currentFrequency or (maximumFrequency != currentFrequency): + print "Error: Current cpu frequency of %s is not set to the maximum value of %s" % (currentFrequency, maximumFrequency) + success = False + + # Repeat work load test + performanceTestTime = self.runLoadTest() + if not performanceTestTime: + print "Error: No Performance load test time available." + success = False + else: + print "Performance load test time: %.2f" % performanceTestTime + + if performanceTestTime and self.maximumFrequencyTestTime: + # Compare the timing to the max results + differencePerformanceVsMaximum = (abs(performanceTestTime-self.maximumFrequencyTestTime)/self.maximumFrequencyTestTime)*100 + print "Percentage Difference vs. maximum frequency: %.1f%%" % differencePerformanceVsMaximum + if differencePerformanceVsMaximum > self.speedUpTolerance: + print "Error: performance setting vs maximum of %.1f%% is not within %.1f%% margin" % (differencePerformanceVsMaximum, self.speedUpTolerance) + success = False + else: + print "Error: Not enough timing data to calculate speed differences." + + return success + + def runConservativeTests(self): + print "" + print "Conservative Governor Test:" + print "-------------------------------------------------" + differenceConservativeVsMinimum = None + governor = "conservative" + success = True + if governor not in self.governors: + print "Note: %s governor not supported" % governor + else: + # Set the governor to "conservative" + print "Setting governor to %s" % governor + if not self.setGovernor(governor): + success = False + + # Set the frequency step to 20, so that it jumps to minimum frequency + path = os.path.join("conservative", "freq_step") + if not self.setParameter(path, path, 20): + success = False + + # Wait a fixed period of time, then verify current speed is the slowest in as before + if not self.verifyMinimumFrequency(10): + print "Error: Could not verify that cpu frequency has settled to the minimum value" + success = False + + # Set the frequency step to 0, so that it doesn't gradually increase + if not self.setParameter(path, path, 0): + success = False + + # Repeat work load test + conservativeTestTime = self.runLoadTest() + if not conservativeTestTime: + print "Error: No Conservative load test time available." + success = False + else: + print "Conservative load test time: %.2f" % conservativeTestTime + + if conservativeTestTime and self.minimumFrequencyTestTime: + # Compare the timing to the max results + differenceConservativeVsMinimum = (abs(conservativeTestTime-self.minimumFrequencyTestTime)/self.minimumFrequencyTestTime)*100 + print "Percentage Difference vs. minimum frequency: %.1f%%" % differenceConservativeVsMinimum + if differenceConservativeVsMinimum > self.speedUpTolerance: + print "Error: performance setting vs minimum of %.1f%% is not within %.1f%% margin" % (differenceConservativeVsMinimum, self.speedUpTolerance) + success = False + else: + print "Error: Not enough timing data to calculate speed differences." + + return success + + def restoreGovernors(self): + print "Restoring original governor to %s" % (self.originalGovernors[0]) + self.setGovernor(self.originalGovernors[0]) + + +def main(args): + usage = "Usage: %prog [OPTIONS]" + parser = OptionParser(usage=usage) + parser.add_option("-q", "--quiet", + action="store_true", + help="Suppress output.") + parser.add_option("-c", "--capabilities", + action="store_true", + help="Only output CPU capabilities.") + (options, args) = parser.parse_args(args) + + if options.quiet: + sys.stdout = open(os.devnull, 'a') + sys.stderr = open(os.devnull, 'a') + + test = CPUScalingTest() + if not os.path.exists(test.cpufreqDirectory): + print "CPU Frequency Scaling not supported" + return 0 + + if not test.getSystemCapabilities(): + parser.error("Failed to get system capabilities") + + returnValues = [] + if not options.capabilities: + returnValues.append(test.runUserSpaceTests()) + returnValues.append(test.runOnDemandTests()) + returnValues.append(test.runPerformanceTests()) + returnValues.append(test.runConservativeTests()) + test.restoreGovernors() + + return 1 if False in returnValues else 0 + + +if __name__ == "__main__": + sys.exit(main(sys.argv[1:])) diff -Nru qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/cycle_vts qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/cycle_vts --- qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/cycle_vts 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/cycle_vts 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,26 @@ +#!/bin/bash + +# NB: This script must be run with root privileges in order to have any effect! + +# This script is from the Checkbox Interface +# This is Checkbox which provides an extensible interface for system testing. +# See the following page for documentation: +# https://wiki.ubuntu.com/Testing/Automation/Checkbox + +CURRENT_VT=`/bin/fgconsole` + +if [ "$CURRENT_VT" == "" ] +then + echo "Unable to determine current virtual terminal." >&2 + exit 1 +fi + +if [ "$CURRENT_VT" -ne "1" ] +then + chvt 1 +else + chvt 2 +fi + +sleep 2 +chvt "$CURRENT_VT" diff -Nru qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/dead_pixel_test qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/dead_pixel_test --- qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/dead_pixel_test 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/dead_pixel_test 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,39 @@ +#!/usr/bin/env python + +# This script is from the Checkbox Interface +# This is Checkbox which provides an extensible interface for system testing. +# See the following page for documentation: +# https://wiki.ubuntu.com/Testing/Automation/Checkbox + +import pygtk +pygtk.require('2.0') +import gtk + +class Application: + def __init__(self): + self.colors = iter(["red", "green", "blue", "white", "black"]) + self.window = gtk.Window(gtk.WINDOW_TOPLEVEL) + self.window.set_decorated(False) + self.window.fullscreen() + self.window.modify_bg(gtk.STATE_NORMAL, + gtk.gdk.color_parse(self.colors.next())) + + self.window.connect("key-press-event", self.rotate_bg_color) + self.window.add_events(gtk.gdk.BUTTON_PRESS_MASK) + self.window.connect("button-press-event", self.rotate_bg_color) + + self.window.show() + + def rotate_bg_color(self, window, event): + try: + self.window.modify_bg(gtk.STATE_NORMAL, + gtk.gdk.color_parse(self.colors.next())) + except StopIteration: + gtk.main_quit() + + def main(self): + gtk.main() + +if __name__ == "__main__": + app = Application() + app.main() diff -Nru qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/disk_bench_test qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/disk_bench_test --- qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/disk_bench_test 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/disk_bench_test 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,24 @@ +#!/usr/bin/python + +# This script is from the Checkbox Interface +# This is Checkbox which provides an extensible interface for system testing. +# See the following page for documentation: +# https://wiki.ubuntu.com/Testing/Automation/Checkbox + +import sys +from subprocess import Popen, PIPE + +def main(): + output = Popen('hdparm -tT /dev/sda', + stdout=PIPE, shell=True).communicate()[0] + + for line in output.splitlines()[-2:]: + line = line.lstrip() + line = ("%s %s" + % (line[:line.find(':')], + line[line.rfind('='):])) + print line + + +if __name__ == "__main__": + sys.exit(main()) diff -Nru qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/dpkg_resource qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/dpkg_resource --- qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/dpkg_resource 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/dpkg_resource 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,56 @@ +#!/usr/bin/python +# +# This file is part of Checkbox. +# +# Copyright 2009 Canonical Ltd. +# +# Checkbox is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Checkbox is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Checkbox. If not, see . +# +# This script is from the Checkbox Interface +# This is Checkbox which provides an extensible interface for system testing. +# See the following page for documentation: +# https://wiki.ubuntu.com/Testing/Automation/Checkbox + + +import re +import sys + +from subprocess import Popen, PIPE + + +# Command to retrieve dpkg information. +COMMAND = "dpkg --version" + + +def get_dpkg(): + output = Popen(COMMAND, stdout=PIPE, shell=True).communicate()[0] + match = re.search(r"(?P[\d\.]+) \((?P.*)\)", output) + + dpkg = {} + dpkg["version"] = match.group("version") + dpkg["architecture"] = match.group("architecture") + + return dpkg + +def main(): + dpkg = get_dpkg() + + for key, value in dpkg.iteritems(): + print "%s: %s" % (key, value) + + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff -Nru qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/filter_packages qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/filter_packages --- qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/filter_packages 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/filter_packages 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,184 @@ +#!/usr/bin/python + +# This script is from the Checkbox Interface +# This is Checkbox which provides an extensible interface for system testing. +# See the following page for documentation: +# https://wiki.ubuntu.com/Testing/Automation/Checkbox + +import os +import sys +import apt +import logging + +from optparse import OptionParser +from tempfile import TemporaryFile + +from checkbox.lib.log import set_logging +from checkbox.lib.redirect import RedirectEcho, RedirectTee +from checkbox.lib.template_i18n import TemplateI18n + +from checkbox.resource import ResourceMap + + +DEFAULT_LOG_LEVEL = "critical" +DEFAULT_OUTPUT = "-" + + +def get_redirect_file(input, output): + temp = TemporaryFile() + tee = RedirectTee(output, temp) + echo = RedirectEcho(input, tee) + echo.read() + + temp.seek(0) + return temp + +def get_package_names(file): + package_names = set() + class PackageObject(object): + + def __init__(self, compare): + self._compare = compare + + def __eq__(self, other): + package_names.add(other) + return self._compare + + # In order to read the package names from the requires field + # in messages, it is necessary to trick eval into thinking that + # package.name exists using the PackageResource. The problem is + # that since we don't have access to the expression tree, an 'or' + # operator will only evaluate the left hand side if it is true + # and an 'and' operator will only evaluate the left hand side if + # it is false. The solution is to compare against both zero and + # non-zero comparison results. Caveat, this doesn't work when + # both operators are used: foo or (bar and baz) + resource_0 = ResourceMap() + resource_0["package"] = [{"name": PackageObject(compare=True)}] + resource_1 = ResourceMap() + resource_1["package"] = [{"name": PackageObject(compare=True)}] + + template = TemplateI18n() + messages = template.load_file(file) + for message in messages: + if "requires_extended" in message: + requires = message["requires_extended"].split("\n") + + elif "requires" in message: + requires = [message["requires"]] + + else: + requires = [] + + for require in requires: + resource_0.eval(require) + resource_1.eval(require) + + return list(package_names) + +def install_package_names(names): + class CapturedInstallProgress(apt.InstallProgress): + + def fork(self): + self.stdout = TemporaryFile() + self.stderr = TemporaryFile() + p = os.fork() + if p == 0: + os.dup2(self.stdout.fileno(), sys.stdout.fileno()) + os.dup2(self.stderr.fileno(), sys.stderr.fileno()) + return p + + cache = apt.Cache() + for name in names: + if name in cache: + cache[name].markInstall() + + os.environ['DEBIAN_FRONTEND'] = 'noninteractive' + install_progress = CapturedInstallProgress() + + try: + cache.commit(None, install_progress) + + # Process stdout + install_progress.stdout.seek(0) + stdout = install_progress.stdout.read() + install_progress.stdout.close() + if stdout: + logging.debug(stdout) + + # Process stderr + install_progress.stderr.seek(0) + stderr = install_progress.stderr.read() + install_progress.stderr.close() + if stderr: + logging.error(stderr) + + except apt.cache.FetchCancelledException, e: + return False + + except (apt.cache.LockFailedException, apt.cache.FetchFailedException), e: + logging.warning('Package fetching failed: %s', str(e)) + raise SystemError, str(e) + + return True + +def main(args): + usage = "Usage: %prog [OPTIONS] [FILE]" + parser = OptionParser(usage=usage) + parser.add_option("--dry-run", + action="store_true", + help="do not modify system") + parser.add_option("-l", "--log", metavar="FILE", + help="log file where to send output") + parser.add_option("--log-level", + default=DEFAULT_LOG_LEVEL, + help="one of debug, info, warning, error or critical") + parser.add_option("-o", "--output", + default=DEFAULT_OUTPUT, + help="output file, - for stdout") + (options, args) = parser.parse_args(args) + + # Set logging early + set_logging(options.log_level, options.log) + + # Parse options + if not options.dry_run and os.getuid(): + parser.error("Must be run as root to modify the system") + + if options.output == "-": + output_file = sys.stdout + + else: + try: + output_file = open(options.output, "w") + except IOError, e: + parser.error("%s: %s" % (options.output, e.strerror)) + + # Parse args + if len(args) > 1: + parser.error("Can only specify zero or one file") + + if args: + filename = args[0] + try: + input_file = open(filename, "r") + except IOError, e: + parser.error("%s: %s" % (filename, e.strerror)) + + else: + input_file = sys.stdin + + # Get packages + file = get_redirect_file(input_file, output_file) + package_names = get_package_names(file) + + # Install packages + if not options.dry_run: + if not install_package_names(package_names): + parser.error("Failed to fetch packages") + + return 0 + + +if __name__ == "__main__": + sys.exit(main(sys.argv[1:])) diff -Nru qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/filter_templates qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/filter_templates --- qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/filter_templates 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/filter_templates 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,132 @@ +#!/usr/bin/python + +# This script is from the Checkbox Interface +# This is Checkbox which provides an extensible interface for system testing. +# See the following page for documentation: +# https://wiki.ubuntu.com/Testing/Automation/Checkbox + +import re +import sys +import posixpath + +from optparse import OptionParser + +from checkbox.lib.path import path_expand_recursive +from checkbox.lib.template import Template + + +class FilterError(Exception): + + pass + + +def compile_filters(filters): + patterns = {} + for filter in filters: + if "=" not in filter: + raise FilterError("Missing assignment in filter: %s" + % filter) + + name, value = filter.split("=", 1) + try: + pattern = re.compile(r"^%s$" % value) + except re.error: + raise FilterError("Invalid regular expression in filter: %s" + % value) + patterns.setdefault(name, []) + patterns[name].append(pattern) + + return patterns + +def match_patterns(patterns_table, element): + matches = [] + for key, patterns in patterns_table.iteritems(): + if key not in element: + matches.append(False) + else: + value = element[key] + for pattern in patterns: + matches.append(True if pattern.match(value) else False) + + return matches + +def match_elements(elements, attributes=[], whitelist=[], blacklist=[]): + whitelist_patterns = compile_filters(whitelist) + blacklist_patterns = compile_filters(blacklist) + + # Apply attributes + for element in elements: + for attribute in attributes: + name, value = attribute.split("=", 1) + element[name] = value + + # Apply whitelist and blacklist + matches = [] + for element in elements: + if whitelist_patterns \ + and True not in match_patterns(whitelist_patterns, element): + continue + if blacklist_patterns \ + and True in match_patterns(blacklist_patterns, element): + continue + + matches.append(element) + + return matches + +def parse_file(file, *args, **kwargs): + template = Template() + matches = match_elements(template.load_file(file), *args, **kwargs) + template.dump_file(matches, sys.stdout) + +def parse_path(path, *args, **kwargs): + for filename in path_expand_recursive(path): + print "# %s" % filename + + name = posixpath.basename(filename) + if name.startswith(".") or name.endswith("~"): + continue + + file = open(filename, "r") + parse_file(file, *args, **kwargs) + +def parse_paths(paths, *args, **kwargs): + for path in paths: + parse_path(path, *args, **kwargs) + +def main(args): + usage = "Usage: %prog [OPTIONS] [FILE...]" + parser = OptionParser(usage=usage) + parser.add_option("-a", "--attribute", + action="append", + type="string", + default=[], + help="Set additional attributes by name and value.") + parser.add_option("-b", "--blacklist", + action="append", + type="string", + default=[], + help="Blacklist of elements by name and value.") + parser.add_option("-w", "--whitelist", + action="append", + type="string", + default=[], + help="Whitelist of elements by name and value.") + (options, args) = parser.parse_args(args) + + if args: + parse_func = parse_paths + else: + parse_func = parse_file + args = sys.stdin + + try: + parse_func(args, options.attribute, options.whitelist, options.blacklist) + except FilterError, error: + parser.error(error.args[0]) + + return 0 + + +if __name__ == "__main__": + sys.exit(main(sys.argv[1:])) diff -Nru qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/gconf_resource qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/gconf_resource --- qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/gconf_resource 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/gconf_resource 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,101 @@ +#!/usr/bin/python +# +# This file is part of Checkbox. +# +# Copyright 2009 Canonical Ltd. +# +# Checkbox is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Checkbox is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Checkbox. If not, see . +# + +# This script is from the Checkbox Interface +# This is Checkbox which provides an extensible interface for system testing. +# See the following page for documentation: +# https://wiki.ubuntu.com/Testing/Automation/Checkbox + +import re +import sys +import posixpath + +from subprocess import Popen, PIPE + +from checkbox.lib.conversion import string_to_type + + +# Command to retrieve gconf information. +COMMAND = "gconftool-2 -R / --direct --config-source xml:readwrite:$source" + +# Source directory containing gconf information. +SOURCE = "~/.gconf" + + +def get_gconf(command): + id = None + id_pattern = re.compile(r"\s+(?P\/.+):") + key_value_pattern = re.compile(r"\s+(?P[\w\-]+) = (?P.*)") + list_value_pattern = re.compile(r"\[(?P[^\]]*)\]") + + # TODO: add support for multi-line values + + gconf = {} + output = Popen(command, stdout=PIPE, shell=True).communicate()[0] + for line in output.split("\n"): + if not line: + continue + + match = id_pattern.match(line) + if match: + id = match.group("id") + continue + + match = key_value_pattern.match(line) + if match: + key = match.group("key") + value = match.group("value") + if value == "(no value set)": + value = None + else: + match = list_value_pattern.match(value) + if match: + list_string = match.group("list") + if len(list_string): + value = list_string.replace(",", " ") + else: + value = "" + else: + value = string_to_type(value) + + name = "%s/%s" % (id, key) + gconf[name] = value + continue + + return gconf + + +def main(): + source = posixpath.expanduser(SOURCE) + command = COMMAND.replace("$source", source) + gconf = get_gconf(command) + + for name, value in gconf.iteritems(): + print "name: %s" % name + print "value: %s" % value + + # Empty line + print + + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff -Nru qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/gcov_tarball qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/gcov_tarball --- qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/gcov_tarball 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/gcov_tarball 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,16 @@ +#!/bin/sh + +# This script is from the Checkbox Interface +# This is Checkbox which provides an extensible interface for system testing. +# See the following page for documentation: +# https://wiki.ubuntu.com/Testing/Automation/Checkbox + +set -o errexit + +cd /usr/share +tar -xzf gcov.tar.gz + +cd /tmp +lcov -q -c -o gcov.info +genhtml -q -o gcov gcov.info 2>/dev/null +tar -czf - gcov diff -Nru qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/gst_pipeline_test qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/gst_pipeline_test --- qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/gst_pipeline_test 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/gst_pipeline_test 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,43 @@ +#!/usr/bin/python + +# This script is from the Checkbox Interface +# This is Checkbox which provides an extensible interface for system testing. +# See the following page for documentation: +# https://wiki.ubuntu.com/Testing/Automation/Checkbox + +import sys +import time + +import pygst +pygst.require("0.10") + +from optparse import OptionParser + + +def main(args): + import gst + + usage = "Usage: %prog [OPTIONS] PIPELINE" + parser = OptionParser(usage=usage) + parser.add_option("-t", "--timeout", + type="int", + default=0, + help="Timeout for running the pipeline.") + (options, args) = parser.parse_args(args) + + if len(args) != 1: + parser.error("Must provide a PIPELINE") + + pipeline = args[0] + element = gst.parse_launch(pipeline) + element.set_state(gst.STATE_PLAYING) + + if options.timeout: + time.sleep(options.timeout) + + element.set_state(gst.STATE_NULL) + return 0 + + +if __name__ == "__main__": + sys.exit(main(sys.argv[1:])) diff -Nru qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/hal_resource qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/hal_resource --- qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/hal_resource 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/hal_resource 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,483 @@ +#!/usr/bin/python +# +# This file is part of Checkbox. +# +# Copyright 2009 Canonical Ltd. +# +# Checkbox is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Checkbox is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Checkbox. If not, see . +# + +# This script is from the Checkbox Interface +# This is Checkbox which provides an extensible interface for system testing. +# See the following page for documentation: +# https://wiki.ubuntu.com/Testing/Automation/Checkbox + + +import re +import sys +import dbus +import string +import posixpath + +from checkbox.lib.dmi import DmiNotAvailable +from checkbox.lib.pci import Pci +from checkbox.lib.usb import Usb + + +class UnknownName(object): + def __init__(self, function): + self._function = function + + def __get__(self, instance, cls=None): + self._instance = instance + return self + + def __call__(self, *args, **kwargs): + name = self._function(self._instance, *args, **kwargs) + if name and name.startswith("Unknown ("): + name = None + + return name + + +class DeviceResource(object): + __slots__ = ("_properties") + + def __init__(self, properties): + self._properties = properties + + @property + def bus(self): + return self._properties.get("linux.subsystem") + + @property + def category(self): + if "system.hardware.vendor" in self._properties: + return "SYSTEM" + + if "net.interface" in self._properties: + return "NETWORK" + + if "pci.device_class" in self._properties: + class_id = self._properties["pci.device_class"] + subclass_id = self._properties["pci.device_subclass"] + + if class_id == Pci.BASE_CLASS_NETWORK: + return "NETWORK" + + if class_id == Pci.BASE_CLASS_DISPLAY: + return "VIDEO" + + if class_id == Pci.BASE_CLASS_SERIAL \ + and subclass_id == Pci.CLASS_SERIAL_USB: + return "USB" + + if class_id == Pci.BASE_CLASS_STORAGE: + if subclass_id == Pci.CLASS_STORAGE_SCSI: + return "SCSI" + + if subclass_id == Pci.CLASS_STORAGE_IDE: + return "IDE" + + if subclass_id == Pci.CLASS_STORAGE_FLOPPY: + return "FLOPPY" + + if subclass_id == Pci.CLASS_STORAGE_RAID: + return "RAID" + + if class_id == Pci.BASE_CLASS_COMMUNICATION \ + and subclass_id == Pci.CLASS_COMMUNICATION_MODEM: + return "MODEM" + + if class_id == Pci.BASE_CLASS_INPUT \ + and subclass_id == Pci.CLASS_INPUT_SCANNER: + return "SCANNER" + + if class_id == Pci.BASE_CLASS_MULTIMEDIA: + if subclass_id == Pci.CLASS_MULTIMEDIA_VIDEO: + return "CAPTURE" + + if subclass_id == Pci.CLASS_MULTIMEDIA_AUDIO \ + or subclass_id == Pci.CLASS_MULTIMEDIA_AUDIO_DEVICE: \ + return "AUDIO" + + if class_id == Pci.BASE_CLASS_SERIAL \ + and subclass_id == Pci.CLASS_SERIAL_FIREWIRE: + return "FIREWIRE" + + if class_id == Pci.BASE_CLASS_BRIDGE \ + and (subclass_id == Pci.CLASS_BRIDGE_PCMCIA \ + or subclass_id == Pci.CLASS_BRIDGE_CARDBUS): + return "SOCKET" + + if "usb.interface.class" in self._properties: + interface_class = self._properties["usb.interface.class"] + interface_subclass = self._properties["usb.interface.subclass"] + + if interface_class == Usb.BASE_CLASS_AUDIO: + return "AUDIO" + + if interface_class == Usb.BASE_CLASS_PRINTER: + return "PRINTER" + + if interface_class == Usb.BASE_CLASS_STORAGE: + if interface_subclass == Usb.CLASS_STORAGE_FLOPPY: + return "FLOPPY" + + if interface_subclass == Usb.CLASS_STORAGE_SCSI: + return "SCSI" + + if interface_class == Usb.BASE_CLASS_VIDEO: + return "VIDEO" + + if interface_class == Usb.BASE_CLASS_WIRELESS: + return "NETWORK" + + if "info.capabilities" in self._properties: + capabilities = self._properties["info.capabilities"] + if "input.keyboard" in capabilities: + return "KEYBOARD" + + if "input.mouse" in capabilities: + return "MOUSE" + + if "storage.drive_type" in self._properties: + drive_type = self._properties["storage.drive_type"] + if drive_type == "cdrom": + return "CDROM" + + if drive_type == "disk": + return "DISK" + + if drive_type == "floppy": + return "FLOPPY" + + if "scsi.type" in self._properties: + type = self._properties["scsi.type"] + if type == "disk": + return "DISK" + + if type == "tape": + return "TAPE" + + if type == "printer": + return "PRINTER" + + if type == "cdrom": + return "CDROM" + + if type == "scanner": + return "SCANNER" + + if type == "raid": + return "RAID" + + if self.product_id: + return "OTHER" + + return None + + @property + def driver(self): + return self._properties.get("info.linux.driver") + + @property + def path(self): + return self._properties.get("linux.sysfs_path", "").replace("/sys", "") + + @property + def product_id(self): + if "info.subsystem" in self._properties: + product_id = "%s.product_id" % self._properties["info.subsystem"] + if product_id in self._properties: + return self._properties[product_id] + + # pnp + if "pnp.id" in self._properties: + match = re.match(r"^(?P.*)(?P[%s]{4})$" + % string.hexdigits, self._properties["pnp.id"]) + if match: + return int(match.group("product_id"), 16) + + return None + + @property + def vendor_id(self): + if "info.subsystem" in self._properties: + vendor_id = "%s.vendor_id" % self._properties["info.subsystem"] + if vendor_id in self._properties: + return self._properties[vendor_id] + + return None + + @property + def subproduct_id(self): + return self._properties.get("pci.subsys_product_id") + + @property + def subvendor_id(self): + return self._properties.get("pci.subsys_vendor_id") + + @property + def product(self): + return self._get_product() + + @UnknownName + def _get_product(self): + bus = self.bus + + # Ignore subsystems using parent or generated names + if bus in ("drm", "net", "pci", "pnp", "scsi_generic", + "scsi_host", "tty", "usb", "video4linux"): + return None + + # Treat the floppy device specifically + if bus == "platform": + if self.driver == "floppy": + return "Platform Device" + else: + return None + + if "usb.interface.number" in self._properties: + return None + + if self._properties.get("info.category") == "ac_adapter": + return None + + for property in ("alsa.device_id", + "alsa.card_id", + "sound.card_id", + "battery.model", + "ieee1394.product", + "killswitch.name", + "oss.device_id", + "scsi.model", + "system.hardware.product", + "info.product"): + if property in self._properties: + return self._properties[property] + + return None + + @property + def vendor(self): + return self._get_vendor() + + @UnknownName + def _get_vendor(self): + bus = self.bus + + # Ignore subsystems using parent or generated names + if bus in ("drm", "pci", "rfkill", "usb"): + return None + + # pnp + if "pnp.id" in self._properties: + match = re.match(r"^(?P.*)(?P[%s]{4})$" + % string.hexdigits, self._properties["pnp.id"]) + if match: + return match.group("vendor_name") + + for property in ("battery.vendor", + "ieee1394.vendor", + "scsi.vendor", + "system.hardware.vendor", + "info.vendor"): + if property in self._properties: + return self._properties[property] + + return None + + +class DmiDeviceResource(DeviceResource): + + _category_to_property = { + "BIOS": "system.firmware", + "BOARD": "system.board", + "CHASSIS": "system.chassis"} + + def __init__(self, properties, category): + super(DmiDeviceResource, self).__init__(properties) + if category not in self._category_to_property: + raise Exception, "Unsupported category: %s" % category + + self._category = category + + @property + def _property(self): + return self._category_to_property[self._category] + + @property + def category(self): + return self._category + + @property + def path(self): + path = super(DmiDeviceResource, self).path + return posixpath.join(path, self._category.lower()) + + @property + def product(self): + for subproperty in "product", "type", "version": + property = "%s.%s" % (self._property, subproperty) + product = self._properties.get(property) + if product and product != "Not Available": + return product + + return None + + @property + def vendor(self): + return self._get_vendor() + + @DmiNotAvailable + def _get_vendor(self): + for subproperty in "vendor", "manufacturer": + property = "%s.%s" % (self._property, subproperty) + if property in self._properties: + return self._properties[property] + + return None + + +class HalResource(object): + """Resource for HAL information. + + Each item contained in this resource consists of the udi as key and + the corresponding device resource as value. + """ + + # See also section "Deprecated Properties" of the "HAL 0.5.10 Specification", + # available from http://people.freedesktop.org/~david/hal-spec/hal-spec.html + _deprecated_expressions = ( + (r"info\.bus", "info.subsystem"), + (r"([^\.]+)\.physical_device", "\1.originating_device"), + (r"power_management\.can_suspend_to_ram", "power_management.can_suspend"), + (r"power_management\.can_suspend_to_disk", "power_management.can_hibernate"), + (r"smbios\.system\.manufacturer", "system.hardware.vendor"), + (r"smbios\.system\.product", "system.hardware.product"), + (r"smbios\.system\.version", "system.hardware.version"), + (r"smbios\.system\.serial", "system.hardware.serial"), + (r"smbios\.system\.uuid", "system.hardware.uuid"), + (r"smbios\.bios\.vendor", "system.firmware.vendor"), + (r"smbios\.bios\.version", "system.firmware.version"), + (r"smbios\.bios\.release_date", "system.firmware.release_date"), + (r"smbios\.chassis\.manufacturer", "system.chassis.manufacturer"), + (r"smbios\.chassis\.type", "system.chassis.type"), + (r"system\.vendor", "system.hardware.vendor"), + (r"usb_device\.speed_bcd", "usb_device.speed"), + (r"usb_device\.version_bcd", "usb_device.version")) + + _conversion_types = { + dbus.Boolean: bool, + dbus.Int16: int, + dbus.UInt16: int, + dbus.Int32: int, + dbus.UInt32: int, + dbus.Int64: int, + dbus.UInt64: int, + dbus.Double: float, + dbus.Array: list, + dbus.Dictionary: dict, + dbus.String: str, + dbus.UTF8String: unicode} + + def __init__(self, *args, **kwargs): + super(HalResource, self).__init__(*args, **kwargs) + self._deprecated_patterns = ((re.compile("^%s$" % a), b) + for (a, b) in self._deprecated_expressions) + + def _get_key(self, key): + key = str(key) + for (old, new) in self._deprecated_patterns: + key = old.sub(new, key) + + return key + + def _get_value(self, value): + return self._conversion_types[type(value)](value) + + def _ignore_device(self, device): + # Ignore devices without bus information + if not device.bus: + return True + + # Ignore devices without product information + if not device.product and device.product_id is None: + return True + + # Ignore invalid subsystem information + if (device.subproduct_id is None and device.subvendor_id is not None) \ + or (device.subproduct_id is not None and device.subvendor_id is None): + return True + + # Ignore virtual devices except for dmi information + if device.bus != "dmi" \ + and "virtual" in device.path.split(posixpath.sep): + return True + + return False + + @property + def devices(self): + devices = [] + bus = dbus.SystemBus() + manager_obj = bus.get_object("org.freedesktop.Hal", "/org/freedesktop/Hal/Manager") + manager = dbus.Interface(manager_obj, "org.freedesktop.Hal.Manager") + for udi in manager.GetAllDevices(): + name = udi.split(posixpath.sep)[-1] + object = bus.get_object("org.freedesktop.Hal", udi) + interface = dbus.Interface(object, "org.freedesktop.Hal.Device") + + properties = {} + for key, value in interface.GetAllProperties().iteritems(): + key = self._get_key(key) + value = self._get_value(value) + properties[key] = value + + if name == "computer": + properties["linux.subsystem"] = "dmi" + properties["linux.sysfs_path"] = "/sys/devices/virtual/dmi/id" + + device = DeviceResource(properties) + devices.append(device) + for category in "BIOS", "BOARD", "CHASSIS": + device = DmiDeviceResource(properties, category) + devices.append(device) + else: + device = DeviceResource(properties) + devices.append(device) + + return [d for d in devices if not self._ignore_device(d)] + + +def main(): + attributes = ("path", "bus", "category", "driver", "product_id", + "vendor_id", "subproduct_id", "subvendor_id", "product", "vendor",) + + hal = HalResource() + for device in hal.devices: + for attribute in attributes: + value = getattr(device, attribute) + if value is not None: + print "%s: %s" % (attribute, value) + + # Empty line + print + + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff -Nru qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/internet_test qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/internet_test --- qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/internet_test 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/internet_test 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,150 @@ +#!/usr/bin/python + +# This script is from the Checkbox Interface +# This is Checkbox which provides an extensible interface for system testing. +# See the following page for documentation: +# https://wiki.ubuntu.com/Testing/Automation/Checkbox + + +import os +import re +import sys + +import commands +import logging +import socket +import struct +import gettext + +from gettext import gettext as _ + +from optparse import OptionParser + +class Route(object): + """Gets routing information from the system. + """ + + # auxiliary functions + def _hex_to_dec(self, string): + """Returns the integer value of a hexadecimal string s + """ + return int(string, 16) + + def _num_to_dotted_quad(self, number): + """Convert long int to dotted quad string + """ + return socket.inet_ntoa(struct.pack("\w+)\s+00000000\s+(?P[\w]+)\s+") + w = h.search(route) + if w: + if w.group("def_gateway"): + return self._num_to_dotted_quad(self._hex_to_dec(w.group("def_gateway"))) + else: + logging.error("Could not find def gateway info in /proc") + return None + else: + logging.error("Could not find def gateway info in /proc") + return None + + def _get_default_gateway_from_bin_route(self): + """Get default gateway from /sbin/route -n + Called by get_default_gateway and is only used if could not get that from /proc + """ + logging.debug("Reading default gateway information from route binary") + routebin = commands.getstatusoutput("export LANGUAGE=C; /usr/bin/env route -n") + + if routebin[0] == 0: + h = re.compile("\n0.0.0.0\s+(?P[\w.]+)\s+") + w = h.search(routebin[1]) + if w: + def_gateway = w.group("def_gateway") + if def_gateway: + return def_gateway + + logging.error("Could not find default gateway by running route") + return None + + def get_hostname(self): + return socket.gethostname() + + def get_default_gateway(self): + t1 = self._get_default_gateway_from_proc() + if not t1: + t1 = self._get_default_gateway_from_bin_route() + + return t1 + +def ping(host, count, deadline, verbose=False): + command = "ping -R -c %s -w %s %s" % (count, deadline, host) + reg = re.compile(r"(\d) received") + packets_received = 0 + + output = os.popen(command) + for line in output.readlines(): + if verbose: + print line.rstrip() + + received = re.findall(reg, line) + if received: + packets_received = int(received[0]) + + return packets_received + +def main(args): + + gettext.textdomain("checkbox") + + default_count = 2 + default_delay = 4 + + usage = "%prog [HOST]" + parser = OptionParser(usage=usage) + parser.add_option("-c", "--count", + default=default_count, + type="int", + help="Number of packets to send.") + parser.add_option("-d", "--deadline", + default=default_delay, + type="int", + help="Timeouts in seconds.") + parser.add_option("-v", "--verbose", + default=False, + action="store_true", + help="Be verbose.") + (options, args) = parser.parse_args(args) + + if args: + host = args.pop(0) + else: + route = Route() + host = route.get_default_gateway() + + received_packets = 0 + if host: + received_packets = ping(host, options.count, options.deadline, + options.verbose) + + if received_packets == 0: + print _("No Internet connection") + return 1 + elif received_packets != options.count: + print _("Connection established lost a packet") + return 1 + else: + print _("Internet connection fully established") + return 0 + +if __name__ == "__main__": + sys.exit(main(sys.argv[1:])) diff -Nru qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/keyboard_test qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/keyboard_test --- qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/keyboard_test 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/keyboard_test 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,85 @@ +#!/usr/bin/python + +# This script is from the Checkbox Interface +# This is Checkbox which provides an extensible interface for system testing. +# See the following page for documentation: +# https://wiki.ubuntu.com/Testing/Automation/Checkbox + +import os +import sys +from gettext import gettext as _ +import gettext + +def cli_prompt(): + import termios + + limit = 50 + separator = ord("\n") + fileno = sys.stdin.fileno() + saved_attributes = termios.tcgetattr(fileno) + attributes = termios.tcgetattr(fileno) + attributes[3] = attributes[3] & ~(termios.ICANON) + attributes[6][termios.VMIN] = 1 + attributes[6][termios.VTIME] = 0 + termios.tcsetattr(fileno, termios.TCSANOW, attributes) + + sys.stdout.write(_("Enter text:\n")) + + input = "" + try: + while len(input) < limit: + ch = str(sys.stdin.read(1)) + if ord(ch) == separator: + break + input += ch + finally: + termios.tcsetattr(fileno, termios.TCSANOW, saved_attributes) + +def gtk_prompt(): + import pygtk + pygtk.require('2.0') + import gtk + + # create a new window + window = gtk.Window(gtk.WINDOW_TOPLEVEL) + window.set_size_request(200, 100) + window.set_resizable(False) + window.set_title(_("Type Text")) + window.connect("delete_event", lambda w,e: gtk.main_quit()) + + vbox = gtk.VBox(False, 0) + window.add(vbox) + vbox.show() + + entry = gtk.Entry() + entry.set_max_length(50) + vbox.pack_start(entry, True, True, 0) + entry.show() + + hbox = gtk.HBox(False, 0) + vbox.add(hbox) + hbox.show() + + button = gtk.Button(stock=gtk.STOCK_CLOSE) + button.connect("clicked", lambda w: gtk.main_quit()) + vbox.pack_start(button, False, False, 0) + button.set_flags(gtk.CAN_DEFAULT) + button.grab_default() + button.show() + window.show() + + gtk.main() + +def main(args): + + gettext.textdomain("checkbox") + + if "DISPLAY" in os.environ: + gtk_prompt() + else: + cli_prompt() + + return 0 + +if __name__ == "__main__": + sys.exit(main(sys.argv[1:])) diff -Nru qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/lsb_resource qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/lsb_resource --- qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/lsb_resource 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/lsb_resource 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,61 @@ +#!/usr/bin/python +# +# This file is part of Checkbox. +# +# Copyright 2009 Canonical Ltd. +# +# Checkbox is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Checkbox is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Checkbox. If not, see . +# + +# This script is from the Checkbox Interface +# This is Checkbox which provides an extensible interface for system testing. +# See the following page for documentation: +# https://wiki.ubuntu.com/Testing/Automation/Checkbox + +import sys + +from subprocess import Popen, PIPE + + +# Command to retrieve lsb release information. +COMMAND = "lsb_release -a 2>/dev/null" + + +def get_lsb_release(): + lsb_release_map = { + "Distributor ID": "distributor_id", + "Description": "description", + "Release": "release", + "Codename": "codename"} + + lsb_release = {} + output = Popen(COMMAND, stdout=PIPE, shell=True).communicate()[0] + for line in [l for l in output.split("\n") if l]: + (key, value) = line.split(":\t", 1) + if key in lsb_release_map: + key = lsb_release_map[key] + lsb_release[key] = value + + return lsb_release + +def main(): + lsb_release = get_lsb_release() + for key, value in lsb_release.iteritems(): + print "%s: %s" % (key, value) + + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff -Nru qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/ltp_filter qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/ltp_filter --- qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/ltp_filter 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/ltp_filter 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,95 @@ +#!/usr/bin/python + +# This script is from the Checkbox Interface +# This is Checkbox which provides an extensible interface for system testing. +# See the following page for documentation: +# https://wiki.ubuntu.com/Testing/Automation/Checkbox + +import re +import sys + +from optparse import OptionParser + +# TPASS The test case produced expected results. +# TFAIL The test case produced unexpected results. +# TBROK A resource needed to execute the test case was not available (e.g. a temporary file could not be opened). +# TCONF The test case was not appropriate for the current hardware or software configuration (e.g. MLS was not enabled). +# TRETR The test case was no longer valid and has been "retired." +# TWARN The testing procedure caused undesirable side effects that did not affect test results (e.g. a temporary file could not be removed after all test results were recorded). +# TINFO An informative message about the execution of the test that does not correspond to a test case result and does not indicate a problem. + +ltp_to_checkox_status = { + "TPASS": "pass", + "TFAIL": "fail", + "TBROK": "unresolved", + "TCONF": "unsupported"} + +def print_line(key, value): + print "%s: %s" % (key, value) + +def print_element(element): + for key, value in element.iteritems(): + print_line(key, value) + + print + +def parse_file(file): + test_pattern = re.compile("(?P\w+)\s+(?P\d+)\s+(?P[A-Z]+)\s+:\s+(?P.*)") + + elements = [] + for line in file.readlines(): + match = test_pattern.match(line) + if match: + if match.group("status") in ltp_to_checkox_status: + element = { + "plugin": "shell", + "name": "%s.%s" % (match.group("case"), match.group("number")), + "requires": "package.alias == 'linux'", + "description": "%s.%s" % (match.group("case"), match.group("number")), + "status": ltp_to_checkox_status[match.group("status")], + "data": match.group("data")} + elements.append(element) + + return elements + +def parse_filename(filename): + if filename == "-": + file = sys.stdin + else: + file = open(filename, "r") + + return parse_file(file) + +def parse_filenames(filenames): + elements = [] + for filename in filenames: + elements.extend(parse_filename(filename)) + + return elements + +def main(args): + usage = "Usage: %prog [FILE...]" + parser = OptionParser(usage=usage) + parser.add_option("-s", "--suite", + help="Suite corresponding to the tests") + (options, args) = parser.parse_args(args) + + if not args: + filenames = ["-"] + else: + filenames = args + + elements = parse_filenames(filenames) + if not elements: + return 1 + + for element in elements: + if options.suite: + element["suite"] = options.suite + print_element(element) + + return 0 + + +if __name__ == "__main__": + sys.exit(main(sys.argv[1:])) diff -Nru qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/ltp_suite qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/ltp_suite --- qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/ltp_suite 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/ltp_suite 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,156 @@ +#!/usr/bin/python + +# This script is from the Checkbox Interface +# This is Checkbox which provides an extensible interface for system testing. +# See the following page for documentation: +# https://wiki.ubuntu.com/Testing/Automation/Checkbox + +import re +import os +import sys +import posixpath + +from subprocess import Popen, PIPE +from urlparse import urlparse + +from optparse import OptionParser + + +DEFAULT_DIRECTORY = "/var/cache/checkbox/ltp" +DEFAULT_LOCATION = ":pserver:anonymous:@ltp.cvs.sourceforge.net:/cvsroot/ltp" +DEFAULT_TIMEOUT = 10800 + +COMMAND_TEMPLATE = "cd '%(directory)s' && ./runltp -f %(suite)s -r '%(directory)s' -p -q 2>/dev/null | ltp_filter --suite=%(suite)s" + +def print_line(key, value): + if type(value) is list: + print "%s:" % key + for v in value: + print " %s" % v + else: + print "%s: %s" % (key, value) + +def print_element(element): + for key, value in element.iteritems(): + print_line(key, value) + + print + +def parse_url(url): + scheme, host, path, params, query, fragment = urlparse(url) + + if "@" in host: + username, host = host.rsplit("@", 1) + if ":" in username: + username, password = username.split(":", 1) + else: + password = None + else: + username = password = None + + if ":" in host: + host, port = host.split(":") + assert port.isdigit() + port = int(port) + else: + port = None + + return scheme, username, password, host, port, path, params, query, fragment + +def checkout_ltp(location, directory): + if posixpath.exists(directory): + return + + target_directory = posixpath.basename(directory) + next_directory = posixpath.dirname(directory) + if not posixpath.exists(next_directory): + os.makedirs(next_directory) + + previous_directory = posixpath.abspath(posixpath.curdir) + os.chdir(next_directory) + + # Use this to prevent installing into /opt + os.environ["DESTDIR"] = directory + os.environ["SKIP_IDCHECK"] = "1" + + for command_template in [ + "cvs -d '%(location)s' login", + "cvs -z3 -d '%(location)s' co -d %(target_directory)s ltp", + "make -C '%(target_directory)s' autotools", + "cd '%(target_directory)s' && ./configure", + "make -C '%(target_directory)s'", + "make -C '%(target_directory)s' install"]: + command = command_template % { + "location": location, + "target_directory": target_directory} + process = Popen(command, shell=True, stdout=PIPE, stderr=PIPE) + stdout, stderr = process.communicate() + if process.returncode: + raise Exception, "Failed to run command %s" % command + + os.chdir(previous_directory) + +def run_ltp(location, directory, timeout=None): + checkout_ltp(location, directory) + + description_pattern = re.compile(r"#DESCRIPTION:(?P.*)") + + elements = [] + directory = posixpath.join(directory, "opt", "ltp") + suites_directory = posixpath.join(directory, "runtest") + for suite_name in os.listdir(suites_directory): + suite_path = posixpath.join(suites_directory, suite_name) + if posixpath.isfile(suite_path): + first_line = open(suite_path, "r").readline() + match = description_pattern.match(first_line) + if match: + description = match.group("description") + element = {} + element["plugin"] = "remote" + element["depends"] = "ltp" + element["timeout"] = timeout + element["name"] = suite_name + element["description"] = match.group("description") + element["user"] = "root" + element["command"] = COMMAND_TEMPLATE % { + "suite": suite_name, + "directory":directory} + + elements.append(element) + + return elements + +def main(args): + usage = "Usage: %prog [OPTIONS]" + parser = OptionParser(usage=usage) + parser.add_option("-d", "--directory", + default=DEFAULT_DIRECTORY, + help="Directory where to branch ltp") + parser.add_option("-l", "--location", + default=DEFAULT_LOCATION, + help="Location from where to checkout ltp") + parser.add_option("-t", "--timeout", + default=DEFAULT_TIMEOUT, + type="int", + help="Timeout when running ltp") + (options, args) = parser.parse_args(args) + + # Check for http_proxy environment variable + location = options.location + if "http_proxy" in os.environ: + host, port = parse_url(os.environ["http_proxy"])[3:5] + pserver_proxy = "pserver;proxy=%s;proxyport=%s" % (host, port) + location = location.replace("pserver", pserver_proxy) + + suites = run_ltp(location, options.directory, options.timeout) + if not suites: + return 1 + + for suite in suites: + print_element(suite) + + return 0 + + +if __name__ == "__main__": + sys.exit(main(sys.argv[1:])) diff -Nru qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/meminfo_resource qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/meminfo_resource --- qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/meminfo_resource 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/meminfo_resource 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,64 @@ +#!/usr/bin/python +# +# This file is part of Checkbox. +# +# Copyright 2009 Canonical Ltd. +# +# Checkbox is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Checkbox is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Checkbox. If not, see . +# + +# This script is from the Checkbox Interface +# This is Checkbox which provides an extensible interface for system testing. +# See the following page for documentation: +# https://wiki.ubuntu.com/Testing/Automation/Checkbox + +import re +import sys + + +# Filename where meminfo is stored. +FILENAME = "/proc/meminfo" + + +def get_meminfo(): + key_value_pattern = re.compile(r"(?P.*):\s+(?P.*)") + meminfo_map = { + "MemTotal": "total", + "SwapTotal": "swap"} + + meminfo = {} + file = open(FILENAME, "r") + for line in file.readlines(): + line = line.strip() + match = key_value_pattern.match(line) + if match: + key = match.group("key") + if key in meminfo_map: + key = meminfo_map[key] + value = match.group("value") + (integer, factor) = value.split() + meminfo[key] = int(integer) * 1024 + + return meminfo + +def main(): + meminfo = get_meminfo() + for key, value in meminfo.iteritems(): + print "%s: %s" % (key, value) + + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff -Nru qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/module_resource qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/module_resource --- qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/module_resource 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/module_resource 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,78 @@ +#!/usr/bin/python +# +# This file is part of Checkbox. +# +# Copyright 2009 Canonical Ltd. +# +# Checkbox is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Checkbox is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Checkbox. If not, see . +# + +# This script is from the Checkbox Interface +# This is Checkbox which provides an extensible interface for system testing. +# See the following page for documentation: +# https://wiki.ubuntu.com/Testing/Automation/Checkbox + +import sys + + +# Filename where cpuinfo is stored. +MODULES_FILENAME = "/proc/modules" + + +def get_module(line): + """ + Each line consists of the following information for each module: + + name: Name of the module. + size: Memory size of the module, in bytes. + instances: How many instances of the module are currently loaded. + dependencies: If the module depends upon another module to be present + in order to function, and lists those modules. + state: The load state of the module: Live, Loading or Unloading. + offset: Current kernel memory offset for the loaded module. + """ + (name, size, instances, dependencies, state, offset) = line.split(" ")[:6] + if dependencies == "-": + dependencies = "" + + return { + "name": name, + "size": int(size), + "instances": int(instances), + "dependencies": dependencies.replace(",", " ").strip(), + "state": state, + "offset": int(offset, 16)} + +def get_modules(filename): + file = open(filename, "r") + for line in file.readlines(): + line = line.strip() + if line: + yield get_module(line) + + +def main(): + modules = get_modules(MODULES_FILENAME) + for module in modules: + for key, value in module.iteritems(): + if value != "": + print "%s: %s" % (key, value) + + # Empty line + print + + return 0 + +if __name__ == "__main__": + sys.exit(main()) diff -Nru qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/network_check qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/network_check --- qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/network_check 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/network_check 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,72 @@ +#!/usr/bin/python + +# This script is from the Checkbox Interface +# This is Checkbox which provides an extensible interface for system testing. +# See the following page for documentation: +# https://wiki.ubuntu.com/Testing/Automation/Checkbox + +""" +Check that it's possible to establish http and ftp connections against +ubuntu.com +""" +from subprocess import call +from optparse import OptionParser, Option +import urllib2 +import sys + + +def check_url(url): + """ + Open URL and return True if no exceptions were raised + """ + try: + urllib2.urlopen(url) + except urllib2.URLError: + return False + + return True + +def main(): + """ + Check HTTP and FTP connections + """ + usage = 'Usage %prog [OPTIONS]' + parser = OptionParser(usage) + parser.add_option('-a', '--auto', + action='store_true', + default=False, + help='Runs in Automated mode, with no visible output') + + (options,args) = parser.parse_args() + + url = {"http": "http://cdimage.ubuntu.com/daily/current/", + "ftp": "ftp://cdimage.ubuntu.com/cdimage/daily/current/",} + + results = {} + for protocol, value in url.iteritems(): + results[protocol] = check_url(value) + + bool2str = {True: 'Success', False: 'Failed'} + message = ("HTTP connection: %(http)s\n" + "FTP connection: %(ftp)s\n" + % dict([(protocol, bool2str[value]) + for protocol, value in results.iteritems()])) + + command = ["zenity", "--title=Network", + "--text=%s" % message] + + if all(results.itervalues()): + command.append("--info") + else: + command.append("--error") + + if not options.auto: + call(command) + + if any(results.itervalues()): + return 0 + else: + return 1 + +if __name__ == "__main__": + sys.exit(main()) diff -Nru qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/network_test qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/network_test --- qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/network_test 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/network_test 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,30 @@ +#!/usr/bin/python + +# This script is from the Checkbox Interface +# This is Checkbox which provides an extensible interface for system testing. +# See the following page for documentation: +# https://wiki.ubuntu.com/Testing/Automation/Checkbox + + +import os +import re +import sys + + +def main(args): + devices = [] + command = "lspci" + for line in os.popen(command).readlines(): + match = re.match("^.*(Network|Ethernet) controller: (.*)", line) + if match: + devices.append(match.group(2)) + + if devices: + print "\n".join(devices) + return 0 + else: + print "Not found." + return 1 + +if __name__ == "__main__": + sys.exit(main(sys.argv[1:])) diff -Nru qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/package_resource qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/package_resource --- qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/package_resource 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/package_resource 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,125 @@ +#!/usr/bin/python +# +# This file is part of Checkbox. +# +# Copyright 2009 Canonical Ltd. +# +# Checkbox is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Checkbox is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Checkbox. If not, see . +# + +# This script is from the Checkbox Interface +# This is Checkbox which provides an extensible interface for system testing. +# See the following page for documentation: +# https://wiki.ubuntu.com/Testing/Automation/Checkbox + +import os +import sys + +from optparse import OptionParser +from subprocess import Popen, PIPE + + +# Command to retrieve packages. +COMMAND = "COLUMNS=200 dpkg -l" + + +def get_packages(file): + desired_to_value = { + "u": "Unknown", + "i": "Install", + "r": "Remove", + "p": "Purge", + "h": "Hold"} + + status_to_value = { + "n": "Not Installed", + "i": "Installed", + "c": "Cfg-files", + "u": "Unpacked", + "u": "Failed-cfg", + "h": "Half-inst"} + + error_to_value = { + "": None, + "h": "Hold", + "r": "Reinst-required", + "x": "both-problems"} + + columns = ["desired", "status", "error", "name", "version", "description"] + aliases = { + "linux-image-" + os.uname()[2]: "linux"} + + # Skip header lines + while True: + line = file.readline() + if line.startswith("+++"): + break + + # Get length from separator + lengths = [0, 1, 2] + lengths.extend([len(i) + 1 for i in line.split("-")]) + for i in range(4, len(lengths)): + lengths[i] += lengths[i - 1] + + # Get remaining lines + for line in file.readlines(): + package = {} + for i, column in enumerate(columns): + value = line[lengths[i]:lengths[i+1]].strip() + + # Convert value + if column == "desired": + value = desired_to_value.get(value) + elif column == "status": + value = status_to_value.get(value) + elif column == "error": + value = error_to_value.get(value) + + # Set value + if value: + package[column] = value + + name = package["name"] + if name in aliases: + yield dict(package) + package["name"] = aliases[name] + + yield package + +def main(args): + usage = "Usage: %prog [FILE...]" + parser = OptionParser(usage=usage) + parser.add_option("-i", "--input", + action="store_true", + help="Read packages from stdin") + (options, args) = parser.parse_args(args) + + if options.input: + file = sys.stdin + else: + file = Popen(COMMAND, stdout=PIPE, shell=True).stdout + + packages = get_packages(file) + for package in packages: + for key, value in package.iteritems(): + print "%s: %s" % (key, value) + + # Empty line + print + + return 0 + + +if __name__ == "__main__": + sys.exit(main(sys.argv[1:])) diff -Nru qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/phoronix_filter qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/phoronix_filter --- qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/phoronix_filter 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/phoronix_filter 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,154 @@ +#!/usr/bin/python + +# This script is from the Checkbox Interface +# This is Checkbox which provides an extensible interface for system testing. +# See the following page for documentation: +# https://wiki.ubuntu.com/Testing/Automation/Checkbox + + +import os +import sys + +import logging +import pexpect +import posixpath + +from logging import StreamHandler, FileHandler, Formatter + +from optparse import OptionParser + +from xml.dom import minidom + + +DEFAULT_DIRECTORY = "/var/cache/checkbox/phoronix" +DEFAULT_LOG_LEVEL = "critical" +DEFAULT_SAVE_NAME = "checkbox" +DEFAULT_TIMEOUT = 900 + +UNIQUE_NAME_CHARACTERS = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" + + +def unique_name(length=15): + l = len(UNIQUE_NAME_CHARACTERS) + return "".join([UNIQUE_NAME_CHARACTERS[ord(c)%l] for c in os.urandom(length)]) + +def get_benchmark(node, name): + for benchmark in node.getElementsByTagName("Benchmark"): + for child in benchmark.childNodes: + if child.nodeName == "TestName" \ + and child.firstChild.data == name: + return benchmark + + return None + +def get_result(node, name): + for entry in node.getElementsByTagName("Entry"): + for child in entry.childNodes: + if child.nodeName == "Identifier" \ + and child.firstChild.data == name: + return entry + + return None + +def parse_phoronix(options, suite): + file = posixpath.expanduser("~/.phoronix-test-suite/test-results/%s/composite.xml" + % options.save_name) + tree = minidom.parse(file) + benchmark = get_benchmark(tree, suite) + if benchmark: + result = get_result(benchmark, options.run_name) + if result: + value = result.getElementsByTagName("Value")[0] + return value.firstChild.data + + return None + +def run_phoronix(options, suite): + question_answer = [ + ("Enter a name to save these results: ", options.save_name), + ("Enter a unique name for this test run: ", options.run_name)] + + command = posixpath.join(options.directory, "phoronix-test-suite") + args = ["batch-benchmark", suite] + connection = pexpect.spawn(command, args=args, + cwd=options.directory, + timeout=options.timeout) + if logging.getLogger().getEffectiveLevel() == logging.DEBUG: + # Backward compatibility for pexpect + if hasattr(connection, "logfile"): + connection.logfile = sys.stdout + else: + connection.setlog(sys.stdout) + + while True: + questions = [qa[0] for qa in question_answer] + index = connection.expect_exact(questions + [pexpect.EOF]) + if index >= len(question_answer): + break + + answer = question_answer[index][1] + if answer is None: + answer = unique_name() + + connection.send("%s\n" % answer) + + return parse_phoronix(options, suite) + +def main(args): + usage = "Usage: %prog [OPTIONS] SUITE" + parser = OptionParser(usage=usage) + parser.add_option("-l", "--log", metavar="FILE", + help="log file where to send output") + parser.add_option("--log-level", + default=DEFAULT_LOG_LEVEL, + help="one of debug, info, warning, error or critical") + parser.add_option("-d", "--directory", + default=DEFAULT_DIRECTORY, + help="Directory where phoronix was cloned (default %default)") + parser.add_option("-r", "--run-name", + default=unique_name(), + help="Unique name for this test run (default is random)") + parser.add_option("-s", "--save-name", + default=DEFAULT_SAVE_NAME, + help="Name to save these results (default %default)") + parser.add_option("-t", "--timeout", + default=DEFAULT_TIMEOUT, + help="Timeout to run the tests (default %default)") + (options, args) = parser.parse_args(args) + + # Set logging early + log_level = logging.getLevelName(options.log_level.upper()) + log_handlers = [] + log_handlers.append(StreamHandler()) + if options.log: + log_filename = options.log + log_handlers.append(FileHandler(log_filename)) + + format = ("%(asctime)s %(levelname)-8s %(message)s") + if log_handlers: + for handler in log_handlers: + handler.setFormatter(Formatter(format)) + logging.getLogger().addHandler(handler) + if log_level: + logging.getLogger().setLevel(log_level) + elif not logging.getLogger().handlers: + logging.disable(logging.CRITICAL) + + # Parse args + if not args: + parser.error("Must specify a SUITE") + elif len(args) > 1: + parser.error("Must specify a single SUITE") + + suite = args[0] + value = run_phoronix(options, suite) + if value is None: + return 1 + + print value + + return 0 + + +if __name__ == "__main__": + sys.exit(main(sys.argv[1:])) diff -Nru qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/phoronix_suite qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/phoronix_suite --- qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/phoronix_suite 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/phoronix_suite 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,312 @@ +#!/usr/bin/python + +# This script is from the Checkbox Interface +# This is Checkbox which provides an extensible interface for system testing. +# See the following page for documentation: +# https://wiki.ubuntu.com/Testing/Automation/Checkbox + +import os +import pwd +import re +import sys + +import pexpect +import posixpath +import subprocess + +from xml.dom import minidom + +from urlparse import urlparse +from optparse import OptionParser + + +DEFAULT_DIRECTORY = "/var/cache/checkbox/phoronix" +DEFAULT_LOCATION = "http://www.phorogit.com/repo/phoronix-test-suite.git" +DEFAULT_TIMEOUT = 900 + +COMMAND_TEMPLATE = "phoronix_filter --directory=%(directory)s '%(suite)s'" + + +def print_line(key, value): + if type(value) is list: + print "%s:" % key + for v in value: + print " %s" % v + else: + print "%s: %s" % (key, value) + +def print_element(element): + for key, value in element.iteritems(): + print_line(key, value) + + print + +def print_elements(elements): + for element in elements: + print_element(element) + +def parse_url(url): + scheme, host, path, params, query, fragment = urlparse(url) + + if "@" in host: + username, host = host.rsplit("@", 1) + if ":" in username: + username, password = username.split(":", 1) + else: + password = None + else: + username = password = None + + if ":" in host: + host, port = host.split(":") + assert port.isdigit() + port = int(port) + else: + port = None + + return scheme, username, password, host, port, path, params, query, fragment + +def lsb_release(): + key_map = { + "Distributor ID": "distributor_id", + "Description": "description", + "Release": "release", + "Codename": "codename"} + + command = "lsb_release -a 2>/dev/null" + process = subprocess.Popen(command, shell=True, + stdout=subprocess.PIPE) + + lsb = {} + for line in process.stdout.readlines(): + line = line.strip() + if not line: + continue + + (key, value) = line.split(":\t", 1) + if key in key_map: + key = key_map[key] + lsb[key] = value + + return lsb + +def phoronix_packages(directory): + lsb = lsb_release() + distributor = lsb["distributor_id"].lower() + file = posixpath.join(directory, "pts-core", "static", "distro-xml", + "%s-packages.xml" % distributor) + if not posixpath.exists(file): + raise Exception, "Packages file does not exist: %s" % file + + packages = {} + tree = minidom.parse(file) + for package in tree.getElementsByTagName("Package"): + generic_node = package.getElementsByTagName("GenericName")[0] + package_node = package.getElementsByTagName("PackageName")[0] + packages[generic_node.firstChild.data] = package_node.firstChild.data + + return packages + +def phoronix_dependencies(): + dependencies = [] + if os.uname()[4] == "x86_64": + dependencies.append("ia32-libs") + + return dependencies + +def phoronix_profile(directory, name): + file = posixpath.join(directory, "pts", "test-profiles", "%s.xml" % name) + if not posixpath.exists(file): + raise Exception, "Profile file does not exist: %s" % file + + profile = {} + profile["Directory"] = directory + profile["Name"] = name + + tree = minidom.parse(file) + suite = tree.getElementsByTagName("PhoronixTestSuite")[0] + for child in suite.childNodes: + if isinstance(child, minidom.Text): + continue + + if child.nodeName in ("TestProfile", "TestInformation"): + profile.setdefault(child.nodeName, {}) + for subchild in child.childNodes: + if isinstance(subchild, minidom.Text): + continue + + if subchild.firstChild: + profile[child.nodeName][subchild.nodeName] = \ + subchild.firstChild.data + + return profile + +def phoronix_profiles(directory): + profiles = [] + profiles_directory = posixpath.join(directory, "pts", "test-profiles") + names = os.listdir(profiles_directory) + for name in names: + if name.endswith(".xml"): + name = name.replace(".xml", "") + try: + profile = phoronix_profile(directory, name) + except Exception: + continue + profiles.append(profile) + + return profiles + +def phoronix_clone(location, directory): + if posixpath.exists(directory): + return + + dirname = posixpath.dirname(directory) + if not posixpath.exists(dirname): + os.makedirs(dirname) + + process = subprocess.Popen(["git", "clone", location, directory], + stdout=subprocess.PIPE, stderr=subprocess.PIPE) + stdout, stderr = process.communicate() + if process.returncode: + raise Exception, "Failed to clone phoronix from %s" % location + +def phoronix_batch_setup(location, directory): + command = posixpath.join(directory, "phoronix-test-suite") + args = ["batch-setup"] + connection = pexpect.spawn(command, args=args, cwd=directory) + + question_answer = [ + ("Do you agree to these terms and wish to proceed (Y/n)? ", "y"), + ("Do you wish to enable anonymous usage / statistics reporting (Y/n)? ", "n"), + ("Save test results when in batch mode (Y/n)? ", "y"), + ("Open the web browser automatically when in batch mode (y/N)? ", "n"), + ("Auto upload the results to Phoronix Global (Y/n)? ", "n"), + ("Prompt for test identifier (Y/n)? ", "y"), + ("Prompt for test description (Y/n)? ", "n"), + ("Prompt for saved results file-name (Y/n)? ", "y"), + ("Run all test options (Y/n)? ", "y")] + + while True: + questions = [qa[0] for qa in question_answer] + index = connection.expect_exact(questions + [pexpect.EOF]) + if index >= len(question_answer): + break + + answer = question_answer[index][1] + connection.send("%s\n" % answer) + +def phoronix_network_setup(location, directory): + command = posixpath.join(directory, "phoronix-test-suite") + args = ["network-setup"] + connection = pexpect.spawn(command, args=args, cwd=directory) + + if "http_proxy" in os.environ: + has_proxy = "y" + proxy_host, proxy_port = parse_url(os.environ["http_proxy"])[3:5] + else: + has_proxy, proxy_host, proxy_port = "n", "", "" + + question_answer = [ + ("Configure the Phoronix Test Suite to use a HTTP proxy (y/N)? ", has_proxy), + ("Enter IP address / server name of proxy: ", proxy_host), + ("Enter TCP port for proxy server: ", proxy_port)] + + while True: + questions = [qa[0] for qa in question_answer] + index = connection.expect_exact(questions + [pexpect.EOF]) + if index >= len(question_answer): + break + + answer = question_answer[index][1] + connection.send("%s\n" % answer) + +def phoronix_setup(location, directory): + phoronix_clone(location, directory) + phoronix_batch_setup(location, directory) + phoronix_network_setup(location, directory) + +def profile_to_test(profile, packages, timeout=None): + # Default values + test = { + "plugin": "metric", + "depends": "phoronix", + "timeout": timeout, + "requires": []} + + # Profile values + test["name"] = profile["Name"] + test["command"] = COMMAND_TEMPLATE % { + "directory": profile["Directory"], + "suite": profile["Name"]} + test["environ"] = [ + "PATH=%s" % ":".join([profile["Directory"], os.environ.get("PATH", "")])] + + dependencies = phoronix_dependencies() + if dependencies: + test["requires"].extend(["package.name == '%s'" % d + for d in dependencies]) + + if "TestProfile" in profile: + test_profile = profile["TestProfile"] + external_dependencies = test_profile.get("ExternalDependencies") + if external_dependencies: + generic_names = re.split(r",\s+", external_dependencies) + package_names = [] + for generic_name in generic_names: + package_names.extend(re.split(r"\s+", packages[generic_name])) + test["requires"].extend(["package.name == '%s'" % n + for n in package_names]) + + if "TestInformation" in profile: + test_information = profile["TestInformation"] + if "Description" in test_information: + test["description"] = test_information["Description"] + + return test + +def profiles_to_tests(profiles, packages, timeout=None): + tests = [] + for profile in profiles: + test = profile_to_test(profile, packages, timeout) + tests.append(test) + + return tests + +def main(args): + usage = "Usage: %prog [OPTIONS]" + parser = OptionParser(usage=usage) + parser.add_option("-d", "--directory", + default=DEFAULT_DIRECTORY, + help="Directory where to clone phoronix (default %default)") + parser.add_option("-l", "--location", + default=DEFAULT_LOCATION, + help="Location from which to clone phoronix (default %default)") + parser.add_option("-t", "--timeout", + default=DEFAULT_TIMEOUT, + type="int", + help="Timeout when running phoronix (default %default)") + (options, args) = parser.parse_args(args) + + # Parse environment + user = os.environ.get("SUDO_USER") + if user: + pw = pwd.getpwnam(user) + os.setgid(pw.pw_gid) + os.setuid(pw.pw_uid) + os.chdir(pw.pw_dir) + + phoronix_setup(options.location, options.directory) + + profiles = phoronix_profiles(options.directory) + if not profiles: + return 1 + + packages = phoronix_packages(options.directory) + tests = profiles_to_tests(profiles, packages, options.timeout) + print_elements(tests) + + return 0 + + +if __name__ == "__main__": + sys.exit(main(sys.argv[1:])) diff -Nru qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/qa_regression_suite qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/qa_regression_suite --- qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/qa_regression_suite 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/qa_regression_suite 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,176 @@ +#!/usr/bin/python + +# This script is from the Checkbox Interface +# This is Checkbox which provides an extensible interface for system testing. +# See the following page for documentation: +# https://wiki.ubuntu.com/Testing/Automation/Checkbox + +import os +import pwd +import re +import sys + +import posixpath +import subprocess + +from optparse import OptionParser + + +DEFAULT_DIRECTORY = "/var/cache/checkbox/qa-regression-testing" +DEFAULT_LOCATION = "http://bazaar.launchpad.net/%7Eubuntu-bugcontrol/qa-regression-testing/master" +DEFAULT_SUDO_PASSWORD = "insecure" + +COMMAND_TEMPLATE = "cd %(scripts)s; python %(script)s" + + +def print_line(key, value): + if type(value) is list: + print "%s:" % key + for v in value: + print " %s" % v + else: + print "%s: %s" % (key, value) + +def print_element(element): + for key, value in element.iteritems(): + print_line(key, value) + + print + +def fetch_qa_regression(location, directory): + if posixpath.exists(directory): + return + + process = subprocess.Popen(["bzr", "export", directory, location], + stdout=subprocess.PIPE, stderr=subprocess.PIPE) + stdout, stderr = process.communicate() + if process.returncode: + raise Exception, "Failed to fetch from %s" % location + +def list_qa_regression(location, directory, dry_run): + if not dry_run: + fetch_qa_regression(location, directory) + + script_pattern = re.compile(r"^test\-.*\.py$") + + directory = posixpath.join(directory, "scripts") + for script in os.listdir(directory): + if script_pattern.match(script): + yield script + +def run_qa_regression(scripts, location, directory, dry_run): + if not dry_run: + fetch_qa_regression(location, directory) + + for script in scripts: + path = posixpath.join(directory, "scripts", script) + + # Initialize test structure + test = {} + test["plugin"] = "shell" + test["name"] = posixpath.splitext(script)[0] + test["command"] = COMMAND_TEMPLATE % { + "scripts": posixpath.dirname(path), + "script": posixpath.basename(path)} + + # Get description from first commented paragraph + description = "" + in_paragraph = True + file = open(path) + for line in file.readlines(): + if in_paragraph == True: + if line.startswith("#") and not line.startswith("#!"): + in_paragraph = False + + elif in_paragraph == False: + line = re.sub(r"#\s+", "", line).strip() + if line: + test["description"] = line + break + + else: + test["description"] = "No description found" + + # Get package requirements from QRT-Packages and QRT-Alternates + pattern = re.compile(r"# (?P[^ ]+): (?P.*)$") + packages = [] + file = open(path) + for line in file.readlines(): + line = line.strip() + match = pattern.match(line) + # Check for match + if not match: + continue + + # Check for value with content + value = match.group("value").strip() + if not value: + continue + + # Check for QRT-* + values = re.split(r"\s+", value) + if match.group("key") == "QRT-Packages": + packages.extend(["package.name == '%s'" % v for v in values]) + + elif match.group("key") == "QRT-Alternates": + packages.append("%s" % " or ".join(["package.name == '%s'" % v for v in values])) + + elif match.group("key") == "QRT-Privilege": + test["user"] = value + + if packages: + test["requires"] = packages + + yield test + +def main(args): + usage = "Usage: %prog [OPTIONS] [SCRIPTS]" + parser = OptionParser(usage=usage) + parser.add_option("--dry-run", + default=False, + action="store_true", + help="Dry run to avoid fetching from the given location.") + parser.add_option("-d", "--directory", + default=DEFAULT_DIRECTORY, + help="Directory where to fetch qa-regression-testing") + parser.add_option("-l", "--location", + default=DEFAULT_LOCATION, + help="Location from where to fetch qa-regression-testing") + + (options, scripts) = parser.parse_args(args) + + # Parse environment + if os.getuid() != 0: + parser.error("Must be run as root with sudo.") + + user = os.environ.get("SUDO_USER") + if not user: + parser.error("SUDO_USER variable not found, must be run with sudo.") + + dirname = posixpath.dirname(options.directory) + if not posixpath.exists(dirname): + os.makedirs(dirname) + os.chmod(dirname, 0777) + + pw = pwd.getpwnam(user) + os.setgid(pw.pw_gid) + os.setuid(pw.pw_uid) + os.chdir(pw.pw_dir) + + if not scripts: + scripts = list_qa_regression(options.location, options.directory, + options.dry_run) + + tests = run_qa_regression(scripts, options.location, options.directory, + options.dry_run) + if not tests: + return 1 + + for test in tests: + print_element(test) + + return 0 + + +if __name__ == "__main__": + sys.exit(main(sys.argv[1:])) diff -Nru qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/resolution_test qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/resolution_test --- qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/resolution_test 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/resolution_test 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,93 @@ +#!/usr/bin/python + +# This script is from the Checkbox Interface +# This is Checkbox which provides an extensible interface for system testing. +# See the following page for documentation: +# https://wiki.ubuntu.com/Testing/Automation/Checkbox + +import os +import re +import sys + +from optparse import OptionParser + +def error(message): + sys.stderr.write("ERROR: %s\n" % message) + sys.exit(1) + +def check_ati(): + command = "lsmod | grep fglrx" + fglrx_lines = os.popen(command).readlines() + if len(fglrx_lines) != 0: + print "unknown (impossible to determine resolution with fglrx)" + return True + + return False + +def get_resolution(): + command = "xrandr -q" + xrandr_lines = os.popen(command).readlines() + star_lines = [l for l in xrandr_lines if "*" in l] + if len(star_lines) != 1: + error("%s should return a single line with '*'" % command) + + star_line = star_lines[0] + match = re.search(r"(\d+)\s?x\s?(\d+)", star_line) + if not match: + error("%s should return pixels like '1024 x 768'" % command) + + horizontal = int(match.group(1)) + vertical = int(match.group(2)) + + fields = re.split(r"\s+", star_line) + star_fields = [f for f in fields if "*" in f] + if len(star_fields) < 1: + error("%s should return a refresh rate with '*'" % command) + + return (horizontal, vertical) + +def check_resolution(): + if check_ati(): + return True + + (horizontal, vertical) = get_resolution() + + print "%d x %d" % (horizontal, vertical) + return True + +def compare_resolution(min_h, min_v): + if check_ati(): + return True + + (horizontal, vertical) = get_resolution() + + if (horizontal >= min_h) and (vertical >= min_v): + return True + else: + return False + +def main(args): + usage = "Usage: %prog [OPTIONS]" + parser = OptionParser(usage=usage) + parser.add_option("--horizontal", + type="int", + default=0, + help="Minimum acceptable horizontal resolution.") + parser.add_option("--vertical", + type="int", + default=0, + help="Minimum acceptable vertical resolution.") + (options, args) = parser.parse_args(args) + + if (options.horizontal > 0) and (options.vertical > 0): + if compare_resolution(options.horizontal, options.vertical): + return 0 + else: + if check_resolution(): + return 0 + + return 1 + + +if __name__ == "__main__": + sys.exit(main(sys.argv[1:])) diff -Nru qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/run_compiz_check qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/run_compiz_check --- qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/run_compiz_check 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/run_compiz_check 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,32 @@ +#!/usr/bin/python + +# This script is from the Checkbox Interface +# This is Checkbox which provides an extensible interface for system testing. +# See the following page for documentation: +# https://wiki.ubuntu.com/Testing/Automation/Checkbox + +import re +import sys +import posixpath + +from subprocess import Popen, PIPE + + +def main(): + """ + Run compiz check and return any error code + """ + compiz_check = posixpath.join(posixpath.dirname(__file__), "compiz-check") + # Answer 'n' to all questions + command = "yes n | %s" % compiz_check + process = Popen(command, shell=True, stdout=PIPE) + output = process.communicate()[0] + + # Remove colored output (not handled correctly in checkbox report) + output = re.sub(r"\[([0-8])?(;3[0-7])?(;4[0-7])?m", "", output) + print output + + return process.returncode + +if __name__ == "__main__": + sys.exit(main()) diff -Nru qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/run_templates qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/run_templates --- qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/run_templates 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/run_templates 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,147 @@ +#!/usr/bin/env python + +# This script is from the Checkbox Interface +# This is Checkbox which provides an extensible interface for system testing. +# See the following page for documentation: +# https://wiki.ubuntu.com/Testing/Automation/Checkbox + +import os +import re +import sys +import uuid + +from optparse import OptionParser +from subprocess import Popen, PIPE + +from checkbox.lib.template import Template + + +DEFAULT_INPUT = "-" +DEFAULT_OUTPUT = "-" + +COMMAND_TEMPLATE = """cat <<%(separator)s +%(input)s +%(separator)s""" + + +class Runner(object): + + def __init__(self, input, output): + self.input = input + self.output = output + + def get_args(self, record): + return [] + + def get_env(self, record): + env = dict(os.environ) + env["NF"] = str(len(record)) + + return env + + def process(self, args, shell=False): + process = Popen(args, shell=shell, stdout=PIPE) + records = self.process_output(process.stdout) + + for nr, record in enumerate(records): + args = self.get_args(record) + env = self.get_env(record) + env["NR"] = str(nr) + + command_string = COMMAND_TEMPLATE % { + "input": self.input, + "separator": uuid.uuid4()} + command = ["sh", "-c", command_string] + args + + process = Popen(command, + env=env, + stdout=self.output) + process.communicate() + + def process_output(self, output): + raise NotImplementedError + + +class LineRunner(Runner): + + field_separator = r"\s+" + record_separator = r"(?:\r?\n)" + + def get_args(self, record): + args = [record] + args.extend(re.split(self.field_separator, record)) + + return args + + def process_output(self, file): + # Strip trailing separator + data = re.sub(r"%s$" % self.record_separator, "", file.read()) + + return re.split(self.record_separator, data) + + +class TemplateRunner(Runner): + + def get_env(self, record): + env = super(TemplateRunner, self).get_env(record) + env.update(record) + + return env + + def process_output(self, output): + template = Template() + return template.load_file(output) + + +def main(args): + usage = "Usage: %prog [OPTIONS] [COMMAND]" + parser = OptionParser(usage=usage) + parser.add_option("-i", "--input", + metavar="FILE", + default=DEFAULT_INPUT, + help="Input from the given file name, - for stdin") + parser.add_option("-o", "--output", + metavar="FILE", + default=DEFAULT_OUTPUT, + help="Output to the given file name, - for stdout") + parser.add_option("-s", "--shell", + action="store_true", + help="Run the command as a shell script") + parser.add_option("-t", "--template", + action="store_true", + help="Interpret the command output as a template") + (options, args) = parser.parse_args(args) + + # Default args to echo command + if not args: + args = ["echo"] + + # Read input + if options.input == "-": + input = sys.stdin.read() + else: + input_file = open(options.input, "r") + try: + input = input_file.read() + finally: + input_file.close() + + # Open output + if options.output == "-": + output_file = sys.stdout + else: + output_file = open(options.output, "w") + + # Determine runner class + if options.template: + runner_class = TemplateRunner + else: + runner_class = LineRunner + + runner = runner_class(input, output_file) + runner.process(args, options.shell) + + return 0 + +if __name__ == "__main__": + sys.exit(main(sys.argv[1:])) diff -Nru qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/sleep_test qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/sleep_test --- qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/sleep_test 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/sleep_test 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,446 @@ +#!/usr/bin/python + +# This script is from the Checkbox Interface +# This is Checkbox which provides an extensible interface for system testing. +# See the following page for documentation: +# https://wiki.ubuntu.com/Testing/Automation/Checkbox + +''' +Program to automate system entering and resuming from sleep states + +Copyright (C) 2010 Canonical Ltd. + +Author: + Jeff Lane + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License version 2, +as published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . + +The purpose of this script is to test a system's ability to suspend to ram +(enter the S3 sleep state) or hibernate (enter S4 sleep state) and then resume +without loss of data, OS crashes, or any other Bad Things[tm] happening. + +As we progress forward, it's become apparent that being able to suspend and +wake up a system during slow times while offloading that systems's load to +another system accomplishes at least two goals. + +1: The system that stays awake handling the load is more fully utilized +2: Un-needed systems are suspended creating savings in power usage, cooling, + and other assorted expenses related to datacenter operations + +Thus, this test will allow us to determine of Ubuntu and a given system can +happily suspend and wake up, without experiencing any difficulties. + +The test will, in the most basic sense do the following: + +1: Determine if the S3/S4 states are available +2: Set a wakeup alarm in the RTC via rtcwake +3: Put the system to sleep. +4: Wake the system and resume normal operation + +TO DO: +* remove workaround once we get a fix for the pm scripts issue that causes the + wakealarm and alarm_IRQ entries to not be reset after resume from S4 +* Add in post-resume check to determine of network has resumed +* Add in checks to factor in the consumer-test hibernate/suspend test cases + +Changelog: +v1.0: Added code to support Hibernate (S4) and allow choice between S3 and S4 + at run-time. + Created mechanism in SuspendTest() class to check /proc/driver/rtc as a + means to see if system woke via alarm IRQ or other means (indicating + that the system did not wake itself via timer. + Adjusted code to fail test if several conditions are not met (test to + see if /sys/class/rtc/rtc0/wakealarm is still set and is < current + epoch time and see if /proc/driver/rtc.Alarm_IRQ still says Yes). All + those indicate that the system did not wake properly. +V0.9: Added GPL info, last bit of cleaning up. + Changed supid way I was handling reading files to a more appropriate + manner +v0.8: Changed CanWeSleep() to utilize /sys/power/state instead of the + precated /proc/acpi/sleep to maintain usefulness in future kernels. +V0.7: Fixed error in calculating how long suspend cycle lasted +V0.6: Added facility for setting maximum wait time (used to test whether we + woke automagically or manually. +V0.5: Added SuspendTest class to handle all the hard work. + Added the rest of the debug logging stuff to get some useful output + when we use -d +V0: First draft + +''' + +import sys +import logging +from subprocess import call +from optparse import OptionParser + +from datetime import datetime, timedelta +from time import sleep + +class ListDictHandler(logging.StreamHandler): + ''' + Extends logging.StreamHandler to handle list, tuple and dict objects + internally, rather than through external code, mainly used for debugging + purposes. + + ''' + def emit(self, record): + if isinstance(record.msg, (list, tuple,)): + for msg in record.msg: + logger = logging.getLogger(record.name) + new_record = logger.makeRecord(record.name, record.levelno, + record.pathname, record.lineno, msg, record.args, + record.exc_info, record.funcName) + logging.StreamHandler.emit(self, new_record) + elif isinstance(record.msg, dict): + for key, val in record.msg.iteritems(): + logger = logging.getLogger(record.name) + new_msg = '%s: %s' % (key, val) + new_record = logger.makeRecord(record.name, record.levelno, + record.pathname, record.lineno, new_msg, record.args, + record.exc_info, record.funcName) + logging.StreamHandler.emit(self, new_record) + else: + logging.StreamHandler.emit(self, record) + +class SuspendTest(): + ''' + Creates an object to handle the actions necessary for suspend/resume + testing. + + ''' + def __init__(self,max_sleep): + self.max_sleep_time = max_sleep + self.wake_time = 0 + self.current_time = 0 + self.last_time = 0 + + + def CanWeSleep(self,mode): + ''' + Test to see if S3 state is available to us. /proc/acpi/* is old + and will be deprecated, using /sys/power to maintine usefulness for + future kernels. + + ''' + states_fh = open('/sys/power/state','r',0) + try: + states = states_fh.read().split() + finally: + states_fh.close() + logging.debug('The following sleep states were found:') + logging.debug(states) + + if mode in states: + return True + else: + return False + + def GetCurrentTime(self): + + time_fh = open('/sys/class/rtc/rtc0/since_epoch','r',0) + try: + time = int(time_fh.read()) + finally: + time_fh.close() + return time + + def SetWakeTime(self,time): + ''' + Get the current epoch time from /sys/class/rtc/rtc0/since_epoch + then add time and write our new wake_alarm time to + /sys/class/rtc/rtc0/wakealarm. + + The math could probably be done better but this method avoids having to + worry about whether or not we're using UTC or local time for both the + hardware and system clocks. + + ''' + self.last_time = self.GetCurrentTime() + logging.debug('Current epoch time: %s' % self.last_time) + + wakealarm_fh = open('/sys/class/rtc/rtc0/wakealarm','w',0) + + try: + wakealarm_fh.write('0\n') + wakealarm_fh.flush() + + wakealarm_fh.write('+%s\n' % time) + wakealarm_fh.flush() + finally: + wakealarm_fh.close() + + logging.debug('Wake alarm in %s seconds' % time) + + def DoSuspend(self,mode): + ''' + Suspend the system and hope it wakes up. + Previously tried writing new state to /sys/power/state but that + seems to put the system into an uncrecoverable S3 state. So far, + pm-suspend seems to be the most reliable way to go. + + ''' + if mode == 'mem': + status = call('/usr/sbin/pm-suspend') + elif mode == 'disk': + status = call('/usr/sbin/pm-hibernate') + else: + logging.debug('Unknown sleep state passed') + status == 1 + + if status == 0: + logging.debug('Successful suspend') + else: + logging.debug('Error while running pm-suspend') + + def CheckSleepTime(self,sleep_time): + ''' + This code will most likely be removed soon. In all but actal test, it + has been superceded by CheckAlarm(). This is no longe called, but + until the final decision is made to kill it or re-implement it, I will + leave it here. + + A method for guessing if the system woke itself or was woken + manually. + + There has got to be a better way to do this that actually detects + whether the system woke on a RTC alarm event instead of anything else + (e.g. key press, WOL packet, USB, etc) + + ''' + self.current_time = self.GetCurrentTime() + delta = (self.current_time - self.last_time) + + if delta > self.max_sleep_time: + logging.debug(['Current epoch time is: %s' % self.current_time, + 'Wake time is too long: %s secs' % delta]) + return False + else: + logging.debug(['Current epoch time is: %s' % self.current_time, + 'Suspend/Resume cycle lasted: %s seconds' % + (self.current_time - self.last_time)]) + return True + + def CheckAlarm(self,mode): + ''' + A better method for checking if system woke via rtc alarm IRQ. If the + system woke via IRQ, then alarm_IRQ will be 'no' and wakealarm will be + an empty file. Otherwise, alarm_IRQ should still say yes and wakealarm + should still have a number in it (the original alarm time), indicating + the system did not wake by alarm IRQ, but by some other means. + ''' + rtc = {} + rtc_fh = open('/proc/driver/rtc','r',0) + alarm_fh = open('/sys/class/rtc/rtc0/wakealarm','r',0) + try: + rtc_data = rtc_fh.read().splitlines() + for item in rtc_data: + rtc_entry = item.partition(':') + rtc[rtc_entry[0].strip()] = rtc_entry[2].strip() + finally: + rtc_fh.close() + + try: + alarm = int(alarm_fh.read()) + except ValueError: + alarm = None + finally: + alarm_fh.close() + + logging.debug('Current RTC entries') + logging.debug(rtc) + logging.debug('Current wakealarm %s' % alarm) + + # see if there's something in wakealarm or alarm_IRQ + # Return True indicating the alarm is still set + # Return False indicating the alarm is NOT set. + # This is currently held up by a bug in PM scripts that + # does not reset alarm_IRQ when waking from hibernate. + # https://bugs.launchpad.net/ubuntu/+source/linux/+bug/571977 + if mode == 'mem': + if (alarm is not None) or (rtc['alarm_IRQ'] == 'yes'): + logging.debug('alarm is %s' % alarm) + logging.debug('rtc says alarm_IRQ: %s' % rtc['alarm_IRQ']) + return True + else: + logging.debug('alarm was cleared') + return False + else: + # This needs to be changed after we get a way around the + # hibernate bug. For now, pretend that the alarm is unset for + # hibernate tests. + logging.debug('mode is %s so we\'re skipping success check' % mode) + return False + + +class NetworkManagerException(Exception): + + pass + + +class NetworkManager(object): + + NM_SERVICE = "org.freedesktop.NetworkManager" + NM_PATH = "/org/freedesktop/NetworkManager" + NM_INTERFACE = NM_SERVICE + + NM_PATH_DEVICES = "/org/freedesktop/NetworkManager/Devices" + NM_INTERFACE_DEVICES = "org.freedesktop.NetworkManager.Devices" + + NMI_SERVICE = "org.freedesktop.NetworkManagerInfo" + NMI_PATH = "/org/freedesktop/NetworkManagerInfo" + NMI_INTERFACE = NMI_SERVICE + + HAL_SERVICE = "org.freedesktop.Hal" + HAL_PATH = "/org/freedesktop/Hal/Manager" + HAL_INTERFACE = "org.freedesktop.Hal.Manager" + HAL_INTERFACE_DEVICE = "org.freedesktop.Hal.Device" + + STATE_UNKNOWN = "unknown" + STATE_ASLEEP = "asleep" + STATE_CONNECTING = "connecting" + STATE_CONNECTED = "connected" + STATE_DISCONNECTED = "disconnected" + + _state_table = [ + STATE_UNKNOWN, + STATE_ASLEEP, + STATE_CONNECTING, + STATE_CONNECTED, + STATE_DISCONNECTED] + + def __init__(self): + try: + import dbus + except ImportError: + raise NetworkManagerException, "Python module not found: dbus" + + try: + self._bus = dbus.SystemBus() + self.nm_object = self._bus.get_object(self.NM_SERVICE, self.NM_PATH) + self.nm_service = dbus.Interface(self.nm_object, self.NM_INTERFACE) + except dbus.exceptions.DBusException: + raise NetworkManagerException, "Failed to connect to dbus service" + + def get_state(self): + state = self.nm_service.state() + return self._state_table[state] + + +def check_network(): + try: + nm = NetworkManager() + except NetworkManagerException: + return True + + start = datetime.now() + while True: + if nm.get_state() == nm.STATE_CONNECTED: + return True + # give 60 seconds to NetworkManager to get to a CONNECTED state, then give up + if datetime.now() - start > timedelta(60): + return False + sleep(5) + +def main(): + usage = 'Usage: %prog [OPTIONS]' + parser = OptionParser(usage) + parser.add_option('-i','--iterations', + action='store', + type='int', + metavar='NUM', + default=1, + help='The number of times to run the suspend/resume \ + loop. Default is %default') + parser.add_option('-w','--wake-in', + action='store', + type='int', + metavar='NUM', + default=60, + dest='wake_time', + help='Sets wake up time (in seconds) in the future \ + from now. Default is %default.') + parser.add_option('-m','--max-sleep', + action='store', + type='int', + metavar='NUM', + default=120, + help='Sets the maximum sleep time. If the difference \ + between current_time and last_time after a suspend \ + cycle is greater than this, we assume something has \ + gone wrong and the system had to be manually woken. \ + Default is %default') + parser.add_option('-s','--sleep-state', + action='store', + default='mem', + metavar='MODE', + dest='mode', + help='Sets the sleep state to test. Passing mem will \ + set the sleep state to Suspend-To-Ram or S3. Passing \ + disk will set the sleep state to Suspend-To-Disk or S4\ + (hibernate). Default sleep state is %default') + parser.add_option('-d','--debug', + action='store_true', + default=False, + help='Choose this to add verbose output for debug \ + purposes') + (options, args) = parser.parse_args() + options_dict = vars(options) + + # create logging device + format = '%(asctime)s %(levelname)-8s %(message)s' + handler = ListDictHandler() + handler.setFormatter(logging.Formatter(format)) + logger = logging.getLogger() + logger.addHandler(handler) + + if options.debug: + logger.setLevel(logging.DEBUG) + logging.debug('Running with these options') + logging.debug(options_dict) + + suspender = SuspendTest(options.max_sleep) + run_result = {} + run_count = 0 + + # Chcek fo the S3 state availability + if not suspender.CanWeSleep(options.mode): + logging.error('%s sleep state not supported' % options.mode) + return 1 + else: + logging.info('%s sleep state supported, continuing test' % options.mode) + + # We run the following for the number of iterations requested + for iteration in range(0,options.iterations): + # Set new alarm time and suspend. + suspender.SetWakeTime(options.wake_time) + suspender.DoSuspend(options.mode) + run_count += 1 + if suspender.CheckAlarm(options.mode): + logging.debug('The alarm is still set') + run_result[run_count] = 'Fail' + else: + run_result[run_count] = 'Pass' + + # Be reasonably sure the network is up before returning, we want + # the network to be up for possible following tests. + network_is_live = check_network() + + if 'Fail' in run_result.values(): + logging.error('One or more suspend tests failed') + logging.error(run_result) + return 1 + else: + return 0 + +if __name__ == '__main__': + sys.exit(main()) diff -Nru qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/suspend_test qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/suspend_test --- qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/suspend_test 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/suspend_test 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,617 @@ +#!/bin/bash +# +# Script to automate suspend / resume +# +# Copyright (C) 2008-2009 Canonical Ltd. +# +# Authors: +# Michael Frey +# Andy Whitcroft +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2, +# as published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# +# Script to automate suspend / resume +# +# We set a RTC alarm that wakes the system back up and then sleep +# for seconds before we go back to sleep. +# +# Changelog: +# +# V8: +# - add a new suspend battery drain test +# - track batteries disabling tests which require them automatically +# - disable dbus tests when we have no primary user +# - include the new power drain test in --full +# - handle AC transitions better +# - use minutes in messages where appropriate +# - report AC transition failures +# - only mention AC when we have batteries +# - report results at the bottom for easy posting +# +# V7: +# - add a --dry-run mode to simplify developement +# - add a automation mode for checkbox integration +# - add a new pm-suspend test +# - record and restore timer_delay around the variable time test. +# +# V6: +# - move an --enable/--disable interface for tests +# - add --set to allow setting of approved parameters +# - fix up prompting for interactive and non-interactive tests +# - supply a sensible default for testing on servers (apw, kirkland) +# +# V5: +# - send dbus messages as the original user +# - stop clearing the dmesg as we go +# - stop using trace generally as this affects the wakeups +# - do a single dbus test then move to pm-suspend to avoid screensaver +# - timeout waiting for a suspend to complete catching failure to go down +# +# V4: +# - update the help output +# - add --comprehensive to do AC related tests +# - add --extensive to do a range of time related tests +# - add --full to enable all harder tests +# - add fallback to pm-suspend for Kbuntu +# - collect dmesg output +# - remove hwclock update +# +# V3: +# - fix typo in fallback acpi interface +# - when recording the RTC clock do not go direct +# - pmi is now deprecated suspend using dbus +# +# V2: +# - support newer rtc sysfs wakealarm interface +# - move to using pmi action suspend +# - allow the user to specify the number of iterations +# - ensure we are running as root +# - report the iterations to the user +# - clean up the output and put it in a standard logfile +# - add a descriptive warning and allow user cancel +# - add tracing enable/disable +# - fix logfile location +# - add a failure cleanup mode +# - make time sleep time and delay time configurable +# - ensure the log directory exists +# - clock will be fixed automatically on network connect +# - default sleep before wakeup to 20s +# - do not use dates after we have corrupted the clock +# - sort out the copyright information +# - we do not have any failure cleanup currently +# +# V1: +# - add the suspend test scripts +# + +# This script is from the Checkbox Interface +# This is Checkbox which provides an extensible interface for system testing. +# See the following page for documentation: +# https://wiki.ubuntu.com/Testing/Automation/Checkbox + +P="test-suspend" + +LOGDIR='/var/lib/pm-utils' +LOGFILE="$LOGDIR/stress.log" + +setup_wakeup_timer () +{ + timeout="$1" + + # + # Request wakeup from the RTC or ACPI alarm timers. Set the timeout + # at 'now' + $timeout seconds. + # + ctl='/sys/class/rtc/rtc0/wakealarm' + if [ -f "$ctl" ]; then + # Cancel any outstanding timers. + echo "0" >"$ctl" + # rtcN/wakealarm can use relative time in seconds + echo "+$timeout" >"$ctl" + return 0 + fi + ctl='/proc/acpi/alarm' + if [ -f "$ctl" ]; then + echo `date '+%F %H:%M:%S' -d '+ '$timeout' seconds'` >"$ctl" + return 0 + fi + + echo "no method to awaken machine automatically" 1>&2 + exit 1 +} + +suspend_system () +{ + if [ "$dry" -eq 1 ]; then + echo "DRY-RUN: suspend machine for $timer_sleep" + sleep 1 + return + fi + + setup_wakeup_timer "$timer_sleep" + + dmesg >"$LOGFILE.dmesg.A" + + # Send a dbus message to initiate Suspend. + if [ "$suspend_dbus" -eq 1 ]; then + sudo -u $SUDO_USER dbus-send --session --type=method_call \ + --dest=org.freedesktop.PowerManagement \ + /org/freedesktop/PowerManagement \ + org.freedesktop.PowerManagement.Suspend \ + >> "$LOGFILE" || { + ECHO "FAILED: dbus suspend failed" + return + } + else + pm-suspend >> "$LOGFILE" + fi + + # Wait on the machine coming back up -- pulling the dmesg over. + echo "v---" >>"$LOGFILE" + retry=30 + while [ "$retry" -gt 0 ]; do + let "retry=$retry-1" + + # Accumulate the dmesg delta. + dmesg >"$LOGFILE.dmesg.B" + diff "$LOGFILE.dmesg.A" "$LOGFILE.dmesg.B" | \ + grep '^>' >"$LOGFILE.dmesg" + mv "$LOGFILE.dmesg.B" "$LOGFILE.dmesg.A" + + echo "Waiting for suspend to complete $retry to go ..." \ + >> "$LOGFILE" + cat "$LOGFILE.dmesg" >> "$LOGFILE" + + if [ "`grep -c 'Back to C!' $LOGFILE.dmesg`" -ne 0 ]; then + break; + fi + sleep 1 + done + echo "^---" >>"$LOGFILE" + rm -f "$LOGFILE.dmesg"* + if [ "$retry" -eq 0 ]; then + ECHO "SUSPEND FAILED, did not go to sleep" + fi +} + +delay_system () +{ + if [ "$dry" -eq 1 ]; then + echo "DRY-RUN: stay awake for $timer_delay" + sleep 1 + return + fi + + # + # wait for $timer_delay seconds after system resume from S3 + # + ECHO "wait for $timer_delay seconds" + sleep $timer_delay +} + +ECHO () +{ + echo "$@" | tee -a "$LOGFILE" +} + +run_suspend () +{ + CNT=1 + TOTAL=$1 + ECHO "Suspend Test starting on $(date '+%F %H:%M:%S') ($TOTAL cycles)" + while [ "$CNT" -le "$TOTAL" ] + do + ECHO "Suspend iteration $CNT of $TOTAL" + + suspend_system "$START" + delay_system + + (( CNT++ )) + done + ECHO "Suspend Test completed" +} + +enable_trace() +{ + echo 1 > '/sys/power/pm_trace' +} + +disable_trace() +{ + echo 0 > '/sys/power/pm_trace' +} + +# Battery +battery_count() +{ + cat /proc/acpi/battery/*/state 2>/dev/null | \ + awk ' + BEGIN { total = 0 } + /present:.*yes/ { total += 1 } + END { print total } + ' +} +battery_capacity() +{ + cat /proc/acpi/battery/*/state 2>/dev/null | \ + awk ' + BEGIN { total = 0 } + /remaining capacity:/ { total += $3 } + END { print total } + ' +} + +# +# MAIN +# +usage() { + cat - 1>&2 <] +Options: + --sleep - how long the machine wait before waking + --delay - default delay between iterations + + --enable - enable a specific test + --disable - disable a specific test + --set .= - set a test specific variable + dbus - perform a suspend via dbus + ac - perform tests involving removing ac power + timed - perform a variable timing test + repeat - perform a longer repeat test + .iterations - the number of iterations in the repeat + power - perform a battery consumption test + .sleep - how long to sleep + + --full - run a basic set of tests + --server - run those test appropriate for a server +EOM +} + +# We need TEMP as the `eval set --' would nuke the return value of getopt. +TEMP=`getopt -o '' -l dry-run,auto,,sleep:,delay:,enable:,disable:,set:,full,desktop,server -n "$P" -- "$@"` +if [ $? != 0 ] ; then + usage + exit 1 +fi + +# Note the quotes around `$TEMP': they are essential! +eval set -- "$TEMP" + +# Options helpers. +chk_test () +{ + if ! declare -p "test_$1" 2>/dev/null 1>&2; then + echo "$P: $1: test unknown" 1>&2 + exit 1 + fi +} +handle_set () +{ + stmt=`echo "$1" | sed -e 's/\./_/g'` + + test="${stmt%%_*}" + var="${stmt%%=*}" + + chk_test "$test" + if ! declare -p "args_$var" 2>/dev/null 1>&2; then + echo "$P: $var: test variable unknown" 1>&2 + exit 1 + fi + + RET="args_$stmt" +} +chk_number() { + eval "val=\"\$$1\"" + let num="0+$val" + if [ "$val" != "$num" ]; then + name=`echo "$1" | sed -e 's/args_//' -e 's/_/./'` + echo "$P: $name: $val: non-numeric value" 1>&2 + exit 1 + fi +} + +# Options handling. +dry=0 +auto=0 +timer_sleep=20 +timer_delay=10 + +test_dbus=0 +test_pmsuspend=0 +test_ac=0 +test_timed=0 +test_repeat=0 +args_repeat_iterations=10 +test_power=0 +args_power_sleep=1200 + +while : +do + case "$1" in + --dry-run) dry=1; shift 1 ;; + --auto) auto=1; shift 1 ;; + --sleep) timer_sleep="$2"; shift 2 ;; + --delay) timer_delay="$2"; shift 2 ;; + --disable) chk_test "$2"; declare "test_$1=0"; shift 2 ;; + --enable) chk_test "$2"; declare "test_$2=1"; shift 2 ;; + --set) handle_set "$2"; declare "$RET"; shift 2 ;; + --desktop|--full) test_dbus=1; test_ac=1; test_timed=1; + test_power=1; shift 1 ;; + --server) test_timed=1; shift 1 ;; + --) shift; break ;; + *) echo "$1: ERROR"; exit 1 ;; + esac +done + +chk_number "args_repeat_iterations" +chk_number "args_power_sleep" + +tests=`set | grep ^test_ | grep -c =1` + +if [ "$#" -gt 1 ]; then + usage + exit 1 +fi +if [ "$tests" -eq 0 ]; then + usage + echo "$P: no tests selected" 1>&2 + exit 1 +fi + +battery_count=`battery_count` + +report_battery='' + +suspend_dbus=0 + +# Check we are running as root as we are going to fiddle with the clock +# and use the rtc wakeups. +id=`id -u` +if [ "$id" -ne 0 ]; then + echo "ERROR: must be run as root to perform this test, use sudo:" 1>&2 + echo " sudo $0 $@" 1>&2 + exit 1 +fi + +ac_needed=-1 +ac_is=-1 +ac_becomes=-1 +ac_required() +{ + ac_check + + ac_needed="$1" + ac_becomes="$1" +} +ac_transitions() +{ + ac_check + + ac_needed="$1" + ac_becomes="$2" +} +ac_online() +{ + cat /proc/acpi/ac_adapter/*/state 2>/dev/null | \ + awk ' + BEGIN { online = 0; offline = 0 } + /on-line/ { online = 1 } + /off-line/ { offline = 1 } + END { + if (online) { + print "1" + } else if (offline) { + print "0" + } else { + print "-1" + } + } + ' +} +ac_check() +{ + typeset ac_current=`ac_online` + + if [ "$ac_becomes" -ne -1 -a "$ac_current" -ne -1 -a \ + "$ac_current" -ne "$ac_becomes" ]; then + ECHO "*** WARNING: AC power not in expected state" \ + "($ac_becomes) after test" + fi + ac_is="$ac_becomes" +} + +phase=0 +phase_first=1 +phase_interactive=1 +phase() +{ + typeset sleep + + let phase="$phase+1" + + echo "" + echo "*** TEST $phase -- $1" + shift 1 + for line in "$@" + do + echo "*** $line" + done + if [ "$battery_count" -ne 0 -a "$ac_needed" -ne "$ac_is" ]; then + case "$ac_needed" in + 0) echo "*** please ensure your AC cord is detached" ;; + 1) echo "*** please ensure your AC cord is attached" ;; + esac + ac_is="$ac_needed" + fi + + if [ "$timer_sleep" -gt 60 ]; then + let sleep="$timer_sleep / 60" + sleep="$sleep minutes" + else + sleep="$timer_sleep seconds" + fi + echo "*** machine will suspend for $sleep" + + if [ "$auto" -eq 1 ]; then + : + + elif [ "$phase_interactive" -eq 1 ]; then + echo "*** press return when ready" + read x + + elif [ "$phase_first" -eq 1 ]; then + echo "*** NOTE: there will be no further user interaction from this point" + echo "*** press return when ready" + phase_first=0 + read x + fi + echo "" +} + +[ "$auto" -eq 0 ] && cat - <. +# +# This script is from the Checkbox Interface +# This is Checkbox which provides an extensible interface for system testing. +# See the following page for documentation: +# https://wiki.ubuntu.com/Testing/Automation/Checkbox + + +import os +import sys +import re +import string +import posixpath + +from curses.ascii import isprint +from subprocess import Popen, PIPE + +from checkbox.lib.bit import get_bitmask, test_bit +from checkbox.lib.dmi import Dmi, DmiNotAvailable +from checkbox.lib.input import Input +from checkbox.lib.pci import Pci +from checkbox.lib.usb import Usb + + +# Command to retrieve udev information. +COMMAND = "udevadm info --export-db" + + +class DeviceResource(object): + __slots__ = ("_environment", "_attributes") + + def __init__(self, environment, attributes): + super(DeviceResource, self).__init__() + self._environment = environment + self._attributes = attributes + + @property + def bus(self): + sys_path = posixpath.join("/sys%s" % self._environment["DEVPATH"], "subsystem") + if posixpath.islink(sys_path): + link = os.readlink(sys_path) + if "/" in link: + return posixpath.basename(link) + + return None + + @property + def category(self): + if "sys_vendor" in self._attributes: + return "SYSTEM" + + if "IFINDEX" in self._environment: + return "NETWORK" + + if "PCI_CLASS" in self._environment: + pci_class_string = self._environment["PCI_CLASS"] + pci_class = int(pci_class_string, 16) + + # Strip prog_if if defined + if pci_class > 0xFFFF: + pci_class >>= 8 + + subclass_id = pci_class & 0xFF + class_id = (pci_class >> 8) & 0xFF + + if class_id == Pci.BASE_CLASS_NETWORK: + return "NETWORK" + + if class_id == Pci.BASE_CLASS_DISPLAY: + return "VIDEO" + + if class_id == Pci.BASE_CLASS_SERIAL \ + and subclass_id == Pci.CLASS_SERIAL_USB: + return "USB" + + if class_id == Pci.BASE_CLASS_STORAGE: + if subclass_id == Pci.CLASS_STORAGE_SCSI: + return "SCSI" + + if subclass_id == Pci.CLASS_STORAGE_IDE: + return "IDE" + + if subclass_id == Pci.CLASS_STORAGE_FLOPPY: + return "FLOPPY" + + if subclass_id == Pci.CLASS_STORAGE_RAID: + return "RAID" + + if class_id == Pci.BASE_CLASS_COMMUNICATION \ + and subclass_id == Pci.CLASS_COMMUNICATION_MODEM: + return "MODEM" + + if class_id == Pci.BASE_CLASS_INPUT \ + and subclass_id == Pci.CLASS_INPUT_SCANNER: + return "SCANNER" + + if class_id == Pci.BASE_CLASS_MULTIMEDIA: + if subclass_id == Pci.CLASS_MULTIMEDIA_VIDEO: + return "CAPTURE" + + if subclass_id == Pci.CLASS_MULTIMEDIA_AUDIO \ + or subclass_id == Pci.CLASS_MULTIMEDIA_AUDIO_DEVICE: + return "AUDIO" + + if class_id == Pci.BASE_CLASS_SERIAL \ + and subclass_id == Pci.CLASS_SERIAL_FIREWIRE: + return "FIREWIRE" + + if class_id == Pci.BASE_CLASS_BRIDGE \ + and (subclass_id == Pci.CLASS_BRIDGE_PCMCIA \ + or subclass_id == Pci.CLASS_BRIDGE_CARDBUS): + return "SOCKET" + + if "bInterfaceClass" in self._attributes: + interface_class = int(self._attributes["bInterfaceClass"], 16) + interface_subclass = int(self._attributes["bInterfaceSubClass"], 16) + + if interface_class == Usb.BASE_CLASS_AUDIO: + return "AUDIO" + + if interface_class == Usb.BASE_CLASS_PRINTER: + return "PRINTER" + + if interface_class == Usb.BASE_CLASS_STORAGE: + if interface_subclass == Usb.CLASS_STORAGE_FLOPPY: + return "FLOPPY" + + if interface_subclass == Usb.CLASS_STORAGE_SCSI: + return "SCSI" + + if interface_class == Usb.BASE_CLASS_VIDEO: + return "VIDEO" + + if interface_class == Usb.BASE_CLASS_WIRELESS: + return "NETWORK" + + if "ID_TYPE" in self._environment: + id_type = self._environment["ID_TYPE"] + + if id_type == "cd": + return "CDROM" + + if id_type == "disk": + return "DISK" + + if id_type == "video": + return "VIDEO" + + if "KEY" in self._environment: + key = self._environment["KEY"].strip("=") + bitmask = get_bitmask(key) + + for i in range(Input.KEY_Q, Input.KEY_P+1): + if not test_bit(i, bitmask): + break + else: + return "KEYBOARD" + + if test_bit(Input.BTN_MOUSE, bitmask): + return "MOUSE" + + if "DEVTYPE" in self._environment: + devtype = self._environment["DEVTYPE"] + if devtype == "disk": + if "ID_CDROM" in self._environment: + return "CDROM" + + if "ID_DRIVE_FLOPPY" in self._environment: + return "FLOPPY" + + if devtype == "scsi_device": + type = int(self._attributes.get("type", "-1")) + if type in (0, 7, 14): + return "DISK" + + if type == 1: + return "TAPE" + + if type == 2: + return "PRINTER" + + if type in (4, 5): + return "CDROM" + + if type == 6: + return "SCANNER" + + if type == 12: + return "RAID" + + if "DRIVER" in self._environment: + if self._environment["DRIVER"] == "floppy": + return "FLOPPY" + + if self.product: + return "OTHER" + + return None + + @property + def driver(self): + if "DRIVER" in self._environment: + return self._environment["DRIVER"] + + if "ID_USB_DRIVER" in self._environment: + return self._environment["ID_USB_DRIVER"] + + return None + + @property + def path(self): + return self._environment.get("DEVPATH") + + @property + def product_id(self): + # pci + if "PCI_ID" in self._environment: + vendor_id, product_id = self._environment["PCI_ID"].split(":") + return int(product_id, 16) + + # usb interface + if "PRODUCT" in self._environment \ + and self._environment.get("DEVTYPE") == "usb_interface": + vendor_id, product_id, revision = self._environment["PRODUCT"].split("/") + return int(product_id, 16) + + # usb device and ieee1394 + for attribute in "idProduct", "model_id": + if attribute in self._attributes: + return int(self._attributes[attribute], 16) + + # pnp + if "id" in self._attributes: + match = re.match(r"^(?P.*)(?P[%s]{4})$" + % string.hexdigits, self._attributes["id"]) + if match: + return int(match.group("product_id"), 16) + + return None + + @property + def vendor_id(self): + # pci + if "PCI_ID" in self._environment: + vendor_id, product_id = self._environment["PCI_ID"].split(":") + return int(vendor_id, 16) + + # usb interface + if "PRODUCT" in self._environment \ + and self._environment.get("DEVTYPE") == "usb_interface": + vendor_id, product_id, revision = self._environment["PRODUCT"].split("/") + return int(vendor_id, 16) + + # usb device + if "idVendor" in self._attributes: + return int(self._attributes["idVendor"], 16) + + # ieee1394 + vendor_id_path = posixpath.join(self.path, "../vendor_id") + if posixpath.exists(vendor_id_path): + vendor_id = open(vendor_id_path, "r").read().strip() + return int(vendor_id, 16) + + return None + + @property + def subproduct_id(self): + if "PCI_SUBSYS_ID" in self._environment: + pci_subsys_id = self._environment["PCI_SUBSYS_ID"] + subvendor_id, subproduct_id = pci_subsys_id.split(":") + return int(subproduct_id, 16) + + return None + + @property + def subvendor_id(self): + if "PCI_SUBSYS_ID" in self._environment: + pci_subsys_id = self._environment["PCI_SUBSYS_ID"] + subvendor_id, subproduct_id = pci_subsys_id.split(":") + return int(subvendor_id, 16) + + return None + + @property + def product(self): + for element in ("NAME", + "RFKILL_NAME", + "POWER_SUPPLY_MODEL_NAME"): + if element in self._environment: + return self._environment[element].strip('"') + + for attribute in ("description", + "model_name_kv", + "model", + "product_name"): + if attribute in self._attributes: + return self._attributes[attribute] + + # sound + bus = self.bus + if bus == "sound": + device = posixpath.basename(self._environment["DEVPATH"]) + match = re.match(r"(card|controlC|hwC|midiC)(?P\d+)", device) + if match: + card = match.group("card") + in_card = False + file = open("/proc/asound/cards", "r") + for line in file.readlines(): + line = line.strip() + match = re.match(r"(?P\d+) \[", line) + if match: + in_card = match.group("card") == card + + if in_card: + match = re.match(r"""(?P.*) """ + """at (?P
0x[%s]{8}) """ + """irq (?P\d+)""" % string.hexdigits, line) + if match: + return match.group("name") + + path = None + match = re.match(r"pcmC(?P\d+)D(?P\d+)(?P\w)", + device) + if match: + path = "/proc/asound/card%s/pcm%s%c/info" % match.groups() + + match = re.match(r"(dsp|adsp|midi|amidi|audio|mixer)(?P\d+)?", + device) + if match: + card = match.group("card") or 0 + path = "/proc/asound/card%s/pcm0p/info" % card + + if path and posixpath.exists(path): + file = open(path, "r") + for line in file.readlines(): + match = re.match(r"name: (?P.*)", line) + if match: + return match.group("name") + + # floppy + if self.driver == "floppy": + return "Platform Device" + + return None + + @property + def vendor(self): + if "RFKILL_NAME" in self._environment: + return None + + if "POWER_SUPPLY_MANUFACTURER" in self._environment: + return self._environment["POWER_SUPPLY_MANUFACTURER"] + + if "vendor" in self._attributes: + vendor = self._attributes["vendor"] + if not re.match(r"^0x[%s]{4}$" % string.hexdigits, vendor): + return vendor + + # dmi + if "sys_vendor" in self._attributes: + return self._attributes["sys_vendor"] + + # pnp + if "id" in self._attributes: + match = re.match(r"^(?P.*)(?P[%s]{4})$" + % string.hexdigits, self._attributes["id"]) + if match: + return match.group("vendor_name") + + # ieee1394 + vendor_path = posixpath.join(self.path, "../vendor_oui") + if posixpath.exists(vendor_path): + return open(vendor_path, "r").read().strip() + + return None + + +class DmiDeviceResource(DeviceResource): + + def __init__(self, environment, attributes, category): + super(DmiDeviceResource, self).__init__(environment, attributes) + self._category = category + + @property + def category(self): + return self._category + + @property + def path(self): + path = super(DmiDeviceResource, self).path + return posixpath.join(path, self._category.lower()) + + @property + def product(self): + if self._category == "CHASSIS": + type_string = self._attributes.get("chassis_type", "0") + type_index = int(type_string) + return Dmi.chassis_names[type_index] + + for name in "name", "version": + attribute = "%s_%s" % (self._category.lower(), name) + product = self._attributes.get(attribute) + if product and product != "Not Available": + return product + + return None + + @DmiNotAvailable + def _get_vendor(self): + attribute = "%s_vendor" % self._category.lower() + if attribute in self._attributes: + return self._attributes[attribute] + + return None + + @property + def vendor(self): + return self._get_vendor() + + +class UdevResource(object): + """Resource for udev information.""" + + def _get_attributes(self, path): + attributes = {} + sys_path = "/sys%s" % path + try: + names = os.listdir(sys_path) + except OSError: + return attributes + + for name in names: + name_path = posixpath.join(sys_path, name) + if name[0] == "." \ + or name in ["dev", "uevent"] \ + or posixpath.isdir(name_path) \ + or posixpath.islink(name_path): + continue + + try: + value = open(name_path, "r").read().strip() + except IOError: + continue + + value = value.split("\n")[0] + if [c for c in value if not isprint(c)]: + continue + + attributes[name] = value + + return attributes + + def _ignore_device(self, device): + # Ignore devices without bus information + if not device.bus: + return True + + # Ignore devices without product information + if not device.product and device.product_id is None: + return True + + # Ignore invalid subsystem information + if (device.subproduct_id is None and device.subvendor_id is not None) \ + or (device.subproduct_id is not None and device.subvendor_id is None): + return True + + # Ignore virtual devices except for dmi information + if device.bus != "dmi" \ + and "virtual" in device.path.split(posixpath.sep): + return True + + return False + + @property + def devices(self): + devices = [] + line_pattern = re.compile(r"(?P\w):\s*(?P.*)") + multi_pattern = re.compile(r"(?P[^=]+)=(?P.*)") + + output = Popen(COMMAND, stdout=PIPE, shell=True).communicate()[0] + for record in output.split("\n\n"): + if not record: + continue + + # Determine path and environment + path = None + environment = {} + for line in record.split("\n"): + match = line_pattern.match(line) + if not match: + raise Exception, \ + "Device line not supported: %s" % line + + key = match.group("key") + value = match.group("value") + + if key == "P": + path= value + elif key == "E": + match = multi_pattern.match(value) + if not match: + raise Exception, \ + "Device property not supported: %s" % value + environment[match.group("key")] = match.group("value") + + # Set default DEVPATH + environment.setdefault("DEVPATH", path) + + # Determine attributes + attributes = self._get_attributes(path) + + if path == "/devices/virtual/dmi/id": + device = DeviceResource(environment, attributes) + devices.append(device) + for category in "BIOS", "BOARD", "CHASSIS": + device = DmiDeviceResource(environment, attributes, category) + devices.append(device) + else: + device = DeviceResource(environment, attributes) + devices.append(device) + + return [d for d in devices if not self._ignore_device(d)] + + +def main(): + attributes = ("path", "bus", "category", "driver", "product_id", + "vendor_id", "subproduct_id", "subvendor_id", "product", "vendor",) + + udev = UdevResource() + for device in udev.devices: + for attribute in attributes: + value = getattr(device, attribute) + if value is not None: + print "%s: %s" % (attribute, value) + + # Empty line + print + + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff -Nru qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/uname_resource qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/uname_resource --- qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/uname_resource 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/uname_resource 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,43 @@ +#!/usr/bin/python +# +# This file is part of Checkbox. +# +# Copyright 2009 Canonical Ltd. +# +# Checkbox is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Checkbox is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Checkbox. If not, see . +# +# This script is from the Checkbox Interface +# This is Checkbox which provides an extensible interface for system testing. +# See the following page for documentation: +# https://wiki.ubuntu.com/Testing/Automation/Checkbox + +import os +import sys + + +def get_uname(): + keys = ("name", "node", "release", "version", "machine") + values = os.uname() + return dict(zip(keys, values)) + +def main(): + uname = get_uname() + for key, value in uname.iteritems(): + print "%s: %s" % (key, value) + + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff -Nru qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/xrandr_cycle qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/xrandr_cycle --- qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/xrandr_cycle 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/checkbox-hardware-testing/scripts/xrandr_cycle 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,90 @@ +#!/usr/bin/env python +# This script is from the Checkbox Interface +# This is Checkbox which provides an extensible interface for system testing. +# See the following page for documentation: +# https://wiki.ubuntu.com/Testing/Automation/Checkbox + +import subprocess +import time +import sys + +device_context = '' # track what device's modes we are looking at +modes = [] # keep track of all the devices and modes discovered +current_modes = [] # remember the user's current settings for cleanup later +failures = 0 # count the number of failed modesets +failure_messages = [] # remember which modes failed +success_messages = [] # remember which modes succeeded + +# Run xrandr and ask it what devices and modes are supported +xrandrinfo = subprocess.Popen('xrandr -q', shell=True, stdout=subprocess.PIPE) +output = xrandrinfo.communicate()[0].split('\n') + + +# The results from xrandr are given in terms of the available display devices. +# One device can have zero or more associated modes. Unfortunately xrandr +# indicates this through indentation and is kinda wordy, so we have to keep +# track of the context we see mode names in as we parse the results. + +for line in output: + # I haven't seen any blank lines in xrandr's output in my tests, but meh + if line == '': + break; + + # luckily the various data from xrandr are separated by whitespace... + foo = line.split() + + # Check to see if the second word in the line indicates a new context + # -- if so, keep track of the context of the device we're seeing + if len(foo) >= 2: # throw out any weirdly formatted lines + if foo[1] == 'disconnected': + # we have a new context, but it should be ignored + device_context = '' + if foo[1] == 'connected': + # we have a new context that we want to test + device_context = foo[0] + elif device_context != '': # we've previously seen a 'connected' device + # mode names seem to always be of the format [horiz]x[vert] + # (there can be non-mode information inside of a device context!) + if foo[0].find('x') != -1: + modes.append( (device_context, foo[0]) ) + # we also want to remember what the current mode is, which xrandr + # marks with a '*' character, so we can set things back the way + # we found them at the end: + if foo[1].find('*') != -1: + current_modes.append( (device_context, foo[0]) ) + + +# Now we have a list of the modes we need to test. So let's do just that. + +for mode in modes: + cmd = 'xrandr --output ' + mode[0] + ' --mode ' + mode[1] + retval = subprocess.call(cmd, shell=True) + if retval != 0: + failures = failures + 1 + message = 'Failed to set mode ' + mode[1] + ' for output ' + mode[0] + failure_messages.append(message) + else: + message = 'Set mode ' + mode[1] + ' for output ' + mode[0] + success_messages.append(message) + time.sleep(3) # let the hardware recover a bit + + +# Put things back the way we found them + +for mode in current_modes: + cmd = 'xrandr --output ' + mode[0] + ' --mode ' + mode[1] + subprocess.call(cmd, shell=True) + + +# Output some fun facts and knock off for the day + +for message in failure_messages: + print >> sys.stderr, message + +for message in success_messages: + print message + +if failures != 0: + exit(1) +else: + exit(0) diff -Nru qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/chromium/test_chromium.py qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/chromium/test_chromium.py --- qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/chromium/test_chromium.py 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/chromium/test_chromium.py 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,134 @@ +# Copyright (C) 2011 Canonical Ltd +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +# This script contains the tests to run with mago + +""" +Chromium Browser Test Suite +""" + +from mago import TestCase +import unittest +import commands +import ldtp +import ooldtp +import os +import shutil +import tarfile + +class TestChromium(TestCase): + + launcher = '/usr/bin/chromium-browser' + launcher_args = ['%U'] + window_name = 'frm*Chromium' + config_dir = os.path.join(os.path.expanduser('~'), '.config', 'chromium') + config_tar = os.path.join(os.path.dirname(__file__), 'data', 'config.tar.gz') + + button = { + 'windowclose' : 'btn0', + 'newtab' : 'btn4', + 'closetab' : 'btn%r' # first close tab starts at index 5 + } + + text = { + 'address' : 'txt0' + } + + @classmethod + def setUpClass(self): + """Move config fir and restore known state""" + super(TestChromium, self).setUpClass() + if os.path.exists(self.config_dir): + # mv and append .bak + shutil.move(self.config_dir, self.config_dir + '.bak') + # uncompress tar + tar = tarfile.open(self.config_tar) + tar.extractall(os.path.expanduser('~')) + + @classmethod + def tearDownClass(self): + """Delete current state and restore backup""" + super(TestChromium, self).tearDownClass() + # delete config + shutil.rmtree(self.config_dir) + + # mv .bak to config + shutil.move(self.config_dir + '.bak', self.config_dir) + + def test_happypath(self): + # navigate to url + ldtp.settextvalue(self.window_name, self.text['address'], 'http://www.ubuntu.com') + ldtp.generatekeyevent('') + self.assertTrue(ldtp.waittillguiexist('frmUbuntuhomepage|Ubuntu*')) + + # bookmark page + keys = ['', 'd'] + for key in keys: + ldtp.keypress(key) + for key in keys: + ldtp.keyrelease(key) + ldtp.generatekeyevent('') + + # open new tab + ldtp.mouseleftclick(self.window_name, self.button['newtab']) + ldtp.settextvalue(self.window_name, self.text['address'], 'http://www.canonical.com') + ldtp.generatekeyevent('') + self.assertTrue(ldtp.waittillguiexist('frmCanonicalHomepage|Canonical*')) + + # close first tab + ldtp.mouseleftclick(self.window_name, self.button['closetab'] % 5) + self.assertTrue(ldtp.guiexist('frmCanonicalHomepage|Canonical*')) + self.assertFalse(ldtp.guiexist('frmUbuntuhomepage|Ubuntu*')) + + # open bookmarked page + ldtp.mouseleftclick(self.window_name, self.button['newtab']) + ldtp.mouseleftclick(self.window_name, 'btnUbuntuhomepage|Ubuntu*') + self.assertTrue(ldtp.waittillguiexist('frmUbuntuhomepage|Ubuntu*')) + +if __name__ == "__main__": + nose.main() + + +#btn0 = "btn0" +#btn1 = "btn1" +#btn10 = "btn10" +#btn11 = "btn11" +#btn12 = "btn12" +#btn14 = "btn14" +#btn16 = "btn16" +#btn2 = "btn2" +#btn3 = "btn3" +#btn4 = "btn4" +#btn5 = "btn5" +#btn8 = "btn8" +#btnBack = "btnBack" +#btnForward = "btnForward" +#btnHome = "btnHome" +#btnImportbookmarksnow = "btnImportbookmarksnow" +#btnOtherBookmarks = "btnOtherBookmarks" +#ico0 = "ico0" +#ico1 = "ico1" +#ico10 = "ico10" +#ico2 = "ico2" +#ico3 = "ico3" +#ico4 = "ico4" +#ico5 = "ico5" +#ico6 = "ico6" +#ico7 = "ico7" +#ico8 = "ico8" +#ico9 = "ico9" +#txt0 = "txt0" +#txt1 = "txt1" diff -Nru qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/empathy/test_empathy.py qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/empathy/test_empathy.py --- qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/empathy/test_empathy.py 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/empathy/test_empathy.py 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,153 @@ +# Copyright (C) 2010 Canonical Ltd +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +# This script contains the tests to run with mago + +"""Empathy Test + +This is a test that verifies that Empathy application is working correctly. +Tests: +- Create an People Nearby account. +- Check the General Preferences. +- Check the Notifications Preferences. + +To run it with: +$ mago-ng +""" + +from mago import TestCase +import unittest +import ldtp +import ooldtp +import os +import shutil + +ACCOUNT_ASSISTANT = 'frmMessagingandVoIPAccountsAssistant' +RBTN_PEOPLE_NEARBY = 'rbtnNo,Ijustwanttoseepeopleonlinenearbyfornow' +BTN_APPLY = 'btnApply' +BTN_CLOSE = 'btnClose' +BTN_FORWARD = 'btnForward' +FIRSTNAME = 'txtFirstName' +LASTNAME = 'txtLastName' +NICKNAME = 'txtNickname' +MAIN_WINDOW = 'frmContactList' +MNU_PREFERENCES = 'mnuPreferences' +PREFERENCES = 'dlgPreferences' +TABS = 'ptl0' +TAB_GENERAL = 'ptabGeneral' +TAB_NOTIFICATIONS = 'ptabNotifications' +TAB_SOUNDS = 'ptabSounds' +TAB_SPELL = 'ptabSpellChecking' +TAB_THEMES = 'ptabThemes' +#general tab options. +SHOW_SMILEY = 'chkShowsmileysasimages' +SHOW_CONTACTSINROOMS = 'chkShowcontactlistinrooms' +OPEN_CHATS_SEPARATE = 'chkOpennewchatsinseparatewindows' +DISPLAY_EVENTS = 'chkDisplayincomingeventsinthenotificationarea' +CONNECT_STARTUP = 'chkAutomaticallyconnectonstartup' +LOG_CONVERSATIONS = 'chkLogconversations' +#notifications options. +BUBBLE_NOTIFICATIONS = 'chkEnablebubblenotifications' +DISABLE_WHEN_BUSY = 'chkDisablenotificationswhenawayorbusy' +NOTIFY_NOT_FOCUSED = 'chkEnablenotificationswhenthechatisnotfocused' +CONTACT_GOES_OFFLINE = 'chkEnablenotificationswhenacontactgoesoffline' +CONTACT_IS_ONLINE = 'chkEnablenotificationswhenacontactcomesonline' +SHOW_IN_MENU = 'chkShowincomingmessagesinthemessagingmenu' + +GENERAL_OPTIONS = [ SHOW_SMILEY, + SHOW_CONTACTSINROOMS, + OPEN_CHATS_SEPARATE, + DISPLAY_EVENTS, + CONNECT_STARTUP, + LOG_CONVERSATIONS ] + +NOTIFICATIONS_OPTIONS = [ BUBBLE_NOTIFICATIONS, + DISABLE_WHEN_BUSY, + NOTIFY_NOT_FOCUSED, + CONTACT_GOES_OFFLINE, + CONTACT_IS_ONLINE, + SHOW_IN_MENU ] + + +class EmpathyTests(TestCase): + launcher = 'empathy' + window_name = ACCOUNT_ASSISTANT + setupOnce = True + + def tearDown(self): + """ we call the teardown method in order to remove the files on ~/.mission-control + """ + config = os.getenv('HOME') + '/.mission-control/' + + if os.path.exists(config): + shutil.rmtree(config) + + super(EmpathyTests, self).tearDown() + + def test_01_account_assistant(self): + """we filed up the account dialog, change the name of the contact,etc + """ + dialog = ooldtp.context(self.window_name) + ldtp.wait() + dialog.getchild(RBTN_PEOPLE_NEARBY).click() + dialog.getchild(BTN_FORWARD).click() + dialog.getchild(FIRSTNAME).settextvalue('Emmet') + dialog.getchild(LASTNAME).settextvalue('Brown') + dialog.getchild(NICKNAME).settextvalue('Doc') + dialog.getchild(BTN_APPLY).click() + + def test_02_general_preferences(self): + """since the account was already created we check the preferences options + """ + empathy = ooldtp.context(MAIN_WINDOW) + empathy.getchild(MNU_PREFERENCES).selectmenuitem() + ldtp.waittillguiexist(PREFERENCES) + preferences = ooldtp.context(PREFERENCES) + + self.select_general_options(preferences, True) + self.select_general_options(preferences, False) + + preferences.getchild(BTN_CLOSE).click() + + def test_03_notifications_preferences(self): + """since the account was already created we check the notifications options + """ + empathy = ooldtp.context(MAIN_WINDOW) + empathy.getchild(MNU_PREFERENCES).selectmenuitem() + ldtp.waittillguiexist(PREFERENCES) + preferences = ooldtp.context(PREFERENCES) + + self.select_notifications_options(preferences, True) + self.select_notifications_options(preferences, False) + + preferences.getchild(BTN_CLOSE).click() + + def select_general_options(self, preferences, enable): + for option in GENERAL_OPTIONS: + if enable: + preferences.getchild(option).check() + else: + preferences.getchild(option).uncheck() + + def select_notifications_options(self, preferences, enable): + for option in NOTIFICATIONS_OPTIONS: + if enable: + preferences.getchild(option).check() + else: + preferences.getchild(option).uncheck() + +if __name__ == "__main__": + unittest.main() Binary files /tmp/cFjkONjEmM/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/eog/data/ubuntu01_1.jpg and /tmp/D4HGyIf3Td/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/eog/data/ubuntu01_1.jpg differ diff -Nru qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/eog/test_eog.py qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/eog/test_eog.py --- qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/eog/test_eog.py 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/eog/test_eog.py 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,190 @@ +# Copyright (C) 2011 Canonical Ltd +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +# This script contains the tests to run with mago + +""" +Eye of GNOME Test Suite + +pre-requisites: + * install eog-plugins + * Map plugin is not enabled + +""" + +from mago import TestCase +import unittest +import commands +import ldtp +import ooldtp +import os + +class TestEyeOfGnome(TestCase): + + launcher = 'eog' + img_path = os.path.join(os.path.dirname(__file__), 'data', 'ubuntu01_1.jpg') + launcher_args = [img_path] + #window_name = 'frmubuntu01.jpg' + window_name = 'frm0' # TODO hack until JB's mago launcher_args fix is committed + + dialog = { + 'Preferences' : 'dlgEyeofGNOMEPreferences' + } + menu = { + 'Preferences' : 'mnuPreferences' + } + + table = { + 'ActivePlugins' : 'tblActivePlugins' + } + + pageTab = { + 'Plugins' : 'ptabPlugins' + } + + + def test_bug730733(self): + # TODO hack until JB's mago launcher_args fix is committed + ldtp.click(self.window_name, 'mnu*ubuntu01*') + self.window_name = 'frmubuntu01.jpg' + ldtp.waittillguiexist(self.window_name) + # end hack + + ldtp.click(self.window_name, self.menu['Preferences']) + ldtp.waittillguiexist(self.dialog['Preferences']) + ldtp.mouseleftclick(self.dialog['Preferences'], self.pageTab['Plugins']) + + # TODO I'd like to either see this partial match get added to LDTP + # or refactor this to mago + row = 0 + row_count = ldtp.getrowcount(self.dialog['Preferences'], self.table['ActivePlugins']) + while row <= row_count: + name = ldtp.getcellvalue(self.dialog['Preferences'], self.table['ActivePlugins'], row, 1) + if 'Map' in name: + ldtp.checkrow(self.dialog['Preferences'], self.table['ActivePlugins'], row) + break + row += 1 + + self.application.close() + self.application.launch() + self.application.close() + +if __name__ == "__main__": + nose.main() + +#launcher = 'eog' +#launcher_args = [] +#window_name = 'frmubuntu01*jpg' + +#btn10 = "btn10" +#btn11 = "btn11" +#btnClose = "btnClose" +#btnEditImage = "btnEditImage" +#btnFit = "btnFit" +#btnIn = "btnIn" +#btnLeft = "btnLeft" +#btnNext = "btnNext" +#btnNormal = "btnNormal" +#btnOut = "btnOut" +#btnPrevious = "btnPrevious" +#btnRight = "btnRight" +#ico0 = "ico0" +#mnu1ubuntu01jpg = "mnu1ubuntu01jpg" +#mnuAbout = "mnuAbout" +#mnuBestFit = "mnuBestFit" +#mnuClose = "mnuClose" +#mnuContents = "mnuContents" +#mnuEdit = "mnuEdit" +#mnuEmpty = "mnuEmpty" +#mnuEmpty1 = "mnuEmpty1" +#mnuEmpty2 = "mnuEmpty2" +#mnuEmpty3 = "mnuEmpty3" +#mnuEmpty4 = "mnuEmpty4" +#mnuEmpty5 = "mnuEmpty5" +#mnuEmpty6 = "mnuEmpty6" +#mnuFirefoxWebBrowser = "mnuFirefoxWebBrowser" +#mnuFirstImage = "mnuFirstImage" +#mnuFlickrUploader = "mnuFlickrUploader" +#mnuFlipHorizontal = "mnuFlipHorizontal" +#mnuFlipVertical = "mnuFlipVertical" +#mnuFullscreen = "mnuFullscreen" +#mnuGetHelpOnline = "mnuGetHelpOnline" +#mnuGo = "mnuGo" +#mnuHelp = "mnuHelp" +#mnuImage = "mnuImage" +#mnuImageCollection = "mnuImageCollection" +#mnuLastImage = "mnuLastImage" +#mnuMovetoTrash = "mnuMovetoTrash" +#mnuNextImage = "mnuNextImage" +#mnuNormalSize = "mnuNormalSize" +#mnuOpenwith = "mnuOpenwith" +#mnuOpen___ = "mnuOpen*" +#mnuPreferences = "mnuPreferences" +#mnuPreviousImage = "mnuPreviousImage" +#mnuPrint___ = "mnuPrint*" +#mnuProperties = "mnuProperties" +#mnuRandomImage = "mnuRandomImage" +#mnuReportaProblem = "mnuReportaProblem" +#mnuRotateClockwise = "mnuRotateClockwise" +#mnuRotateCounterclockwise = "mnuRotateCounterclockwise" +#mnuSave = "mnuSave" +#mnuSaveAs___ = "mnuSaveAs*" +#mnuSetasDesktopBackground = "mnuSetasDesktopBackground" +#mnuShotwellPhotoViewer = "mnuShotwellPhotoViewer" +#mnuSidePane = "mnuSidePane" +#mnuSlideshow = "mnuSlideshow" +#mnuStatusbar = "mnuStatusbar" +#mnuToolbar = "mnuToolbar" +#mnuToolbar1 = "mnuToolbar1" +#mnuTools = "mnuTools" +#mnuTranslateThisApplication = "mnuTranslateThisApplication" +#mnuUndo = "mnuUndo" +#mnuView = "mnuView" +#mnuZoomIn = "mnuZoomIn" +#mnuZoomOut = "mnuZoomOut" +#ptl0 = "ptl0" +#scbr0 = "scbr0" +#scbr1 = "scbr1" +#scbr2 = "scbr2" +#tbtn0 = "tbtn0" + +#launcher = 'eog' +#launcher_args = [] +#window_name = 'dlgEyeofGNOMEPreferences' + +#btn0 = "btn0" +#btn1 = "btn1" +#btnAboutPlugin = "btnAboutPlugin" +#btnClose = "btnClose" +#btnConfigurePlugin = "btnConfigurePlugin" +#btnHelp = "btnHelp" +#chkAscustomcolor = "chkAscustomcolor" +#chkAutomaticorientation = "chkAutomaticorientation" +#chkExpandimagestofitscreen = "chkExpandimagestofitscreen" +#chkLoopsequence = "chkLoopsequence" +#chkSmoothimageswhenzoomed_in = "chkSmoothimageswhenzoomed-in" +#chkSmoothimageswhenzoomed_out = "chkSmoothimageswhenzoomed-out" +#ptabImageView = "ptabImageView" +#ptabPlugins = "ptabPlugins" +#ptabSlideshow = "ptabSlideshow" +#ptl0 = "ptl0" +#rbtnAsbackground = "rbtnAsbackground" +#rbtnAscheckpattern = "rbtnAscheckpattern" +#rbtnAscustomcolor = "rbtnAscustomcolor" +#sbtnSwitchimageafter = "sbtnSwitchimageafter" +#scbr0 = "scbr0" +#tblActivePlugins = "tblActivePlugins" + Binary files /tmp/cFjkONjEmM/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/evince/data/case_Contact_gzipped.pdf.bz2 and /tmp/D4HGyIf3Td/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/evince/data/case_Contact_gzipped.pdf.bz2 differ Binary files /tmp/cFjkONjEmM/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/evince/data/case_Contact_gzipped.pdf.gz and /tmp/D4HGyIf3Td/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/evince/data/case_Contact_gzipped.pdf.gz differ Binary files /tmp/cFjkONjEmM/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/evince/data/cups_testprint.djvu and /tmp/D4HGyIf3Td/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/evince/data/cups_testprint.djvu differ diff -Nru qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/evince/data/cups_testprint.ps qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/evince/data/cups_testprint.ps --- qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/evince/data/cups_testprint.ps 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/evince/data/cups_testprint.ps 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,598 @@ +%!PS-Adobe-3.0 +%%BoundingBox: 0 0 612 792 +%%Pages: 1 +%%LanguageLevel: 1 +%%DocumentData: Clean7Bit +%%DocumentSuppliedResources: procset testprint/1.3 +%%DocumentNeededResources: font Helvetica Helvetica-Bold Times-Roman +%%Creator: Michael Sweet, Apple Inc. +%%CreationDate: D:20070606214000+0500 +%%Title: Test Page +%%EndComments +%%BeginProlog +%%BeginResource procset testprint 1.3 0 +% +% PostScript test page for the Common UNIX Printing System ("CUPS"). +% +% Copyright 2007-2008 Apple Inc. +% Copyright 1993-2007 Easy Software Products +% +% These coded instructions, statements, and computer programs are the +% property of Apple Inc. and are protected by Federal copyright law. +% Distribution and use rights are outlined in the file "LICENSE.txt" +% which is included with the CUPS source distribution. +% +/SEXTANT { % Draw a color wheel sextant... + % (name) white radius r g b SEXTANT - + % Loop through 100 shades... + 0 0.010101 0.98 { + % Set the color... + dup 0.75 le { % Get "white" value + % Start from black + dup 0.75 div % val2 = val / 0.75 + + 0 index 5 index mul % R = R * val2 + 1 index 5 index mul % G = G * val2 + 2 index 5 index mul % B = B * val2 + + 4 -1 roll pop % Discard val2 + } { + % Fade to white + dup neg 1 add 4 mul % val2 = (1 - val) * 4 + + 0 index 5 index mul % R = R * val2 + 1 index neg 1 add add % + (1 - val2) + 1 index 5 index mul % G = G * val2 + 2 index neg 1 add add % + (1 - val2) + 2 index 5 index mul % B = B * val2 + 3 index neg 1 add add % + (1 - val2) + + 4 -1 roll pop % Discard val2 + } ifelse + setrgbcolor % Set the color... + + % Draw the polygon... + newpath % Start a new path... + dup 5 index mul % r1 = radius * val + 0 0 3 -1 roll 0 60 arc % Draw the inner arc + + dup 0.010101 add 5 index mul% r2 = (radius + 0.010101) * val + 0 0 3 -1 roll 60 0 arcn % Draw the outer arc + + closepath % Close the path + fill % Fill it... + + pop % Pop value... + } for + + % Draw a line around the polygons... + pop pop pop dup % Pop R, G, B, start + 0 setgray % Black + newpath + 0 0 moveto % Center + 0 0 3 -1 roll 0 60 arc % Arc around octant + closepath % Back to center + stroke % Stroke it... + + % Draw the label... + dup % Save radius + dup 30 cos mul % X = radius * cos(30) + exch 30 sin mul % Y = radius * sin(30) + moveto % Position label + + gsave + 30 rotate % Rotate label + dup 0.05 mul % Offset to the right + exch -0.05 mul % and down... + rmoveto % Offset label + show % Show label + grestore +} bind def +/CENTER { % Draw centered text + % (name) CENTER - + dup stringwidth pop % Get the width of the string + 0.5 mul neg 0 rmoveto % Shift left 1/2 of the distance + show % Show the string +} bind def +/RIGHT { % Draw right-justified text + % (name) RIGHT - + dup stringwidth pop % Get the width of the string + neg 0 rmoveto % Shift left the entire distance + show % Show the string +} bind def +/NUMBER { % Draw a number + % power n NUMBER - + 1 index 1 eq { % power == 1? + round cvi exch pop % Convert "n" to integer + } { + 1 index mul round exch div % Truncate extra decimal places + } ifelse + 100 string cvs show % Convert to a string and show it... +} bind def +/CUPSLOGO { % Draw the CUPS logo + % height CUPSLOGO + % Start with a big C... + /Helvetica findfont 1 index scalefont setfont + 0 setgray + 0 0 moveto + (C) show + + % Then "UNIX Printing System" much smaller... + /Helvetica-Bold findfont 1 index 9 div scalefont setfont + 0.25 mul + dup dup 2.0 mul moveto + (UNIX) show + dup dup 1.6 mul moveto + (Printing) show + dup 1.2 mul moveto + (System) show +} bind def +%%EndResource +%%EndProlog +%%Page: 1 1 +gsave + + % Determine the imageable area and device resolution... + initclip newpath clippath pathbbox % Get bounding rectangle + 72 div /pageTop exch def % Get top margin in inches + 72 div /pageRight exch def % Get right margin in inches + 72 div /pageBottom exch def % Get bottom margin in inches + 72 div /pageLeft exch def % Get left margin in inches + + 4 setlinewidth % Draw wide lines + 0 setgray closepath stroke % Draw a clipping rectangle + + /pageWidth pageRight pageLeft sub def % pageWidth = pageRight - pageLeft + /pageHeight pageTop pageBottom sub def% pageHeight = pageTop - pageBottom + + 72 72 dtransform % Get device resolution per inch + /yResolution exch abs def % yResolution = abs(yres) + /xResolution exch abs def % xResolution = abs(xres) + + % Figure out the sizes of things... + /wheelSize % size of wheels + pageWidth pageHeight lt + { pageWidth 9 mul } + { pageHeight 7 mul } + ifelse def + + % Create fonts... + /bigFont /Helvetica-Bold findfont % bigFont = Helvetica-Bold + pageHeight 3 mul scalefont def % size = pageHeight * 3 (nominally 33) + + /mediumFont /Helvetica findfont % mediumFont = Helvetica + pageHeight 1.5 mul scalefont def % size = pageHeight * 1.5 (nominally 16.5) + + /smallFont /Times-Roman findfont % smallFont = Times-Roman + pageHeight scalefont def % size = pageHeight (nominally 11) + + % Draw rulers along the edges... + /CENTIMETER 72 2.54 div def + /MILLIMETER 72 25.4 div def + + /Times-Roman findfont % Font for ruler numbers + 11 scalefont setfont % 11 points + + gsave % Left side inches + pageLeft 72 mul 0 translate % Offset left edge + + 1 setlinewidth % Draw normal lines + 72 72 pageTop 72 mul { % Height inches + dup dup + 0 exch moveto 24 0 rlineto stroke % Draw tic mark + 24 exch pageHeight sub moveto % Draw number + 72 div cvi 10 string cvs RIGHT + } for + + 0.5 setlinewidth % Draw thin lines + 18 18 pageTop 72 mul { % 1/4 inches + 0 exch moveto 15 0 rlineto stroke % Draw tic mark + } for + + 9 9 pageTop 72 mul { % 1/8 inches + 0 exch moveto 6 0 rlineto stroke % Draw tic mark + } for + grestore + + gsave % Bottom inches + 0 pageBottom 72 mul translate % Offset bottom edge + + 1 setlinewidth % Draw normal lines + 72 72 pageRight 72 mul { % Width inches + dup dup + 0 moveto 0 24 rlineto stroke % Draw tic mark + 3 add 27 pageHeight sub moveto % Draw number + 72 div cvi 10 string cvs show + } for + + 0.5 setlinewidth % Draw thin lines + 18 18 pageRight 72 mul { % 1/4 inches + 0 moveto 0 15 rlineto stroke % Draw tic mark + } for + + 9 9 pageRight 72 mul { % 1/8 inches + 0 moveto 0 6 rlineto stroke % Draw tic mark + } for + grestore + + gsave % Right side centimeters + pageRight 72 mul 0 translate % Offset right edge + + 1 setlinewidth % Draw normal lines + CENTIMETER CENTIMETER + pageTop 72 mul { % Height centimeters + 0 exch moveto -24 0 rlineto stroke% Draw tic mark + } for + 1 1 pageTop 2.54 mul { % Height labels + dup + -24 exch CENTIMETER mul + pageHeight sub moveto % Draw number + cvi 10 string cvs show + } for + + 0.5 setlinewidth % Draw thin lines + 0 0.5 CENTIMETER mul + pageTop 72 mul { % 1/2 centimeters + 0 exch moveto -15 0 rlineto stroke% Draw tic mark + } for + 0 MILLIMETER pageTop 72 mul { % Millimeters + 0 exch moveto -6 0 rlineto stroke % Draw tic mark + } for + grestore + + gsave % Top centimeters + 0 pageTop 72 mul translate % Offset top edge + + 1 setlinewidth % Draw normal lines + CENTIMETER CENTIMETER + pageRight 72 mul { % Width centimeters + 0 moveto 0 -24 rlineto stroke % Draw tic mark + } for + 1 1 pageRight 2.54 mul { % Width labels + dup + CENTIMETER mul 3 add -24 moveto % Draw number + cvi 10 string cvs show + } for + + 0.5 setlinewidth % Draw thin lines + 0 0.5 CENTIMETER mul + pageRight 72 mul { % 1/2 centimeters + 0 moveto 0 -15 rlineto stroke % Draw tic mark + } for + 0 MILLIMETER pageRight 72 mul { % Millimeters + 0 moveto 0 -6 rlineto stroke % Draw tic mark + } for + grestore + + % Offset page to account for lower-left margin... + pageLeft 72 mul + pageBottom 72 mul + translate + + % Set text font and color... + mediumFont setfont % Font + 0 setgray % Color + 1 setlinewidth % Draw normal lines + + % Draw the color wheel... + gsave + % Position the wheel on the left side... + pageWidth 18 mul % x = pageWidth * 1/4 * 72 + pageHeight 54 mul % y = pageHeight * 3/4 * 72 + translate + + % Size the wheel... + wheelSize + + % Draw the colors... + dup (C) 3 -1 roll 0 1 1 SEXTANT 60 rotate + dup (M) 3 -1 roll 1 0 1 SEXTANT 60 rotate + dup (Y) 3 -1 roll 1 1 0 SEXTANT 60 rotate + dup (R) 3 -1 roll 1 0 0 SEXTANT 60 rotate + dup (G) 3 -1 roll 0 1 0 SEXTANT 60 rotate + dup (B) 3 -1 roll 0 0 1 SEXTANT 60 rotate + + pop + grestore + + % Label the color wheel... + pageWidth 18 mul % x = pageWidth * 1/4 * 72 + pageHeight 43 mul % y = pageHeight * 19/32 * 72 + moveto % Position the text + (Color Wheel) CENTER % Show the text centered + + % Draw the gray ramp... + gsave + % Position the gray ramp in the center... + pageWidth 36 mul % x = pageWidth * 1/2 * 72 + pageHeight 54 mul % y = pageHeight * 3/4 * 72 + wheelSize sub % - wheelSize + translate + + % Loop through 100 shades... + 0 0.010101 0.98 { + % Set the color... + dup setgray % Set the grayscale... + + % Draw the polygon... + newpath % Start a new path... + + wheelSize -0.2 mul % X = -wheelSize / 5 + 1 index 2 mul wheelSize mul % Y = val * 2 * wheelSize + moveto % Move there... + + wheelSize 0.4 mul 0 rlineto % Right side... + + wheelSize 0.2 mul % X = wheelSize / 5 + 1 index 0.010101 add 2 mul wheelSize mul + % Y = (val + 0.010101) * 2 * wheelSize + lineto % Move there... + + wheelSize -0.4 mul 0 rlineto % Left side... + + closepath % Close the path + fill % Fill it... + + pop % Pop value... + } for + + 0 setgray % Black + + newpath % Start a new path + wheelSize -0.2 mul 0 moveto % Bottom left + wheelSize 0.4 mul 0 rlineto % Bottom right + 0 wheelSize 2 mul rlineto % Upper right + wheelSize -0.4 mul 0 rlineto % Upper left + closepath % Close the path + stroke % Stroke it... + + 0 wheelSize -0.2 mul moveto % Center bottom for label + (K) CENTER % Center K at bottom + + 0 wheelSize 2.05 mul moveto % Center top for label + (W) CENTER % Center W at top + grestore + + % Label the gray ramp... + pageWidth 36 mul % x = pageWidth * 1/2 * 72 + pageHeight 43 mul % y = pageHeight * 19/32 * 72 + moveto % Position the text + (Gray Ramp) CENTER % Show the text centered + + + % Draw radial lines... + gsave + 0 setlinewidth % 1 pixel lines + + % Position the lines on the left side... + pageWidth 54 mul % x = pageWidth * 3/4 * 72 + pageHeight 54 mul % y = pageHeight * 3/4 * 72 + translate + + % Size the wheel... + wheelSize + + % Loop at 1 degree increments + 0 1 359 { + pop % Discard angle - not used + 0 0 moveto % Start line at the center + dup 0 lineto % Draw to the radius + 1 rotate % Rotate 1 degree + } for + + pop % Discard radius - not needed anymore + stroke % Draw lines... + + grestore + + % Label the lines... + pageWidth 54 mul % x = pageWidth * 3/4 * 72 + pageHeight 43 mul % y = pageHeight * 19/32 * 72 + moveto % Position the text + (1 Degree Radial Lines) CENTER % Show the text centered + + % Imageable area... + pageHeight 15 mul % Height of imageable area + + pageWidth 4.5 mul % x = pageWidth * 1/16 * 72 + pageHeight 35.5 mul % y = pageHeight * 1/2 * 72 + 2 index sub % y -= height + pageWidth 28 mul % width = pageWidth * 1/4 * 72 + 3 index % height + 0.5 setgray rectfill % Draw a shadow + + pageWidth 4 mul % x = pageWidth * 1/16 * 72 + pageHeight 36 mul % y = pageHeight * 1/2 * 72 + 2 index sub % y -= height + pageWidth 28 mul % width = pageWidth * 3/8 * 72 + 3 index % height + 4 copy 1 setgray rectfill % Clear the box to white + 0 setgray rectstroke % Draw a black box around it... + + pop % Discard height + + % Label the imageable area... + pageWidth 4 mul % x = pageWidth * 1/16 * 72 + pageHeight 37 mul % y = pageHeight * 1/2 * 72 + moveto % Position the text + mediumFont setfont % Font + (Imageable Area) show % Show the text + + smallFont setfont % Font + pageWidth 14 mul % x = pageWidth * 3/16 * 72 + pageHeight 36 mul % y = pageWidth * 1/2 * 72 + pageHeight -2 mul add % y -= 2 * smallFont height + + % Page Size inches + 2 copy moveto % Move to x & y + (Page Size: ) RIGHT % Label + 100 pageWidth NUMBER % pageWidth + (x) show % "x" + 100 pageHeight NUMBER % pageHeight + (in) show % "in" + + % Page Size millimeters + pageHeight sub % Move down... + + 2 copy moveto % Move to x & y + 10 pageWidth 25.4 mul NUMBER % pageWidth + (x) show % "x" + 10 pageHeight 25.4 mul NUMBER % pageHeight + (mm) show % "mm" + + % Lower-left inches + pageHeight 2 mul sub % Move down... + + 2 copy moveto % Move to x & y + (Lower-Left: ) RIGHT % Label + 100 pageLeft NUMBER % pageLeft + (x) show % "x" + 100 pageBottom NUMBER % pageBottom + (in) show % "in" + + % Lower-left millimeters + pageHeight sub % Move down... + + 2 copy moveto % Move to x & y + 10 pageLeft 25.4 mul NUMBER % pageLeft + (x) show % "x" + 10 pageBottom 25.4 mul NUMBER % pageBottom + (mm) show % "mm" + + % Upper-right inches + pageHeight 2 mul sub % Move down... + + 2 copy moveto % Move to x & y + (Upper-Right: ) RIGHT % Label + 100 pageRight NUMBER % pageRight + (x) show % "x" + 100 pageTop NUMBER % pageTop + (in) show % "in" + + % Upper-right millimeters + pageHeight sub % Move down... + + 2 copy moveto % Move to x & y + 10 pageRight 25.4 mul NUMBER % pageRight + (x) show % "x" + 10 pageTop 25.4 mul NUMBER % pageTop + (mm) show % "mm" + + % Resolution dots-per-inch + pageHeight 2 mul sub % Move down... + + 2 copy moveto % Move to x & y + (Resolution: ) RIGHT % Label + 1 xResolution NUMBER % xResolution + (x) show % "x" + 1 yResolution NUMBER % yResolution + (dpi) show % "dpi" + + % Resolution dots-per-meter + pageHeight sub % Move down... + + moveto % Move to x & y + 1 xResolution 39.27 mul NUMBER % xResolution + (x) show % "x" + 1 yResolution 39.27 mul NUMBER % yResolution + (dpm) show % "dpm" + + % Interpreter Information... + pageHeight 15 mul % Height of interpreter information + + pageWidth 40.5 mul % x = pageWidth * 9/16 * 72 + pageHeight 35.5 mul % y = pageHeight * 1/2 * 72 + 2 index sub % y -= height + pageWidth 28 mul % width = pageWidth * 1/4 * 72 + 3 index % height + 0.5 setgray rectfill % Draw a shadow + + pageWidth 40 mul % x = pageWidth * 9/16 * 72 + pageHeight 36 mul % y = pageHeight * 1/2 * 72 + 2 index sub % y -= height + pageWidth 28 mul % width = pageWidth * 3/8 * 72 + 3 index % height + 4 copy 1 setgray rectfill % Clear the box to white + 0 setgray rectstroke % Draw a black box around it... + + pop % Discard height + + % Label the interpreter info... + pageWidth 40 mul % x = pageWidth * 9/16 * 72 + pageHeight 37 mul % y = pageHeight * 1/2 * 72 + moveto % Position the text + mediumFont setfont % Font + (Interpreter Information) show % Show the text + + smallFont setfont % Font + pageWidth 49 mul % x = pageWidth * 11/16 * 72 + pageHeight 36 mul % y = pageWidth * 1/2 * 72 + pageHeight 2 mul sub % y -= 2 * smallFont height + + % Language level + 2 copy moveto % Move to x & y + (PostScript: ) RIGHT % Label + (Level ) show % "Level " + 1 languagelevel NUMBER % Language level + + % Version + pageHeight 2 mul sub % Move down... + 2 copy moveto % Move to x & y + (Version: ) RIGHT % Label + version show % Version + ( \() show % " (" + 1 revision NUMBER % Revision + (\)) show % ")" + + % Product + pageHeight 2 mul sub % Move down... + 2 copy moveto % Move to x & y + (Product: ) RIGHT % Label + product show % Product name + + % Serial Number + pageHeight 2 mul sub % Move down... + moveto % Move to x & y + (Serial #: ) RIGHT % Label + 1 serialnumber NUMBER % S/N + + % Draw the label at the top... + pageWidth 36 mul % Center of page + pageHeight 66 mul % Top of page (11/12ths) + moveto % Position text + bigFont setfont % Font + (Printer Test Page) CENTER % Show text centered + + % Draw the copyright notice at the bottom... + pageWidth 17 mul % Center of page + pageHeight 10 mul % Bottom of page + moveto % Position text + (Printed Using CUPS v1.3.x) show + + pageWidth 17 mul % Left side of page + pageHeight 8 mul % Move down... + 2 copy moveto % Position text + smallFont setfont % Font + (Copyright 2007-2008 Apple Inc., All Rights Reserved. CUPS and the CUPS logo are the) show + pageHeight 2 add sub % Move down... + 2 copy moveto % Position text + (trademark property of Apple Inc., 1 Infinite Loop, Cupertino, CA 95014, USA.) show + pageHeight 2 mul 4 add sub % Move down... + moveto % Position text + (Need help? Contact your operating system vendor or visit "http://www.cups.org/".) show + + % Then the CUPS logo.... + gsave + pageWidth 4 mul + pageHeight 4 mul + translate + pageWidth 15 mul CUPSLOGO + grestore + +% Show the page... +grestore +showpage +% +% End of "$Id: testprint.ps 7158 2008-01-02 21:23:11Z mike $". +% +%%EOF Binary files /tmp/cFjkONjEmM/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/evince/data/exif-data.jpg and /tmp/D4HGyIf3Td/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/evince/data/exif-data.jpg differ Binary files /tmp/cFjkONjEmM/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/evince/data/kubuntu-leaflet.jpg and /tmp/D4HGyIf3Td/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/evince/data/kubuntu-leaflet.jpg differ Binary files /tmp/cFjkONjEmM/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/evince/data/test.cb7 and /tmp/D4HGyIf3Td/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/evince/data/test.cb7 differ Binary files /tmp/cFjkONjEmM/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/evince/data/test.cbr and /tmp/D4HGyIf3Td/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/evince/data/test.cbr differ Binary files /tmp/cFjkONjEmM/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/evince/data/test.cbt and /tmp/D4HGyIf3Td/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/evince/data/test.cbt differ Binary files /tmp/cFjkONjEmM/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/evince/data/test.cbz and /tmp/D4HGyIf3Td/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/evince/data/test.cbz differ Binary files /tmp/cFjkONjEmM/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/evince/data/test.dvi and /tmp/D4HGyIf3Td/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/evince/data/test.dvi differ Binary files /tmp/cFjkONjEmM/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/evince/data/ubuntu_philosophy.pdf and /tmp/D4HGyIf3Td/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/evince/data/ubuntu_philosophy.pdf differ Binary files /tmp/cFjkONjEmM/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/evince/data/well-formed.bmp and /tmp/D4HGyIf3Td/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/evince/data/well-formed.bmp differ diff -Nru qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/evince/data/well-formed.eps qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/evince/data/well-formed.eps --- qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/evince/data/well-formed.eps 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/evince/data/well-formed.eps 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,874 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: (ImageMagick) +%%Title: (./well-formed.eps) +%%CreationDate: (Wed Aug 19 12:42:33 2009) +%%BoundingBox: 0 0 92 84 +%%HiResBoundingBox: 0 0 92.021 84 +%%DocumentData: Clean7Bit +%%LanguageLevel: 1 +%%Pages: 1 +%%EndComments + +%%BeginDefaults +%%EndDefaults + +%%BeginProlog +% +% Display a color image. The image is displayed in color on +% Postscript viewers or printers that support color, otherwise +% it is displayed as grayscale. +% +/DirectClassPacket +{ + % + % Get a DirectClass packet. + % + % Parameters: + % red. + % green. + % blue. + % length: number of pixels minus one of this color (optional). + % + currentfile color_packet readhexstring pop pop + compression 0 eq + { + /number_pixels 3 def + } + { + currentfile byte readhexstring pop 0 get + /number_pixels exch 1 add 3 mul def + } ifelse + 0 3 number_pixels 1 sub + { + pixels exch color_packet putinterval + } for + pixels 0 number_pixels getinterval +} bind def + +/DirectClassImage +{ + % + % Display a DirectClass image. + % + systemdict /colorimage known + { + columns rows 8 + [ + columns 0 0 + rows neg 0 rows + ] + { DirectClassPacket } false 3 colorimage + } + { + % + % No colorimage operator; convert to grayscale. + % + columns rows 8 + [ + columns 0 0 + rows neg 0 rows + ] + { GrayDirectClassPacket } image + } ifelse +} bind def + +/GrayDirectClassPacket +{ + % + % Get a DirectClass packet; convert to grayscale. + % + % Parameters: + % red + % green + % blue + % length: number of pixels minus one of this color (optional). + % + currentfile color_packet readhexstring pop pop + color_packet 0 get 0.299 mul + color_packet 1 get 0.587 mul add + color_packet 2 get 0.114 mul add + cvi + /gray_packet exch def + compression 0 eq + { + /number_pixels 1 def + } + { + currentfile byte readhexstring pop 0 get + /number_pixels exch 1 add def + } ifelse + 0 1 number_pixels 1 sub + { + pixels exch gray_packet put + } for + pixels 0 number_pixels getinterval +} bind def + +/GrayPseudoClassPacket +{ + % + % Get a PseudoClass packet; convert to grayscale. + % + % Parameters: + % index: index into the colormap. + % length: number of pixels minus one of this color (optional). + % + currentfile byte readhexstring pop 0 get + /offset exch 3 mul def + /color_packet colormap offset 3 getinterval def + color_packet 0 get 0.299 mul + color_packet 1 get 0.587 mul add + color_packet 2 get 0.114 mul add + cvi + /gray_packet exch def + compression 0 eq + { + /number_pixels 1 def + } + { + currentfile byte readhexstring pop 0 get + /number_pixels exch 1 add def + } ifelse + 0 1 number_pixels 1 sub + { + pixels exch gray_packet put + } for + pixels 0 number_pixels getinterval +} bind def + +/PseudoClassPacket +{ + % + % Get a PseudoClass packet. + % + % Parameters: + % index: index into the colormap. + % length: number of pixels minus one of this color (optional). + % + currentfile byte readhexstring pop 0 get + /offset exch 3 mul def + /color_packet colormap offset 3 getinterval def + compression 0 eq + { + /number_pixels 3 def + } + { + currentfile byte readhexstring pop 0 get + /number_pixels exch 1 add 3 mul def + } ifelse + 0 3 number_pixels 1 sub + { + pixels exch color_packet putinterval + } for + pixels 0 number_pixels getinterval +} bind def + +/PseudoClassImage +{ + % + % Display a PseudoClass image. + % + % Parameters: + % class: 0-PseudoClass or 1-Grayscale. + % + currentfile buffer readline pop + token pop /class exch def pop + class 0 gt + { + currentfile buffer readline pop + token pop /depth exch def pop + /grays columns 8 add depth sub depth mul 8 idiv string def + columns rows depth + [ + columns 0 0 + rows neg 0 rows + ] + { currentfile grays readhexstring pop } image + } + { + % + % Parameters: + % colors: number of colors in the colormap. + % colormap: red, green, blue color packets. + % + currentfile buffer readline pop + token pop /colors exch def pop + /colors colors 3 mul def + /colormap colors string def + currentfile colormap readhexstring pop pop + systemdict /colorimage known + { + columns rows 8 + [ + columns 0 0 + rows neg 0 rows + ] + { PseudoClassPacket } false 3 colorimage + } + { + % + % No colorimage operator; convert to grayscale. + % + columns rows 8 + [ + columns 0 0 + rows neg 0 rows + ] + { GrayPseudoClassPacket } image + } ifelse + } ifelse +} bind def + +/DisplayImage +{ + % + % Display a DirectClass or PseudoClass image. + % + % Parameters: + % x & y translation. + % x & y scale. + % label pointsize. + % image label. + % image columns & rows. + % class: 0-DirectClass or 1-PseudoClass. + % compression: 0-none or 1-RunlengthEncoded. + % hex color packets. + % + gsave + /buffer 512 string def + /byte 1 string def + /color_packet 3 string def + /pixels 768 string def + + currentfile buffer readline pop + token pop /x exch def + token pop /y exch def pop + x y translate + currentfile buffer readline pop + token pop /x exch def + token pop /y exch def pop + currentfile buffer readline pop + token pop /pointsize exch def pop + /Times-Roman findfont pointsize scalefont setfont + x y scale + currentfile buffer readline pop + token pop /columns exch def + token pop /rows exch def pop + currentfile buffer readline pop + token pop /class exch def pop + currentfile buffer readline pop + token pop /compression exch def pop + class 0 gt { PseudoClassImage } { DirectClassImage } ifelse + grestore +} bind def +%%EndProlog +%%Page: 1 1 +%%PageBoundingBox: 0 0 92 84 +userdict begin +DisplayImage +0 0 +92.021 84.0191 +12.000000 +92 84 +0 +0 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000002344B00456A00486F00496F004A71 +004A71014A72014A72014A71004A7100497000486E00476C004468003D5D011A28000000000000 +000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFF00000000000001253A01466D004A71004B72024C74014C74014C74014C74 +014C74024C74044E75064F76064F76044E75024C75014C73014C74014C74014C74004B73004970 +00456901395900090E000000000000000000000000000000000000000000000000FFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFF00000000000001486F014A71004B73014C74014C74034E752C6A8B618FA78EAFC1 +B2C9D4D1DFE5E8EFF2F4F7F9FAFCFDFAFCFDF4F7F9E8EEF2D0DEE5B2C9D48DAFC0608EA72B698A +034D75014C74014C74004A7200446901314C000000000000000000000000000000000000000000 +000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFF000000061D2700496F014B73014C74014C740E557B588AA3A7C1CEDAE5E8AAC2CFFAFCFC +FFFEFFFEFEFFEBF1F4D7E3E8FDFEFED6E2E9D4E1E7CFDDE4EBF1F4F7F9FAFAFBFCFFFFFFFEFEFE +B7CDD6D6E1E7A4BFCC5788A20D547A014C74014C7400476D003855000204000000000000000000 +000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +000000000000004A71004B73014C74024C74387290A0BCCAF3F6F7E9EFF2A5BFCCCCDBE2024C73 +5D8CA4618FA7DBE5E90E557B2061847DA3B65C8CA650839D12587D9AB8C62C698B306D8D397391 +D7E3E8074F779CB9C8FCFDFDFEFEFDF1F5F69DB9C834708F014C74014C7400486E013450000000 +000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +00000002476E014C72014C74024C74467C99C0D3DBB2C8D39EBAC8FFFFFF9CB9C8024C7494B4C3 +0C53794D829D024C749AB8C7024D745C8CA54179965587A25588A20C537990B1C1024D74618FA7 +085077A8C2CE054E752363866A96AD8AACBD4C7F9BFCFDFDFEFFFEBDD1DA427997014C74014C74 +014469012133000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +000000014A71024C74014C742E6B8BBACED8FEFEFEFFFFFF709AB0165B7FF6F8F9E6EDF013597E +8DAEC03B75935C8CA6064F767AA0B5014C745D8CA52C6A8B4D829E5C8CA5064E75759DB2014C74 +5E8DA52665886B96AD33708F2F6D8D709AAF336F8E185C80F0F5F7F0F5F6FBFCFCFEFEFEB6CBD6 +2A698A024C74004A72023957000000000000000000000000000000000000000000FFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 +044768014B72014C7409517886AABCF9FBFBFFFFFFFFFFFFFFFFFFDBE5EA044E769DBAC9FFFFFE +5C8CA53F7795709AB0346F902E6C8B6894AB0C53792967894D819C5C8DA6266588034C7488ABBD +336F8F1F61844A7F9B276788608FA7044E7597B6C5054E76ABC4D0FFFFFF739CB16E98AEC9D9E1 +FEFEFDF8FAFA81A7B8085177014C7401436602141E000000000000000000000000000000000000 +000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 +034A71014B73014C742D6A8BD2DFE5FEFEFFCFDDE479A0B6E0E8ECFFFFFFFEFEFE4F829E306D8D +FDFDFDACC4D1054F7651849F35708F9CB9C8B1C8D4DBE5EABED1DAAFC7D27CA3B56C98ADA3BECB +B4CAD515597E175B807DA3B62D6B8B6391A90851777BA2B514597EF7F9FAF7F9FA175B7F51839E +0A52789DBAC8D5E1E7D5E2E7C3D5DD286789014C7401486D022133000000000000000000000000 +000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 +034A71014C74014C745888A3F2F6F7FFFFFFE8EEF10E557A5688A2BED1DAFEFEFEFFFFFFBCD0D9 +014C74BFD1DBF9FBFBB2C9D4E6EEF0FEFFFEFEFFFEFBFCFDE0E9EDC4D5DE4D819E014C74014C74 +5688A2C5D6DED6E2E7E1EAEDFEFEFDFEFEFEE7EFF1B5CBD684A8BA326E8DFEFEFEA5C0CD054E76 +0951772E6C8C0B5278A0BCC91D5F83739CB1F0F4F55285A0014C7401497002283C000000000000 +000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 +044C75024C74024C747DA2B7FDFDFDE7EDF17EA4B8B4CAD52665870B52790851788AACBDFFFEFF +FEFEFE89ABBEE3EBEFFFFFFFF8FAFABACED8759DB23974920D5479024C74024C74014C74014C74 +014C74014C74024C74014C750E557A3B7593769EB3BCD0D9F9FBFBFEFEFEECF1F4FFFFFF4D819C +095278296789044D75719AAF497E9B12577D54859FF1F5F7FCFDFD759DB2024C74014A72032B41 +000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 +054D74024C74034D7590B1C2FFFFFEFFFFFF3872903D7592085178C8D8DF6C97AD5485A0336F8E +FEFEFEFFFFFFFEFEFECFDDE36995AC13597D014C74014C74014C74014C74014C74014C74014C74 +014C74014C74014C74014C74014C74014C74014C74014C74014C74155A7E6C97ADD2DFE5FFFFFF +EBF1F3B4CAD410567B36708F7DA3B70850776E98AE034D74CEDCE4FFFFFFFEFEFE89ABBD024D74 +014B7204283C000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 +044B71014C74024C7490B1C1E9EFF14B7F9B99B7C63D76940C52796290A829688977A0B4497E9A +CDDBE3FEFEFEC7D7DF487E9A024D75014C74014C74014C74014C74014C74014C74014C74014C74 +014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74034D75 +4B809CCBDAE1FEFEFED8E3E8AAC3CF074F756794AB0F557B6B97AE6693AA2E6B8BC7D8DFFDFEFE +88ABBC024C74014A70031E2D000000000000000000000000000000000000000000FFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 +06496A014B73014C747DA2B7FFFFFEE6EEF00D5379206184BACFD714597D4D819C10567BE1EAEE +FEFFFEE6EEF05C8BA5034D75014C74014C74014C74014C74014C74014C74014C74014C74014C74 +014C750750760E557C0E557C075076014C73014C74014C74014C74014C74014C74014C74014C74 +014C74014C74034D746190A8EAF0F2FAFCFCA5BFCC336E8E336F8E86A9BB4F819D50839D357090 +FDFEFDF9FBFB749CB1014C7402486E021018000000000000000000000000000000000000000000 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +163A4F024C73014C745889A3FDFDFDDEE7EC2F6C8CABC3CE306C8C24648695B4C350839EAEC6D2 +FEFEFEACC4D0165A7F014C74014C74014C74014C74014C74014C74014C74195D815D8DA597B6C5 +C6D7DEE9F0F3FAFCFCFDFEFEFDFEFEFAFCFCE9EFF2C5D6DE96B5C45C8BA5185C80014C74014C74 +014C74014C74014C74014C74014C74185C80B2C8D4FEFFFEBDD0DA709AB00F557B3C7594024C74 +88ABBC52849E467C98F8F9F951849E014C74034364020304000000000000000000000000000000 +000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +000000034B73014C732D6A8BF2F6F7EEF3F56B96AC447B970B527891B1C12D6A8B206184EAF0F2 +FBFCFC729BB0024D74014C74014C74014C74014C74014C740850775B8BA5BED1DAFBFCFCFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9FBFBBBCFD9 +5989A3064F76014C74014C74014C74014C74014C74034D7579A0B4FCFCFDCBDAE23D7694074F76 +6D98AE6592AA054E7552859FFEFEFEEFF4F6276689014C7404344F000000000000000000000000 +000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +0000000A4E74024C74095177D2DFE5FFFFFFC7D8DF12577C3873915889A3044D758DAEBFF0F4F6 +F5F7F84F829C014C74014C74014C74014C74014C74064F766692AAE1EAEEFEFFFEFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFEFFFEDEE8EC6290A8044E76014C74014C74014C74014C74014C745587A0F6F8F9DBE5E9 +779EB3497E9B0C5479B0C7D3FCFDFDFEFEFEABC3D0C3D5DD075076014B72051C29000000000000 +000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFF203A48024C74014C7486A9BBFEFEFE8BADBF50839EADC4D0236385236485347090D8E3E8 +F5F8F9437A97014C74014C74014C74014C74014C74326E8ECDDBE2FEFEFEFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC8D9E02F6C8C014C74014C74014C74014C74014C744C809C +F6F9FAECF1F313587CBCCFD8FFFFFFE9EFF252849F034C74AAC3CF7DA3B6014C74044365010203 +000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFF000000054C72014C742D6B8BF9FBFBDFE8ED427A963772910A51786A96AC5687A1B5CAD5 +FBFCFC4F829C014C74014C74014C74014C74024C74709AAFF8FAFBFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F8FA6B96AD024C74014C74014C74014C74 +014C745687A1FCFDFDD4E0E6F9FBFBB5CBD61B5D80165B7F9DB9C750839EC9D8E0276788014C74 +052B40000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFF0000001A4D64024C74024C74BACED8FEFEFE5788A2064F763F77956F99AE12577CA7C1CD +FEFEFE729BB0014C74014C74014C74014C74064F769CB9C8FEFEFEFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFE96B4C4054E75014C74 +014C74014C74014C747AA1B6FEFFFFB5CAD4034D744B809BE6EDF0CAD9E092B2C3F7FAF9B2C8D4 +014C7503486D030709000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFF000000064D72014C74467C99FEFEFEAEC5D20C5479709AAF3A73920A52788DAEBF +FDFDFEADC5D0024D75014C74014C74014C74064F76A9C2CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4BECC +044E75014C74014C74014C74034D74B5CBD6F9FBFBA9C1CEFDFDFEF9FAFB97B5C52F6C8BB5CBD6 +FBFDFD3D7694014C73062F45000000000000000000000000000000000000000000FFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFF000000274655024C73024C74C1D3DCFFFFFFF5F8F979A1B50750773F77946F99AE +D6E2E8E6EEF0165A7F014C74014C74014C74024C749CB9C8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFF94B4C3024C74014C74014C74014C741A5D81EBF1F2FFFFFFBCCFD82364850851775486A0 +2B698A3A7393B5CBD5014C7403476B020303000000000000000000000000000000000000000000 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFF0000000A5074014C74387290FDFEFDFFFFFFFFFFFFA9C2CF94B3C23C7593 +81A5B9FEFEFE5C8CA5014C74014C74014C74014C74709AAFFEFEFEFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFEFEFE6995AC014C74014C74014C74014C746592A9FEFFFE6C97AD3873916391A9 +12587D14597E88ABBDF7FAFA2F6C8C014C74072636000000000000000000000000000000000000 +000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFF000000054E74014C749FBBC95C8BA49FBBC9FAFBFB306C8DD7E2E8 +FCFDFDFAFBFCC7D7DF034D75014C74014C74014C74326E8EF8FAFBFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFF5F8F92D6B8B014C74014C74014C74044E75CFDEE4F2F5F70F557B +10567B7EA4B7EFF4F5FFFFFFFFFFFF96B5C4014C7406405E000000000000000000000000000000 +000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFF000000154B6B024C740E557BF1F5F63F7896024C742E6B8C81A6B8 +EBF1F4FFFFFFFEFFFE487E9A014C74014C74014C74054F76CCDBE2FFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6D7DF044E75014C74014C74014C7450849FFEFFFE +B6CBD6EBF1F2FEFEFEF3F6F8B6CCD6F0F5F6EEF3F50B5279014C73050E12000000000000000000 +000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000A4C74014C74588AA3FFFFFEE5ECEF99B7C66491AA +0F557B0D547AECF1F4CFDDE3024D75014C74014C74014C746592A9FEFEFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5E8DA6014C74014C74014C74044E75 +D7E3E8FFFFFFBFD2DB5385A10C537A034D7481A6B9EBF0F350849E014C74082B3E000000000000 +000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000054D74014C74A7C0CEFDFDFD336F8E054F76 +387291739DB28EAFBFFEFEFE6995AC014C74014C74014C74085077E0EAEDFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDCE6EB054F76014C74014C74 +014C74719BB0FEFEFE3D76943E76946391A95788A10B52793772919EBAC9014C74063E5B000000 +000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000354550044D75034D75E9F0F2E2EAEE1A5D81 +467D9934708F165B809FBBC9F8FAFA13597D014C74014C74014C745B8BA5FEFEFEFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFE5486A0014C74 +014C74014C741A5D81FAFCFCA1BDCB12577C024C74256587769EB3C9D9E1E2EAEE024C74064C72 +020303000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000001A5475024C742C6A8BFEFFFFFBFCFC +5B8BA46D98AE0A5179185B7FE7EEF1BACED8014C74014C74014C74014C743973915A8BA45A8BA4 +5A8BA45A8BA45A8BA45A8BA45A8BA45A8BA45A8BA45A8BA45A8BA45A8BA45A8BA45A8BA45A8BA4 +5A8BA45A8BA45A8BA45A8BA45A8BA45A8BA45A8BA45A8BA45A8BA45A8BA45A8BA45A8BA45A8BA4 +5A8BA45A8BA45A8BA45A8BA45A8BA45A8BA45A8BA45A8BA45A8BA45A8BA45A8BA45A8BA4367190 +014C74014C74014C74014C744E829D497E9A014C742A688A598AA35889A25A8BA45A8AA3075077 +014C7405395602385504375203293F020506000000000000000000000000000000000000000000 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000D5075014C74618FA7FFFFFE +C3D5DE6391A99AB8C56692AA9AB8C6FDFEFE749DB2014C74014C74014C74014C74014C74014C74 +014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74 +014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74 +014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74 +014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74 +014C74014C74014C74014C74014C74014C7401496E02344F000000000000000000000000000000 +000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000094F74014C748EAFC1 +FEFEFE346F8F3B759351839E11577C89ABBEFFFEFE397492014C74014C74014C74014C74014C74 +014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74 +014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74 +014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74 +014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74 +014C74014C74014C74014C74014C74014C74014C74014C74004B73023C5C000000000000000000 +000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000B5176014C74 +B3CAD4FEFFFE336E8F084F7726668740789583A7BAFBFCFD0D5479014C74014C74014C74014C74 +014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74 +014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74 +014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74 +014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74 +014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74012F48000000 +000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000064D74 +014C74CEDDE4DFE8ECD4E0E692B2C26F99AF6A95ACEBF1F4F3F7F881A6BA80A6BA80A6BA80A6BA +80A6BA80A6BA80A6BA80A6BA80A6BA80A6BA80A6BA80A6BA80A6BA80A6BA80A6BA80A6BA80A6BA +80A6BA80A6BA80A6BA80A6BA80A6BA80A6BA80A6BA80A6BA80A6BA80A6BA80A6BA80A6BA80A6BA +80A6BA80A6BA80A6BA80A6BA80A6BA80A6BA80A6BA80A6BA80A6BA80A6BA80A6BA80A6BA80A6BA +80A6BA80A6BA80A6BA80A6BA80A6BA80A6BA80A6BA80A6BA80A6BA80A6BA80A6BA80A6BA80A6BA +80A6BA80A6BA80A6BA80A6BA80A6BA80A6BA7EA4B84C819C044E75014C74014C74014C7400486F +00070B000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000 +0A5277014C74CDDCE3014C74014C74054E76095278155A7FDBE6EBFFFFFFFFFFFEFEFFFEFEFFFE +FEFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFF +FEFFFEFEFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFEFFFEFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBACED80B5279014C74014C74 +014C74002B42000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF000000 +000000054E75044E76EEF3F4A4BFCC2D6A8A608FA7608FA8276688EBF0F3C3D4DD437A97437A97 +437A97487E9AFCFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFED4E0E65F8EA6 +2365871C5F82467C98A8C1CFFDFEFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFF5F8F98AACBE3671911A5D812E6B8B779FB4EAF0F3FFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFF81A6B8014C74 +014C74014C74003A58000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF +000000000000024C74064F75FAFCFDD1DFE614587E064F76014C740B5279EAF0F2A6C0CD014C74 +014C74014C7411577CFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA7C0CD095178 +014C74014C74014C74014C74014C745989A3FAFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFE7EEF1306C8D014C74014C74014C74014C74014C741A5D81D1DEE5 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFDDE3 +014C74014C74014C74004062000000000000000000000000000000000000000000000000FFFFFF +FFFFFF000000000000024C74064F76FAFCFDFFFFFFFDFEFEF7F9FBEEF3F4F0F4F6FFFFFFA6C0CD +014C74014C74014C7410567CFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5E0E70A5178 +3C7594A2BDCBD5E2E7DCE7EBB9CDD76593AA07507785A8BBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFEFEFE497E9A155A7F7EA4B7C5D6DEDEE8ECCDDCE28EAFC0236486 +246586F5F8F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +CEDDE3014C74014C74014C74003F60000000000000000000000000000000000000000000000000 +FFFFFFFFFFFF000000000000054E75044E75F4F8F9FFFFFFF2F5F7C3D4DDBCCFD9BFD2DCFFFFFF +B0C7D3014C74014C74014C74085077FAFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6793AA +92B2C3FDFEFDFFFFFFFFFFFFFFFFFFFFFFFFFEFFFECFDDE4316D8DF7F9FAFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCEDCE3417896E9F0F2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +F5F8F9618FA7A0BCCAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFF81A6B9014C74014C74014C74003753000000000000000000000000000000000000000000 +000000FFFFFFFFFFFF0000000000000B5378024C74E8EFF2F4F7F91D5F82014C745485A015597E +CEDCE3C4D5DE014C74014C74014C74024C74EAF0F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +DBE5EAFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2EAEEF8FAFAFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7EEF1F2F6F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFCFDFDDDE7EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FEFFFFBBCED80B5379014C74014C74014C74002233000000000000000000000000000000000000 +000000000000FFFFFFFFFFFF000000000000095075014C74D1DFE6E2EBEE1E5F822B698A4A7E9A +236486B9CDD8E0E9ED014C74014C74014C74014C74C7D7DFFFFFFFEFF3F56B96AE6A95AD6A95AD +6A95AD6A95AD6A95AD6A95AD6A95AD6A95AD6A95AD6A95AD6A95AD6A95AD6A95AD6A95AD6A95AD +6A95AD6A95AD6A95AD6A95AD6A95AD6A95AD6A95AD6A95AD6A95AD6A95AD6A95AD6A95AD6A95AD +6A95AD6A95AD6A95AD6A95AD6A95AD6A95AD6A95AD6A95AD6A95ADE8EFF2FFFFFFD9E4E981A6B9 +81A6B981A6B981A6B981A6B981A6B981A6B981A6B981A6B981A6B981A6B981A6B981A6B981A6B9 +7EA4B84E829D044E75014C74014C74014C7400466B000305000000000000000000000000000000 +000000000000000000FFFFFFFFFFFF0000000000000D5277014C74B3CAD4FEFEFE6B97AD377291 +4D819D6390A8F5F8F9FBFCFC0D547A014C74014C74014C7498B6C5FFFFFFF6F9FA0A5278014C74 +014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74 +014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74 +014C74014C74014C74014C74014C74014C74014C74014C74014C740E557BF8FBFBFFFFFF8FB0C2 +014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74 +014C74014C74014C74014C74014C74014C74004B73001C2B000000000000000000000000000000 +000000000000000000000000FFFFFFFFFFFF0000000000000D5073014C748FB0C1FFFFFFD6E1E7 +9FBBC96592A9024D746693AAFEFEFE397492014C74014C74014C745D8DA6FFFFFFFFFFFF457B98 +014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74 +014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74 +014C74014C74014C74014C74014C74014C74014C74014C74014C74014C744D809CFFFFFFFFFFFF +5587A1014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74 +014C74014C74014C74014C74014C74014C74004B7301273C000000000000000000000000000000 +000000000000000000000000000000FFFFFFFFFFFF000000000000135171014C746190A8FFFFFF +6C97AE5D8DA511567B6995AC2F6C8CFEFFFF749DB3014C74014C74014C741A5D81FBFCFCFFFFFF +96B5C4014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74 +014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74 +014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C749CB9C8FFFFFF +F8FAFA13597D014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74 +014C74014C74014C74014C74014C74014C74014264001825000000000000000000000000000000 +000000000000000000000000000000000000FFFFFFFFFFFF00000000000021536D014C742D6A8B +FFFFFE9FBBCA034C74336E8E99B7C6A1BDCBFEFFFEBACED8014C74014C74014C74014C74BED1DB +FFFFFFECF2F40C5379014C74014C74014C74014C74437A975A8AA45A8AA45A8AA45A8AA45A8AA4 +5A8AA45A8AA45A8AA45A8AA45A8AA45A8AA45A8AA45A8AA45A8AA45A8AA45A8AA45A8AA45A8AA4 +5A8AA45A8AA45A8AA45A8AA45A8AA45A8AA43D7694014C74014C74014C74014C7410567BF0F4F6 +FFFFFFB6CBD6014C74014C74014C74014C744E829C4B7F9B014C74014C74165B7F1D5F823F7795 +5A8AA3075077014C7406385301314B032B40011622000101000000000000000000000000000000 +000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF000000000000303C41064F76 +044E75EAF0F2FEFEFEC3D5DD79A1B42B6A8B085177A6C0CEF8FAFA13587D014C74014C74014C74 +5D8CA5FEFEFEFFFFFF6B97AD014C74014C74014C74014C744B809CFCFDFDFEFFFEFEFFFEFEFFFE +FEFFFEFEFFFEFEFFFEFEFFFEFEFFFEFEFFFEFEFFFEFEFFFEFEFFFEFEFFFEFEFFFEFEFFFEFEFFFE +FEFFFEFEFFFEFEFFFEFEFFFEFEFFFEFEFFFEF9FBFB3D7593014C74014C74014C74014C74739BB1 +FFFFFEFFFFFF5386A0014C74014C74014C741A5D81FAFBFCF4F7F94A7E9B2B698A7CA2B516597F +DBE6EAE4ECEE024D75095075070808000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF000000000000000000 +0B5074014C74A7C1CEFFFFFF6291A81A5D815A8AA351849F427996FEFFFE6995AC014C74014C74 +014C74075077E1EAEDFFFFFFE4ECEF0D547A014C74014C74014C74014C7484A8BAFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFE719BB0014C74014C74014C74014C7410567B +E8EFF2FFFFFFDBE6EB054E76014C74014C74014C74729BB1FFFFFFFFFFFFFEFFFEFFFFFEDFE8EC +CADAE1FFFFFFA0BCCA014C740E4561000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000 +0000000F4D6C014C74598AA4FFFFFF729CB1356F8F0850770C537A83A7BAEFF4F6CFDDE4034D75 +014C74014C74014C736693AAFFFEFFFEFFFF8AACBD014C74014C74014C74014C74034D7495B4C4 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFEFE85A8BA024C74014C74014C74014C74014C74 +90B0C1FEFFFFFFFFFE5E8DA6014C74014C74014C74044E75D7E2E8F3F7F8FBFCFDFFFFFFFFFFFF +FFFFFFFFFFFFFEFFFE52859F014C740F3143000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF000000 +000000000000234759024C740F557BF3F6F8EDF3F581A6B992B2C2739CB115597E79A0B4FEFEFE +487E9A014C74014C74014C74054F76CDDCE2FFFFFFFAFCFC3D7694014C74014C74014C74014C74 +024D757CA2B6FBFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8FBFB6D97AD024C74014C74014C74014C74014C74 +437A97FCFDFDFFFFFFC6D7DF044E75014C74014C74014C7451849EFEFFFF6D98AF29688999B6C5 +F5F8F9FFFFFFFFFFFFEFF4F60B5379034D740D161B000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFF0000000000000000000D5174014C74A0BBCAFFFFFEB8CCD610577C12587D618FA7618FA7 +EDF2F4C8D8DF034D75014C74014C74014C74336F8FF7FAFAFFFFFFE3EBEE1D5F82014C74014C74 +014C74014C74014C743F7794D6E2E8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFECDDCE336708F014C74014C74014C74014C74014C74 +206184E6EDF0FFFFFFF5F8F92D6B8B014C74014C74014C74044E76D0DEE5FFFFFFC8D8DF5587A1 +054F76175B7F7FA4B8E8EFF199B6C6014C74104867000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFF000000000000000000154C69014C74387291FEFFFEAAC3D02A68895789A2095178 +1B5E818AACBEFEFEFE5D8CA5014C74014C74014C74014C74709AB0FFFEFEFFFFFFD0DEE4155A7E +014C74014C74014C74014C74014C740750776491A9D2DFE6FEFEFEFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFEFEFDCADAE15B8BA5054E75014C74014C74014C74014C74014C74 +175B7FD4E0E6FFFFFFFFFEFE6894AC014C74014C74014C74014C746592AAFEFEFECCDBE3F0F5F7 +FEFEFEDCE6EB6E98AE0E557BB1C8D3316E8D014C74102D3D000000000000000000000000000000 +000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFF0000000000000000001C2931064D74014C74C1D4DC7BA1B6054F76246486 +96B5C597B6C40D5479E9EFF2E7EEF1165A7E014C74014C74014C74024C749CBAC8FFFFFFFFFFFF +D0DEE41D5F83014C74014C74014C74014C74014C74014C74024C742D6C8B749CB2A7C0CEC8D8E0 +D7E3E7D7E2E7C6D7DFA4BECC6F9AB0286889014C74014C74014C74014C74014C74014C74014C74 +206184D4E0E6FFFFFFFFFFFF95B4C4014C74014C74014C74014C741A5D81EBF0F3DBE5EA044D73 +1B5E82AAC2CEEFF4F5447A96A4BECBB8CCD6014C74094C7107090A000000000000000000000000 +000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000134D6C014C74467C99AFC7D2A0BCC9 +8CADBF3E7694054F756C97ADF9FBFBFFFFFFADC5D1024D74014C74014C74014C74074F76A9C2CF +FFFFFFFFFFFFE3EBEE3D7694014C74014C74014C74014C74014C74014C74014C74014C74014C74 +014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74 +417997E5ECF0FFFFFFFFFFFFA3BECB044E75014C74014C74014C74044D75B4CAD5FCFDFD3C7593 +477D9A53859F034D745E8DA5BFD2DBBDD0DA3F7794014C7410374C000000000000000000000000 +000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000001B2F3A064E75024C74BACFD8 +C9D8E0054E762F6C8DCADAE1FEFFFFE7EEF1A9C2CFFFFEFF729BB0014C74014C74014C74014C74 +064F769DB9C7FEFFFEFFFFFFF9FBFC88ABBE0D547A014C74014C74014C74014C74014C74014C74 +014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C740E557A +8EAEBFFBFCFDFFFFFFFEFFFE95B5C4054E75014C74014C74014C74014C747AA1B6EEF3F6FDFDFD +9DBAC815597E1D5F8250829D4B7F9BFFFFFEB4C9D4014C74084D72090E10000000000000000000 +000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000134A68014C74 +2E6B8CF7F9FAA4BFCCD9E4E9FEFEFEC1D3DC1C5F82286688F7F9FAFAFCFC4E829D014C74014C74 +014C74014C74024C74719AB0F7FAFBFFFFFFFEFFFEE3ECEF6A96AC0C5379014C74014C74014C74 +014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C740D547A6D98AE +E5EDF0FFFFFFFFFFFFF5F8F96A96AD014D74014C74014C74014C74014C745687A1E9EFF11A5D82 +87AABBFDFEFEE9F0F35F8EA7034D7450839EF4F7F8286788014C74113447000000000000000000 +000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000131B20 +084E73014C7487AABCFFFFFEF0F5F65B8BA4064F764E829D78A0B4437996CAD9E0F4F7F8437A97 +014C74014C74014C74014C74014C74326F8ECDDBE3FFFFFFFFFFFFFFFFFFECF2F495B4C4447B98 +0A5278014C74014C74014C74014C74014C74014C74014C74014C740B5379467C9A97B6C5EDF2F5 +FFFFFFFFFFFFFFFFFEC9D9E02F6C8C014C74014C74014C74014C74014C744C809CF6F9F9CAD9E0 +346F8F054E756593A9F9FBFCFEFEFEBDD0DA8DAEBE80A5B8014C740C4B6C050708000000000000 +000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 +000000184358024C740A5178D1DFE44D819C074F766692AA6693AA054F765587A1266587FEFEFE +F5F8F94E829D014C74014C74014C74014C74014C74064F766693AAE1EAEEFEFFFFFFFFFFFFFFFF +FFFFFFF5F8F9C9D9E0A3BECC8AACBE7DA3B77DA3B78AACBFA3BFCCCADAE1F6F8FAFFFFFEFFFFFF +FFFFFFFEFFFEDEE8EC6290A8044E75014C74014C74014C74014C74014C745587A1F5F9F9E1EAEE +6D98AE14597D729AAF0C547A497E9AF1F5F7FFFFFFCCDBE2085077024D75112531000000000000 +000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 +000000000000000000114B6B014C742D6B8BDBE5EACCDBE2B0C7D20A52786E98AE10567B5587A1 +FEFEFEFFFFFFFAFCFC729BB0024D74014C74014C74014C74014C74014C730750775D8BA5BED1DB +FBFCFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +F9FBFBBBCFD95889A2064F76014C74014C74014C74014C74014C74034D7579A0B4FCFCFDFBFCFD +2B698A4A7F9B4F829D09517854859F36708FF0F4F6F0F5F6286789014C74103F56000000000000 +000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +000000000000000000000000111C21094D72014C745989A3FDFDFDDFE8ED2666880A52785788A2 +F6F8F9D7E2E8608EA6B0C7D3FEFFFEADC5D1165A7E014C74014C74014C74014C74014C74014C74 +014C74195D805D8DA697B6C5C6D6DEE9EFF3FAFCFDFDFEFEFDFEFEFAFCFCE8EFF2C5D6DE96B5C4 +5C8BA5185B80014C74014C74014C74014C74014C74014C74014C74185C7FB1C9D3FEFEFEC5D6DE +C4D5DEC0D2DB0C53795D8DA5729CB01B5E80E5EDF0FCFDFD52849F014C740C496B07090B000000 +000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFF000000000000000000000000000000143140054D74014C747EA3B6FEFEFED9E4E9B2C9D4 +FCFDFDEAF1F3608EA74C809C12577DD7E2E8FDFEFDE7EEF15C8CA6034D74014C74014C74014C74 +014C74014C74014C74014C74014C74014C74024C740750770F567B0E567B065076024C74014C74 +014C74014C74014C74014C74014C74014C74014C74014C74034D75618FA7E9EFF2FFFFFF99B7C6 +296788044D75AFC6D284A9BB014C7479A0B4FDFDFDFDFEFD769DB1014C74074D720C1920000000 +000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFF000000000000000000000000000000153C51034D74024D7490B1C2FEFEFE +FFFFFFFFFFFF5C8CA50E547A4379970E557A729CB1497E9AF0F4F5FEFEFEC8D8E0487E9A034D75 +014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74 +014C74014C74014C74014C74014C74014C74014C74034D744B809CCCDBE3FEFEFED5E1E88FB0C2 +6B97AD447B983C759311577C84A8B9346F8ED4E0E6FDFEFE8AACBD024C74044D74102632000000 +000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000154058024C74034D75 +90B1C1FEFEFEFFFFFF4A7F9B427896024D7489ACBD0D547A6190A8175A7EBED1DAFDFEFEFEFEFE +CFDDE36994AC13597D014C74014C74014C74014C74014C74014C74014C74014C74014C74014C74 +014C74014C74014C74014C74014C74014C74165A7E6C97AED3DFE6FFFFFEDCE6EB99B7C66E99AE +064F7681A6B95587A122638525658799B7C6EDF2F3FDFEFD8AACBE034D74034D75112F3F000000 +000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000015435D +024D74024C747DA3B6FCFDFDE6EDF06A96AC9CB9C84F829E286889487D9A2666886693AA14587C +729BB1FEFEFEFFFFFFF7FAFAB9CED7759DB23974930D547A024C75014C74014C74024C74014C74 +014C74014C74014C740D557A3B7593779FB4BCCFD9F9FBFBFEFEFEE0E9EDD5E1E6175A7F2F6C8B +467C98759DB211567CAEC5D12465874E819CF0F5F6FCFDFD779EB3024C74034D75133345000000 +000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 +000000123C53024C74014C745989A2F3F7F8FFFFFFF4F8F90A52784F829E034D7591B2C1054D76 +6290A8044D75F0F4F6E5ECF09EBAC8DFE8ECFEFEFFFEFFFEFBFCFCE0E9EDC4D5DEB1C8D4A8C1CF +A8C1CFB2C8D4C5D6DEE1EAEEFBFCFCFEFFFEFDFEFEEDF2F4B7CCD685A8BB15597E6F9AB014597D +729CB0024C74B3C9D41D6083226285FBFDFCFEFEFEF1F5F75486A0014C74044D74102D3D000000 +000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 +000000000000000000123446044C73014C742D6B8CD2DFE5FEFEFED9E3E952849E5D8CA56995AC +2A68893D7694487E9AFEFEFD5788A237729010567C9AB7C66C98AE8CADBFEAF0F3D8E4E8EFF4F6 +EEF4F7FBFCFDFFFFFFD9E4E9D2DFE6FEFEFE7CA3B6437996054E756290A80E557B5889A32F6C8C +83A7B90C537A3772926C97AD7EA4B6447A96F2F6F7CFDCE32A6889014C74064C720E2531000000 +000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000 +0000000000000000000000000000000F242F084A6E014C740A527888ABBDF9FBFBFDFEFDF6F8F9 +749DB1316D8D034D74C1D3DCFFFEFE6391A92A68897099AE5D8CA637729113587D8AACBE024D75 +5D8CA5034C7485A8BAFEFFFF5486A1497F9CFFFFFE5989A4487D9A1B5E82739CB20851776592A9 +024C74AFC6D22665872F6C8CCDDCE2FEFEFEF7FAFA84A7BA085177014C740A48690B171E000000 +000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +000000000000000000000000000000000000000000090E110C415D024C74024C742E6C8CBBCFD9 +FEFEFEFBFCFCA8C1CEB1C7D3FEFEFEDAE5EA5A8AA3336F8F779FB43772911F60832262859AB8C6 +024D74195C81024C74709AB0FFFFFF6F99B02E6C8DFFFFFE96B5C510567C5386A04A7F9B5385A0 +2F6C8C0C537991B1C2FEFEFEFEFEFEFDFEFEB8CCD72C698B014C74024D750E3B53050809000000 +000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFF0000000000000000000000000000000000000000000000000E2C3B08496D014C74 +024C74467C99C2D4DDFEFEFEFFFFFFFFFFFFE9EFF22E6B8C12587D9CB9C8165B7F5788A23F7795 +90B1C2236386024C742766895A8AA4FFFFFF8AACBE13597EFEFEFED2DFE5014C743B7592276688 +D3E0E57AA1B5E8EEF1FFFEFEFEFEFFBED1DB437A97014C75014C7409486A0D222D000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000005090B +0C364E054B71014C74014C74397392A1BCCBF3F7F8FEFFFEFCFDFDE9EFF2FDFEFD89ABBE306C8B +729BB16B96AD5C8CA5024C746391A8447B98FFFFFFA4BECC024C74F5F9FAFCFDFD165A7F6592A9 +DAE4E9FFFFFFFFFFFEF2F6F79DBAC836708F024C74014C74064C700C3044040607000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000 +000000000000070E120A374F044B6F014C74014C740F567B5A8AA4A8C2CFEBF0F3FFFEFEFEFFFE +FEFFFEFFFFFFE9EFF2EBF1F3CBDAE1E0E9EEC4D6DEFFFFFFBED1DB064F76DFE8ECFFFFFF99B7C6 +C4D5DEE9F0F2A7C0CE5889A30E547B014C74014C7406496E0B3246050A0C000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000 +00000000000000000000000000000006090A0A2D400A4564014B73014C74014C74034D752D6B8C +6390A990B0C1B4CAD5D2DFE5E8EFF2F5F8FAFAFCFDFAFCFDF4F8FAE4ECEFCCDBE2B3C9D48EAFC0 +6190A82C6A8B034D75014C74014C74014B730A43620A2838040607000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 +00000000000000000000000000000000000000000000000000000009141A092E4308415F044C72 +014C74014C74014C74014C74014C74014C74044E75064F76064F76044E75014C74014C74014C74 +014C74014C74014C74054C72093F5C092C3E081116000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +0506070A1D27092C3F0736500A415F0645670A4D71054D73014B73014B73054D740B4D70074666 +0A405E08364E0A2A3C0A1B23040506000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + +end +%%PageTrailer +%%Trailer +%%EOF Binary files /tmp/cFjkONjEmM/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/evince/data/well-formed.gif and /tmp/D4HGyIf3Td/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/evince/data/well-formed.gif differ Binary files /tmp/cFjkONjEmM/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/evince/data/well-formed.jpg and /tmp/D4HGyIf3Td/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/evince/data/well-formed.jpg differ Binary files /tmp/cFjkONjEmM/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/evince/data/well-formed.png and /tmp/D4HGyIf3Td/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/evince/data/well-formed.png differ diff -Nru qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/evince/data/well-formed.pnm qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/evince/data/well-formed.pnm --- qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/evince/data/well-formed.pnm 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/evince/data/well-formed.pnm 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,21 @@ +P6 +# CREATOR: GIMP PNM Filter Version 1.1 +92 84 +255 +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþþþýýýýýýýýýýýýýýýýýýýýýýýýþþþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþýýýýýýýýýüüüûûûúúúùùùùùùùùùøøøøøøùùùùùùùùùúúúûûûüüüýýýýýýýýýþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþýýýýýýóõ÷ÅÕÝ›·Çv²[‹¤E{—9r‘2m1lŒ7qDz–X‡ r™®”±À½ÍÕèêìñññôôôõõõøøøùùùûûûýýýýýýþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþýýýùúú¿ÑÚvž³5pPwLtLtLtLtLtNuOvOvNuLuLsLtLtLtOv1l‹l”©±ÂÌèééïïïòòòõõõøøøúúúüüüýýýþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþýýýÏÝäm—­[€LtLtNu,j‹a§Ž¯Á²ÉÔÑßåèïòô÷ùúüýúüýô÷ùèîòÐÞå²ÉÔ¯À`Ž§+iŠMuLtLtX}`Š¡¹ÆÎèèèíííòòòöööùùùüüüýýýþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþüüü¯ÆÒ>v”LtLtU{XŠ£§ÁÎÚåèªÂÏúüüÿþÿþþÿëñô×ãèýþþÖâéÔáçÏÝäëñô÷ùúúûüÿÿÿþþþ·ÍÖÖá礿ÌWˆ¢ TzLtLt3lŠ—®ºáááéééðððõõõùùùûûûýýýþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþýýý¸Í×1nŽLtLt8r ¼Êóö÷éïò¥¿ÌÌÛâLs]Œ¤a§ÛåéU{ a„}£¶\Œ¦PƒX}š¸Æ,i‹0m9s‘×ãèOwœ¹Èüýýþþýñõö¹È4pLtLt'd„›¯ºÞÞÞçççïïïõõõùùùüüüýýýþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÞçìMœLtLtF|™ÀÓÛ²ÈÓžºÈÿÿÿœ¹ÈLt”´Ã SyM‚Ltš¸ÇMt\Œ¥Ay–U‡¢Uˆ¢ Sy±ÁMta§Pw¨ÂÎNu#c†j–­Š¬½L›üýýþÿþ½ÑÚBy—LtLt=pŒ¸ÁÆÝÝÝèèèðððöööúúúýýýþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýý•´ÄT{Lt.k‹ºÎØþþþÿÿÿpš°[öøùæíðY~®À;u“\Œ¦Ovz µLt]Œ¥,j‹M‚ž\Œ¥Nuu²Lt^¥&eˆk–­3p/mpš¯3oŽ\€ðõ÷ðõöûüüþþþ¶ËÖ*iŠLtPvu“£ÒÒÒàààêêêòòòøøøüüüýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþìñôNLt Qx†ª¼ùûûÿÿÿÿÿÿÿÿÿÛåêNvºÉÿÿþ\Œ¥?w•pš°4o.l‹h”« Sy)g‰Mœ\¦&eˆLtˆ«½3oa„J›'gˆ`§Nu—¶ÅNv«ÄÐÿÿÿsœ±n˜®ÉÙáþþýøúú§¸QwLt9lˆ¼ÀÃØØØåååïïïöööúúúýýýþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÔàç%d‡Lt-j‹ÒßåþþÿÏÝäy ¶àèìÿÿÿþþþO‚ž0mýýý¬ÄÑOvQ„Ÿ5pœ¹È±ÈÔÛåê¾ÑÚ¯ÇÒ|£µl˜­£¾Ë´ÊÕY~[€}£¶-k‹c‘©Qw{¢µY~÷ùú÷ùú[Qƒž +RxºÈÕáçÕâçÃÕÝ(g‰LtZ{Ÿ«±ÐÐÐßßßìììôôôùùùýýýþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÂÓÜY~LtXˆ£òö÷ÿÿÿèîñUzVˆ¢¾ÑÚþþþÿÿÿ¼ÐÙLt¿ÑÛùûû²ÉÔæîðþÿþþÿþûüýàéíÄÕÞMžLtLtVˆ¢ÅÖÞÖâçáêíþþýþþþçïñµËÖ„¨º2nþþþ¥ÀÍNv Qw.lŒ Rx ¼É_ƒsœ±ðôõR… Lt Qv‹œ¦ÉÉÉÛÛÛéééòòòùùùýýýþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþ¶Ë× RyLt}¢·ýýýçíñ~¤¸´ÊÕ&e‡ RyQxŠ¬½ÿþÿþþþ‰«¾ãëïÿÿÿøúúºÎØu²9t’ TyLtLtLtLtLtLtLtLuUz;u“vž³¼ÐÙùûûþþþìñôÿÿÿMœ Rx)g‰Muqš¯I~›W}T…Ÿñõ÷üýýu²LtNu~’ÄÄÄ×××æææñññùùùüüüþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþ¾ÑÛ +RxMu±Âÿÿþÿÿÿ8r=u’QxÈØßl—­T… 3oŽþþþÿÿÿþþþÏÝãi•¬Y}LtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtZ~l—­Òßåÿÿÿëñó´ÊÔV{6p}£·Pwn˜®MtÎÜäÿÿÿþþþ‰«½MtOu‘œÀÀÀÕÕÕåååñññùùùýýýþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÐÝäW|Lt±ÁéïñK›™·Æ=v” Ryb¨)h‰w ´I~šÍÛãþþþÇ×ßH~šMuLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtMuK€œËÚáþþþØãèªÃÏOug”«U{k—®f“ª.k‹ÇØßýþþˆ«¼Lt Ptˆ•œ½½½ÔÔÔåååñññùùùýýýþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþéïò_ƒLt}¢·ÿÿþæîð Sy a„ºÏ×Y}MœV{áêîþÿþæîð\‹¥MuLtLtLtLtLtLtLtLtLtLuPvU|U|PvLsLtLtLtLtLtLtLtLtLtMta¨êðòúüü¥¿Ì3nŽ3oŽ†©»OPƒ5pýþýùûûtœ±LtSw— ½½½ÔÔÔåååòòòùùùýýýþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúûüBz—LtX‰£ýýýÞçì/lŒ«ÃÎ0lŒ$d†•´ÃPƒž®ÆÒþþþ¬ÄÐZLtLtLtLtLtLtLt]]¥—¶ÅÆ×ÞéðóúüüýþþýþþúüüéïòÅÖÞ–µÄ\‹¥\€LtLtLtLtLtLtLt\€²ÈÔþÿþ½ÐÚpš°U{v”c‘©Wˆ¡ Ry7r‘žºÉLt Rlrrr•••¸¸¸ÕÕÕêêêöööüüüþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþùúúW}Muéðòâêî]F}™4p[€Ÿ»ÉøúúY}LtLtLt[‹¥þþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþT† LtLtLt]úüü¡½ËW|Lt%e‡vž³ÉÙáâêîLt Pufgg†††©©©ÉÉÉáááðððøøøüüüýýýþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÐÜãLt,j‹þÿÿûüü[‹¤m˜® +Qy[çîñºÎØLtLtLtLt9s‘Z‹¤Z‹¤Z‹¤Z‹¤Z‹¤Z‹¤Z‹¤Z‹¤Z‹¤Z‹¤Z‹¤Z‹¤Z‹¤Z‹¤Z‹¤Z‹¤Z‹¤Z‹¤Z‹¤Z‹¤Z‹¤Z‹¤Z‹¤Z‹¤Z‹¤Z‹¤Z‹¤Z‹¤Z‹¤Z‹¤Z‹¤Z‹¤Z‹¤Z‹¤Z‹¤Z‹¤Z‹¤Z‹¤Z‹¤Z‹¤6qLtLtLtLtN‚I~šLt*hŠYŠ£X‰¢Z‹¤ZŠ£PwLt'Tm4_vSvˆ¡«ÓÔÔåååðððõõõùùùüüüýýýþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýž¹ÈLta§ÿÿþÃÕÞc‘©š¸Åf’ªš¸Æýþþt²LtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLt!`€°»áááéééñññöööúúúýýýþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþüüürš¯LtŽ¯Áþþþ4o;u“QƒžW|‰«¾ÿþþ9t’LtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtp‘£ÕÕÕáááêêêóóóùùùýýýþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþûûûP‚Lt³ÊÔþÿþ3nOw&f‡@x•ƒ§ºûüý TyLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtMu€—£ÉÉÉÙÙÙçççñññùùùýýýþþþÿÿÿÿÿÿÿÿÿÿÿÿþþþúúú1lŒLtÎÝäßèìÔàæ’²Âo™¯j•¬ëñôó÷ø¦º€¦º€¦º€¦º€¦º€¦º€¦º€¦º€¦º€¦º€¦º€¦º€¦º€¦º€¦º€¦º€¦º€¦º€¦º€¦º€¦º€¦º€¦º€¦º€¦º€¦º€¦º€¦º€¦º€¦º€¦º€¦º€¦º€¦º€¦º€¦º€¦º€¦º€¦º€¦º€¦º€¦º€¦º€¦º€¦º€¦º€¦º€¦º€¦º€¦º€¦º€¦º€¦º€¦º€¦º€¦º€¦º€¦º€¦º€¦º€¦º€¦º~¤¸LœNuLtLtLtSw¦¨ªÁÁÁÕÕÕæææòòòùùùýýýÿÿÿÿÿÿÿÿÿÿÿÿýýýùùùaƒLtÍÜãLtLtNv RxZÛæëÿÿÿÿÿþþÿþþÿþþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿþÿþþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿºÎØ RyLtLtLtYu„§§§ÁÁÁØØØéééõõõûûûþþþÿÿÿÿÿÿÿÿÿýýýùùùTzNvîóô¤¿Ì-jŠ`§`¨'fˆëðóÃÔÝCz—Cz—Cz—H~šüýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÔàæ_Ž¦#e‡_‚F|˜¨ÁÏýþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõøùŠ¬¾6q‘].k‹wŸ´êðóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿ¦¸LtLtLt)ZsªªªÇÇÇßßßïïïùùùýýýÿÿÿÿÿÿÿÿÿýýýøøøMuOuúüýÑßæX~OvLt Ryêðò¦ÀÍLtLtLtW|þþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ§ÀÍ QxLtLtLtLtLtY‰£úüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçîñ0lLtLtLtLtLt]ÑÞåÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÏÝãLtLtLtPoxxx–––···ÔÔÔéééõõõüüüþþþÿÿÿÿÿÿýýý÷÷÷MuOvúüýÿÿÿýþþ÷ùûîóôðôöÿÿÿ¦ÀÍLtLtLtV|þþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÕàç +Qxv”Oul—­ùûûÿÿÿ­ÅÑMtLtLtLtOv©ÂÏÿÿÿÿÿÿãëî=v”LtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtLtAy—åìðÿÿÿÿÿÿ£¾ËNuLtLtLtMu´ÊÕüýý>>IIIXXXnnn‰‰‰§§§ÄÄÄÛÛÛìììöööüüüþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýúúúôôôéééÖÖÖ¾¾¾l†”MuLtY‰¢ó÷øÿÿÿôøù +RxO‚žMu‘²ÁMvb¨MuðôöåìðžºÈßèìþþÿþÿþûüüàéíÄÕÞ±ÈÔ¨ÁϨÁϲÈÔÅÖÞáêîûüüþÿþýþþíòô·ÌÖ…¨»Y~oš°Y}rœ°Lt³ÉÔ`ƒ"b…ûýüþþþñõ÷T† LtNu0IW>>>HHHWWWkkk………¢¢¢¾¾¾ÖÖÖéééôôôúúúýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýùùùòòòåååÓÓÓºººxŒ– QwLt-kŒÒßåþþþÙãéR„ž]Œ¥i•¬*h‰=v”H~šþþýWˆ¢7rV|š·Æl˜®Œ­¿êðóØäèïôöîô÷ûüýÿÿÿÙäéÒßæþþþ|£¶Cy–Nub¨U{X‰£/lŒƒ§¹ Sz7r’l—­~¤¶Dz–òö÷ÏÜã*h‰Lt Nt4GQ???IIIWWWjjjƒƒƒŸŸŸºººÓÓÓåååòòòùùùýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþýýýøøøðððãããÐÐй¹¹‰”™YzLt +Rxˆ«½ùûûýþýöøùt±1mMtÁÓÜÿþþc‘©*h‰p™®]Œ¦7r‘X}Š¬¾Mu]Œ¥Lt…¨ºþÿÿT†¡IœÿÿþY‰¤H}š^‚sœ²Qwe’©Lt¯ÆÒ&e‡/lŒÍÜâþþþ÷úú„§ºQwLtNn:DIAAAJJJXXXkkkƒƒƒ¹¹¹ÐÐÐãããðððøøøýýýþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþüüüøøøïïïâââÐÐй¹¹œžŸ>h~LtLt.lŒ»ÏÙþþþûüü¨ÁαÇÓþþþÚåêZŠ£3owŸ´7r‘`ƒ"b…š¸ÆMt\Ltpš°ÿÿÿo™°.lÿÿþ–µÅV|S† J›S… /lŒ Sy‘±Âþþþþþþýþþ¸Ì×,i‹LtMu#Lb>@ACCCMMM[[[nnn………ŸŸŸ¹¹¹ÐÐÐâââïïïøøøüüüþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþüüü÷÷÷ïïïâââÐÐкºº¢¢¢l~‡TvLtLtF|™ÂÔÝþþþÿÿÿÿÿÿéïò.kŒX}œ¹È[Wˆ¢?w•±Â#c†Lt'f‰ZŠ¤ÿÿÿŠ¬¾Y~þþþÒßåLt;u’'fˆÓàåz¡µèîñÿþþþþÿ¾ÑÛCz—LuLtNo6GP???GGGQQQaaasss‰‰‰¢¢¢ºººÐÐÐâââïïï÷÷÷üüüþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþüüü÷÷÷ïïïãããÓÓÓ¾¾¾¨¨¨Ji{ OtLtLt9s’¡¼Ëó÷øþÿþüýýéïòýþý‰«¾0l‹r›±k–­\Œ¥Ltc‘¨D{˜ÿÿÿ¤¾ÌLtõùúüýýZe’©Úäéÿÿÿÿÿþòö÷ºÈ6pLtLt +Or*I[>@@CCCLLLXXXgggzzz¨¨¨¾¾¾ÓÓÓãããïïï÷÷÷üüüþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþüüüøøøñññåååÖÖÖÄÄį¯¯™™™‚„@cv QtLtLtV{ZŠ¤¨ÂÏëðóÿþþþÿþþÿþÿÿÿéïòëñóËÚáàéîÄÖÞÿÿÿ¾ÑÛOvßèìÿÿÿ™·ÆÄÕÞéðò§ÀÎX‰£T{LtLt +Lp'I[=ABBBBIIISSS```qqq„„„™™™¯¯¯ÄÄÄÖÖÖåååñññøøøüüüþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþüüüùùùòòòéééÛÛÛËË˸¸¸£££|~~JdrUqKsLtLtMu-kŒc©°Á´ÊÕÒßåèïòõøúúüýúüýôøúäìïÌÛâ³ÉÔŽ¯Àa¨,j‹MuLtLtKsMj.GU@BBDDDJJJSSS]]]lll}}}£££¸¸¸ËËËÛÛÛéééòòòùùùüüüþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþýýýùùùôôôìììáááÓÓÓ°°°‹‹‹zzzelo=ZkRmNtLtLtLtLtLtLtNuOvOvNuLtLtLtLtLtLtMsKf*HX>EICCCHHHNNNUUU```lllzzz‹‹‹°°°ÂÂÂÓÓÓáááìììôôôùùùýýýþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþýýýûûûöööðððçççÛÛÛÍÍͽ½½­­­œœœŒŒŒ}}}qqqfggP^e9Ue'PgQlNnQtNtKsKsNuPsNmMi"Ka/JY c #064F76", +", c #024C75", +"' c #014C73", +") c #004B73", +"! c #004569", +"~ c #034E75", +"{ c #2C6A8B", +"] c #618FA7", +"^ c #8EAFC1", +"/ c #B2C9D4", +"( c #D1DFE5", +"_ c #E8EFF2", +": c #F4F7F9", +"< c #FAFCFD", +"[ c #E8EEF2", +"} c #D0DEE5", +"| c #8DAFC0", +"1 c #608EA7", +"2 c #2B698A", +"3 c #034D75", +"4 c #004A72", +"5 c #004469", +"6 c #014B73", +"7 c #0E557B", +"8 c #588AA3", +"9 c #A7C1CE", +"0 c #DAE5E8", +"a c #AAC2CF", +"b c #FAFCFC", +"c c #FFFEFF", +"d c #FEFEFF", +"e c #EBF1F4", +"f c #D7E3E8", +"g c #FDFEFE", +"h c #D6E2E9", +"i c #D4E1E7", +"j c #CFDDE4", +"k c #F7F9FA", +"l c #FAFBFC", +"m c #FFFFFF", +"n c #FEFEFE", +"o c #B7CDD6", +"p c #D6E1E7", +"q c #A4BFCC", +"r c #5788A2", +"s c #0D547A", +"t c #00476D", +"u c #387290", +"v c #A0BCCA", +"w c #F3F6F7", +"x c #E9EFF2", +"y c #A5BFCC", +"z c #CCDBE2", +"A c #024C73", +"B c #5D8CA4", +"C c #DBE5E9", +"D c #206184", +"E c #7DA3B6", +"F c #5C8CA6", +"G c #50839D", +"H c #12587D", +"I c #9AB8C6", +"J c #2C698B", +"K c #306D8D", +"L c #397391", +"M c #074F77", +"N c #9CB9C8", +"O c #FCFDFD", +"P c #FEFEFD", +"Q c #F1F5F6", +"R c #9DB9C8", +"S c #34708F", +"T c #014C72", +"U c #467C99", +"V c #C0D3DB", +"W c #B2C8D3", +"X c #9EBAC8", +"Y c #94B4C3", +"Z c #0C5379", +"` c #4D829D", +" . c #9AB8C7", +".. c #024D74", +"+. c #5C8CA5", +"@. c #417996", +"#. c #5587A2", +"$. c #5588A2", +"%. c #90B1C1", +"&. c #085077", +"*. c #A8C2CE", +"=. c #054E75", +"-. c #236386", +";. c #6A96AD", +">. c #8AACBD", +",. c #4C7F9B", +"'. c #FEFFFE", +"). c #BDD1DA", +"!. c #427997", +"~. c #014469", +"{. c #2E6B8B", +"]. c #BACED8", +"^. c #709AB0", +"/. c #165B7F", +"(. c #F6F8F9", +"_. c #E6EDF0", +":. c #13597E", +"<. c #8DAEC0", +"[. c #3B7593", +"}. c #7AA0B5", +"|. c #5D8CA5", +"1. c #4D829E", +"2. c #064E75", +"3. c #759DB2", +"4. c #5E8DA5", +"5. c #266588", +"6. c #6B96AD", +"7. c #33708F", +"8. c #2F6D8D", +"9. c #709AAF", +"0. c #336F8E", +"a. c #185C80", +"b. c #F0F5F7", +"c. c #F0F5F6", +"d. c #FBFCFC", +"e. c #B6CBD6", +"f. c #2A698A", +"g. c #023957", +"h. c #014B72", +"i. c #095178", +"j. c #86AABC", +"k. c #F9FBFB", +"l. c #DBE5EA", +"m. c #044E76", +"n. c #9DBAC9", +"o. c #FFFFFE", +"p. c #3F7795", +"q. c #346F90", +"r. c #2E6C8B", +"s. c #6894AB", +"t. c #296789", +"u. c #4D819C", +"v. c #5C8DA6", +"w. c #034C74", +"x. c #88ABBD", +"y. c #336F8F", +"z. c #1F6184", +"A. c #4A7F9B", +"B. c #276788", +"C. c #608FA7", +"D. c #97B6C5", +"E. c #054E76", +"F. c #ABC4D0", +"G. c #739CB1", +"H. c #6E98AE", +"I. c #C9D9E1", +"J. c #F8FAFA", +"K. c #81A7B8", +"L. c #085177", +"M. c #014366", +"N. c #2D6A8B", +"O. c #D2DFE5", +"P. c #79A0B6", +"Q. c #E0E8EC", +"R. c #4F829E", +"S. c #FDFDFD", +"T. c #ACC4D1", +"U. c #054F76", +"V. c #51849F", +"W. c #35708F", +"X. c #B1C8D4", +"Y. c #BED1DA", +"Z. c #AFC7D2", +"`. c #7CA3B5", +" + c #6C98AD", +".+ c #A3BECB", +"++ c #B4CAD5", +"@+ c #15597E", +"#+ c #175B80", +"$+ c #2D6B8B", +"%+ c #6391A9", +"&+ c #7BA2B5", +"*+ c #14597E", +"=+ c #175B7F", +"-+ c #51839E", +";+ c #0A5278", +">+ c #9DBAC8", +",+ c #D5E1E7", +"'+ c #D5E2E7", +")+ c #C3D5DD", +"!+ c #286789", +"~+ c #01486D", +"{+ c #5888A3", +"]+ c #F2F6F7", +"^+ c #E8EEF1", +"/+ c #0E557A", +"(+ c #5688A2", +"_+ c #BCD0D9", +":+ c #BFD1DB", +"<+ c #E6EEF0", +"[+ c #FBFCFD", +"}+ c #E0E9ED", +"|+ c #C4D5DE", +"1+ c #4D819E", +"2+ c #C5D6DE", +"3+ c #D6E2E7", +"4+ c #E1EAED", +"5+ c #E7EFF1", +"6+ c #B5CBD6", +"7+ c #84A8BA", +"8+ c #326E8D", +"9+ c #A5C0CD", +"0+ c #095177", +"a+ c #2E6C8C", +"b+ c #0B5278", +"c+ c #A0BCC9", +"d+ c #1D5F83", +"e+ c #F0F4F5", +"f+ c #5285A0", +"g+ c #014970", +"h+ c #7DA2B7", +"i+ c #E7EDF1", +"j+ c #7EA4B8", +"k+ c #266587", +"l+ c #0B5279", +"m+ c #085178", +"n+ c #89ABBE", +"o+ c #E3EBEF", +"p+ c #397492", +"q+ c #0D5479", +"r+ c #014C75", +"s+ c #769EB3", +"t+ c #ECF1F4", +"u+ c #095278", +"v+ c #044D75", +"w+ c #719AAF", +"x+ c #497E9B", +"y+ c #12577D", +"z+ c #54859F", +"A+ c #F1F5F7", +"B+ c #032B41", +"C+ c #90B1C2", +"D+ c #3D7592", +"E+ c #C8D8DF", +"F+ c #6C97AD", +"G+ c #5485A0", +"H+ c #CFDDE3", +"I+ c #6995AC", +"J+ c #13597D", +"K+ c #155A7E", +"L+ c #EBF1F3", +"M+ c #B4CAD4", +"N+ c #10567B", +"O+ c #36708F", +"P+ c #7DA3B7", +"Q+ c #034D74", +"R+ c #CEDCE4", +"S+ c #89ABBD", +"T+ c #04283C", +"U+ c #E9EFF1", +"V+ c #4B7F9B", +"W+ c #99B7C6", +"X+ c #3D7694", +"Y+ c #0C5279", +"Z+ c #6290A8", +"`+ c #296889", +" @ c #77A0B4", +".@ c #497E9A", +"+@ c #CDDBE3", +"@@ c #C7D7DF", +"#@ c #487E9A", +"$@ c #024D75", +"%@ c #4B809C", +"&@ c #CBDAE1", +"*@ c #D8E3E8", +"=@ c #AAC3CF", +"-@ c #074F75", +";@ c #6794AB", +">@ c #0F557B", +",@ c #6B97AE", +"'@ c #6693AA", +")@ c #C7D8DF", +"!@ c #88ABBC", +"~@ c #014A70", +"{@ c #0D5379", +"]@ c #BACFD7", +"^@ c #14597D", +"/@ c #E1EAEE", +"(@ c #5C8BA5", +"_@ c #075076", +":@ c #0E557C", +"<@ c #6190A8", +"[@ c #EAF0F2", +"}@ c #336E8E", +"|@ c #86A9BB", +"1@ c #4F819D", +"2@ c #357090", +"3@ c #FDFEFD", +"4@ c #749CB1", +"5@ c #02486E", +"6@ c #5889A3", +"7@ c #DEE7EC", +"8@ c #2F6C8C", +"9@ c #ABC3CE", +"0@ c #306C8C", +"a@ c #246486", +"b@ c #95B4C3", +"c@ c #50839E", +"d@ c #AEC6D2", +"e@ c #ACC4D0", +"f@ c #165A7F", +"g@ c #195D81", +"h@ c #5D8DA5", +"i@ c #C6D7DE", +"j@ c #E9F0F3", +"k@ c #96B5C4", +"l@ c #B2C8D4", +"m@ c #BDD0DA", +"n@ c #3C7594", +"o@ c #52849E", +"p@ c #467C98", +"q@ c #F8F9F9", +"r@ c #51849E", +"s@ c #034364", +"t@ c #EEF3F5", +"u@ c #6B96AC", +"v@ c #447B97", +"w@ c #91B1C1", +"x@ c #729BB0", +"y@ c #5B8BA5", +"z@ c #BBCFD9", +"A@ c #5989A3", +"B@ c #79A0B4", +"C@ c #FCFCFD", +"D@ c #CBDAE2", +"E@ c #074F76", +"F@ c #6D98AE", +"G@ c #6592AA", +"H@ c #52859F", +"I@ c #EFF4F6", +"J@ c #276689", +"K@ c #04344F", +"L@ c #12577C", +"M@ c #387391", +"N@ c #8DAEBF", +"O@ c #F0F4F6", +"P@ c #F5F7F8", +"Q@ c #4F829C", +"R@ c #6692AA", +"S@ c #DEE8EC", +"T@ c #5587A0", +"U@ c #779EB3", +"V@ c #0C5479", +"W@ c #B0C7D3", +"X@ c #ABC3D0", +"Y@ c #051C29", +"Z@ c #8BADBF", +"`@ c #ADC4D0", +" # c #236385", +".# c #236485", +"+# c #347090", +"@# c #F5F8F9", +"## c #437A97", +"$# c #326E8E", +"%# c #CDDBE2", +"&# c #C8D9E0", +"*# c #4C809C", +"=# c #F6F9FA", +"-# c #ECF1F3", +";# c #13587C", +"># c #BCCFD8", +",# c #52849F", +"'# c #044365", +")# c #DFE8ED", +"!# c #427A96", +"~# c #377291", +"{# c #0A5178", +"]# c #6A96AC", +"^# c #5687A1", +"/# c #B5CAD5", +"(# c #F8FAFB", +"_# c #F6F8FA", +":# c #D4E0E6", +"<# c #1B5D80", +"[# c #9DB9C7", +"}# c #C9D8E0", +"|# c #052B40", +"1# c #6F99AE", +"2# c #A7C1CD", +"3# c #96B4C4", +"4# c #7AA1B6", +"5# c #FEFFFF", +"6# c #B5CAD4", +"7# c #4B809B", +"8# c #CAD9E0", +"9# c #92B2C3", +"0# c #F7FAF9", +"a# c #03486D", +"b# c #AEC5D2", +"c# c #3A7392", +"d# c #FDFDFE", +"e# c #ADC5D0", +"f# c #A9C2CF", +"g# c #A4BECC", +"h# c #A9C1CE", +"i# c #F9FAFB", +"j# c #97B5C5", +"k# c #2F6C8B", +"l# c #FBFDFD", +"m# c #062F45", +"n# c #C1D3DC", +"o# c #79A1B5", +"p# c #075077", +"q# c #3F7794", +"r# c #D6E2E8", +"s# c #1A5D81", +"t# c #EBF1F2", +"u# c #5486A0", +"v# c #3A7393", +"w# c #B5CBD5", +"x# c #03476B", +"y# c #020303", +"z# c #94B3C2", +"A# c #3C7593", +"B# c #81A5B9", +"C# c #6592A9", +"D# c #F7FAFA", +"E# c #072636", +"F# c #054E74", +"G# c #9FBBC9", +"H# c #5C8BA4", +"I# c #FAFBFB", +"J# c #306C8D", +"K# c #D7E2E8", +"L# c #CFDEE4", +"M# c #F2F5F7", +"N# c #7EA4B7", +"O# c #EFF4F5", +"P# c #06405E", +"Q# c #000000", +"R# c #3F7896", +"S# c #2E6B8C", +"T# c #81A6B8", +"U# c #C6D7DF", +"V# c #50849F", +"W# c #F3F6F8", +"X# c #B6CCD6", +"Y# c #050E12", +"Z# c #E5ECEF", +"`# c #6491AA", +" $ c #5E8DA6", +".$ c #BFD2DB", +"+$ c #5385A1", +"@$ c #0C537A", +"#$ c #81A6B9", +"$$ c #EBF0F3", +"%$ c #50849E", +"&$ c #082B3E", +"*$ c #054D74", +"=$ c #A7C0CE", +"-$ c #387291", +";$ c #739DB2", +">$ c #8EAFBF", +",$ c #E0EAED", +"'$ c #DCE6EB", +")$ c #719BB0", +"!$ c #3E7694", +"~$ c #5788A1", +"{$ c #9EBAC9", +"]$ c #063E5B", +"^$ c #E9F0F2", +"/$ c #E2EAEE", +"($ c #467D99", +"_$ c #165B80", +":$ c #A1BDCB", +"<$ c #256587", +"[$ c #064C72", +"}$ c #5B8BA4", +"|$ c #0A5179", +"1$ c #185B7F", +"2$ c #E7EEF1", +"3$ c #5A8BA4", +"4$ c #367190", +"5$ c #4E829D", +"6$ c #2A688A", +"7$ c #598AA3", +"8$ c #5889A2", +"9$ c #5A8AA3", +"0$ c #053956", +"a$ c #023855", +"b$ c #043752", +"c$ c #C3D5DE", +"d$ c #9AB8C5", +"e$ c #749DB2", +"f$ c #01496E", +"g$ c #094F74", +"h$ c #346F8F", +"i$ c #11577C", +"j$ c #FFFEFE", +"k$ c #023C5C", +"l$ c #0B5176", +"m$ c #B3CAD4", +"n$ c #336E8F", +"o$ c #084F77", +"p$ c #266687", +"q$ c #407895", +"r$ c #83A7BA", +"s$ c #012F48", +"t$ c #064D74", +"u$ c #CEDDE4", +"v$ c #DFE8EC", +"w$ c #92B2C2", +"x$ c #6F99AF", +"y$ c #6A95AC", +"z$ c #F3F7F8", +"A$ c #81A6BA", +"B$ c #80A6BA", +"C$ c #4C819C", +"D$ c #00486F", +"E$ c #0A5277", +"F$ c #CDDCE3", +"G$ c #155A7F", +"H$ c #DBE6EB", +"I$ c #002B42", +"J$ c #EEF3F4", +"K$ c #2D6A8A", +"L$ c #608FA8", +"M$ c #276688", +"N$ c #C3D4DD", +"O$ c #5F8EA6", +"P$ c #236587", +"Q$ c #1C5F82", +"R$ c #A8C1CF", +"S$ c #8AACBE", +"T$ c #367191", +"U$ c #779FB4", +"V$ c #EAF0F3", +"W$ c #003A58", +"X$ c #064F75", +"Y$ c #D1DFE6", +"Z$ c #14587E", +"`$ c #A6C0CD", +" % c #A7C0CD", +".% c #D1DEE5", +"+% c #004062", +"@% c #F7F9FB", +"#% c #10567C", +"$% c #D5E0E7", +"%% c #A2BDCB", +"&% c #DCE7EB", +"*% c #B9CDD7", +"=% c #6593AA", +"-% c #85A8BB", +";% c #CDDCE2", +">% c #8EAFC0", +",% c #236486", +"'% c #246586", +")% c #CEDDE3", +"!% c #003F60", +"~% c #F4F8F9", +"{% c #BCCFD9", +"]% c #BFD2DC", +"^% c #6793AA", +"/% c #316D8D", +"(% c #CEDCE3", +"_% c #417896", +":% c #003753", +"<% c #0B5378", +"[% c #1D5F82", +"}% c #EAF0F4", +"|% c #F2F6F8", +"1% c #DDE7EB", +"2% c #BBCED8", +"3% c #0B5379", +"4% c #002233", +"5% c #095075", +"6% c #E2EBEE", +"7% c #1E5F82", +"8% c #4A7E9A", +"9% c #B9CDD8", +"0% c #EFF3F5", +"a% c #6B96AE", +"b% c #6A95AD", +"c% c #D9E4E9", +"d% c #00466B", +"e% c #000305", +"f% c #0D5277", +"g% c #6B97AD", +"h% c #4D819D", +"i% c #6390A8", +"j% c #98B6C5", +"k% c #F8FBFB", +"l% c #8FB0C2", +"m% c #001C2B", +"n% c #0D5073", +"o% c #8FB0C1", +"p% c #5D8DA6", +"q% c #457B98", +"r% c #4D809C", +"s% c #5587A1", +"t% c #01273C", +"u% c #6C97AE", +"v% c #11567B", +"w% c #749DB3", +"x% c #014264", +"y% c #001825", +"z% c #9FBBCA", +"A% c #BED1DB", +"B% c #ECF2F4", +"C% c #5A8AA4", +"D% c #4E829C", +"E% c #063853", +"F% c #01314B", +"G% c #032B40", +"H% c #011622", +"I% c #000101", +"J% c #79A1B4", +"K% c #2B6A8B", +"L% c #A6C0CE", +"M% c #13587D", +"N% c #3D7593", +"O% c #739BB1", +"P% c #5386A0", +"Q% c #4A7E9B", +"R% c #7CA2B5", +"S% c #16597F", +"T% c #DBE6EA", +"U% c #E4ECEE", +"V% c #070808", +"W% c #0B5074", +"X% c #6291A8", +"Y% c #427996", +"Z% c #E4ECEF", +"`% c #729BB1", +" & c #CADAE1", +".& c #0E4561", +"+& c #0F4D6C", +"@& c #598AA4", +"#& c #729CB1", +"$& c #356F8F", +"%& c #95B4C4", +"&& c #85A8BA", +"*& c #90B0C1", +"=& c #0F3143", +"-& c #EDF3F5", +";& c #7CA2B6", +">& c #6D97AD", +",& c #6D98AF", +"'& c #99B6C5", +")& c #0D161B", +"!& c #0D5174", +"~& c #A0BBCA", +"{& c #B8CCD6", +"]& c #10577C", +"^& c #EDF2F4", +"/& c #E3EBEE", +"(& c #7FA4B8", +"_& c #E8EFF1", +":& c #99B6C6", +"<& c #104867", +"[& c #AAC3D0", +"}& c #2A6889", +"|& c #5789A2", +"1& c #1B5E81", +"2& c #D0DEE4", +"3& c #6491A9", +"4& c #D2DFE6", +"5& c #6894AC", +"6& c #CCDBE3", +"7& c #B1C8D3", +"8& c #316E8D", +"9& c #102D3D", +"0& c #C1D4DC", +"a& c #7BA1B6", +"b& c #96B5C5", +"c& c #97B6C4", +"d& c #165A7E", +"e& c #9CBAC8", +"f& c #2D6C8B", +"g& c #749CB2", +"h& c #C8D8E0", +"i& c #D7E3E7", +"j& c #D7E2E7", +"k& c #6F9AB0", +"l& c #286889", +"m& c #044D73", +"n& c #1B5E82", +"o& c #AAC2CE", +"p& c #447A96", +"q& c #A4BECB", +"r& c #094C71", +"s& c #07090A", +"t& c #134D6C", +"u& c #8CADBF", +"v& c #054F75", +"w& c #ADC5D1", +"x& c #417997", +"y& c #E5ECF0", +"z& c #477D9A", +"A& c #53859F", +"B& c #10374C", +"C& c #BACFD8", +"D& c #2F6C8D", +"E& c #F9FBFC", +"F& c #88ABBE", +"G& c #8EAEBF", +"H& c #95B5C4", +"I& c #EEF3F6", +"J& c #50829D", +"K& c #B4C9D4", +"L& c #084D72", +"M& c #090E10", +"N& c #134A68", +"O& c #286688", +"P& c #719AB0", +"Q& c #F7FAFB", +"R& c #E3ECEF", +"S& c #E5EDF0", +"T& c #014D74", +"U& c #1A5D82", +"V& c #87AABB", +"W& c #5F8EA7", +"X& c #F4F7F8", +"Y& c #286788", +"Z& c #113447", +"`& c #084E73", +" * c #87AABC", +".* c #78A0B4", +"+* c #437996", +"@* c #326F8E", +"#* c #447B98", +"$* c #467C9A", +"%* c #EDF2F5", +"&* c #C9D9E0", +"** c #F6F9F9", +"=* c #6593A9", +"-* c #8DAEBE", +";* c #80A5B8", +">* c #0C4B6C", +",* c #050708", +"'* c #D1DFE4", +")* c #A3BECC", +"!* c #8AACBF", +"~* c #A3BFCC", +"{* c #F5F9F9", +"]* c #729AAF", +"^* c #0C547A", +"/* c #112531", +"(* c #114B6B", +"_* c #B0C7D2", +":* c #5D8BA5", +"<* c #4F829D", +"[* c #103F56", +"}* c #094D72", +"|* c #266688", +"1* c #608EA6", +"2* c #195D80", +"3* c #C6D6DE", +"4* c #E9EFF3", +"5* c #185B80", +"6* c #185C7F", +"7* c #B1C9D3", +"8* c #C0D2DB", +"9* c #729CB0", +"0* c #1B5E80", +"a* c #0C496B", +"b* c #07090B", +"c* c #7EA3B6", +"d* c #EAF1F3", +"e* c #0F567B", +"f* c #0E567B", +"g* c #065076", +"h* c #296788", +"i* c #AFC6D2", +"j* c #84A9BB", +"k* c #769DB1", +"l* c #074D72", +"m* c #0C1920", +"n* c #153C51", +"o* c #0E547A", +"p* c #437997", +"q* c #D5E1E8", +"r* c #84A8B9", +"s* c #346F8E", +"t* c #044D74", +"u* c #102632", +"v* c #154058", +"w* c #427896", +"x* c #89ACBD", +"y* c #175A7E", +"z* c #6994AC", +"A* c #D3DFE6", +"B* c #6E99AE", +"C* c #226385", +"D* c #EDF2F3", +"E* c #112F3F", +"F* c #15435D", +"G* c #487D9A", +"H* c #14587C", +"I* c #B9CED7", +"J* c #397493", +"K* c #0D557A", +"L* c #D5E1E6", +"M* c #175A7F", +"N* c #11567C", +"O* c #AEC5D1", +"P* c #246587", +"Q* c #4E819C", +"R* c #133345", +"S* c #123C53", +"T* c #5989A2", +"U* c #91B2C1", +"V* c #054D76", +"W* c #B7CCD6", +"X* c #B3C9D4", +"Y* c #1D6083", +"Z* c #226285", +"`* c #FBFDFC", +" = c #123446", +".= c #044C73", +"+= c #2D6B8C", +"@= c #D9E3E9", +"#= c #377290", +"$= c #9AB7C6", +"%= c #6C98AE", +"&= c #D8E4E8", +"*= c #EEF4F7", +"== c #7CA3B6", +"-= c #83A7B9", +";= c #377292", +">= c #7EA4B6", +",= c #CFDCE3", +"'= c #0E2531", +")= c #084A6E", +"!= c #749DB1", +"~= c #7099AE", +"{= c #5D8CA6", +"]= c #5486A1", +"^= c #497F9C", +"/= c #5989A4", +"(= c #739CB2", +"_= c #84A7BA", +":= c #0A4869", +"<= c #0B171E", +"[= c #0C415D", +"}= c #A8C1CE", +"|= c #B1C7D3", +"1= c #DAE5EA", +"2= c #1F6083", +"3= c #195C81", +"4= c #6F99B0", +"5= c #2E6C8D", +"6= c #5385A0", +"7= c #91B1C2", +"8= c #B8CCD7", +"9= c #0E3B53", +"0= c #050809", +"a= c #0E2C3B", +"b= c #08496D", +"c= c #C2D4DD", +"d= c #3B7592", +"e= c #D3E0E5", +"f= c #7AA1B5", +"g= c #09486A", +"h= c #0D222D", +"i= c #0C364E", +"j= c #054B71", +"k= c #397392", +"l= c #A1BCCB", +"m= c #306C8B", +"n= c #6391A8", +"o= c #F5F9FA", +"p= c #DAE4E9", +"q= c #064C70", +"r= c #0C3044", +"s= c #040607", +"t= c #070E12", +"u= c #0A374F", +"v= c #044B6F", +"w= c #A8C2CF", +"x= c #E0E9EE", +"y= c #C4D6DE", +"z= c #0E547B", +"A= c #06496E", +"B= c #0B3246", +"C= c #050A0C", +"D= c #06090A", +"E= c #0A2D40", +"F= c #0A4564", +"G= c #6390A9", +"H= c #F5F8FA", +"I= c #F4F8FA", +"J= c #0A4362", +"K= c #0A2838", +"L= c #09141A", +"M= c #092E43", +"N= c #08415F", +"O= c #044C72", +"P= c #054C72", +"Q= c #093F5C", +"R= c #092C3E", +"S= c #081116", +"T= c #050607", +"U= c #0A1D27", +"V= c #092C3F", +"W= c #073650", +"X= c #0A415F", +"Y= c #064567", +"Z= c #0A4D71", +"`= c #054D73", +" - c #0B4D70", +".- c #074666", +"+- c #0A405E", +"@- c #08364E", +"#- c #0A2A3C", +"$- c #0A1B23", +"%- c #040506", +" ", +" ", +" ", +" . + + @ @ # + $ % & ", +" + * = - - - - = ; > > ; , ' - - - ) $ ! ", +" # ) - - ~ { ] ^ / ( _ : < < : [ } / | 1 2 3 - - 4 5 ", +" 6 - - 7 8 9 0 a b c d e f g h i j e k l m n o p q r s - - t ", +" ) - = u v w x y z A B ] C 7 D E F G H I J K L f M N O P Q R S - - % ", +" T - = U V W X m N = Y Z ` = ...+.@.#.$.Z %...] &.*.=.-.;.>.,.O '.).!.- - ~. ", +" = - {.].n m ^./.(._.:.<.[.F > }.- |.{ 1.+.2.3.- 4.5.6.7.8.9.0.a.b.c.d.n e.f.= 4 g. ", +" h.- i.j.k.m m m l.m.n.o.+.p.^.q.r.s.Z t.u.v.5.w.x.y.z.A.B.C.; D.E.F.m G.H.I.P J.K.L.- M. ", +" 6 - N.O.d j P.Q.m n R.K S.T.U.V.W.N X.l.Y.Z.`. +.+++@+#+E $+%+L.&+*+k k =+-+;+>+,+'+)+!+- ~+ ", +" - - {+]+m ^+/+(+Y.n m _+- :+k./ <+'.'.[+}+|+1+- - (+2+3+4+P n 5+6+7+8+n 9+E.0+a+b+c+d+G.e+f+- g+ ", +" = = h+S.i+j+++k+l+m+>.c n n+o+m J.].3.p+q+= = - - - - = r+/+[.s+_+k.n t+m u.u+t.v+w+x+y+z+A+O 3.= @ B+ ", +" = 3 C+o.m u D+m+E+F+G+0.n m n H+I+J+- - - - - - - - - - - - - - - - K+F+O.m L+M+N+O+P+&.H.Q+R+m n S+..h.T+ ", +" - = %.U+V+W+X+Y+Z+`+ @.@+@n @@#@$@- - - - - - - - - - - - - - - - - - - - 3 %@&@n *@=@-@;@>@,@'@{.)@g !@= ~@ ", +" 6 - h+o.<+{@D ]@^@u.N+/@'.<+(@3 - - - - - - - - - r+_@:@:@_@' - - - - - - - - - Q+<@[@b y }@0.|@1@G 2@3@k.4@- 5@ ", +" A - 6@S.7@8@9@0@a@b@c@d@n e@f@- - - - - - - g@h@D.i@j@b g g b x 2+k@(@a.- - - - - - - a.l@'.m@^.>@n@= !@o@p@q@r@- s@ ", +" ' N.]+t@u@v@b+w@N.D [@d.x@..- - - - - &.y@Y.d.m m m m m m m m m m m m k.z@A@> - - - - - 3 B@C@D@X+E@F@G@=.H@n I@J@- K@ ", +" = 0+O.m )@L@M@6@v+N@O@P@Q@- - - - - > R@/@'.m m m m m m m m m m m m m m m m '.S@Z+m.- - - - - T@(.C U@x+V@W@O n X@)+_@h.Y@ ", +" = - |@n Z@c@`@ #.#+#*@@###- - - - - $#%#n m m m m m m m m m m m m m m m m m m m m o.@- - - - - *#=#-#;#>#m x ,#w.=@E - '# ", +" - $+k.)#!#~#{#]#^#/#d.Q@- - - - = 9.(#m m m m m m m m m m m m m m m m m m m m m m m m _#6.= - - - - ^#O :#k.6+<#/.[#c@}#B.- |# ", +" = = ].n r > p.1#L@2#n x@- - - - > N n m m m m m m m m m m m m m m m m m m m m m m m m m m n 3#=.- - - - 4#5#6#Q+7#_.8#9#0#l@r+a# ", +" - U n b#V@9.c#;+N@d#e#$@- - - > f#m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m g#; - - - Q+6+k.h#d#i#j#k#6+l#X+' m# ", +" A = n#m @#o#p#q#1#r#<+f@- - - = N m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m Y = - - - s#t#m >#.#L.u#2 v#w#- x#y# ", +" - u 3@m m f#z#A#B#n +.- - - - 9.n m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m n I+- - - - C#'.F+M@%+H *+x.D#8@- E# ", +" F#- G#H#G#I#J#K#O l @@3 - - - $#(#m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m @#$+- - - ; L#M#>@N+N#O#m m k@- P#Q# ", +" = 7 Q R#= S#T#e m '.#@- - - U.z m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m U#; - - - V#'.e.t#n W#X#c.t@l+' Y# ", +" - 8 o.Z#W+`#>@s t+H+$@- - - C#d m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m o. $- - - ; f m .$+$@$Q+#$$$%$- &$Q# ", +" *$- =$S.0.U.-$;$>$n I+- - - &.,$m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m '$U.- - - )$n X+!$%+~$l+~#{$- ]$Q# ", +" v+3 ^$/$s#($S _$G#J.J+- - - y@n m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m n u#- - - s#b :$L@= <$s+I./$= [$y# ", +" = { 5#d.}$F@|$1$2$].- - - - L 3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$3$4$- - - - 5$.@- 6$7$8$3$9$p#- 0$a$b$ ", +" - ] o.c$%+d$R@I g e$- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - f$ ", +" g$- ^ n h$[.-+i$n+j$p+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ) k$ ", +" l$- m$'.n$o$p$q$r$[+q+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - s$ ", +" t$- u$v$:#w$x$y$e z$A$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$B$j+C$; - - - D$ ", +" E$- F$- - E.u+G$H$m o.'.'.'.m m m m m m m m m m 5#m '.'.m m m m m m m m m m m m m m m 5#'.o.m m m m m m m m m m m m m m m m m m m m m m m m m m m m ].l+- - - I$ ", +" =.m.J$q K$C.L$M$$$N$#######@O m m m m m m m '.:#O$P$Q$p@R$3@m m m m m m m m m m m m @#S$T$s#{.U$V$m m m m m m m m m m m m m m m m m m m m m m m m m d T#- - - W$ ", +" = X$< Y$Z$> - l+[@`$- - - i$n m m m m m m o. %i.- - - - - A@b m m m m m m m m m m 2$J#- - - - - s#.%m m m m m m m m m m m m m m m m m m m m m m m m m H+- - - +%Q# ", +" = > < m g @%J$O@m `$- - - #%n m m m m m m $%{#n@%%'+&%*%=%p#-%m m m m m m m m m n .@G$N#2+S@;%>%,%'%@#m m m m m m m m m m m m m m m m m m m m m m m m )%- - - !%Q# ", +" =.; ~%m M#N${%]%m W@- - - &.b m m m m m m ^%9#3@m m m m '.j /%k m m m m m m m m (%_%^$m m m m m @#] v m m m m m m m m m m m m m m m m m m m m m m m m #$- - - :%Q#Q# ", +" <%= _ : [%- G+@+(%|+- - - = }%m m m m m m l.o.m m m m m m m /$J.m m m m m m m m 2$|%m m m m m m m O 1%m m m m m m m m m m m m m m m m m m m m m m 5#2%3%- - - 4%Q#Q# ", +" 5%- Y$6%7%2 8%,%9%}+- - - - @@m 0%a%b%b%b%b%b%b%b%b%b%b%b%b%b%b%b%b%b%b%b%b%b%b%b%b%b%b%b%b%b%b%b%b%b%b%b%b%b%_ m c%#$#$#$#$#$#$#$#$#$#$#$#$#$#$j+5$; - - - d%e%Q#Q# ", +" f%- m$n g%~#h%i%@#d.s - - - j%m =#;+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 7 k%m l%- - - - - - - - - - - - - - - - - - - ) m%Q#Q#Q# ", +" n%- o%m p G#C#..'@n p+- - - p%m m q%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - r%m m s%- - - - - - - - - - - - - - - - - - ) t%Q#Q#Q# ", +" - <@m u%h@v%I+8@5#w%- - - s#d.m k@- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - N m J.J+- - - - - - - - - - - - - - - - - x%y%Q#Q#Q#Q# ", +" - N.o.z%w.}@W+:$'.].- - - - A%m B%Z - - - - ##C%C%C%C%C%C%C%C%C%C%C%C%C%C%C%C%C%C%C%C%C%C%C%C%X+- - - - N+O@m e.- - - - D%V+- - /.[%p.9$p#- E%F%G%H%I%Q#Q#Q#Q# ", +" > ; [@n )+J%K%L.L%J.M%- - - |.n m g%- - - - %@O '.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.k.N%- - - - O%o.m P%- - - s#l : Q%2 R%S%T%U%$@5%V%Q#Q#Q#Q#Q#Q#Q# ", +" W%- 9 m X%s#9$V.Y%'.I+- - - p#4+m Z%s - - - - 7+m m m m m m m m m m m m m m m m m m m m m n )$- - - - N+_ m H$E.- - - `%m m '.o.v$ &m v - .&Q#Q#Q#Q#Q#Q# ", +" +&- @&m #&$&&.@$r$I@j 3 - - ' '@c 5#>.- - - - Q+%&m m m m m m m m m m m m m m m m m m m g &&= - - - - *&5#o. $- - - ; K#z$[+m m m m '.H@- =&Q#Q#Q#Q# ", +" = >@W#-&#$w$G.@+B@n #@- - - U.;%m b X+- - - - $@;&d.m m m m m m m m m m m m m m m m k%>&= - - - - ##O m U#; - - - r@5#,&`+'&@#m m I@3%Q+)&Q#Q#Q# ", +" !&- ~&o.{&]&H ] ] ^&E+3 - - - y.D#m /&[%- - - - - q#r#m m m m m m m m m m m m m '.F$O+- - - - - D _.m @#$+- - - m.} m E+s%U.=+(&_&:&- <&Q#Q#Q# ", +" - -$'.[&}&|&i.1&S$n |.- - - - ^.j$m 2&K+- - - - - p#3&4&n m m m m m m m m P &y@=.- - - - - =+:#m j$5&- - - - G@n 6&b.n '$H.7 7&8&- 9&Q#Q#Q# ", +" t$- 0&a&U.a@b&c&q+x 2$d&- - - = e&m m 2&d+- - - - - - = f&g&=$h&i&j&U#g#k&l&- - - - - - - D :#m m %&- - - - s#$$l.m&n&o&O#p&q&{&- r&s&Q#Q# ", +" t&- U Z.c+u&!$v&F+k.m w&..- - - E@f#m m /&X+- - - - - - - - - - - - - - - - - - - - - - x&y&m m .+; - - - v+++O A#z&A&Q+4..$m@q#- B&Q#Q#Q# ", +" 2.= C&}#E.D& &5#2$f#c x@- - - - > [#'.m E&F&s - - - - - - - - - - - - - - - - - - /+G&[+m '.H&=.- - - - 4#I&S.>+@+[%J&V+o.K&- L&M&Q#Q#Q# ", +" N&- S#k q c%n n#Q$O&k b 5$- - - - = P&Q&m '.R&]#Z - - - - - - - - - - - - - - s F@S&m m @#;.T&- - - - ^#U+U&V&g j@W&Q+c@X&Y&- Z&Q#Q#Q# ", +" `&- *o.c.}$> 5$.*+*8#X&##- - - - - @*+@m m m B%%&#*;+- - - - - - - - 3%$*D.%*m m o.&*8@- - - - - *#**8#h$=.=*E&n m@-*;*- >*,*Q#Q#Q# ", +" = {#'*u.E@R@'@U.s%k+n @#5$- - - - - > '@/@5#m m m @#&*)*S$P+P+!*~* &_#o.m m '.S@Z+; - - - - - s%{*/@F@^@]*^*.@A+m z &.$@/*Q#Q#Q# ", +" (*- $+l.z _*;+H.N+s%n m b x@..- - - - ' p#:*A%d.m m m m m m m m m m m m k.z@8$> - - - - - 3 B@C@[+2 A.<*i.z+O+O@c.!+- [*Q#Q#Q#Q# ", +" }*- A@S.)#|*;+r (.K#1*W@'.w&d&- - - - - - - 2*p%D.3*4*< g g b _ 2+k@(@5*- - - - - - - 6*7*n 2+|+8*Z h@9*0*S&O ,#- a*b*Q#Q#Q# ", +" *$- c*n c%/ O d*1 *#y+K#3@2$F Q+- - - - - - - - - = p#e*f*g*= - - - - - - - - - 3 ] x m W+h*v+i*j*- B@S.3@k*- l*m*Q#Q#Q# ", +" n*Q+..C+n m m +.o*p*/+#&.@e+n h&#@3 - - - - - - - - - - - - - - - - - - - - Q+%@6&n q*l%g%#*A#i$r*s*:#g >.= t*u*Q#Q#Q#Q# ", +" v*= 3 %.n m A.w*..x*s <@y*Y.g n H+z*J+- - - - - - - - - - - - - - - - d&u%A*o.'$W+B*> #$s%C*<$W+D*3@S$Q+3 E*Q#Q#Q#Q# ", +" F*..= E O _.]#N R.l&G*|*'@H*`%n m D#I*3.J*s , - - = - - - - K*[.U${%k.n }+L*M*k#p@3.N*O*P*Q*c.O U@= 3 R*Q#Q#Q#Q# ", +" S*= - T*z$m ~%;+R.3 U*V*Z+v+O@y&X v$d '.d.}+|+X.R$R$l@2+/@d.'.g ^&W*-%@+k&^@9*= X*Y*Z*`*n A+u#- t*9&Q#Q#Q#Q# ", +" =.=- +=O.n @=o@|.I+}&X+#@P r #=#%$=%=u&V$&=I@*=[+m c%4&n ==+*=.Z+7 6@8@-=@$;=F+>=p&]+,=}&- [$'=Q#Q#Q#Q# ", +" )=- ;+x.k.3@(.!=/%Q+n#j$%+}&~={=~#M%S$$@|.w.&&5#]=^=o./=G*n&(=L.C#= i*k+8@;%n D#_=L.- :=<=Q#Q#Q#Q# ", +" [== = a+z@n d.}=|=n 1=9$y.U$~#2=Z*I ..3== ^.m 4=5=o.b&#%P%A.6=8@Z 7=n n g 8=J - $@9=0=Q#Q#Q#Q# ", +" a=b=- = U c=n m m x S#H N /.r p.C+-.= J@C%m S$:.n O.- d=M$e=f=^+j$d A%##r+- g=h=Q#Q#Q#Q#Q# ", +" i=j=- - k=l=z$'.O x 3@n+m=`%6.+.= n=#*m g#= o=O f@C#p=m o.]+>+O+= - q=r=s=Q#Q#Q#Q#Q# ", +" t=u=v=- - e*C%w=$$j$'.'.m x L+&@x=y=m A%> v$m W+|+^$=$6@z=- - A=B=C=Q#Q#Q#Q#Q# ", +" D=E=F=6 - - 3 +=G=*&++O._ H=< < I=Z%z X*>%<@{ 3 - - 6 J=K=s=Q#Q#Q#Q#Q#Q# ", +" Q#L=M=N=O=- - - - - - ; > > ; - - - - - - P=Q=R=S=Q#Q#Q#Q#Q#Q#Q# ", +" Q#Q#T=U=V=W=X=Y=Z=`=6 6 *$ -.-+-@-#-$-%-Q#Q#Q#Q#Q#Q#Q#Q# ", +" Q#Q#Q#Q#Q#Q#Q#Q#Q#Q#Q#Q#Q#Q#Q#Q#Q#Q#Q#Q#Q#Q# ", +" Q#Q#Q#Q#Q#Q#Q#Q#Q#Q#Q#Q#Q#Q# ", +" ", +" ", +" ", +" ", +" ", +" ", +" "}; Binary files /tmp/cFjkONjEmM/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/evince/data.tar.gz and /tmp/D4HGyIf3Td/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/evince/data.tar.gz differ diff -Nru qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/evince/test_opendocument.py qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/evince/test_opendocument.py --- qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/evince/test_opendocument.py 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/evince/test_opendocument.py 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,265 @@ +# Copyright (C) 2005-2010 Canonical Ltd +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +# This script contains the tests to run with mago + +"""Minimal Test + +This is a basic test to verify that mago-ng is working as expected and can +be run with various testing framework + +To run it with: +* pyunit + $ PYTHONPATH= python ./minimal.py +* nose + $ PYTHONPATH=.. nosetests -v +* subunit with jUnit output format + $ PYTHONPATH=.. python -m subunit.run helloword|subunit2junitxml +* testtools + $ PYTHONPATH=.. python -m testtools.run minimal + +Where is the path to the mago library if not in a standard +location e.g .. + +You can code ldtp directly in there or an external module +The only mandatory element is '_launcher' (and _win_name for now) + +set _setupOnce to False to launch/close the app for each test +""" + +from mago import TestCase +import nose +import os +import ldtp + +LBL_UNABLETOOPENDOCUMENT = 'lblUnabletoopendocument' + +class TestEvince(TestCase): + launcher = 'evince' + window_name = 'frm0' + datadir = os.path.join(os.path.dirname(__file__), 'data') + testfile = None + + @classmethod + def setUpClass(self): + """Class setup + + Build the document list from the content of the data directory + which will be used in the tests + """ + self.doclist = {} + for f in os.listdir(self.datadir): + try: + ext = f.split('.',1)[1] + # Only take the first occurrence for an extension + if not ext in self.doclist: + self.doclist[ext] = f + except: + pass + + super(TestEvince, self).setUpClass() + + def openDocument(self, extension): + """Open the first document in datadir with the given extension + + :param extension: File extension + """ + + try: + docname = self.doclist[extension] + except KeyError: + return False + + self.testfile = os.path.join(self.datadir, docname) + return self.application.openDocument( self.testfile ) + + def test_open_bmp(self): + """Open a document of type 'PC bitmap' (.bmp)""" + self.assertTrue(self.openDocument('bmp'), + "Failed to open document '%s'" % self.testfile) + + self.assertTrue(not ldtp.guiexist(self.window_name, + LBL_UNABLETOOPENDOCUMENT), + "Failed to open document '%s'" % self.testfile) + + def test_open_cb7(self): + """Open a document of type 'Comic Book 7-zip archive data' (.cb7)""" + self.assertTrue(self.openDocument('cb7'), + "Failed to open document '%s'" % self.testfile) + + self.assertTrue(not ldtp.guiexist(self.window_name, + LBL_UNABLETOOPENDOCUMENT), + "Failed to open document '%s'" % self.testfile) + + def test_open_cbr(self): + """Open a document of type 'Comic Book RAR archive data, v1d' (.cbr)""" + self.assertTrue(self.openDocument('cbr'), + "Failed to open document '%s'" % self.testfile) + + self.assertTrue(not ldtp.guiexist(self.window_name, + LBL_UNABLETOOPENDOCUMENT), + "Failed to open document '%s'" % self.testfile) + + def test_open_cbt(self): + """Open a document of type 'Comic Book POSIX tar archive (GNU)' (.cbt)""" + self.assertTrue(self.openDocument('cbt'), + "Failed to open document '%s'" % self.testfile) + + self.assertTrue(not ldtp.guiexist(self.window_name, + LBL_UNABLETOOPENDOCUMENT), + "Failed to open document '%s'" % self.testfile) + + def test_open_cbz(self): + """Open a document of type 'Comic Book Zip archive data' (.cbz)""" + self.assertTrue(self.openDocument('cbz'), + "Failed to open document '%s'" % self.testfile) + + self.assertTrue(not ldtp.guiexist(self.window_name, + LBL_UNABLETOOPENDOCUMENT), + "Failed to open document '%s'" % self.testfile) + + def test_open_djvu(self): + """Open a document of type 'DjVu multiple page document' (.djvu)""" + self.assertTrue(self.openDocument('djvu'), + "Failed to open document '%s'" % self.testfile) + + self.assertTrue(not ldtp.guiexist(self.window_name, + LBL_UNABLETOOPENDOCUMENT), + "Failed to open document '%s'" % self.testfile) + + def test_open_dvi(self): + """Open a document of type 'TeX DVI file' (.dvi)""" + self.assertTrue(self.openDocument('dvi'), + "Failed to open document '%s'" % self.testfile) + + self.assertTrue(not ldtp.guiexist(self.window_name, + LBL_UNABLETOOPENDOCUMENT), + "Failed to open document '%s'" % self.testfile) + + def test_open_eps(self): + """Open a document of type 'PostScript document text' (.eps)""" + self.assertTrue(self.openDocument('eps'), + "Failed to open document '%s'" % self.testfile) + + self.assertTrue(not ldtp.guiexist(self.window_name, + LBL_UNABLETOOPENDOCUMENT), + "Failed to open document '%s'" % self.testfile) + + def test_open_gif(self): + """Open a document of type 'GIF image data' (.gif)""" + self.assertTrue(self.openDocument('gif'), + "Failed to open document '%s'" % self.testfile) + + self.assertTrue(not ldtp.guiexist(self.window_name, + LBL_UNABLETOOPENDOCUMENT), + "Failed to open document '%s'" % self.testfile) + + def test_open_jpg(self): + """Open a document of type 'JPEG image data' (.jpg)""" + self.assertTrue(self.openDocument('jpg'), + "Failed to open document '%s'" % self.testfile) + + self.assertTrue(not ldtp.guiexist(self.window_name, + LBL_UNABLETOOPENDOCUMENT), + "Failed to open document '%s'" % self.testfile) + + def test_open_pdf(self): + """Open a document of type 'PDF document' (.pdf)""" + self.assertTrue(self.openDocument('pdf'), + "Failed to open document '%s'" % self.testfile) + + self.assertTrue(not ldtp.guiexist(self.window_name, + LBL_UNABLETOOPENDOCUMENT), + "Failed to open document '%s'" % self.testfile) + + def test_open_pdfbz2(self): + """Open a document of type 'PDF bzip2 compressed data' (.pdf.bz2)""" + self.assertTrue(self.openDocument('pdf.bz2'), + "Failed to open document '%s'" % self.testfile) + + self.assertTrue(not ldtp.guiexist(self.window_name, + LBL_UNABLETOOPENDOCUMENT), + "Failed to open document '%s'" % self.testfile) + + def test_open_pdfgz(self): + """Open a document of type 'PDF gzip compressed data' (.pdf.gz)""" + self.assertTrue(self.openDocument('pdf.gz'), + "Failed to open document '%s'" % self.testfile) + + self.assertTrue(not ldtp.guiexist(self.window_name, + LBL_UNABLETOOPENDOCUMENT), + "Failed to open document '%s'" % self.testfile) + + def test_open_png(self): + """Open a document of type 'PNG image data' (.png)""" + self.assertTrue(self.openDocument('png'), + "Failed to open document '%s'" % self.testfile) + + self.assertTrue(not ldtp.guiexist(self.window_name, + LBL_UNABLETOOPENDOCUMENT), + "Failed to open document '%s'" % self.testfile) + + def test_open_pnm(self): + """Open a document of type 'Netpbm PPM "rawbits" image data' (.pnm)""" + self.assertTrue(self.openDocument('pnm'), + "Failed to open document '%s'" % self.testfile) + + self.assertTrue(not ldtp.guiexist(self.window_name, + LBL_UNABLETOOPENDOCUMENT), + "Failed to open document '%s'" % self.testfile) + + def test_open_ps(self): + """Open a document of type 'PostScript document' (.ps)""" + self.assertTrue(self.openDocument('ps'), + "Failed to open document '%s'" % self.testfile) + + self.assertTrue(not ldtp.guiexist(self.window_name, + LBL_UNABLETOOPENDOCUMENT), + "Failed to open document '%s'" % self.testfile) + + def test_open_tif(self): + """Open a document of type 'TIFF image data' (.tif)""" + self.assertTrue(self.openDocument('tif'), + "Failed to open document '%s'" % self.testfile) + + self.assertTrue(not ldtp.guiexist(self.window_name, + LBL_UNABLETOOPENDOCUMENT), + "Failed to open document '%s'" % self.testfile) + + def test_open_tiff(self): + """Open a document of type 'TIFF image data' (.tiff)""" + self.assertTrue(self.openDocument('tiff'), + "Failed to open document '%s'" % self.testfile) + + self.assertTrue(not ldtp.guiexist(self.window_name, + LBL_UNABLETOOPENDOCUMENT), + "Failed to open document '%s'" % self.testfile) + + def test_open_xpm(self): + """Open a document of type 'X pixmap image text' (.xpm)""" + self.assertTrue(self.openDocument('xpm'), + "Failed to open document '%s'" % self.testfile) + + self.assertTrue(not ldtp.guiexist(self.window_name, + LBL_UNABLETOOPENDOCUMENT), + "Failed to open document '%s'" % self.testfile) + + + + + +if __name__ == "__main__": + nose.main() diff -Nru qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/gnome-terminal/test_gnome-terminal.py qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/gnome-terminal/test_gnome-terminal.py --- qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/gnome-terminal/test_gnome-terminal.py 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/gnome-terminal/test_gnome-terminal.py 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,138 @@ +# Copyright (C) 2010 Canonical Ltd +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +# This script contains the tests to run with mago + +"""GNOME Terminal Test +Test the Gnome terminal: + - Add a new profile. + - Delete a profile. + - Zoom out + - Zoom in + - Open tabs + - Close tabs + +To run it with: +$ mago-ng + +""" + +from mago import TestCase +import unittest +import ldtp +import ooldtp + +TERMINAL = 'frm*/tmp' +MNU_PROFILE = 'mnuProfile*' +DLG_PROFILE = 'dlgProfiles' +BTN_CLOSE = 'btnClose' +BTN_NEWPROFILE = 'btnNew' +DLG_NEWPROFILE = 'dlgNewProfile' +TXT_PROFILENAME = 'txtProfilename' +PROFILE_NAME = 'Prueba' +BTN_CREATE = 'btnCreate' +DLG_EDITINGPROFILE = 'dlgEditingProfile*' +PROFILE_LIST = 'tblProfilelist' +BTN_DELETE = 'btnDelete' +DLG_QUESTION = 'dlgQuestion' +ZOOM_OUT = 'mnuZoomOut' +ZOOM_IN = 'mnuZoomIn' +FULLSCREEN = 'mnuFullScreen' +OPENTAB = 'mnuOpenTab' +CLOSETAB = 'mnuCloseTab' + +class TerminalTests(TestCase): + launcher = 'gnome-terminal' + launcher_args = ['--working-directory=/tmp', '--disable-factory'] + window_name = TERMINAL + setupOnce = True + + def test_01_add_new_profile(self): + t = ooldtp.context(self.application.get_windowname(discover = True)) + t.getchild(MNU_PROFILE).selectmenuitem() + ldtp.wait(2) + self.assertTrue(ldtp.guiexist(DLG_PROFILE)) + p = ooldtp.context(DLG_PROFILE) + p.getchild(BTN_NEWPROFILE).click() + + ldtp.waittillguiexist(DLG_NEWPROFILE) + np = ooldtp.context(DLG_NEWPROFILE) + np.getchild(TXT_PROFILENAME).settextvalue(PROFILE_NAME) + np.getchild(BTN_CREATE).click() + ldtp.waittillguiexist(DLG_EDITINGPROFILE) + ep = ooldtp.context(DLG_EDITINGPROFILE) + ep.getchild(BTN_CLOSE).click() + p.getchild(BTN_CLOSE).click() + + + def test_02_delete_profile(self): + t = ooldtp.context(self.application.get_windowname(discover = True)) + t.getchild(MNU_PROFILE).selectmenuitem() + ldtp.wait(2) + + self.assertTrue(ldtp.guiexist(DLG_PROFILE)) + + p = ooldtp.context(DLG_PROFILE) + pl = p.getchild(PROFILE_LIST) + self.assertTrue(pl.selectrowpartialmatch(PROFILE_NAME)) + p.getchild(BTN_DELETE).click() + + ldtp.waittillguiexist(DLG_QUESTION) + + q = ooldtp.context(DLG_QUESTION) + q.getchild(BTN_DELETE).click() + + p.getchild(BTN_CLOSE).click() + + def test_03_zoom_out(self): + t = ooldtp.context(self.application.get_windowname(discover = False)) + zoom = t.getchild(ZOOM_OUT) + + while zoom.stateenabled(): + zoom.selectmenuitem() + self.assertTrue(t.guiexist()) + + def test_04_zoom_in(self): + t = ooldtp.context(self.application.get_windowname(discover = False)) + zoom = t.getchild(ZOOM_IN) + + while zoom.stateenabled(): + zoom.selectmenuitem() + + self.assertTrue(t.guiexist()) + + def test_05_open_new_tabs(self): + ui = ooldtp.context(self.application.get_windowname(discover = False)) + tabs = ui.getchild(OPENTAB) + t = 0 + while t < 10: + ldtp.wait(1) + tabs.selectmenuitem() + t+=1 + ldtp.wait(1) + self.assertTrue(ui.guiexist()) + + def test_06_close_tabs(self): + t = ooldtp.context(self.application.get_windowname(discover = False)) + ldtp.wait(1) + tabs = t.getchild(CLOSETAB) + while tabs.stateenabled(): + ldtp.wait(1) + tabs.selectmenuitem() + self.assertTrue(t.guiexist()) + +if __name__ == "__main__": + unittest.main() diff -Nru qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/jockey-gtk/test_jockey-gtk.py qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/jockey-gtk/test_jockey-gtk.py --- qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/jockey-gtk/test_jockey-gtk.py 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/jockey-gtk/test_jockey-gtk.py 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,79 @@ +# Copyright (C) 2011 Canonical Ltd +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +# This script contains the tests to run with mago + +"""Jockey GTK Test + +This is a basic test to verify that jockey-gtk is working correctly. + +It checks the following: + - that clicking the Help button brings up yelp + - that the activate button is clickable when proprietary drivers are + available + - that the deactivate button is clickable when proprietary drivers are + active + +To run it with: +$ mago-ng +""" + +from mago import TestCase +import ldtp +import unittest + +class JockeyTests(TestCase): + """Launcher for the application jockey-gtk + """ + launcher = 'jockey-gtk' + window_name = 'dlgAdditionalDrivers' + + def test_help_button(self): + """Test help button + + This tests that Help regarding proprietary drivers can be accessed. + """ + ldtp.mouseleftclick(self.window_name, 'Help') + #help_name = 'frmProprietaryDrivers' + help_name = 'frmWorkingwithHardwareDevices' + self.assertTrue(ldtp.waittillguiexist(help_name)) + ldtp.closewindow(help_name) + + def test_activate_is_active(self): + """Test activate button is available + + This test ensures the activate button is present if there are + drivers that have not been activated. + """ + not_activated = 'lblThisdriverisnotactivated' + if ldtp.guiexist(self.window_name, not_activated): + self.assertTrue(ldtp.objectexist(self.window_name, + 'btnActivate')) + + def test_deactivate_is_active(self): + """Test deactivate button is available + + This test ensures the deactivate button is present if there are + drivers that have been activated. + """ + activated = 'lblThisdriverisactivatedandcurrentlyinuse' + if ldtp.guiexist(self.window_name, activated): + self.assertTrue(ldtp.objectexist(self.window_name, + 'btnDeactivate')) + + +if __name__ == "__main__": + unittest.main() diff -Nru qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/language-selector/test_languageselector.ini qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/language-selector/test_languageselector.ini --- qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/language-selector/test_languageselector.ini 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/language-selector/test_languageselector.ini 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,10 @@ +[data] +; This file contains the tests to run with mago +; To pass the test you need to specify valid credentials in the included file: +; [auth] +; username=USERNAME +; password=PASSWORD +include=~/.magocredentials.ini + +; Used by the test_changetime test. Format hh:mm +language=Zulu diff -Nru qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/language-selector/test_languageselector.py qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/language-selector/test_languageselector.py --- qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/language-selector/test_languageselector.py 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/language-selector/test_languageselector.py 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,134 @@ +# Copyright (C) 2010 Canonical Ltd +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +# This script contains the tests to run with mago + +"""Language Selector Test + +Test the gnome-language-selector application + +To run it with: +$ mago + +""" + +from mago import TestCase +import unittest +import ldtp, ooldtp + +class TestLanguageSelector(TestCase): + """Language Selector Test + """ + launcher = 'gnome-language-selector' + window_name = 'frmLanguage&Format' + + btnInstallRemove = 'btnInstall/RemoveLanguages' + + frmInstalledLanguages = 'frmInstalledLanguages' + btnApplyChanges = 'btnApplyChanges' + chkTranslations = 'chkTranslations' + chkExtrafonts = 'chkExtrafonts' + chkInputmethods = 'chkInputmethods' + chkSpellchecking= 'chkSpellcheckingandwritingaids' + tblLanguages = 'tbl0' + + def test_01InstallLanguage(self): + """Test the installation of a language package + + TESTCASE + caseid: langsel001 - Unique ID for the testcase + name: administration-language-support-install + requires: + command: gnome-language-selector + _description: + PURPOSE: + 1. Verify the ability to install a new language + STEPS: + 1. System -> Administration -> Language Support + 2. Click Install/Remove Language + 3. Select a new language + 4. Apply translations + 5. Select language drop down for Menus + 6. Set to another language + 7. Proceed with installation + VERIFICATION: + 1. Verifiy that the language is installed + + """ + password = self.testConfig.get('auth', 'password') + language = self.testConfig.get('data', 'language') + + # g-l-s does a cache refresh on start. + ldtp.wait(5) + self.application.context.click( self.btnInstallRemove ) + ldtp.waittillguiexist( self.frmInstalledLanguages ) + + frmInstallCtx = ooldtp.context( self.frmInstalledLanguages ) + + ridx = frmInstallCtx.gettablerowindex( self.tblLanguages, language ) + frmInstallCtx.checkrow( self.tblLanguages, ridx, 1 ) + frmInstallCtx.check( self.chkTranslations ) + frmInstallCtx.check( self.chkSpellchecking ) + frmInstallCtx.click( self.btnApplyChanges ) + self.application.authenticate( password ) + # Gives time to the app to install the packages + ldtp.wait(20) + + # TODO: Check that the packages are installed + self.assertTrue(True) + + def test_02RemoveLanguage(self): + """Test the removal of a language package + + Add documentation for your test in the following format: + caseid: langsel002 + name: administration-language-support-remove + requires: + command: gnome-language-selector + _description: + PURPOSE: + 1. Verify the ability to remove an installed language + STEPS: + 1. System -> Administration -> Language Support + 2. Click Install/Remove Language + 3. Select an installed language + 7. Proceed with removal + VERIFICATION: + 1. Verifiy that the language is not installed + + """ + password = self.testConfig.get('auth', 'password') + language = self.testConfig.get('data', 'language') + + # g-l-s does a cache refresh on start. + ldtp.wait(5) + self.application.context.click( self.btnInstallRemove ) + ldtp.waittillguiexist( self.frmInstalledLanguages ) + + frmInstallCtx = ooldtp.context( self.frmInstalledLanguages ) + + ridx = frmInstallCtx.gettablerowindex( self.tblLanguages, language ) + frmInstallCtx.uncheckrow( self.tblLanguages, ridx, 1 ) + frmInstallCtx.click( self.btnApplyChanges ) + self.application.authenticate( password ) + # Gives time to the app to remove the packages + ldtp.wait(20) + + # TODO: Check that the packages are not installed + self.assertTrue(True) + +if __name__ == "__main__": + unittest.main() diff -Nru qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/openoffice/test_OOo.py qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/openoffice/test_OOo.py --- qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/openoffice/test_OOo.py 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/openoffice/test_OOo.py 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,131 @@ +# Copyright (C) 2010 Canonical Ltd +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +# This script contains the tests to run with mago + +"""LibreOffice Test + +This test verifies OOo functionalities + +To run it with: +$ mago-ng + +""" + +from mago import TestCase +import unittest +import ldtp, ooldtp + +class TestOOo(TestCase): + """Test OOo functionalities + """ + launcher = 'soffice' + window_name = 'frm*Office*' + + + MNU_SPREADSHEET = 'mnuSpreadsheet' + MNU_PRESENTATION = 'mnuPresentation' + MNU_DRAWING = 'mnuDrawing' + MNU_DOCUMENT = 'mnuTextDocument' + MNU_CLOSE = 'mnuClose' + MNU_QUIT = 'mnuQuit' + BTN_CREATE = 'btnCreate' + FRM_IMPRESS = 'frm*Impress' + + _appnames = { + 'writer':(MNU_DOCUMENT, 'frm*Writer'), + 'calc':(MNU_SPREADSHEET,'frm*Calc'), + 'impress':(MNU_PRESENTATION, 'dlgPresentationWizard'), + 'draw':(MNU_DRAWING, 'frm*Draw') + } + + + def __about(self): + """Open and close the about dialog + Return True on success + """ + # The window manager needs time, give it time + ldtp.wait(2) + rc = self.application.about_open() + self.assertTrue(rc) + dlgAboutName = self.application.dlgAboutName + self.assertIsNotNone(dlgAboutName, + "Name of the about dialog was not found") + self.assertTrue(ldtp.guiexist(dlgAboutName)) + + # Then close it + rc = self.application.about_close('btnOK') + self.assertTrue(rc) + self.assertFalse(ldtp.guiexist(dlgAboutName)) + + return True + + def __runApp(self, appname): + """Launch one OOo application + + :param appname: Name of the OOo application + + The list of valid application is: + - writer + - calc + - impress + - draw + """ + appname = appname.lower() + + if not appname in self._appnames: + raise AssertionError("The application '%s' is not a valid OO.o application" % appname) + + self.application.context.click(self._appnames[appname][0]) + ldtp.wait(2) + ldtp.waittillguiexist(self._appnames[appname][1]) + ldtp.wait(2) + appobj = ooldtp.context(self._appnames[appname][1]) + + ldtp.wait(2) + if 'impress' in appname: + appobj.click(self.BTN_CREATE) + ldtp.waittillguiexist(self.FRM_IMPRESS) + ldtp.wait(2) + ldtp.click(self.FRM_IMPRESS, self.MNU_CLOSE) + else: + appobj.click(self.MNU_CLOSE) + return True + + + def test_01MainMenu(self): + """ This test verifies that the main application can be launched + """ + self.assertTrue( self.__about()) + + def test_02Writer(self): + """Launch Writer""" + self.assertTrue( self.__runApp('writer')) + + def test_03Calc(self): + """Launch Calc""" + self.assertTrue( self.__runApp('calc')) + + def test_04Impress(self): + """Launch Impress""" + self.assertTrue( self.__runApp('impress')) + + def test_05Draw(self): + """Launch Draw""" + self.assertTrue( self.__runApp('draw')) + +if __name__ == "__main__": + unittest.main() diff -Nru qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/README qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/README --- qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/README 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/README 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1 @@ +This branch contains the tests to run with mago diff -Nru qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/sanitychecks/gen-tests.py qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/sanitychecks/gen-tests.py --- qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/sanitychecks/gen-tests.py 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/sanitychecks/gen-tests.py 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,88 @@ +#!/usr/bin/python +# Copyright (C) 2010 Canonical Ltd +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +# This script contains the tests to run with mago + +""" Generate a basic test for each application listed in +/usr/share/applications/desktop.en_US.utf8.cache + +The basic test launches the application, wait for 3 seconds then closes it +""" +import ConfigParser +from re import sub, search +import os + +DESKTOPCACHE = "/usr/share/applications/desktop.en_US.utf8.cache" + +#: List of sections to skip. This must be a valid regular expression +# We must exclude window managers to not kill ourselves +BLACKLIST = ['metacity', 'compiz', 'unity' ] +BINARIES = [] + +config = ConfigParser.ConfigParser() +config.read( DESKTOPCACHE ) + +sections = config.sections() + +teststr = "" +for section in sorted(config.sections()): + for v in BLACKLIST: + if search(v, section): continue + + try: + binary = config.get( section, 'TryExec' ) + except ConfigParser.NoOptionError: + binary = config.get( section, 'Exec' ) + except: + continue + + try: + name = sub('\W', '', config.get( section, 'Name' ).capitalize()) + terminal = config.get( section, 'Terminal' ) + categories = config.get( section, 'Categories' ).split(';') + + # Skip Terminal applications + if terminal == 'true': continue + except ConfigParser.NoOptionError: + continue + + binary = binary.split(' ')[0] + + if binary in BINARIES: continue + BINARIES.append(binary) + + teststr += """ +class Test%s(TestCase): + launcher = '%s' + + def test_%s_basic(self): + ldtp.wait(3) + self.assertTrue(True) +""" % (name, binary, sub('\W', '', os.path.basename(binary))) + +# Generate the testcase script. You need to redirect to a file named +# test_sanitychecks.py to run it with mago +print """# This file was generated by %s +from mago import TestCase +import ldtp +import unittest + +%s + +if __name__ == "__main__": + unittest.main() +""" % (os.path.basename(__file__), teststr) diff -Nru qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/sanitychecks/test_sanitycheck.py qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/sanitychecks/test_sanitycheck.py --- qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/sanitychecks/test_sanitycheck.py 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/sanitychecks/test_sanitycheck.py 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,1167 @@ +# This file was generated by gen-tests.py +# This script contains the tests to run with mago + +from mago import TestCase +import ldtp +import unittest + + +class TestAccerciser(TestCase): + launcher = '/usr/bin/accerciser' + + def test_accerciser_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestMainmenu(TestCase): + launcher = 'alacarte' + + def test_alacarte_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestAlarmclock(TestCase): + launcher = 'alarmclock' + + def test_alarmclock_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestAnki(TestCase): + launcher = 'anki' + + def test_anki_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestReportaproblem(TestCase): + launcher = '/usr/share/apport/apport-gtk' + + def test_apportgtk_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestAssistivetechnologies(TestCase): + launcher = 'gnome-at-properties' + + def test_gnomeatproperties_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestBansheemediaplayer(TestCase): + launcher = 'banshee-1' + + def test_banshee1_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestDiskusageanalyzer(TestCase): + launcher = 'baobab' + + def test_baobab_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestBluetooth(TestCase): + launcher = 'bluetooth-properties' + + def test_bluetoothproperties_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestBrasero(TestCase): + launcher = 'brasero' + + def test_brasero_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestCddvdcreator(TestCase): + launcher = 'nautilus' + + def test_nautilus_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestBugreporttool(TestCase): + launcher = 'bug-buddy' + + def test_bugbuddy_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestCompizconfigsettingsmanager(TestCase): + launcher = 'ccsm' + + def test_ccsm_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestSystemtesting(TestCase): + launcher = '/usr/bin/checkbox-gtk' + + def test_checkboxgtk_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestCheese(TestCase): + launcher = 'cheese' + + def test_cheese_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestChromiumwebbrowser(TestCase): + launcher = '/usr/bin/chromium-browser' + + def test_chromiumbrowser_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestComputerjanitor(TestCase): + launcher = '/usr/share/computerjanitor/computer-janitor-gtk' + + def test_computerjanitorgtk_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestPreferredapplications(TestCase): + launcher = 'gnome-default-applications-properties' + + def test_gnomedefaultapplicationsproperties_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestDevhelp(TestCase): + launcher = 'devhelp' + + def test_devhelp_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestDfeet(TestCase): + launcher = 'd-feet' + + def test_dfeet_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestMonitors(TestCase): + launcher = 'gnome-display-properties' + + def test_gnomedisplayproperties_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestDebiandocumentationbrowser(TestCase): + launcher = 'dwww' + + def test_dwww_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestEmpathy(TestCase): + launcher = 'empathy' + + def test_empathy_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestMessagingandvoipaccounts(TestCase): + launcher = 'empathy-accounts' + + def test_empathyaccounts_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestImageviewer(TestCase): + launcher = 'eog' + + def test_eog_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestDocumentviewer(TestCase): + launcher = 'evince' + + def test_evince_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestEvolution(TestCase): + launcher = 'evolution' + + def test_evolution_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestEmailsettings(TestCase): + launcher = 'evolution-settings' + + def test_evolutionsettings_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestExaile(TestCase): + launcher = 'exaile' + + def test_exaile_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestArchivemanager(TestCase): + launcher = 'file-roller' + + def test_fileroller_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestFirefox40beta9webbrowser(TestCase): + launcher = 'firefox' + + def test_firefox_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestFprintdemo(TestCase): + launcher = 'fprint_demo' + + def test_fprint_demo_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestFreemind(TestCase): + launcher = '/usr/bin/freemind' + + def test_freemind_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestFrozenbubble(TestCase): + launcher = 'frozen-bubble' + + def test_frozenbubble_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestFslint(TestCase): + launcher = 'fslint-gui' + + def test_fslintgui_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestGbrainy(TestCase): + launcher = 'gbrainy' + + def test_gbrainy_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestCalculator(TestCase): + launcher = 'gcalctool' + + def test_gcalctool_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestConfigurationeditor(TestCase): + launcher = 'gconf-editor' + + def test_gconfeditor_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestGdebipackageinstaller(TestCase): + launcher = 'gdebi-gtk' + + def test_gdebigtk_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestLoginscreen(TestCase): + launcher = 'gdmsetup' + + def test_gdmsetup_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestGedit(TestCase): + launcher = 'gedit' + + def test_gedit_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestGeeqie(TestCase): + launcher = 'geeqie-standard' + + def test_geeqiestandard_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestGimpimageeditor(TestCase): + launcher = 'gimp-2.6' + + def test_gimp26_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestRootterminal(TestCase): + launcher = 'gksu' + + def test_gksu_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestGlade(TestCase): + launcher = 'glade-3' + + def test_glade3_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestChess(TestCase): + launcher = '/usr/games/glchess' + + def test_glchess_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestFiveormore(TestCase): + launcher = '/usr/games/glines' + + def test_glines_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestFourinarow(TestCase): + launcher = '/usr/games/gnect' + + def test_gnect_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestNibbles(TestCase): + launcher = '/usr/games/gnibbles' + + def test_gnibbles_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestRobots(TestCase): + launcher = '/usr/games/gnobots2' + + def test_gnobots2_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestAboutgnome(TestCase): + launcher = 'gnome-about' + + def test_gnomeabout_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestAboutme(TestCase): + launcher = 'gnome-about-me' + + def test_gnomeaboutme_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestAppearance(TestCase): + launcher = 'gnome-appearance-properties' + + def test_gnomeappearanceproperties_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestDictionary(TestCase): + launcher = 'gnome-dictionary' + + def test_gnomedictionary_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestNetworktools(TestCase): + launcher = 'gnome-nettool' + + def test_gnomenettool_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestNetworkproxy(TestCase): + launcher = 'gnome-network-properties' + + def test_gnomenetworkproperties_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestPanel(TestCase): + launcher = 'gnome-panel' + + def test_gnomepanel_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestPowermanagement(TestCase): + launcher = 'gnome-power-preferences' + + def test_gnomepowerpreferences_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestScreensaver(TestCase): + launcher = 'gnome-screensaver-preferences' + + def test_gnomescreensaverpreferences_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestTakescreenshot(TestCase): + launcher = 'gnome-screenshot' + + def test_gnomescreenshot_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestSearchforfiles(TestCase): + launcher = 'gnome-search-tool' + + def test_gnomesearchtool_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestMouse(TestCase): + launcher = 'gnome-mouse-properties' + + def test_gnomemouseproperties_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestSoundrecorder(TestCase): + launcher = 'gnome-sound-recorder' + + def test_gnomesoundrecorder_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestSudoku(TestCase): + launcher = '/usr/games/gnome-sudoku' + + def test_gnomesudoku_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestLogfileviewer(TestCase): + launcher = 'gnome-system-log' + + def test_gnomesystemlog_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestSystemmonitor(TestCase): + launcher = 'gnome-system-monitor' + + def test_gnomesystemmonitor_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestSound(TestCase): + launcher = 'gnome-volume-control' + + def test_gnomevolumecontrol_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestControlcenter(TestCase): + launcher = 'gnome-control-center' + + def test_gnomecontrolcenter_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestMines(TestCase): + launcher = '/usr/games/gnomine' + + def test_gnomine_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestTetravex(TestCase): + launcher = '/usr/games/gnotravex' + + def test_gnotravex_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestKlotski(TestCase): + launcher = '/usr/games/gnotski' + + def test_gnotski_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestGobbycollaborativeeditor04(TestCase): + launcher = 'gobby' + + def test_gobby_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestGobbycollaborativeeditor05(TestCase): + launcher = 'gobby-0.5' + + def test_gobby05_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestGoogleearth(TestCase): + launcher = 'googleearth' + + def test_googleearth_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestGnuprivacyassistant(TestCase): + launcher = 'gpa' + + def test_gpa_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestPalmosdevices(TestCase): + launcher = 'gpilotd-control-applet' + + def test_gpilotdcontrolapplet_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestGrisbi(TestCase): + launcher = 'grisbi' + + def test_grisbi_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestMultimediasystemsselector(TestCase): + launcher = 'gstreamer-properties' + + def test_gstreamerproperties_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestTali(TestCase): + launcher = '/usr/games/gtali' + + def test_gtali_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestGthumb(TestCase): + launcher = 'gthumb' + + def test_gthumb_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestGtimelogtimetracker(TestCase): + launcher = 'gtimelog' + + def test_gtimelog_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestRedshift(TestCase): + launcher = 'gtk-redshift' + + def test_gtkredshift_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestGtkperf(TestCase): + launcher = 'gtkperf' + + def test_gtkperf_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestCharactermap(TestCase): + launcher = 'gucharmap' + + def test_gucharmap_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestGvimtexteditor(TestCase): + launcher = 'gvim' + + def test_gvim_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestFaxaddressbook(TestCase): + launcher = '/bin/sh' + + def test_sh_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestHplipfaxutility(TestCase): + launcher = 'sh' + + def test_sh_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestHpliptoolbox(TestCase): + launcher = '/usr/bin/hp-toolbox' + + def test_hptoolbox_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestReactivatehplaserjet10181020afterreloadingpaper(TestCase): + launcher = 'wish' + + def test_wish_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestIagno(TestCase): + launcher = '/usr/games/iagno' + + def test_iagno_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestKeyboardinputmethods(TestCase): + launcher = 'ibus-setup' + + def test_ibussetup_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestInputmethodswitcher(TestCase): + launcher = 'im-switch' + + def test_imswitch_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestInkscape(TestCase): + launcher = 'inkscape' + + def test_inkscape_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestAdditionaldrivers(TestCase): + launcher = '/usr/bin/jockey-gtk' + + def test_jockeygtk_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestKnetattach(TestCase): + launcher = 'knetattach' + + def test_knetattach_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestKeyboardshortcuts(TestCase): + launcher = 'gnome-keybinding-properties' + + def test_gnomekeybindingproperties_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestKeyboard(TestCase): + launcher = 'gnome-keyboard-properties' + + def test_gnomekeyboardproperties_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestLanguagesupport(TestCase): + launcher = '/usr/bin/gnome-language-selector' + + def test_gnomelanguageselector_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestLibreofficebase(TestCase): + launcher = 'libreoffice' + + def test_libreoffice_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestLifereafeedreader(TestCase): + launcher = 'liferea' + + def test_liferea_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestLightsoff(TestCase): + launcher = '/usr/games/lightsoff' + + def test_lightsoff_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestHardwarelister(TestCase): + launcher = 'lshw-gtk' + + def test_lshwgtk_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestMahjongg(TestCase): + launcher = '/usr/games/mahjongg' + + def test_mahjongg_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestManageprintjobs(TestCase): + launcher = 'system-config-printer-applet' + + def test_systemconfigprinterapplet_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestMumble(TestCase): + launcher = 'mumble' + + def test_mumble_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestFilemanagement(TestCase): + launcher = 'nautilus-file-management-properties' + + def test_nautilusfilemanagementproperties_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestNetworkconnections(TestCase): + launcher = 'nm-connection-editor' + + def test_nmconnectioneditor_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestPopupnotifications(TestCase): + launcher = 'notification-properties' + + def test_notificationproperties_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestOnboard(TestCase): + launcher = 'onboard' + + def test_onboard_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestOnboardsettings(TestCase): + launcher = 'onboard-settings' + + def test_onboardsettings_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestOpenjdkjava6policytool(TestCase): + launcher = '/usr/lib/jvm/java-6-openjdk/bin/policytool' + + def test_policytool_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestDiskutility(TestCase): + launcher = 'palimpsest' + + def test_palimpsest_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestPgadminiii(TestCase): + launcher = 'pgadmin3' + + def test_pgadmin3_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestPitivivideoeditor(TestCase): + launcher = 'pitivi' + + def test_pitivi_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestPoedit(TestCase): + launcher = 'poeditor' + + def test_poeditor_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestQuadrapassel(TestCase): + launcher = '/usr/games/quadrapassel' + + def test_quadrapassel_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestRhythmbox(TestCase): + launcher = 'rhythmbox' + + def test_rhythmbox_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestRhythmbox(TestCase): + launcher = 'rhythmbox-client' + + def test_rhythmboxclient_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestAntspotlight(TestCase): + launcher = '/usr/lib/xscreensaver/antspotlight' + + def test_antspotlight_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestCosmos(TestCase): + launcher = '/usr/lib/gnome-screensaver/gnome-screensaver/slideshow' + + def test_slideshow_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestFiberlamp(TestCase): + launcher = '/usr/lib/xscreensaver/fiberlamp' + + def test_fiberlamp_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestFloatingfeet(TestCase): + launcher = '/usr/lib/gnome-screensaver/gnome-screensaver/floaters' + + def test_floaters_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestFuzzyflakes(TestCase): + launcher = '/usr/lib/xscreensaver/fuzzyflakes' + + def test_fuzzyflakes_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestGlblur(TestCase): + launcher = '/usr/lib/xscreensaver/glblur' + + def test_glblur_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestGlcells(TestCase): + launcher = '/usr/lib/xscreensaver/glcells' + + def test_glcells_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestGlmatrix(TestCase): + launcher = '/usr/lib/xscreensaver/glmatrix' + + def test_glmatrix_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestGlschool(TestCase): + launcher = '/usr/lib/xscreensaver/glschool' + + def test_glschool_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestGlslideshow(TestCase): + launcher = '/usr/lib/xscreensaver/glslideshow' + + def test_glslideshow_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestGltext(TestCase): + launcher = '/usr/lib/xscreensaver/gltext' + + def test_gltext_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestHypertorus(TestCase): + launcher = '/usr/lib/xscreensaver/hypertorus' + + def test_hypertorus_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestFloatingubuntu(TestCase): + launcher = 'floaters' + + def test_floaters_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestPasswordsandencryptionkeys(TestCase): + launcher = 'seahorse' + + def test_seahorse_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestEncryptionandkeyrings(TestCase): + launcher = 'seahorse-preferences' + + def test_seahorsepreferences_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestStartupapplications(TestCase): + launcher = 'gnome-session-properties' + + def test_gnomesessionproperties_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestSharedfolders(TestCase): + launcher = 'shares-admin' + + def test_sharesadmin_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestShotwellphotomanager(TestCase): + launcher = 'shotwell' + + def test_shotwell_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestShutter(TestCase): + launcher = 'shutter' + + def test_shutter_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestSimplescan(TestCase): + launcher = 'simple-scan' + + def test_simplescan_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestAisleriotsolitaire(TestCase): + launcher = '/usr/games/sol' + + def test_sol_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestAudiocdextractor(TestCase): + launcher = 'sound-juicer' + + def test_soundjuicer_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestSqlitedatabasebrowser(TestCase): + launcher = 'sqlitebrowser' + + def test_sqlitebrowser_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestStardict(TestCase): + launcher = 'stardict' + + def test_stardict_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestSwellfoop(TestCase): + launcher = '/usr/games/swell-foop' + + def test_swellfoop_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestSynapticpackagemanager(TestCase): + launcher = 'synaptic' + + def test_synaptic_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestPrinting(TestCase): + launcher = 'system-config-printer' + + def test_systemconfigprinter_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestThunderbirdmailnews(TestCase): + launcher = 'thunderbird' + + def test_thunderbird_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestTimeanddate(TestCase): + launcher = 'time-admin' + + def test_timeadmin_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestTomboynotes(TestCase): + launcher = 'tomboy' + + def test_tomboy_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestMovieplayer(TestCase): + launcher = 'totem' + + def test_totem_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestTransmission(TestCase): + launcher = 'transmission-gtk' + + def test_transmissiongtk_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestTerminalserverclient(TestCase): + launcher = 'tsclient' + + def test_tsclient_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestAboutubuntu(TestCase): + launcher = 'yelp' + + def test_yelp_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestUbuntusoftwarecenter(TestCase): + launcher = '/usr/bin/software-center' + + def test_softwarecenter_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestUpdatemanager(TestCase): + launcher = '/usr/bin/update-manager' + + def test_updatemanager_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestStartupdiskcreator(TestCase): + launcher = 'usb-creator-gtk' + + def test_usbcreatorgtk_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestUsersandgroups(TestCase): + launcher = 'users-admin' + + def test_usersadmin_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestRemotedesktopviewer(TestCase): + launcher = 'vinagre' + + def test_vinagre_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestRemotedesktop(TestCase): + launcher = 'vino-preferences' + + def test_vinopreferences_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestVlcmediaplayer(TestCase): + launcher = 'vlc' + + def test_vlc_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestWindows(TestCase): + launcher = 'gnome-window-properties' + + def test_gnomewindowproperties_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestWireshark(TestCase): + launcher = 'wireshark' + + def test_wireshark_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestXchatirc(TestCase): + launcher = 'xchat' + + def test_xchat_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestXchatgnome(TestCase): + launcher = 'xchat-gnome' + + def test_xchatgnome_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestXpdf(TestCase): + launcher = 'xpdf' + + def test_xpdf_basic(self): + ldtp.wait(3) + self.assertTrue(True) + +class TestXsaneimagescanningprogram(TestCase): + launcher = 'xsane' + + def test_xsane_basic(self): + ldtp.wait(3) + self.assertTrue(True) + + +if __name__ == "__main__": + unittest.main() + diff -Nru qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/fspot/Accounts.xml qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/fspot/Accounts.xml --- qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/fspot/Accounts.xml 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/fspot/Accounts.xml 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,2 @@ + + \ No newline at end of file Binary files /tmp/cFjkONjEmM/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/fspot/addin-db-001/addin-data/1/FSpot.BlackoutEditor,0.8.maddin and /tmp/D4HGyIf3Td/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/fspot/addin-db-001/addin-data/1/FSpot.BlackoutEditor,0.8.maddin differ Binary files /tmp/cFjkONjEmM/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/fspot/addin-db-001/addin-data/1/FSpot.BWEditor,0.8.maddin and /tmp/D4HGyIf3Td/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/fspot/addin-db-001/addin-data/1/FSpot.BWEditor,0.8.maddin differ Binary files /tmp/cFjkONjEmM/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/fspot/addin-db-001/addin-data/1/FSpot.ChangePath,0.8.maddin and /tmp/D4HGyIf3Td/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/fspot/addin-db-001/addin-data/1/FSpot.ChangePath,0.8.maddin differ Binary files /tmp/cFjkONjEmM/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/fspot/addin-db-001/addin-data/1/FSpot.Core,0.8.maddin and /tmp/D4HGyIf3Td/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/fspot/addin-db-001/addin-data/1/FSpot.Core,0.8.maddin differ Binary files /tmp/cFjkONjEmM/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/fspot/addin-db-001/addin-data/1/FSpot.CoverTransition,0.8.maddin and /tmp/D4HGyIf3Td/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/fspot/addin-db-001/addin-data/1/FSpot.CoverTransition,0.8.maddin differ Binary files /tmp/cFjkONjEmM/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/fspot/addin-db-001/addin-data/1/FSpot.DevelopInUFraw,0.8.maddin and /tmp/D4HGyIf3Td/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/fspot/addin-db-001/addin-data/1/FSpot.DevelopInUFraw,0.8.maddin differ Binary files /tmp/cFjkONjEmM/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/fspot/addin-db-001/addin-data/1/FSpot.FacebookExport,0.8.maddin and /tmp/D4HGyIf3Td/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/fspot/addin-db-001/addin-data/1/FSpot.FacebookExport,0.8.maddin differ Binary files /tmp/cFjkONjEmM/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/fspot/addin-db-001/addin-data/1/FSpot.FlipEditor,0.8.maddin and /tmp/D4HGyIf3Td/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/fspot/addin-db-001/addin-data/1/FSpot.FlipEditor,0.8.maddin differ Binary files /tmp/cFjkONjEmM/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/fspot/addin-db-001/addin-data/1/FSpot.__FSpot.Exporters.CD,0.8.maddin and /tmp/D4HGyIf3Td/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/fspot/addin-db-001/addin-data/1/FSpot.__FSpot.Exporters.CD,0.8.maddin differ Binary files /tmp/cFjkONjEmM/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/fspot/addin-db-001/addin-data/1/FSpot.__FSpot.Exporters.Flickr,0.8.maddin and /tmp/D4HGyIf3Td/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/fspot/addin-db-001/addin-data/1/FSpot.__FSpot.Exporters.Flickr,0.8.maddin differ Binary files /tmp/cFjkONjEmM/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/fspot/addin-db-001/addin-data/1/FSpot.__FSpot.Exporters.Folder,0.8.maddin and /tmp/D4HGyIf3Td/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/fspot/addin-db-001/addin-data/1/FSpot.__FSpot.Exporters.Folder,0.8.maddin differ Binary files /tmp/cFjkONjEmM/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/fspot/addin-db-001/addin-data/1/FSpot.__FSpot.Exporters.Gallery,0.8.maddin and /tmp/D4HGyIf3Td/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/fspot/addin-db-001/addin-data/1/FSpot.__FSpot.Exporters.Gallery,0.8.maddin differ Binary files /tmp/cFjkONjEmM/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/fspot/addin-db-001/addin-data/1/FSpot.__FSpot.Exporters.PicasaWeb,0.8.maddin and /tmp/D4HGyIf3Td/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/fspot/addin-db-001/addin-data/1/FSpot.__FSpot.Exporters.PicasaWeb,0.8.maddin differ Binary files /tmp/cFjkONjEmM/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/fspot/addin-db-001/addin-data/1/FSpot.__FSpot.Exporters.SmugMug,0.8.maddin and /tmp/D4HGyIf3Td/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/fspot/addin-db-001/addin-data/1/FSpot.__FSpot.Exporters.SmugMug,0.8.maddin differ Binary files /tmp/cFjkONjEmM/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/fspot/addin-db-001/addin-data/1/FSpot.__FSpot.Exporters.Tabblo,0.8.maddin and /tmp/D4HGyIf3Td/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/fspot/addin-db-001/addin-data/1/FSpot.__FSpot.Exporters.Tabblo,0.8.maddin differ Binary files /tmp/cFjkONjEmM/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/fspot/addin-db-001/addin-data/1/FSpot.LiveWebGallery,0.8.maddin and /tmp/D4HGyIf3Td/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/fspot/addin-db-001/addin-data/1/FSpot.LiveWebGallery,0.8.maddin differ Binary files /tmp/cFjkONjEmM/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/fspot/addin-db-001/addin-data/1/FSpot.MergeDb,0.8.maddin and /tmp/D4HGyIf3Td/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/fspot/addin-db-001/addin-data/1/FSpot.MergeDb,0.8.maddin differ Binary files /tmp/cFjkONjEmM/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/fspot/addin-db-001/addin-data/1/FSpot.PixelateEditor,0.8.maddin and /tmp/D4HGyIf3Td/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/fspot/addin-db-001/addin-data/1/FSpot.PixelateEditor,0.8.maddin differ Binary files /tmp/cFjkONjEmM/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/fspot/addin-db-001/addin-data/1/FSpot.RawPlusJpeg,0.8.maddin and /tmp/D4HGyIf3Td/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/fspot/addin-db-001/addin-data/1/FSpot.RawPlusJpeg,0.8.maddin differ Binary files /tmp/cFjkONjEmM/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/fspot/addin-db-001/addin-data/1/FSpot.ResizeEditor,0.8.maddin and /tmp/D4HGyIf3Td/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/fspot/addin-db-001/addin-data/1/FSpot.ResizeEditor,0.8.maddin differ Binary files /tmp/cFjkONjEmM/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/fspot/addin-db-001/addin-data/1/FSpot.RetroactiveRoll,0.8.maddin and /tmp/D4HGyIf3Td/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/fspot/addin-db-001/addin-data/1/FSpot.RetroactiveRoll,0.8.maddin differ Binary files /tmp/cFjkONjEmM/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/fspot/addin-db-001/addin-data/1/FSpot.ScreensaverConfig,0.8.maddin and /tmp/D4HGyIf3Td/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/fspot/addin-db-001/addin-data/1/FSpot.ScreensaverConfig,0.8.maddin differ Binary files /tmp/cFjkONjEmM/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/fspot/addin-db-001/addin-data/1/FSpot.ZipExport,0.8.maddin and /tmp/D4HGyIf3Td/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/fspot/addin-db-001/addin-data/1/FSpot.ZipExport,0.8.maddin differ Binary files /tmp/cFjkONjEmM/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/fspot/addin-db-001/addin-dir-data/usr_lib_f-spot_abddc21d.data and /tmp/D4HGyIf3Td/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/fspot/addin-db-001/addin-dir-data/usr_lib_f-spot_abddc21d.data differ Binary files /tmp/cFjkONjEmM/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/fspot/addin-db-001/addin-dir-data/usr_lib_f-spot_Extensions_1769d366.data and /tmp/D4HGyIf3Td/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/fspot/addin-db-001/addin-dir-data/usr_lib_f-spot_Extensions_1769d366.data differ Binary files /tmp/cFjkONjEmM/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/fspot/addin-db-001/host-index and /tmp/D4HGyIf3Td/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/fspot/addin-db-001/host-index differ diff -Nru qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/fspot/addin-db-001/hosts/f-spot.addins qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/fspot/addin-db-001/hosts/f-spot.addins --- qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/fspot/addin-db-001/hosts/f-spot.addins 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/fspot/addin-db-001/hosts/f-spot.addins 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,3 @@ + + /usr/lib/f-spot + \ No newline at end of file Binary files /tmp/cFjkONjEmM/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/fspot/photos.db and /tmp/D4HGyIf3Td/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/fspot/photos.db differ Binary files /tmp/cFjkONjEmM/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/images/ubuntu01.jpg and /tmp/D4HGyIf3Td/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/images/ubuntu01.jpg differ Binary files /tmp/cFjkONjEmM/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/images/ubuntu02.jpg and /tmp/D4HGyIf3Td/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/images/ubuntu02.jpg differ diff -Nru qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/shotwell_appmap.py qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/shotwell_appmap.py --- qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/shotwell_appmap.py 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/shotwell_appmap.py 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,183 @@ +# Copyright (C) 2005-2011 Canonical Ltd +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +# This script contains the tests to run with mago + +from mago.struct import Struct + +menu = Struct() +button = Struct() +dialog = Struct() +meridiem = Struct() +text = Struct() +label = Struct() +table = Struct() +radioButton = Struct() +comboSelect = Struct() +checkbox = Struct() + +label.photosSuccessfullyImported = "lbl%dphotossuccessfullyimported" # string format +label.photosDisplayed = "lbl%dPhoto*" +label.originalDateTime = 'lblOriginal*' + +#meridiem widgets +meridiem.am = 'AM' +meridiem.pm = 'PM' +menu.meridiem = "mnu%s" +comboSelect.meridiem = "cbo%s" + +button.copyPhotos = 'btnCopyPhotos' +button.importInPlace = 'btnImportinPlace' +button.keep = 'btnKeep' +button.ok = 'btnOK' +button.open = 'btnOpen' +button.trashFiles = 'btnTrashFiles' +button.typeAFilename = 'tbtnTypeafilename' +button.fSpotDbFile = 'btn(None)' +button.cancel = 'btnCancel' + +checkbox.modifyOriginalFiles = 'chkModifyoriginalfile*' + +dialog.adjustDateTime = 'dlgAdjustDateandTime' +dialog.warning = 'dlgWarning' +dialog.question = 'dlgQuestion' +dialog.importFromFolder = 'dlgImportFromFolder' +dialog.importFromFSpot = 'dlgImportFromF-Spot' +dialog.information = 'dlgInformation' +dialog.addTags = 'dlgAddTags' +dialog.exportPhotos = 'dlgExportPhoto*' +dialog.selectAFile = 'dlgSelectAFile' +dialog.welcome = 'dlgWelcome!' + +menu.about = 'mnuAbount' +menu.addTags = 'mnuAddTags' +menu.adjustDateTime = 'mnuAdjustDateandTime' +menu.allPhotos = 'mnuAllPhotos' +menu.emptyTrash = 'mnuEmptyTrash' +menu.export = 'mnuExport' +menu.importFromFolder = 'mnuImportFromFolder' +menu.importFromFSpot = 'mnuImportFromF-Spot' +menu.moveToTrash = 'mnuMovetoTrash' +menu.selectAll = 'mnuSelectAll' +menu.setRating1 = u'mnu\u2605' +menu.filterPhotos1OrBetter = u'mnu\u2605orBetter' +menu.filterPhotos2OrBetter = u'mnu\u2605\u2605orBetter' +menu.png = 'mnuPNG' + +table.navigationPanel = 'ttbl0' + +text.location = 'txtLocation' +text.tags = 'txt0' + +radioButton.importFSpotDbFile = 'rbtnImportfromanotherF-Spotdatabasefile' + +#btn3 = "btn3" +#btnEnhance = "btnEnhance" +#btnPublish = "btnPublish" +#btnRotate = "btnRotate" +#ico0 = "ico0" +#ico1 = "ico1" + +#menus = { + #mnuAll_Rejected : "mnuAll+Rejected", + #mnuAscending : "mnuAscending", + #mnuAscending1 : "mnuAscending1", + #mnuBasicInformation : "mnuBasicInformation", + #mnuByExposureDate : "mnuByExposureDate", + #mnuByRating : "mnuByRating", + #mnuByTitle : "mnuByTitle", + #mnuContents : "mnuContents", + #mnuDecrease : "mnuDecrease", + #mnuDescending : "mnuDescending", + #mnuDescending1 : "mnuDescending1", + #mnuDuplicate : "mnuDuplicate", + #mnuEdit : "mnuEdit", + #mnuEditTitle : "mnuEditTitle", + #mnuEmpty : "mnuEmpty", + #mnuEmpty1 : "mnuEmpty1", + #mnuEmpty10 : "mnuEmpty10", + #mnuEmpty2 : "mnuEmpty2", + #mnuEmpty3 : "mnuEmpty3", + #mnuEmpty4 : "mnuEmpty4", + #mnuEmpty5 : "mnuEmpty5", + #mnuEmpty6 : "mnuEmpty6", + #mnuEmpty7 : "mnuEmpty7", + #mnuEmpty8 : "mnuEmpty8", + #mnuEmpty9 : "mnuEmpty9", + #mnuEnhance : "mnuEnhance", + #mnuEvents : "mnuEvents", + #mnuExtendedInformation : "mnuExtendedInformation", + #mnuFile : "mnuFile", + #mnuFilterPhotos : "mnuFilterPhotos", + #mnuFlag : "mnuFlag", + #mnuFlipHorizontally : "mnuFlipHorizontally", + #mnuFlipVertically : "mnuFlipVertically", + #mnuFullscreen : "mnuFullscreen", + #mnuGetHelpOnline : "mnuGetHelpOnline", + #mnuHelp : "mnuHelp", + #mnuIncrease : "mnuIncrease", + #mnuModifyTags : "mnuModifyTags", + #mnuNewEvent : "mnuNewEvent", + #mnuOpenWithExternalEditor : "mnuOpenWithExternalEditor", + #mnuOpenWithRAWEditor : "mnuOpenWithRAWEditor", + #mnuPhotos : "mnuPhotos", + #mnuPlayVideo : "mnuPlayVideo", + #mnuPreferences : "mnuPreferences", + #mnuPrint : "mnuPrint", + #mnuPublish : "mnuPublish", + #mnuQuit : "mnuQuit", + #mnuRatings : "mnuRatings", + #mnuRedo : "mnuRedo", + #mnuRejected : "mnuRejected", + #mnuRejectedOnly : "mnuRejectedOnly", + #mnuRemoveFromLibrary : "mnuRemoveFromLibrary", + #mnuReportaProblem : "mnuReportaProblem", + #mnuReverttoOriginal : "mnuReverttoOriginal", + #mnuRotateLeft : "mnuRotateLeft", + #mnuRotateRight : "mnuRotateRight", + #mnuSendTo : "mnuSendTo", + #mnuSetRating : "mnuSetRating", + #mnuSetasDesktopBackground : "mnuSetasDesktopBackground", + #mnuShowinFileManager : "mnuShowinFileManager", + #mnuSlideshow : "mnuSlideshow", + #mnuSortEvents : "mnuSortEvents", + #mnuSortPhotos : "mnuSortPhotos", + #mnuTags : "mnuTags", + #mnuTags1 : "mnuTags1", + #mnuTitles : "mnuTitles", + #mnuTranslateThisApplication : "mnuTranslateThisApplication", + #mnuUndo : "mnuUndo", + #mnuUnrated : "mnuUnrated", + #mnuView : "mnuView", + #mnuViewEventforPhoto : "mnuViewEventforPhoto", + #mnuZoomIn : "mnuZoomIn", + #mnuZoomOut : "mnuZoomOut", + #mnu___ : "mnu*", + #mnu___orBetter : "mnu*orBetter", + #mnu______ : "mnu**", + #mnu______orBetter : "mnu**orBetter", + #mnu_________ : "mnu***", + #mnu_________orBetter : "mnu***orBetter", + #mnu____________ : "mnu****", + #mnu____________orBetter : "mnu****orBetter", + #mnu_______________ : "mnu*****", + #mnu_______________1 : "mnu*****1" +#} + +#ptab0 = "ptab0" +#ptl0 = "ptl0" +#ttbl0 = "ttbl0" + Binary files /tmp/cFjkONjEmM/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/shotwell.tar.gz and /tmp/D4HGyIf3Td/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/shotwell.tar.gz differ diff -Nru qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/test_shotwell.ini qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/test_shotwell.ini --- qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/test_shotwell.ini 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/test_shotwell.ini 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,4 @@ +[data] +; This file contains the tests to run with mago +tmppath=/tmp/shotwelltest + diff -Nru qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/test_shotwell.py qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/test_shotwell.py --- qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/test_shotwell.py 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/shotwell/test_shotwell.py 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,245 @@ +# Copyright (C) 2005-2011 Canonical Ltd +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +# This script contains the tests to run with mago + +"""Shotwell Tests + - Import copy + - Import link + - Import F-Spot + - Add/Remove tags + - Filter by ratinmportg + - Export + - Adjust time/date metadata + +This test will delete all photos stored by Shotwell +This test requires that test_shotwell.ini is configured to pass tests +All source data files get copied to a temp dir to avoid source data corruption +""" + +from mago import TestCase +import unittest +import ldtp +import ooldtp +import os +import shutil +from shotwell_appmap import * + +class TestShotwell(TestCase): + """Test shotwell app""" + launcher = 'shotwell' + launcher_args = [] + window_name = 'frmShotwell' + shotwell = None + tmpdir = None + + def setUp(self): + """Returns shotwell to a known state""" + super(TestShotwell, self).setUp() + # Need to check for welcome dialog and disable it + if ldtp.guiexist(dialog.welcome): + ldtp.click(dialog.welcome, button.ok) + ldtp.wait(2) + # If Fspot is installed the import dialog displays - close it + if ldtp.guiexist(dialog.importFromFSpot): + ldtp.click(dialog.importFromFSpot, button.cancel) + self.tmpdir = self.testConfig.get('data', 'tmppath') + self.shotwell = self.application.context + self.shotwell.click(menu.allPhotos) #reset filter + if self.shotwell.stateenabled(menu.selectAll): + self.shotwell.click(menu.selectAll) + self.shotwell.click(menu.moveToTrash) + ldtp.wait(1) + self.shotwell.click(menu.emptyTrash) + ldtp.waittillguiexist(dialog.warning) + ldtp.click(dialog.warning, button.trashFiles) + ldtp.wait(1) + if ldtp.guiexist(dialog.question): + ldtp.click(dialog.question, button.keep) + + def __import_from_folder(self, copy=True): + """Import image using the import from folder by copying or linking the images + + :param copy: defaults to True, set to False to link images + """ + try: + shutil.rmtree(self.tmpdir) + except OSError: + pass #continue + # copy images foldwe to tmpdir + shutil.copytree(os.path.join(os.path.dirname(__file__), 'images'), os.path.join(self.tmpdir, 'images')) + + # select import from folder menu item + self.shotwell.click(menu.importFromFolder) + + # input images folder path + ldtp.waittillguiexist(dialog.importFromFolder) + importDialog = ooldtp.context(dialog.importFromFolder) + importDialog.check(button.typeAFilename) + imagesdir = os.path.join(self.tmpdir, 'images') + importDialog.settextvalue(text.location, imagesdir) + importDialog.click(button.ok) + + # click copy option + ldtp.waittillguiexist(dialog.question) + importLibraryDialog = ooldtp.context(dialog.question) + if copy: + importLibraryDialog.click(button.copyPhotos) + else: + importLibraryDialog.click(button.importInPlace) + + # assert n photos imported message label + ldtp.waittillguiexist(dialog.information) + infoDialog = ooldtp.context(dialog.information) + infoDialog.waittillguiexist(label.photosSuccessfullyImported % 2) #parameterize count + infoDialog.click(button.ok) + + # assert files displayed + self.shotwell.click(menu.selectAll) + self.shotwell.waittillguiexist(label.photosDisplayed % 2) + + def test_import_from_folder_copy(self): + """Imports images via copying from folder""" + self.__import_from_folder() + + def test_import_from_folder_link(self): + """Imports images via linking from folder""" + self.__import_from_folder(copy=False) + + def test_add_and_remove_tags(self): + """Adds and removes tags from images""" + self.__import_from_folder() + self.shotwell.click(menu.selectAll) + self.shotwell.click(menu.addTags) + ldtp.waittillguiexist(dialog.addTags) + ldtp.settextvalue(dialog.addTags, text.tags, 'test,123') + ldtp.click(dialog.addTags, button.ok) + self.assertTrue(self.shotwell.doesrowexist(table.navigationPanel, 'test')) + self.assertTrue(self.shotwell.doesrowexist(table.navigationPanel, '123')) + + def test_filter_by_rating(self): + """Applies an image rating and filters the displayed images""" + self.__import_from_folder() + # select all and apply rating + self.shotwell.click(menu.setRating1) + # filter by different rating + self.shotwell.click(menu.filterPhotos2OrBetter) + # assert no photos + self.assertFalse(self.shotwell.stateenabled(menu.selectAll)) + # filter by applited rating + self.shotwell.click(menu.filterPhotos1OrBetter) + # assert photos display + self.shotwell.click(menu.selectAll) + self.assertTrue(self.shotwell.guiexist(label.photosDisplayed % 2)) + + def test_export(self): + """Exports imagess as PNGs to another directory""" + self.__import_from_folder() + # select photos + self.shotwell.click(menu.selectAll) + # export default settings + self.shotwell.click(menu.export) + # use /tmp/shotwelltest + ldtp.waittillguiexist(dialog.exportPhotos) + exportDialog = ooldtp.context(dialog.exportPhotos) + exportDialog.click(menu.png) + exportDialog.click(button.ok) + ldtp.waittillguiexist(dialog.exportPhotos) + exportDialog.remap() + exportDialog.check(button.typeAFilename) + exportDialog.remap() + exportDialog.settextvalue(text.location, self.tmpdir) + exportDialog.click(button.ok) + # assert files exist in fs + for i in range(1, 30): + # get ldtp default timeout -- int(os.getenv('GUI_TIMEOUT')): + if os.path.exists(os.path.join(self.tmpdir, 'ubuntu01.png')): + self.assertTrue(len(os.listdir(self.tmpdir)) == 3) # images and images/ + break + else: + if i >= 30: + self.fail("%s dir does not exist, export failed" % self.tmpdir) + ldtp.wait(1) + + @unittest.skip('Issue with importing fspot files more than once') + def test_import_from_fspot(self): + """Imports images from an F-Spot .db file""" + # import from f-spot menu + self.shotwell.click(menu.importFromFSpot) + # import from another db file + ldtp.waittillguiexist(dialog.importFromFSpot) + importFSpotDialog = ooldtp.context(dialog.importFromFSpot) + # the radio buttons display if f-spot is installed, other wise just the button is displayed + if ldtp.guiexist(radioButton.importFSpotDbFile): + importFSpotDialog.click(radioButton.importFSpotDbFile) + importFSpotDialog.click(button.fSpotDbFile) + # click select a file + ldtp.waittillguiexist(dialog.selectAFile) + selectFileDialog = ooldtp.context(dialog.selectAFile) + selectFileDialog.check(button.typeAFilename) + selectFileDialog.remap() + # clear fspot files + try: + shutil.rmtree(self.tmpdir) + except OSError: + pass # continue if path does not exist + # copy the entire fspot dir to tmp + fSpotSrcDir = os.path.join(os.path.dirname(__file__), 'fspot') + shutil.copytree(fSpotSrcDir, os.path.join(self.tmpdir, 'fspot')) + selectFileDialog.settextvalue(text.location, os.path.join(self.tmpdir, 'fspot', 'photos.db')) + ldtp.wait(2) + selectFileDialog.click(button.open) + ldtp.wait(5) + importFSpotDialog.click(button.ok) + # import complete window - ok + ldtp.waittillguiexist(dialog.information) + importCompleteDialog = ooldtp.context(dialog.information) + importCompleteDialog.waittillguiexist(label.photosSuccessfullyImported % 2) #parameterize count + importCompleteDialog.click(button.ok) + # assert files displayed + self.shotwell.click(menu.selectAll) + self.assertTrue(self.shotwell.guiexist(label.photosDisplayed % 2)) + + def test_metadata(self): + """Changes the date metadata""" + self.__import_from_folder() + # select all photos + self.shotwell.click(menu.selectAll) + # adjust date and time + self.shotwell.click(menu.adjustDateTime) + # store hour value + ldtp.waittillguiexist(dialog.adjustDateTime) + dateTimeDialog = ooldtp.context(dialog.adjustDateTime) + self.assertFalse(dateTimeDialog.guiexist(label.originalDateTime)) + if dateTimeDialog.guiexist(comboSelect.meridiem % meridiem.am): + dateTimeDialog.comboselect(comboSelect.meridiem % meridiem.am, menu.meridiem % meridiem.pm) + currentMeridiem = meridiem.pm + else: + dateTimeDialog.comboselect(comboSelect.meridiem % meridiem.pm, menu.meridiem % meridiem.am) + currentMeridiem = meridiem.am + dateTimeDialog.check(checkbox.modifyOriginalFiles) + dateTimeDialog.click(button.ok) + + # assert that hour values are different + self.shotwell.click(menu.selectAll) + self.shotwell.click(menu.adjustDateTime) + ldtp.waittillguiexist(dialog.adjustDateTime) + dateTimeDialog.remap() + self.assertTrue(dateTimeDialog.guiexist('lbl*' + currentMeridiem)) + +if __name__ == "__main__": + unittest.main() + Binary files /tmp/cFjkONjEmM/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/software-center/data/hello_2.5-1_amd64.deb and /tmp/D4HGyIf3Td/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/software-center/data/hello_2.5-1_amd64.deb differ Binary files /tmp/cFjkONjEmM/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/software-center/data/hello_2.5-1_i386.deb and /tmp/D4HGyIf3Td/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/software-center/data/hello_2.5-1_i386.deb differ Binary files /tmp/cFjkONjEmM/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/software-center/data.tar.gz and /tmp/D4HGyIf3Td/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/software-center/data.tar.gz differ diff -Nru qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/software-center/test_softwarecenter.ini qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/software-center/test_softwarecenter.ini --- qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/software-center/test_softwarecenter.ini 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/software-center/test_softwarecenter.ini 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,6 @@ +[data] +; To pass the test you need to specify valid credentials in the included file: +; [auth] +; username=USERNAME +; password=PASSWORD +include=~/.magocredentials.ini diff -Nru qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/software-center/test_softwarecenter.py qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/software-center/test_softwarecenter.py --- qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/software-center/test_softwarecenter.py 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/software-center/test_softwarecenter.py 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,203 @@ +# Copyright (C) 2011 Canonical Ltd +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +# This script contains the tests to run with mago + +""" +Ubuntu Software Center Test Suite +""" + +from mago import TestCase +import unittest +import commands +import ldtp +import ooldtp +import commands +import os + +class TestSoftwareCenter(TestCase): + launcher = 'software-center' + window_name = 'frmUbuntuSoftwareCenter' + + # Test still needs the object strings parameterized + def test_happypath(self): + "Search for Test Drive, install it, then remove it" + ldtp.settextvalue(self.window_name, 'txtAvailablePanesearchentry', 'Test Drive') + # assumes Test Drive is the first in the list + ldtp.wait(3) + ldtp.generatekeyevent('') + ldtp.wait(2) + ldtp.generatekeyevent('') + ldtp.wait(2) + ldtp.click(self.window_name, 'btnInstall') + self.application.authenticate(self.testConfig.get('auth', 'password')) + ldtp.wait(5) + + # TODO It would be nice to add a check that the in progress menu appears and disappears. + #ldtp.wait(3) + #self.assertTrue(ldtp.doesrowexist(self.window_name, 'ttblSoftwaresources', 'In Progress', True)) + #ldtp.wait(10) + #self.assertFalse(ldtp.doesrowexist(self.window_name, 'ttblSoftwaresources', 'In Progress', True)) + + ldtp.singleclickrow(self.window_name, 'ttblSoftwaresources', 'Installed Software') + ldtp.wait(5) + self.assertTrue(ldtp.doesrowexist(self.window_name, 'tblInstalledPaneappview', 'Test Drive an Ubuntu ISO', True)) + ldtp.wait(5) + ldtp.settextvalue(self.window_name, 'txtInstalledPanesearchentry', 'Test Drive') + # assumes Test Drive is the first in the list + ldtp.wait(3) + ldtp.generatekeyevent('') + ldtp.wait(2) + ldtp.generatekeyevent('') + ldtp.wait(5) + # TODO + #ldtp.click(self.window_name, 'btnRemove') + + def test_custom_package_list(self): + """ + """ + # search for gobby,gnome-orca + ldtp.enterstring(self.window_name, 'txtAvailablePanesearchentry', 'gobby,gnome-orca') + ldtp.wait(3) + # assert install button and items displayed + self.assertTrue(ldtp.doesrowexist(self.window_name, 'tblAvailablePaneappview', 'Gobby Collaborative Editor', True)) + self.assertTrue(ldtp.doesrowexist(self.window_name, 'tblAvailablePaneappview', 'Orca Screen Reader and Magnifier', True)) + # append ,9base + ldtp.enterstring(self.window_name, 'txtAvailablePanesearchentry', 'gobby,gnome-orca,9base') + ldtp.wait(3) + # assert + self.assertTrue(ldtp.doesrowexist(self.window_name, 'tblAvailablePaneappview', 'Gobby Collaborative Editor', True)) + self.assertTrue(ldtp.doesrowexist(self.window_name, 'tblAvailablePaneappview', 'Orca Screen Reader and Magnifier', True)) + # TODO bug 746964 self.assertTrue(ldtp.doesrowexist(self.window_name, 'tblAvailablePaneappview', 'Plan 9 userland tools', True)) + # append, abcd + ldtp.enterstring(self.window_name, 'txtAvailablePanesearchentry', 'gobby,gnome-orca,9base,abcd') + # assert not found item + # TODO bug 712903 need to verify if this still according to spec + #self.assertTrue(ldtp.doesrowexist(self.window_name, 'tblAvailablePaneappview', 'Not Found', True)) + + # append e + ldtp.enterstring(self.window_name, 'txtAvailablePanesearchentry', 'gobby,gnome-orca,9base,abcde') + # assert no not found + self.assertFalse(ldtp.doesrowexist(self.window_name, 'tblAvailablePaneappview', 'Not Found', True)) + # assert + # TODO bug 746964 + #self.assertTrue(ldtp.doesrowexist(self.window_name, 'tblAvailablePaneappview', 'A Better CD Encoder', True)) + + def test_launch_with_package_name(self): + """ + """ + # execute command software-center gobby + self.application.close() + self.application.launch(launcher_args=['gobby']) + + # assert Get Software > Internet > Gobby Col..... + ldtp.waittillguiexist(self.window_name, 'btnGobbyCollaborativeEditor*') + # assert pane view + self.assertTrue(ldtp.guiexist(self.window_name, 'lblGobbyCollaborativeEditor*')) + + def test_launch_with_debian_file(self): + """ + """ + self.application.close() + filepath = os.path.join(os.path.dirname(__file__), 'data', 'hello_2.5-1_i386.deb') + self.application.launch(launcher_args=[filepath]) + + # assert Get Software > Internet > Gobby Col..... + ldtp.waittillguiexist(self.window_name, 'btnTheclassicgreeting*') + # assert pane view + self.assertTrue(ldtp.guiexist(self.window_name, 'lblTheclassicgreeting*')) + + + def test_launch_with_apturl(self): + """ + """ + self.application.close() + self.application.launch(launcher_args=['apt://gobby']) + + # assert Get Software > Internet > Gobby Col..... + ldtp.waittillguiexist(self.window_name, 'btnGobbyCollaborativeEditor*') + # assert pane view + self.assertTrue(ldtp.guiexist(self.window_name, 'lblGobbyCollaborativeEditor*')) + + def test_reset_corrupt_cache(self): + """ + These test steps outlined in the spec do not work. contact Gary about how this should work. + """ + pass + # execute command apt-get install 4g8 && dpkg --force-depends -r libnet1 + + # click installed software + + # assert icon + + # press tab, space + + # assert custom policy kit opens + + # click cancel + + # start installing any app + + # asssert icon disappears + + # click In Progress + + # assert "Rebuilding software catalog" task + + # clean up step (apt-get remove 4g8 libnet1 ??? + + def test_add_remove_repositories(self): + """ + LDTP becomes completely inert when the software sources app is opened within usc + """ + pass + # edit - software sources + #ldtp.click(self.window_name, 'mnuSoftwareSources*') + + # password + #self.application.authenticate(self.testConfig.get('auth', 'password')) + + # other software tab click add + #ldtp.click(self.window_name, '') + + # enter url + + # click Add Source + + # click close + + # click in progress (cache update) "Updating cache" + + # when complete should go to main get software pane + + # search for 2mandvd and assert exists + + # remove sources + + # click close + + # click in progress (cache update) "Updating cache" + + # when complete should go to main get software pane + + # click search clear button + + # search for 2mandvd and assert does NOT exist + + + +if __name__ == "__main__": + nose.main() diff -Nru qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/software-center/tree.py qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/software-center/tree.py --- qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/software-center/tree.py 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/software-center/tree.py 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,19 @@ +# This script contains the tests to run with mago + +import ldtp +import sys + +window = "%r" % sys.argv[1] + +objs = sorted(ldtp.getobjectlist(window)) + +for o in objs: + print "Object: %r" % o + oinfo = ldtp.getobjectinfo(sc, o) + #print oinfo + print "Properties" + for oi in oinfo: + #print oi + oprop = ldtp.getobjectproperty(window, o, oi) + print "%r : %r" % (oi, oprop) + print "------------" diff -Nru qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/time-admin/test_timeadmin.ini qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/time-admin/test_timeadmin.ini --- qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/time-admin/test_timeadmin.ini 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/time-admin/test_timeadmin.ini 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,10 @@ +[data] +; # This file contains the tests to run with mago +; To pass the test you need to specify valid credentials in the included file: +; [auth] +; username=USERNAME +; password=PASSWORD +include=~/.magocredentials.ini + +; Used by the test_changetime test. Format hh:mm +time=12:34 diff -Nru qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/time-admin/test_timeadmin.py qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/time-admin/test_timeadmin.py --- qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/time-admin/test_timeadmin.py 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/time-admin/test_timeadmin.py 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,176 @@ +# Copyright (C) 2010 Canonical Ltd +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +# This script contains the tests to run with mago + +"""Time Admin Test + +Test the time-admin applet: + - Compare the time-admin date with the system date + - Change the date + - Change the timezone + +This test requires user authentication. It can be defined in a configuration +file: + +; To pass the test you need to specify valid credentials in the included file: +; [auth] +; username=USERNAME +; password=PASSWORD + + +To run it with: +$ mago-ng + +""" + +from mago import TestCase +import unittest +import ldtp +import time + +class TestTimeAdmin(TestCase): + """Test the time-admin applet + """ + launcher = 'time-admin' + window_name = 'dlgTimeandDateSettings' + + sbtn_hh = 'sbtn0' + sbtn_mm = 'sbtn1' + sbtn_ss = 'sbtn2' + + def __gettime(self): + """Read time from the time applet and returns a list (hh:mm:ss)""" + hh = self.application.context.gettextvalue( self.sbtn_hh ) + mm = self.application.context.gettextvalue( self.sbtn_mm ) + ss = self.application.context.gettextvalue( self.sbtn_ss ) + + return map(lambda x: "%02d" % int(x), (hh, mm, ss)) + + def __settime(self, hh = 0, mm = 0, ss = 0): + """Set time using the time applet + + :param hh: Hours + :param mm: Minutes + :param ss: Seconds + """ + self.application.context.settextvalue( self.sbtn_hh, "%02d" % int(hh) ) + self.application.context.settextvalue( self.sbtn_mm, "%02d" % int(mm) ) + self.application.context.settextvalue( self.sbtn_ss, "%02d" % int(ss) ) + ldtp.generatekeyevent('') + + def setUp(self): + """setUp method. Click on btn2 to popup the auth dialog """ + super(TestTimeAdmin, self).setUp() + ldtp.click(self.window_name, 'btn2') + + def test_01checktime(self): + """Check that the time in the applet is the same than the local time + returned by the system + + """ + tt = self.__gettime() + + self.assertEqual( "%s:%s" % (tt[0], tt[1]), + time.strftime('%H:%M', time.localtime())) + + def test_02changetime(self): + """Change the time and compare to local time returned by the system + + This test requires a valid password + """ + if not self.testConfig.has_option('auth', 'password'): + raise self.failureexception,"password is mandatory. set it in the configuration file" + + time_orig = self.__gettime() + + password = self.testConfig.get('auth', 'password') + hhmm = self.testConfig.get('data', 'time').split(':') + rc = self.application.authenticate(password) + self.assertTrue(rc) + + self.__settime(hhmm[0], hhmm[1]) + time_test = self.__gettime() + + + # Check that the component is updated + self.assertEqual( hhmm[0], time_test[0] ) + self.assertEqual( hhmm[1], time_test[1] ) + + # Need to wait a few seconds in order to update system time + ldtp.wait(5) + # Has system been updated? + self.assertEqual( "%s:%s" % (hhmm[0], hhmm[1]), + time.strftime('%H:%M', time.localtime())) + + # Restore time + self.__settime(time_orig[0], time_orig[1], time_orig[2]) + + + def test_03changetimezone(self): + """Change the timezone""" + raise NotImplementedError + +# def test_password(self): +# """test authentication with a valid password +# +# this test enters a valid password and check the authenticate returned +# true, that the dialog is not there anymore and that the calendar is +# enabled (meaning that the authentication succeeded) +# """ +# if not self.testconfig.has_option('auth', 'password'): +# raise self.failureexception,"password is mandatory. set it in the configuration file" +# +# password = self.testconfig.get('auth', 'password') +# rc = self.application.authenticate(password) +# self.asserttrue(rc) +# self.assertfalse(ldtp.guiexist('dlgauthenticate')) +# self.asserttrue(ldtp.stateenabled(self.window_name, 'caldate')) +# +# def test_cancel(self): +# """test the cancel action of the authentication dialog +# +# open the authentication dialog and cancel, then check the return status +# and that the dialog is closed +# """ +# rc = self.application.authenticate(cancel = True) +# +# self.assertTrue(rc) +# self.assertFalse(ldtp.guiexist('dlgAuthenticate')) +# +# +# def test_wrongpassword(self): +# """Test authentication with a wrong password +# +# The test enters a wrong password and check that authenticate returns +# False, that the dialog is still there. +# +# Then call authenticate again with cancel and check that the return +# status is True and the dialog vanished +# """ +# # Set an invalid password +# rc = self.application.authenticate(password = "this password is invalid") +# self.assertFalse(rc) +# self.assertTrue(ldtp.guiexist('dlgAuthenticate')) +# +# # Cancel the auth. dialog +# rc = self.application.authenticate(cancel = True) +# self.assertTrue(rc) +# self.assertFalse(ldtp.guiexist('dlgAuthenticate')) + + +if __name__ == "__main__": + unittest.main() diff -Nru qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/totem/test_totemplayback.py qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/totem/test_totemplayback.py --- qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/totem/test_totemplayback.py 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/totem/test_totemplayback.py 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,225 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2010 Canonical Ltd +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +# This script contains the tests to run with mago + +"""Totem Test + +This totem test, test the playboack of totem + +To run it with: + $ mago + +""" + + +from mago import TestCase +import unittest + +import ooldtp +import ldtp +import pexpect +import wave +import struct +import numpy as np +import pygst +pygst.require("0.10") +import gst + +import os +from time import time, gmtime, strftime + + +class TestTotem(TestCase): + """ + totem manages the Totem application. + """ + + launcher = 'totem' + window_name = 'frmMoviePlayer' + + BTN_ADD = 'btnAdd' + BTN_CANCEL = 'btnCancel' + BTN_CLOSE = 'btnClose' + BTN_DOWN = 'btnDown' + BTN_FIND = 'btnFind' + BTN_FULLSCREEN = 'btnFullscreen' + BTN_NEXTCHAPTER_MOVIE = 'btnNextChapter/Movie' + BTN_PLAY_PAUSE = 'btnPlay/Pause' + BTN_PREVIOUSCHAPTER_MOVIE = 'btnPreviousChapter/Movie' + BTN_REMOVE = 'btnRemove' + BTN_SAVE = 'btnSave' + BTN_UP = 'btnUp' + + OPEN_DLG_LOC ='dlgOpenLocation...' + OPEN_DLG_LOC_TXT = 'txtEntertheaddressofthefileyouwouldliketoopen' + OPEN_DLG_LOC_OPEN = 'btnOpen' + + MNU_1990331AMPG = 'mnu1990331ampg' + MNU_ABOUT = 'mnuAbout' + MNU_ANGLEMENU = 'mnuAngleMenu' + MNU_AUDIOMENU = 'mnuAudioMenu' + MNU_CHAPTERMENU = 'mnuChapterMenu' + MNU_CLEARPLAYLIST = 'mnuClearPlaylist' + MNU_CONTENTS = 'mnuContents' + MNU_CREATESCREENSHOTGALLERY = 'mnuCreateScreenshotGallery' + MNU_DVDMENU = 'mnuDVDMenu' + MNU_EJECT = 'mnuEject' + MNU_EMPTY = 'mnuEmpty' + MNU_EMPTY1 = 'mnuEmpty1' + MNU_EMPTY2 = 'mnuEmpty2' + MNU_EMPTY3 = 'mnuEmpty3' + MNU_EMPTY4 = 'mnuEmpty4' + MNU_EMPTY5 = 'mnuEmpty5' + MNU_EMPTY6 = 'mnuEmpty6' + MNU_EMPTY7 = 'mnuEmpty7' + MNU_EMPTY8 = 'mnuEmpty8' + MNU_EMPTY9 = 'mnuEmpty9' + MNU_FULLSCREEN = 'mnuFullscreen' + MNU_GETHELPONLINE = 'mnuGetHelpOnline' + MNU_NEXTCHAPTER_MOVIE = 'mnuNextChapter/Movie' + MNU_OPEN = 'mnuOpen' + MNU_OPENLOCATION = 'mnuOpenLocation' + MNU_PLAY_PAUSE = 'mnuPlay/Pause' + MNU_PLUGINS = 'mnuPlugins' + MNU_PREFERENCES = 'mnuPreferences' + MNU_PREVIOUSCHAPTER_MOVIE = 'mnuPreviousChapter/Movie' + MNU_PROPERTIES = 'mnuProperties' + MNU_QUIT = 'mnuQuit' + MNU_REPORTAPROBLEM = 'mnuReportaProblem' + MNU_RESIZE11 = 'mnuResize11' + MNU_RESIZE12 = 'mnuResize12' + MNU_RESIZE21 = 'mnuResize21' + MNU_SELECTTEXTSUBTITLES = 'mnuSelectTextSubtitles' + MNU_SKIPBACKWARDS = 'mnuSkipBackwards' + MNU_SKIPFORWARD = 'mnuSkipForward' + MNU_SKIPTO = 'mnuSkipto' + MNU_SWITCHANGLES = 'mnuSwitchAngles' + MNU_TAKESCREENSHOT = 'mnuTakeScreenshot' + MNU_TITLEMENU = 'mnuTitleMenu' + MNU_TRANSLATETHISAPPLICATION = 'mnuTranslateThisApplication' + MNU_VOLUMEDOWN = 'mnuVolumeDown' + MNU_VOLUMEUP = 'mnuVolumeUp' + MNU_ZOOMIN = 'mnuZoomIn' + MNU_ZOOMOUT = 'mnuZoomOut' + MNU_ZOOMRESET = 'mnuZoomReset' + MNU_PLAYLIST = 'mnuplaylist' + MNU_PROPERTIES = 'mnuproperties' + MNU_YOUTUBE = 'mnuyoutube' + TXT_0 = 'txt0' + + wavfile = '/tmp/totem.wav' + freq=440 + + + def setUp(self): + super(TestTotem, self).setUp() + pipeline = 'audiotestsrc freq=%d num-buffers=1024 ! queue ! \ + audioconvert ! \ + audio/x-raw-int,width=16,depth=16,channels=1 ! \ + wavenc ! \ + filesink location=%s' % (self.freq, self.wavfile) + element = gst.parse_launch(pipeline) + element.set_state(gst.STATE_PLAYING) + + + def test_totem_audio_playback(self): + test_file = strftime( + "/tmp/" + "%Y%m%d_%H%M%S" + ".wav", gmtime((time()))) + self.openfile(self.wavfile) + (freq, flat) = self.capture_do_fft(test_file) + if freq != self.freq: + raise AssertionError, "Sine WAV playback error, frq expected: %s ; got %s" % (self.freq, freq) + self.play_pause() + os.unlink(test_file) + (freq, flat) = self.capture_do_fft(test_file) + if flat != 1: + raise AssertionError, "Pause playback error, non flat PCM detected" + self.play_pause() + os.unlink(test_file) + + def openfile(self, filename, open_menu='mnuOpenLocation'): + """ + It tries to open/play the filename passed as parameter. + + @type filename: string + @param filename: The name of the file to open. + """ + totem = ooldtp.context(self.window_name) + actualMenu = totem.getchild(open_menu) + actualMenu.selectmenuitem() + ldtp.waittillguiexist(self.OPEN_DLG_LOC) + ldtp.wait(1) + open_dialog_loc = ooldtp.context(self.OPEN_DLG_LOC) + open_dlg_loc_txt_filename = open_dialog_loc.getchild(self.OPEN_DLG_LOC_TXT) + ldtp.wait(1) + open_dlg_loc_txt_filename.settextvalue("file://%s" %filename) + open_dlg_loc_btn_open = open_dialog_loc.getchild(self.OPEN_DLG_LOC_OPEN) + ldtp.wait(1) + open_dlg_loc_btn_open.click() + ldtp.waittillguinotexist(self.OPEN_DLG_LOC) + ldtp.wait(1) + #self.set_name(os.path.basename(filename)) + + def capture_do_fft(self, filename): + """ + Start a Gstreamer pipeline to record ALSA PCM output + Perform FFT to find freq peak + + Return: + - the freq peak + - a boolean if the PCM recorded is flat (no sound) + """ + + device = pexpect.run('/bin/bash -c "pactl list | \ + grep -A2 \'^Source #\' | \ + grep -e \'Name: .*\.monitor$\' | cut -d\' \' -f2 | tail -n1"') + + pipeline = 'pulsesrc device=%s ! queue ! audioconvert ! \ + audio/x-raw-int,width=16,depth=16,channels=1 ! \ + wavenc ! filesink location=%s' % (device.rstrip(), filename) + element = gst.parse_launch(pipeline) + element.set_state(gst.STATE_PLAYING) + ldtp.wait(2) + element.set_state(gst.STATE_NULL) + + data_size = 40000 + frate = 44100.0 + wav_file = wave.open(filename,'r') + data = wav_file.readframes(data_size) + wav_file.close() + data = struct.unpack('<{n}h'.format(n=data_size), data) + data = np.array(data) + w = np.fft.fft(data) + freqs = np.fft.fftfreq(len(w)) + + # A flat PCM is made of the following values : -1, 0, 1 only + flat = 0 if (abs(np.min(data))+abs(np.max(data))-2) else 1 + + # Find the peak in the coefficients + idx = np.argmax(np.abs(w)**2) + freq = freqs[idx] + freq_in_hertz = abs(freq*frate) + return ((int(round(freq_in_hertz))), flat) + + def play_pause(self): + totem = ooldtp.context(self.name) + btn_play_pause = totem.getchild(self.BTN_PLAY_PAUSE) + #ldtp.wait(1) + btn_play_pause.click() + ldtp.wait(2) + diff -Nru qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/totem/test_totem.py qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/totem/test_totem.py --- qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/totem/test_totem.py 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/totem/test_totem.py 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,166 @@ +# Copyright (C) 2010 Canonical Ltd +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +# This script contains the tests to run with mago + +"""Totem Tests + +This is a test that verifies that Totem application is working correctly. +So far what it does is: + - Check General Preferences. + - Check Display Preferences. + - Check Sound Preferences. + - Enable/Disable all plugins. + +To run it with: +$ mago-ng +""" + +from mago import TestCase +import unittest +import ldtp +import ooldtp + + +ACCOUNT_ASSISTANT = 'frmMessagingandVoIPAccountsAssistant' +TOTEM = 'frmMoviePlayer' +PREFERENCES = 'dlgPreferences' +MNU_PREFERENCES = 'mnuPreferences' +MNU_PLUGINS = 'mnuPlugins' +GENERAL_TAB = 'ptabGeneral' +DISPLAY_TAB = 'ptabDisplay' +AUDIO_TAB = 'ptabAudio' +BTN_CLOSE = 'btnClose' +TABS = 'ptl0' +PLUGINS = 'dlgConfigurePlugins' +PLUGINS_TABLE = 'tbl0' +#general tab +START_FROM_LAST = 'chkStartplayingfilesfromlastposition' +CONNECTION_SPEED = 'cboConnectionspeed' +LOAD_SUBTITLES = 'chkLoadsubtitlefileswhenmovieisloaded' +LOAD_CHAPTERS = 'chkLoadchapterfileswhenmovieisloaded' +#display tab +RESIZE_WINDOW = 'chkResizethewindowwhenanewvideoisloaded' +DISABLE_DEINTERLACING = 'chkDisabledeinterlacingofinterlacedvideos' +SHOW_EFFECTS = 'chkShowvisualeffectswhenanaudiofileisplayed' +RESET_DEFAULTS = 'btnResettoDefaults' +TYPE_VISUALIZATION = 'cboTypeofvisualization' +VISUALIZATION_SIZE = 'cboVisualizationsize' +#audio tab +AUDIO_OUTPUT = 'cboAudiooutputtype' + + +class TotemTests(TestCase): + launcher = 'totem' + window_name = TOTEM + setupOnce = True + + def test_01_general_preferences(self): + """Test that check that the general preferences can be enabled/disabled + """ + self.enable_disable_general_preferences(True) + self.enable_disable_general_preferences(False) + + def test_02_display_preferences(self): + """Test that check that the display preferences can be enabled/disabled + """ + self.enable_disable_display_preferences(True) + self.enable_disable_display_preferences(False) + + def test_03_audio_preferences(self): + """Test that check that the audio preferences can be changed + """ + self.audio_preferences() + + def test_04_plugins(self): + """Test that check that the available plugins can be enabled/disabled + """ + self.enable_disable_plugins(True) + self.enable_disable_plugins(False) + + def enable_disable_plugins(self, enable): + totem = ooldtp.context(self.window_name) + totem.getchild(MNU_PLUGINS).selectmenuitem() + ldtp.waittillguiexist(PLUGINS) + plugins = ooldtp.context(PLUGINS) + row = 0 + while (row < plugins.getchild(PLUGINS_TABLE).getrowcount()): + if enable: + plugins.getchild(PLUGINS_TABLE).checkrow(row, 0) + else: + plugins.getchild(PLUGINS_TABLE).uncheckrow(row, 0) + row+=1 + + plugins.getchild(BTN_CLOSE).click() + + def enable_disable_general_preferences(self, enable): + totem = ooldtp.context(self.window_name) + totem.getchild(MNU_PREFERENCES).selectmenuitem() + ldtp.waittillguiexist(PREFERENCES) + pref = ooldtp.context(PREFERENCES) + pref.selecttab(TABS, GENERAL_TAB) + + if enable: + pref.getchild(START_FROM_LAST).check() + pref.getchild(LOAD_SUBTITLES).check() + pref.getchild(LOAD_CHAPTERS).check() + else: + pref.getchild(START_FROM_LAST).uncheck() + pref.getchild(LOAD_SUBTITLES).uncheck() + pref.getchild(LOAD_CHAPTERS).uncheck() + + option = 0 + while option < 12: + pref.getchild(CONNECTION_SPEED).selectindex(option) + option+=1 + + pref.getchild(BTN_CLOSE).click() + + def enable_disable_display_preferences(self, enable): + totem = ooldtp.context(self.window_name) + totem.getchild(MNU_PREFERENCES).selectmenuitem() + ldtp.waittillguiexist(PREFERENCES) + pref = ooldtp.context(PREFERENCES) + pref.selecttab(TABS, DISPLAY_TAB) + + if enable: + pref.getchild(RESIZE_WINDOW).check() + pref.getchild(DISABLE_DEINTERLACING).check() + pref.getchild(SHOW_EFFECTS).check() + else: + pref.getchild(RESIZE_WINDOW).uncheck() + pref.getchild(DISABLE_DEINTERLACING).uncheck() + pref.getchild(SHOW_EFFECTS).uncheck() + + pref.getchild(RESET_DEFAULTS).click() + pref.getchild(BTN_CLOSE).click() + + def audio_preferences(self): + totem = ooldtp.context(self.window_name) + totem.getchild(MNU_PREFERENCES).selectmenuitem() + ldtp.waittillguiexist(PREFERENCES) + pref = ooldtp.context(PREFERENCES) + pref.selecttab(TABS, AUDIO_TAB) + + option = 0 + while option < 6: + pref.getchild(AUDIO_OUTPUT).selectindex(option) + option+=1 + + pref.getchild(BTN_CLOSE).click() + +if __name__ == "__main__": + unittest.main() diff -Nru qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/transmission-gtk/test_transmission-gtk.py qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/transmission-gtk/test_transmission-gtk.py --- qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/transmission-gtk/test_transmission-gtk.py 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/transmission-gtk/test_transmission-gtk.py 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,133 @@ +# Copyright (C) 2010 Canonical Ltd +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +# This script contains the tests to run with mago + +"""Transmission GTK Test + +This is a test that verifies that Transmission application is working correctly. +So far what it does is: + - Add a torrent URL. + - Check that the torrent is being downloaded. + - Remove the torrent and the files downloaded. + +This test only requires an Internet connection to be run. + +To run it with: +$ mago-ng +""" + +from mago import TestCase +import unittest +import ldtp +import ooldtp +import os + +TRANSMISSION = 'frmTransmission' +DLG_INFORMATION = 'dlgInformation' +IACCEPT = 'btnIAccept' +MNU_ADD_URL = 'mnuAddURL' +DLG_ADD_URL = 'dlgAddURL' +TXT_ADD_URL = 'txtURL' +BTN_ADD_URL = 'btnAdd' +DLG_TORRENT_OPTIONS = 'dlgTorrentOptions' +DLG_QUESTION = 'dlgQuestion' +BTN_REMOVE = 'btnDelete' +TABLE = 'tbl0' +MNU_REMOVE_TORRENT = 'mnuDeleteFilesandRemove' +SPEED = 'lbl*KiB/s' +"""This is the torrent image we download +""" +TORRENT = 'http://releases.ubuntu.com/10.10/ubuntu-10.10-alternate-i386.iso.torrent' + +class TransmissionTests(TestCase): + """Launcher for the application transmission + """ + launcher = 'transmission-gtk' + window_name = TRANSMISSION + setupOnce = True + + def tearDown(self): + """remove the incompleted files from the Trash and Downloads directory. + """ + trash = os.getenv('HOME') + '/.local/share/Trash/files/' + torrents = os.listdir(trash) + for t in torrents: + if t.endswith('part'): + os.remove(trash + t) + + download = os.getenv('HOME') + '/Downloads/ubuntu-10.10-alternate-i386.iso.part' + if os.path.exists(download): + os.remove(download) + + super(TransmissionTests, self).tearDown() + + def transmission_01_test_add_torrent(self): + """Test that adding a torrent works fine. + When you launch transmission for the first time and information dialog + is being displayed with information regarding torrents, we wait for + that dialog and accept. + """ + if ldtp.guiexist(DLG_INFORMATION): + i = ooldtp.context(DLG_INFORMATION) + i.getchild(IACCEPT).click() + + t = ooldtp.context(TRANSMISSION) + t.getchild(MNU_ADD_URL).selectmenuitem() + + ldtp.waittillguiexist(DLG_ADD_URL) + du = ooldtp.context(DLG_ADD_URL) + du.getchild(TXT_ADD_URL).settextvalue(TORRENT) + du.getchild(BTN_ADD_URL).click() + + ldtp.waittillguiexist(DLG_TORRENT_OPTIONS) + + if ldtp.guiexist(DLG_TORRENT_OPTIONS): + to = ooldtp.context(DLG_TORRENT_OPTIONS) + to.getchild(BTN_ADD_URL).click() + + self.assertTrue(ldtp.guiexist(TRANSMISSION)) + + def transmission_02_test_check_torrent(self): + """Test that checks that the torrent is being downloaded, we double check + that the treeview contains the torrent element and that the speed changes. + """ + t = ooldtp.context(TRANSMISSION) + table = t.getchild(TABLE) + self.assertTrue(table.getrowcount() > 0) + """wait until the torrent has started to download. + """ + while t.getchild(SPEED).gettextvalue() == '0.00 KiB/s': + ldtp.wait(2) + + def transmission_03_test_remove_torrent(self): + """Test that removes the torrent and the files. + """ + t = ooldtp.context(TRANSMISSION) + table = t.getchild(TABLE) + table.selectrowindex(0) + t.getchild(MNU_REMOVE_TORRENT).selectmenuitem() + + ldtp.waittillguiexist(DLG_QUESTION) + + if ldtp.guiexist(DLG_QUESTION): + q = ooldtp.context(DLG_QUESTION) + q.getchild(BTN_REMOVE).click() + + self.assertTrue(table.getrowcount() == 0) + +if __name__ == "__main__": + unittest.main() Binary files /tmp/cFjkONjEmM/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/unity/data/wclosebutton.png and /tmp/D4HGyIf3Td/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/unity/data/wclosebutton.png differ Binary files /tmp/cFjkONjEmM/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/unity/data.tar.gz and /tmp/D4HGyIf3Td/qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/unity/data.tar.gz differ diff -Nru qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/unity/test_decorations.ini qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/unity/test_decorations.ini --- qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/unity/test_decorations.ini 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/unity/test_decorations.ini 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,3 @@ +[data] +; # This file contains the tests to run with mago +img_close = data/wclosebutton.png diff -Nru qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/unity/test_decorations.py qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/unity/test_decorations.py --- qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/unity/test_decorations.py 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/unity/test_decorations.py 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,63 @@ +# Copyright (C) 2010-2011 Canonical Ltd +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +# This script contains the tests to run with mago + +"""Test the decorations of Unity + +To run it with: +$ mago + +""" + +from mago import TestCase +from xpresser.image import Image +from xpresser.opencvfinder import OpenCVFinder +import os, ldtp + + +class TestUnityDecorations(TestCase): + """ Test Class""" + launcher = "gedit" + window_name = 'frm*gedit' + + def test_focusedbutton_LP704413(self): + """Test unity-window-decorator doesn't draw "unfocused state" of title + bar LP: #704413 + + Count the number of occurences of the reference image (window close + button) on the desktop. Must always be 1. + """ + # Need to launch another app to be sure that a least 2 are running at + # the same time but only one is in a 'focused' state + ldtp.launchapp('gcalctool') + + img_close = self.testConfig.get('data', 'img_close') + ldtp.wait(2) + + # Take a screenshot of the desktop + img_desktop = ldtp.imagecapture() + + desktop = Image(filename = os.path.abspath(img_desktop)) + button = Image(filename = os.path.abspath(img_close)) + ldtp.closewindow('frmCalculator') + # Count the number of buttons + finder = OpenCVFinder() + m = finder.find_all(desktop, button) + # Must be 1 + self.assertEqual(len(m), 1) + + diff -Nru qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/users-admin/test_usersadmin.ini qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/users-admin/test_usersadmin.ini --- qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/users-admin/test_usersadmin.ini 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/users-admin/test_usersadmin.ini 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,7 @@ +[data] +; # This file contains the tests to run with mago +; To pass the test you need to specify valid credentials in the included file: +; [auth] +; username=USERNAME +; password=PASSWORD +include=~/.magocredentials.ini diff -Nru qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/users-admin/test_usersadmin.py qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/users-admin/test_usersadmin.py --- qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/users-admin/test_usersadmin.py 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/users-admin/test_usersadmin.py 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,104 @@ +# Copyright (C) 2011 Canonical Ltd +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +# This script contains the tests to run with mago + +""" +User Admin Test Suite + +See comment to understand the change required for running users-admin tests +https://bugs.launchpad.net/ubuntu/+source/ldtp/+bug/741186/comments/2 + +Required changes: +- edit file: /usr/share/polkit-1/actions/org.freedesktop.SystemToolsBackends.policy + +for action id 'org.freedesktop.systemtoolsbackends.set' +change 'allow_inactive' and 'allow_active' values to 'yes' + +""" + +from mago import TestCase +import unittest +import ldtp +import ooldtp + +class TestUsersAdmin(TestCase): + launcher = 'users-admin' + window_name = 'dlgUsersSettings' + users_settings_dlg = None + + def setUp(self): + super(TestUsersAdmin, self).setUp() + self.users_settings_dlg = ooldtp.context(self.window_name) + + def test_happypath(self): + """ + add user (generate random password) + add group + add user to group + remove group + remove user + """ + # add user + ldtp.wait(2) + self.users_settings_dlg.click('btnAdd') + ldtp.waittillguiexist('dlgCreateNewUser') + create_new_user_dlg = ooldtp.context('dlgCreateNewUser') + create_new_user_dlg.settextvalue('txt1', 'ted') + create_new_user_dlg.settextvalue('txt0', 'ted') + create_new_user_dlg.click('btnOK') + ldtp.waittillguiexist('dlgChangeUserPassword') + change_user_password_dlg = ooldtp.context('dlgChangeUserPassword') +# # generate password +# change_user_password_dlg.click('rbtnGeneraterandompassword') +# initialGeneratedPassword = change_user_password_dlg.gettextvalue('txt1') +# self.assertTrue(initialGeneratedPassword != '') +# change_user_password_dlg.click('btnGenerate') +# newGeneratedPassword = change_user_password_dlg.gettextvalue('txt1') +# self.assertTrue(initialGeneratedPassword != newGeneratedPassword) + + # manual password + change_user_password_dlg.settextvalue('txtNewpassword', 'test123') + change_user_password_dlg.settextvalue('txtConfirmation', 'test123') + + change_user_password_dlg.click('btnOK') + # add the user to a new group + self.users_settings_dlg.click('btnManageGroups') + ldtp.waittillguiexist('dlgGroupssettings') + groups_settings_dlg = ooldtp.context('dlgGroupssettings') + groups_settings_dlg.click('btnAdd') + ldtp.waittillguiexist('dlgNewgroup') + new_group_dlg = ooldtp.context('dlgNewgroup') + new_group_dlg.settextvalue('txtGroupname', 'mago') + new_group_dlg.selectrow('tbl0', 'ted') + new_group_dlg.click('btnOK') + self.assertTrue(groups_settings_dlg.doesrowexist('tbl0', 'mago')) + # delete group + groups_settings_dlg.selectrow('tbl0', 'mago') + groups_settings_dlg.click('btnDelete') + ldtp.waittillguiexist('dlgWarning') + ldtp.click('dlgWarning', 'btnDelete') + self.assertFalse(groups_settings_dlg.doesrowexist('tbl0', 'mago')) + groups_settings_dlg.click('btnClose') + # delete user + self.users_settings_dlg.selectrowpartialmatch('tbl0', 'ted') + self.users_settings_dlg.click('btnDelete') + ldtp.waittillguiexist('dlgQuestion') + ldtp.click('dlgQuestion', 'btnDeleteFiles') + self.assertFalse(self.users_settings_dlg.doesrowexist('tbl0', 'ted')) + +if __name__ == "__main__": + nose.main() diff -Nru qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/yelp/test_yelp.py qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/yelp/test_yelp.py --- qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/yelp/test_yelp.py 1970-01-01 00:00:00.000000000 +0000 +++ qatora-2011-07/data/testing-scripts/mago-testsuite-app-testing/yelp/test_yelp.py 2011-07-12 13:33:13.000000000 +0000 @@ -0,0 +1,104 @@ +# Copyright (C) 2011 Canonical Ltd +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +# This script contains the tests to run with mago + +"""Yelp Test + +This is a basic test to verify that yelp is working correctly. + +It checks the following: + - that searching for Shuttleworth returns a reference to Mark. + - that following all links on the home page doesn't crash. + +Disabled test: + - that following a link while loading a search result causes a crash + +To run it with: +$ mago-ng +""" + +from mago import TestCase +import ldtp +import ooldtp +import unittest + + +class YelpTests(TestCase): + """Launcher for the application yelp. + """ + launcher = 'yelp' + window_name = 'frmDesktopHelp' + + def test_search(self): + """Test search + + Test that searching for Shuttleworth returns a reference to Mark. + """ + # LP: #710901 + # searching isn't implemented yet + # FIXME: search_activated + x = ldtp.getwindowlist() + ldtp.wait(5) + context = ooldtp.context(self.window_name) + context.settextvalue('txt0', 'Shuttleworth') + context.enterstring('txt0', '') + ldtp.wait(2) + self.assertTrue('No matching help pages', + context.gettextvalue('txt1')) + + @unittest.skip('Not reproducible with yelp 3.0. Test is invalid') + def test_follow_link_while_loading_crash(self): + """Create a crash: LP: #673355 + + Test that following a link while loading a search result causes a + crash. + """ + x = ldtp.getwindowlist() + ldtp.wait(5) + context = ooldtp.context(self.window_name) + context.settextvalue('txt0', 'network') + context.enterstring('txt0', '') + ldtp.waittillguiexist('frmnetwork') + ldtp.mouseleftclick('frmnetwork', 'Office') + ldtp.waittillguiexist('frmLoading*') + ldtp.wait(2) + ldtp.mouseleftclick('frmLoading*', 'Office') + self.assertTrue(ldtp.guiexist('frmLoading*')) + + @unittest.skip('Links not accessible in webkit view') + def test_follow_all_links_from_home(self): + """Click all links on the home page + + Test that following all links on the home page doesn't crash. + Apparently some of the ukn links cause yelp to close so start with 12. + """ + x = ldtp.getwindowlist() + ldtp.wait(5) + links = [item for item in ldtp.getobjectlist(self.window_name) + if 'ukn' in item] + print links + for link in links: + if int(link.replace('ukn', '')) > 11: + ldtp.waittillguiexist(self.window_name) + ldtp.mouseleftclick(self.window_name, link) + ldtp.wait(2) + wname = self.application.get_windowname(discover=True) + ldtp.waittillguiexist(wname) + ldtp.mouseleftclick(wname, 'btnBack') + +if __name__ == "__main__": + unittest.main() diff -Nru qatora-2011-07/debian/bzr-builder.manifest qatora-2011-07/debian/bzr-builder.manifest --- qatora-2011-07/debian/bzr-builder.manifest 2011-07-07 12:48:57.000000000 +0000 +++ qatora-2011-07/debian/bzr-builder.manifest 2011-07-12 13:33:13.000000000 +0000 @@ -1,2 +1,2 @@ -# bzr-builder format 0.3 deb-version {debupstream}-0~11 -lp:qatora revid:guillem.hernandez.sola@gmail.com-20110707104414-qn8e1dh3kod5924h +# bzr-builder format 0.3 deb-version {debupstream}-0~17 +lp:qatora revid:guillem.hernandez.sola@gmail.com-20110712132512-ps7auejy5rxjwe44 diff -Nru qatora-2011-07/debian/changelog qatora-2011-07/debian/changelog --- qatora-2011-07/debian/changelog 2011-07-07 12:48:57.000000000 +0000 +++ qatora-2011-07/debian/changelog 2011-07-12 13:33:13.000000000 +0000 @@ -1,8 +1,8 @@ -qatora (2011-07-0~11~oneiric1) natty; urgency=low +qatora (2011-07-0~17~oneiric1) natty; urgency=low * Auto build. - -- Guillem Hernandez Sola Thu, 07 Jul 2011 12:48:57 +0000 + -- Guillem Hernandez Sola Tue, 12 Jul 2011 13:33:13 +0000 qatora (2011-07-04) natty; urgency=low diff -Nru qatora-2011-07/debian/copyright qatora-2011-07/debian/copyright --- qatora-2011-07/debian/copyright 2011-07-07 12:48:56.000000000 +0000 +++ qatora-2011-07/debian/copyright 2011-07-12 13:33:13.000000000 +0000 @@ -1,10 +1,10 @@ Format-Specification: http://svn.debian.org/wsvn/dep/web/deps/dep5.mdwn?op=file&rev=135 Name: qatora -Maintainer: Guillem Hernandez Sola +Maintainer: Qatora-dev team Source: https://launchpad.net/qatora Files: * -Copyright: (C) Guillem Hernandez Sola guillemhs@gmail.com +Copyright: (C) Qatora-dev team License: GPL-3 The full text of the GPL is distributed in /usr/share/common-licenses/GPL-3 on Debian systems.