--- funkload-1.10.0.orig/build/scripts-2.4/fl-record +++ funkload-1.10.0/build/scripts-2.4/fl-record @@ -0,0 +1,25 @@ +#!/usr/bin/python +# (C) Copyright 2005 Nuxeo SAS +# Author: bdelbosc@nuxeo.com +# +# 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. +# +"""tcpwatch Proxy recorder that output FunkLoad instruction + +$Id: fl-run-bench 24487 2005-08-24 16:13:39Z bdelbosc $ +""" +from funkload.Recorder import RecorderProgram +RecorderProgram().run() + --- funkload-1.10.0.orig/build/scripts-2.4/fl-monitor-ctl +++ funkload-1.10.0/build/scripts-2.4/fl-monitor-ctl @@ -0,0 +1,31 @@ +#!/usr/bin/python + +# (C) Copyright 2005 Nuxeo SAS +# Author: bdelbosc@nuxeo.com +# +# 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. +# +"""Simple client that control the monitor server.""" + +import sys +from funkload.Monitor import MonitorController + +def main(): + """Control monitor server.""" + ctl = MonitorController() + sys.exit(ctl()) + +if __name__ == '__main__': + main() --- funkload-1.10.0.orig/build/scripts-2.4/fl-run-test +++ funkload-1.10.0/build/scripts-2.4/fl-run-test @@ -0,0 +1,25 @@ +#!/usr/bin/python +# (C) Copyright 2005 Nuxeo SAS +# Author: bdelbosc@nuxeo.com +# +# 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. +# +"""Run a funkload unit test. + +$Id: fl-run-bench 24487 2005-08-24 16:13:39Z bdelbosc $ +""" +from funkload.TestRunner import main +main() + --- funkload-1.10.0.orig/build/scripts-2.4/fl-import-from-tm-recorder +++ funkload-1.10.0/build/scripts-2.4/fl-import-from-tm-recorder @@ -0,0 +1,165 @@ +#!/usr/bin/python + +# (C) Copyright 2005 Nuxeo SAS +# Author: bdelbosc@nuxeo.com +# +# 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. +# +"""Convert a unit Test build with the TestMaker Recorder into a FunkLoad test. + +$Id: ftest_utils.py 22915 2005-06-09 15:38:07Z bdelbosc $ +""" +import os +import re +from optparse import OptionParser, TitledHelpFormatter +from funkload.utils import trace + +class TMImportProgram: + """See usage.""" + usage = """%prog tm_script + +This will convert a TestMaker script build with the TM Recorder into a FunkLoad +script and configuration file. + + +Examples +======== + + %prog scenarioName.tm + +This will generate scenario_name.py and scenario_name.conf. +Then you can use + + fl-run-test scenarionName.py +""" + def __init__(self): + self.tm_path = self.scenario = self.server_url = self.options = None + self.parseArgs() + test_name = os.path.splitext(os.path.basename(self.tm_path))[0] + class_name = ''.join([x.capitalize() + for x in re.split('_|-', test_name)]) + self.script_path = os.path.join(os.path.abspath( + self.options.output_dir), 'test_%s.py' % class_name) + self.configuration_path = os.path.join(os.path.abspath( + self.options.output_dir), class_name + '.conf') + self.test_name = test_name + self.class_name = class_name + + def parseArgs(self): + """Parse command line.""" + parser = OptionParser(self.usage, formatter=TitledHelpFormatter()) + cur_path = os.path.abspath(os.path.curdir) + parser.add_option("-o", "--output-directory", type="string", + dest="output_dir", + help="Directory to dump html pages.", + default=cur_path) + self.options, args = parser.parse_args() + if len(args) != 1: + parser.error("incorrect number of arguments") + self.tm_path = os.path.abspath(args[0]) + + + def grep(self, text): + """Grep interesting lines.""" + patterns = ('self.get(', 'self.post(', 'self.params = ') + for pattern in patterns: + if text.find(pattern) != -1: + return 1 + return 0 + + def format(self, text, server_url): + """Reformat python code.""" + text = text.replace("'''", '"') + text = text.replace("self.params", "params") + if text.find('params') != -1: + # always use post if we have some params + text = text.replace('self.get', 'self.post') + text = text.replace('( ', '(') + text = text.replace(' )', ')') + text = text.replace('[ ', '[') + text = text.replace(' ]', ']') + text = text.replace('],[', '],\n [') + if text.find(server_url) != -1: + text = text.replace(server_url, '%s') + text = text.replace('",', '" % server_url,') + text = text.replace('")', '" % server_url)') + return text + + def extractScenario(self): + """Extract and format testmaker action.""" + lines = open(self.tm_path).readlines() + server_url = '?' + for line in lines: + match = re.search('\'(https?://[^\'\/]*)', line) + if match is not None: + server_url = match.group(1) + break + self.scenario = ''.join([self.format(line, server_url) + for line in lines if self.grep(line)]) + self.server_url = server_url + + + def writeScript(self): + """Write the FunkLoad test script.""" + from pkg_resources import resource_string + tpl = resource_string('funkload', 'data/ScriptTestCase.tpl') + content = tpl % {'script': self.scenario, + 'test_name': self.test_name, + 'class_name': self.class_name} + if os.path.exists(self.script_path): + trace("\nError file %s already exists.\n" % self.script_path) + return + f = open(self.script_path, 'w') + f.write(content) + f.close() + + def writeConfiguration(self): + """Write the FunkLoad configuration test script.""" + from pkg_resources import resource_string + tpl = resource_string('funkload', 'data/ConfigurationTestCase.tpl') + content = tpl % {'server_url': self.server_url, + 'test_name': self.test_name, + 'class_name': self.class_name} + if os.path.exists(self.configuration_path): + trace("\nError file %s already exists.\n" % + self.configuration_path) + return + f = open(self.configuration_path, 'w') + f.write(content) + f.close() + + def main(self): + """Convert.""" + self.parseArgs() + trace("Importing %s: ... " % self.tm_path) + self.extractScenario() + trace('done.\n') + trace("Creating %s: ... " % self.script_path) + self.writeScript() + trace('done.\n') + trace("Creating %s: ... " % self.configuration_path) + self.writeConfiguration() + trace('done.\n') + + __call__ = main + + +def main(): + """main.""" + importer = TMImportProgram() + importer() + +if __name__ == '__main__': + main() --- funkload-1.10.0.orig/build/scripts-2.4/fl-install-demo +++ funkload-1.10.0/build/scripts-2.4/fl-install-demo @@ -0,0 +1,37 @@ +#!/usr/bin/python + +# (C) Copyright 2005 Nuxeo SAS +# Author: bdelbosc@nuxeo.com +# +# 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. +# +"""Extract the demo from the funkload egg into the current path.""" +import os +from shutil import copytree +from pkg_resources import resource_filename, cleanup_resources + +def main(): + """main.""" + demo_path = 'funkload-demo' + print "Extract FunkLoad examples into ./%s : ... " % demo_path, + cache_path = resource_filename('funkload', 'demo') + demo_path = os.path.join(os.path.abspath(os.path.curdir), demo_path) + copytree(cache_path, demo_path) + cleanup_resources() + print "done." + + +if __name__ == '__main__': + main() --- funkload-1.10.0.orig/build/scripts-2.4/fl-build-report +++ funkload-1.10.0/build/scripts-2.4/fl-build-report @@ -0,0 +1,26 @@ +#!/usr/bin/python +# (C) Copyright 2005 Nuxeo SAS +# Author: bdelbosc@nuxeo.com +# +# 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. +# +"""Convert a testmaker script into a FunkLoad test. + +$Id: ftest_utils.py 22915 2005-06-09 15:38:07Z bdelbosc $ +""" +from funkload.ReportBuilder import main + +main() + --- funkload-1.10.0.orig/build/scripts-2.4/fl-credential-ctl +++ funkload-1.10.0/build/scripts-2.4/fl-credential-ctl @@ -0,0 +1,31 @@ +#!/usr/bin/python + +# (C) Copyright 2005 Nuxeo SAS +# Author: bdelbosc@nuxeo.com +# +# 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. +# +"""Simple client that control the credential server.""" + +import sys +from funkload.CredentialFile import CredentialFileController + +def main(): + """Control credentiald server.""" + ctl = CredentialFileController() + sys.exit(ctl()) + +if __name__ == '__main__': + main() --- funkload-1.10.0.orig/build/scripts-2.4/fl-run-bench +++ funkload-1.10.0/build/scripts-2.4/fl-run-bench @@ -0,0 +1,25 @@ +#!/usr/bin/python +# (C) Copyright 2005 Nuxeo SAS +# Author: bdelbosc@nuxeo.com +# +# 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. +# +"""Run a funkload unit test in bench mode. + +$Id: fl-run-bench 24568 2005-08-26 15:23:49Z bdelbosc $ +""" +from funkload.BenchRunner import main +main() + --- funkload-1.10.0.orig/debian/fl-run-bench.1 +++ funkload-1.10.0/debian/fl-run-bench.1 @@ -0,0 +1,57 @@ +.TH "FL-RUN-BENCH" "1" "11 December 2007" "Debian Project" "Debian manual" +.SH "NAME" +fl\-record \- runs a funkload test +.SH "SYNOPSIS" +.B fl\-record +.B [ options ] +.B file +.B class.method +.SH "DESCRIPTION" +A funkload test can be turned into a load test, just by invoking the bench runner fl\-run\-bench. +.SH "OPTIONS" +.TP +.B \-\-version +show program's version number and exit +.TP +.B \-\-help, \-h +show this help message and exit +.TP +.B \-\-url=MAIN_URL, \-uMAIN_URL +Base URL to bench. +.TP +.B \-\-cycles=BENCH_CYCLES, \-cBENCH_CYCLES +Cycles to bench, this is a list of number of virtual concurrent users, to run a bench with 3 cycles with 5, 10 and 20 users use: \-c 2:10:20 +.TP +.B \-\-duration=BENCH_DURATION, \-DBENCH_DURATION +Duration of a cycle in seconds. +.TP +.B \-\-sleep\-time\-min=BENCH_SLEEP_TIME_MIN, \-mBENCH_SLEEP_TIME_MIN +Minimum sleep time between request. +.TP +.B \-\-sleep\-time\-max=BENCH_SLEEP_TIME_MAX, \-MBENCH_SLEEP_TIME_MAX +Maximum sleep time between request. +.TP +.B \-\-startup\-delay=BENCH_STARTUP_DELAY, \-sBENCH_STARTUP_DELAY +Startup delay between thread. +.TP +.B \-\-no\-color +Monochrome output. +.TP +.B \-\-accept\-invalid\-links +Do not fail if css/image links are not reachable. +.TP +.B \-\-simple\-fetch +Don't load additional links like css or images when fetching an html page. +.SH "SEE ALSO" +.BR fl\-build\-report (1), +.BR fl\-credential\-ctl (1), +.BR fl\-import\-from\-tm\-recorder (1), +.BR fl\-install\-demo (1), +.BR fl\-monitor\-ctl (1), +.BR fl\-record (1), +.BR fl\-run\-test (1). +.SH "AUTHOR" +Funkload was written by Benoit Delbosc. +.PP +This manual page was written by Jose Parrella , +for the Debian project (but may be used by others). --- funkload-1.10.0.orig/debian/funkload.html +++ funkload-1.10.0/debian/funkload.html @@ -0,0 +1,1701 @@ + + + + + + + FunkLoad + + + + + +
+

FunkLoad

+ + + + + + + + + + + + + + + +
Author:Benoit Delbosc
Address:
+		  bdelbosc _at_ nuxeo.com
+
+
Version:FunkLoad/1.6.2
Revision:README.txt 51931 2007-07-30 08:00:57Z bdelbosc
Copyright:(C) Copyright 2005 Nuxeo SAS (http://nuxeo.com). + 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, write to the Free Software Foundation, Inc., + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+

Abstract

+

This document describes the usage of the FunkLoad tool. This tool + enables to do functional and load testing of web application.

+
+
+

Table of Contents

+ +
+
+

1   Introducing FunkLoad

+
+

1.1   What is FunkLoad ?

+

FunkLoad is a + functional and load web tester, written in Python, whose + main use cases are:

+
    +
  • Functional testing of web projects, and thus regression testing as well.
  • +
  • Performance testing: by loading the web application and monitoring + your servers it helps you to pinpoint bottlenecks, giving a detailed + report of performance measurement.
  • +
  • Load testing tool to expose bugs that do not surface in cursory testing, + like volume testing or longevity testing.
  • +
  • Stress testing tool to overwhelm the web application resources and test + the application recoverability.
  • +
  • Writing web agents by scripting any web repetitive task, like checking if + a site is alive.
  • +
+

Main FunkLoad + features are:

+
    +
  • FunkLoad is + free software distributed under the GNU GPL.
  • +
  • Functional test are pure Python scripts using the pyUnit framework like + normal unit test. Python enable complex scenarios to handle real world + applications.
  • +
  • Truly emulates a web browser (single-threaded) using Richard Jones' + webunit:
      +
    • basic authentication support
    • +
    • cookies support
    • +
    • referrer support
    • +
    • fetching css, javascript and images
    • +
    • emulating a browser cache
    • +
    • file upload and multipart/form-data submission
    • +
    • https support
    • +
    • http_proxy support
    • +
    +
  • +
  • Advanced test runner with many command-line options:
      +
    • set the target server url
    • +
    • display the fetched page in real time in your browser
    • +
    • debug mode
    • +
    • check performance of a single page (or set of pages) inside a test
    • +
    • green/red color mode
    • +
    • select or exclude tests cases using a regex
    • +
    • support normal pyUnit test
    • +
    • support doctest + from a plain text file or embedded in python docstring
    • +
    +
  • +
  • Turn a functional test into a load test: just by invoking the bench runner + you can identify scalability and performance problems.
  • +
  • Detailed bench reports in ReST or HTML (and PDF via ps2pdf) + containing:
      +
    • the bench configuration
    • +
    • tests, pages, requests stats and charts.
    • +
    • the 5 slowest requests.
    • +
    • servers cpu usage, load average, memory/swap usage and network traffic + charts.
    • +
    • an http error summary list
    • +
    +
  • +
  • Easy test customization using a configuration file or command line options.
  • +
  • + Easy test creation using + TCPWatch as proxy + recorder, so you can use your web browser and produce a + FunkLoad + test automatically. +
  • +
  • Provides web assertion helpers.
  • +
  • Provides a funkload.CPSTestCase to ease Zope and Nuxeo CPS testing. +
  • +
  • Easy to install (EasyInstall) + and use, see examples in the demo + folder. +
  • +
+
+
+

1.2   Where to find FunkLoad ?

+

Either:

+
    +
  • +

    Latest stable package using EasyInstall: +

    +
    + sudo easy_install -U funkload
    +
    +
  • +
  • EasyInstall + the latest snapshot +

    +
    + sudo easy_install -f http://funkload.nuxeo.org/snapshots/ funkload
    +
    +
  • +
  • Bleeding edge svn sources:

    +
    +		  easy_install -eb . funkload==dev
    +		  # or
    + svn co http://svn.nuxeo.org/pub/funkload/trunk funkload
    +
    +
  • +
+

See CHANGES file for information about distribution contents.

+
+
+

1.3   Installation

+

See the INSTALL file for + requirement and installation. +

+
+
+

1.4   Examples

+

See the demo + folder contents and a report example.

+

For package installed with easy_install you need to run + fl-install-demo + to extract the demo examples.

+
+
+

1.5   Documentation

+

This page is the main FunkLoad + documentation, there are also:

+
    +
  • CHANGES for information about + distribution contents. +
  • +
  • INSTALL for requirement and installation. +
  • +
  • API documentation generated with + epydoc. +
  • +
  • SLIDES + introducing FunkLoad. +
  • +
+
+
+

1.6   Credits

+

Thanks to Frank Cohen's TestMaker + framework and Richard Jones webunit + package.

+
+
+
+

2   Test runner

+

A FunkLoad test can + be used like a standard unittest using a unittest.main() + and a 'python MyFile.py'.

+

To ease testing FunkLoad + come with an advanced test runner to override + the static configuration file.

+

The loop-on-pages option + enable to check response time of some specific + pages inside a test without changing the script, which make easy to tune a + page in a complex context. Use the debug option to find the page numbers.

+

Note that fl-run-test + can be used to launch normal unittest.TestCase and + (if you use python2.4) doctest in a + plain text file or embedded in a python + docstring. The --debug + option makes doctests verbose.

+
+

2.1   Usage

+
+ fl-run-test [options] file [class.method|class|suite] [...]
+
+
+
+

2.2   Examples

+
+ fl-run-test myFile.py
+	      Run all tests (including doctest with python2.4).
+
+ fl-run-test myFile.py test_suite
+	      Run suite named test_suite.
+
+ fl-run-test myFile.py MyTestCase.testSomething
+	      Run a single test MyTestCase.testSomething.
+
+ fl-run-test myFile.py MyTestCase
+	      Run all 'test*' test methods in MyTestCase.
+
+ fl-run-test myFile.py MyTestCase -u http://localhost
+	      Same against localhost.
+
+ fl-run-test myDocTest.txt
+	      Run doctest from plain text file (requires python2.4).
+
+ fl-run-test myDocTest.txt -d
+	      Run doctest with debug output (requires python2.4).
+
+ fl-run-test myfile.py -V
+	      Run default set of tests and view in real time each
+	      page fetch with firefox.
+
+ fl-run-test  myfile.py MyTestCase.testSomething -l 3 -n 100
+	      Run MyTestCase.testSomething, reload one hundred
+	      time the page 3 without concurrency and as fast as
+	      possible. Output response time stats. You can loop
+	      on many pages using slice -l 2:4.
+
+ fl-run-test myFile.py -e [Ss]ome
+	      Run all tests that match the regex [Ss]ome.
+
+ fl-run-test myFile.py -e '!foo$'
+	      Run all tests that does not ends with foo.
+
+ fl-run-test myFile.py --list
+	      List all the test names.
+
+ fl-run-test -h
+	      More options.
+
+
+
+

2.3   Options

+
+ --version               show program's version number and exit
+ --help, -h              show this help message and exit
+ --quiet, -q             Minimal output.
+ --verbose, -v           Verbose output.
+ --debug, -d             FunkLoad and doctest debug output.
+ --debug-level=DEBUG_LEVEL
+	                 Debug level 2 is more verbose.
+ --url=MAIN_URL, -uMAIN_URL
+			 Base URL to bench without ending '/'.
+ --sleep-time-min=FTEST_SLEEP_TIME_MIN, -mFTEST_SLEEP_TIME_MIN
+			 Minumum sleep time between request.
+ --sleep-time-max=FTEST_SLEEP_TIME_MAX, -MFTEST_SLEEP_TIME_MAX
+			 Maximum sleep time between request.
+ --dump-directory=DUMP_DIR
+			 Directory to dump html pages.
+ --firefox-view, -V      Real time view using firefox, you must have a running
+			 instance of firefox in the same host.
+ --no-color              Monochrome output.
+ --loop-on-pages=LOOP_STEPS, -lLOOP_STEPS
+		         Loop as fast as possible without concurrency on pages
+			 expect a page number or a slice like 3:5. Output some
+			 statistics.
+ --loop-number=LOOP_NUMBER, -nLOOP_NUMBER
+		         Number of loop.
+ --accept-invalid-links  Do not fail if css/image links are not reachable.
+ --simple-fetch          Don't load additional links like css or images when
+			 fetching an html page.
+ --stop-on-fail          Stop tests on first failure or error.
+ --regex=REGEX, -eREGEX  The test names must match the regex.
+ --list                  Just list the test names.
+
+
+
+
+

3   Benching

+

The same FunkLaod test can be turned into a load test, just by invoking the + bench runner fl-run-bench.

+
+

3.1   Principle

+

Here are some definitions used in bench mode:

+
    +
  • CUs: Concurrent Users, which is the number of threads.
  • +
  • STPS: Average of Successful Tests Per Second during a cycle.
  • +
  • SPPS: Average of Successfully Page Per Second during a cycle.
  • +
  • RPS: Average Request Per Second, successfully or not.
  • +
  • max[STPS|SPPS|RPS]: maximum of STPS|SPPS|RPS for a cycle.
  • +
+
+

Page

+

A page is an http get/post request with associated sub requests like + redirects, images or links (css, js files). This is what users see as a + single page.

+
+
+

Test

+

A test is made with 3 methods: setUp/test_name/tearDown. During the test_name + method each get/post request is called a page.

+
+[setUp][page 1]    [page 2] ... [page n]   [tearDown]
+======================================================> time
+	<----------------------------------> test method
+	       <--> sleeptime_min to sleeptime_max
+	<-----> page 1 connection time
+
+
+
+

Cycle

+

A cycle is a load of n concurrents test during a 'duration' period. + Threads are launched every 'startupdelay' seconds, each thread executes + test in a loop.

+

Once all threads have been started we start to record stats.

+

Only tests that end during the 'duration' period are taken into account + for the test stats (in the representation below test like [---X are not + take into account).

+

Only pages and requests that finish during the 'duration' are taken into + account for the request and pages statistic

+

Before a cycle a setUpCycle method is called, after a cycle a tearDownCycle + method is called, you can use these methods to test differents server + configuration for each cycle.

+
+Threads
+^
+|
+|
+|n                   [---test--]   [--------]   [--|---X
+|...
+|                    |                             |
+|2            [------|--]   [--------]   [-------] |
+|                    |                             |
+|1          [------X | [--------]   [-------]   [--|--X
+|                    |                             |
+|[setUpCycle]        |                             |    [tearDownCycle]
+===========================================================> time
+                     <------ cycle duration ------->
+ <----- staging ----->                             <---- staging ----->
+            <-> startupdelay    <---> sleeptime
+
+
+
+

Cycles

+

FunkLoad can execute many cycles with different number of CUs, this way you + can find easily the maximum number of users that your application can + handle.

+

Running n cycles with the same CUs is a good way to see how the application + handles a writing test over time.

+

Running n cycles with the same CUs with a reading test and a setUpCycle that + change the application configuration will help you to find the right tuning.

+
+cvus = [n1, n2, ...]
+
+Threads
+^
+|
+|
+|n2                            __________
+|                             /          \
+|                            /            \
+|n1   _________             /              \
+|    /         \           /                \
+|   /           \         /                  \
+|  /             \       /                    \
+==================================================> time
+      <------->   duration     <-------->
+		  <-----> cycle sleep time
+
+
+
+
+

3.2   Bench runner

+
+

Usage

+
+ fl-run-bench [options] file class.method
+
+
+
+

Examples

+
+fl-run-bench myFile.py MyTestCase.testSomething
+		Bench MyTestCase.testSomething using MyTestCase.conf.
+fl-run-bench -u http://localhost:8080 -c 10:20 -d 30 myFile.py MyTestCase.testSomething
+		Bench MyTestCase.testSomething on localhost:8080
+		with 2 cycles of 10 and 20 users during 30s.
+fl-run-bench -h
+		More options.
+
+
+
+

Options

+
+--version               show program's version number and exit
+--help, -h              show this help message and exit
+--url=MAIN_URL, -uMAIN_URL
+			Base URL to bench.
+--cycles=BENCH_CYCLES, -cBENCH_CYCLES
+			Cycles to bench, this is a list of number of virtual
+			concurrent users, to run a bench with 3 cycles with 5,
+			10 and 20 users use: -c 2:10:20
+--duration=BENCH_DURATION, -DBENCH_DURATION
+			Duration of a cycle in seconds.
+--sleep-time-min=BENCH_SLEEP_TIME_MIN, -mBENCH_SLEEP_TIME_MIN
+			Minimum sleep time between request.
+--sleep-time-max=BENCH_SLEEP_TIME_MAX, -MBENCH_SLEEP_TIME_MAX
+			Maximum sleep time between request.
+--startup-delay=BENCH_STARTUP_DELAY, -sBENCH_STARTUP_DELAY
+			Startup delay between thread.
+--no-color              Monochrome output.
+--accept-invalid-links  Do not fail if css/image links are not reachable.
+--simple-fetch          Don't load additional links like css or images when
+			fetching an html page.
+
+
+
+
+

3.3   Tips

+

Here are few remarks/advices to obtain workable metrics.

+
    +
  • Since it uses significant CPU resources, make sure that performance limits + are not hit by FunkLoad before your server's limit is reached. + Check this by launching a bench from another host.

    +
  • +
  • Having a cycle with one user gives a usefull reference.

    +
  • +
  • A bench is composed of a benching test (or scenario) run many times. A good + benching test should not be too long so you have a higher testing rate (that + is, more benching tests can come to their end).

    +
  • +
  • The cycle duration for the benching test should be long enough. + Around 5 times the duration of a single benching test is a value that is + usually a safe bet. You can obtain this duration of a single benching test by + running fl-run-test myfile.py MyTestCase.testSomething.

    +

    Rationale : Normally a cycle duration of a single benching test should be + enough. But from the testing platform side if there are more than one + concurrent user, there are many threads to start and it takes some time. And on + from the tested platform side it is common that a benching test will last + longer and longer as the server is used by more and more users.

    +
  • +
  • You should use many cycles with the same step interval to produce readable + charts (1:10:20:30:40:50:60 vs 1:10:100)

    +
  • +
  • A benching test must have the same number of page and in the same + order.

    +
  • +
  • Use a Makefile to make reproductible bench.

    +
  • +
  • There is no debug option while doing a bench (since this would be illegible + with all the threads). So, if a bench fails (that is using fl-run-bench), + use fl-run-test -d to debug.

    +
  • +
  • Using fl-record is very easy and very fast to create a scenario. But since + it doesn't support HTTPS, the good practise is to first record a scenario + with fl-record on HTTP, and then change the url back to https in your + FunkLoad test configuration file.

    +
  • +
  • Always use description in post/get/xmlrpc, this improves the + readability of the report.

    +
  • +
+
+
+
+

4   Bench report

+

To produce an HTML or ReST report you need to invoke the fl-build-report, + you can easily produce PDF report using Firefox 'Print To File' in + PostScript then use the ps2pdf converter.

+
+

4.1   Usage

+
+ fl-build-report [options] xmlfile
+
+

fl-build-report analyze a FunkLoad bench xml result file and output a + report.

+
+
+

4.2   Examples

+
+ fl-build-report funkload.xml
+	      ReST rendering into stdout.
+ fl-build-report --html -o /tmp funkload.xml
+	      Build an HTML report in /tmp.
+ fl-build-report -h
+	      More options.
+
+
+
+

4.3   Options

+
+--version               show program's version number and exit
+--help, -h              show this help message and exit
+--html, -H              Produce an html report.
+--output-directory=OUTPUT_DIR, -oOUTPUT_DIR
+			Directory to store reports.
+
+
+ Note that you can preview the report for cycles that have been done while
+ the bench is still running by invoking the above command.
+
+
+
+
+

5   Test Recorder

+
+

5.1   Recording a new FunkLoad test

+

Starting with FunkLoad 1.3.0 you can use fl-record to record your + navigator activity, this requires the TCPWatch python proxy see INSTALL + for information on how to install TCPWatch.

+
    +
  1. Start the recorder:

    +
    + fl-record basic_navigation
    +
    +
  2. +
+
+

This will output something like this:

+
+Hit Ctrl-C to stop recording.
+HTTP proxy listening on :8090
+Recording to directory /tmp/tmpaYDky9_funkload.
+
+
+
    +
  1. Setup your browser proxy and play your scenario
  2. +
+
+
    +
  • in Firefox: Edit > Preferencies > General; Connection Settings set + localhost:8090 as your HTTP proxy

    +
  • +
  • Play your scenario using your navigator

    +
  • +
  • Hit Ctrl-C to stop recording:

    +
    +^C
    +# Saving uploaded file: foo.png
    +# Saving uploaded file: bar.pdf
    +Creating script: ./test_BasicNavigation.py.
    +Creating configuration file: ./BasicNavigation.conf.
    +
    +
  • +
+
+
    +
  1. Replay you scenario:

    +
    + fl-run-test -dV test_BasicNavigation.py
    +
    +
  2. +
+
+ You should see all the steps on your navigator.
+
    +
  1. Implement the dynamic part and assertion
  2. +
+
+
    +
  • Code the dynamic part like getting new url of a created document
  • +
  • Add assertion using FunkLoad helpers
  • +
  • Use a credential server if you want to make a bench with different users + or simply don't want to hard code your login/password.
  • +
+
+

Note that fl-record works fine with multi-part encoded form and file upload + but will failed to record https session.

+
+
+

5.2   The fl-record command

+
+

Usage

+
+ fl-record [options] [test_name]
+
+ fl-record launch a TCPWatch_ proxy and record activities, then output
+	   a FunkLoad script or generates a FunkLoad unit test if test_name
+	   is specified. The default proxy port is 8090.
+
+ Note that tcpwatch.py executable must be accessible from your env.
+
+
+
+

Examples

+
+fl-record foo_bar
+		Run a proxy and create a FunkLoad test case,
+		generates test_FooBar.py and FooBar.conf file.
+		To test it:  fl-run-test -dV test_FooBar.py
+fl-record -p 9090
+		Run a proxy on port 9090, output script to stdout.
+fl-record -i /tmp/tcpwatch
+		Convert a tcpwatch capture into a script.
+
+
+
+

Options

+
+--version               show program's version number and exit
+--help, -h              show this help message and exit
+--verbose, -v           Verbose output
+--port=PORT, -pPORT     The proxy port.
+--tcp-watch-input=TCPWATCH_PATH, -iTCPWATCH_PATH
+			Path to an existing tcpwatch capture.
+
+
+
+
+
+

6   Credential server

+

If you are writing a bench that requires to be logged with different users + FunkLoad provides an xmlrpc credential server to serve login/pwd between the + different threads.

+

It requires 2 files (like unix /etc/passwd and /etc/group) the password file + have the following format:

+
+login1:pwd1
+...
+
+

The group file format is:

+
+group1:user1, user2
+group2:user2
+# you can split group declaration
+group1:user3
+...
+
+

Setup a configuration file like in the demo/cmf folder, then start the + credential server:

+
+ fl-credential-ctl credential.conf start
+
+

More options:

+
+ fl-credential-ctl --help
+
+

See the funkload-demo/cmf example for a credential configuration file.

+
+
+

7   Monitor server

+

If you want to monitor a linux server health during the bench, you have to + run a monitor xmlrpc server on the target server, this require to install + the FunkLoad package.

+

On the server side you need to install the FunkLoad tool then launch the + server using a configuration file (example in the demo/simple + folder.):

+
+ fl-monitor-ctl monitor.conf start
+
+ # more info
+ fl-monitor-ctl --help
+
+

On the bench host side setup your test configuration like this:

+
+ [monitor]
+ hosts = server.to.test.com
+
+ [server.to.test.com]
+ description = The web server
+ port = 8008
+
+

Then run the bench, the report will include server stats.

+

Note that you can monitor multiple hosts and that the monitor is linux + specific.

+
+
+

8   The FunkLoadTestCase

+

FunkLoadTestCase extends the pyUnit unittest.TestCase with browser + capabilities, configuration file helpers and assertions helpers. FunkLoad + provides also some tools to generate random inputs and communicate with + credential servers.

+

Here is an overview of the api, you can find more on

+
+

8.1   Browser API

+
+

get

+
+ get(url, params=None, description=None, ok_codes=None)
+
+

This emulates a browser http GET link. It will fetch the url, submits + appropriate cookies, follow redirection, register new cookies, load css and + javascript.

+

It also simulates a browser cache by not reloading a css, a javascript or an + image twice.

+

Note that this is an emulation with some limitation:

+
    +
  • It is single threaded (it loads images one after the other)
  • +
  • It does not interpret javascript
  • +
  • See trac tickets that starts with Browser: for other limitations
  • +
+

This method returns a webunit HTTPResponse.

+

Parameters:

+
    +
  • url a valid url
  • +
  • params a dico of parameters that going to be append to the url like + url?key1=value1&...
  • +
  • description is used on the bench report to describe the user action
  • +
  • ok_codes is a list of http expected code like [200:301] if the http + response is not in the list get will raise a test failure exception, + if not provided assume that the default list is [200, 301, 302].
  • +
+

Note that if the url already contains encoded parameters you should not + use the params parameter.

+
+
+

post

+
+ post(url, params=None, description=None, ok_codes=None)
+
+

Same interface than the get() but it uses a http post method. + You can upload a file by setting a params like this:

+
+ from webunit.utility import Upload
+ params['file_up'] = Upload('/tmp/foo.txt')
+
+
+
+

exists

+
+ exists(url, params=None, description="Checking existence")
+
+

Return True if the http response code is 200, 301 or 302, and return False if + http code is 404 or 503, other codes will raise a test failure exception.

+
+
+

setBasicAuth

+
+ setBasicAuth(login, password)
+
+

Next requests will use the http basic authentication.

+
+
+

clearBasicAuth

+
+ clearBasicAuth()
+
+

Remove basic auth credential set by setBasicAuth.

+
+
+

setUserAgent

+
+ setUserAgent(agent)
+
+

New in 1.3.0. version.

+

Set a User-Agent http header for the next requests, the default browser + behaviour is to use the agent defined in the configuration file under + [main] + user_agent or to use the default + FunkLoad/version + string. Using this method enable to change the user agent during a test + case.

+
+
+

addHeader

+
+ addHeader(key, value)
+
+

New in 1.3.0. version.

+

Add an http header for the next requests.

+
+
+

clearHeaders

+
+ clearHeaders()
+
+

New in 1.3.0. version.

+

Remove all headers previously added by addHeader or setUserAgent, + and remove the referer as well.

+
+
+
+

8.2   XML RPC API

+

You can test or bench xmlrpc services using the following API.

+
+

xmlrpc

+
+ xmlrpc(url, method_name, params=None, description=None)
+
+

Call the method_name at url using xmlrpclib. You can use the + setBasicAuth method before to handle the http basic authentication. Note + that due to xmlrpclib limitation you can not use an http proxy.

+

Parameters:

+
    +
  • url the url of the xmlrpc server
  • +
  • method_name the name of the procedure to call
  • +
  • params a list of parameters to pass to the method
  • +
  • description is used on the bench report to describe the action
  • +
+
+
+
+

8.3   Assertion helpers API

+

FunkLoad uses the unittest assertion (assert_, assertEquals, + fail, ...), but provides some methods to check the http response. + After fetching a page you can use the following methods.

+
+

getLastUrl

+
+ getLastUrl()
+
+

Return the last accessed page url taking care of redirects.

+
+
+

getLastBaseUrl

+
+ getLastBaseUrl()
+
+

Return the <base /> href value of the last accessed page.

+
+
+

listHref

+
+ listHref(pattern=None)
+
+

Return a list of href anchor url present in the last html response, + filtering href using the pattern + regex if present.

+
+
+

getBody

+
+ getBody()
+
+

Return the last response content.

+
+
+

The response object

+

The response returned by a get or post are webunit HTTPResponse object

+
+ response = self.get(url)
+ print "http response code %s" % response.code
+ print "http header location %s" % response.headers['location']
+ self.assert_('HTML' in response.body)
+
+
+ response.getDOM().getByName('h1')
+
+

getDOM return a SimpleDOM interface of the fetched html page, see the + webunit SimpleDOM api instructions for details.

+
+
+
+

8.4   Configuration file API

+

A FunkLoadTestCase class uses a configuration file to setup variable + configuration, like the base server url to be tested, the test description, + credential access, logging files and other test specific parameters. The test + configuration file have the same name of the FunkLoadTestCase with a '.conf' + extension. See documented examples in the demo folder (fl-install-demo).

+
+

conf_get

+
+ conf_get(section, key, default=_marker)
+
+

Return an entry from the configuration file. Note that the entry may be + overriden by a command line option.

+

Parameters:

+
    +
  • section the section in the configuration file.
  • +
  • key the key.
  • +
  • default a default value.
  • +
+
+
+

conf_getInt

+

Return an integer.

+
+
+

conf_getFloat

+

Return a float.

+
+
+

conf_getList

+

Additional parameter:

+
    +
  • separator the default separator is a colon ':'.
  • +
+

Return a list

+
+
+
+

8.5   Logging

+

A FunkLoadTestCase store its results in an xml file (like request and test + result) and put other log information into a text log and/or output to the + console.

+
+

logd

+
+ logd(message)
+
+

Debug log message

+
+
+

logi

+
+ logi(message)
+
+

Information log message

+
+
+
+

8.6   Lipsum API

+

To generate dummy document contents you can use the funkload.Lipsum api, + this is a very simple "Lorem ipsum" generator.

+

You can see some examples by doing:

+
+ python -c "from funkload.Lipsum import main; main()"
+
+
+

Lipsum

+
+ from funkload.Lipsum import Lipsum
+ lipsum = Lipsum(vocab=V_ASCII, chars=CHARS, sep=SEP)
+
+

Parameters:

+
    +
  • vocab a list of word, Lipsum provide 3 lists V_ASCII, V_DIAC, V_8859_15
  • +
  • chars the list of char used to build an identifier
  • +
  • sep some separators used in sentences like coma, question mark ...
  • +
+
+
+

getWord

+
+ lipsum.getWord()
+
+

Return a random word from the vocabulary.

+
+
+

getUniqWord

+
+ lipsum.getUniqWord(length_min=None, length_max=None):
+
+

Generate a kind of uniq id.

+
+
+

getSubject

+
+ lipsum.getSubject(length=5, prefix=None, uniq=False,
+ length_min=None, length_max=None)
+
+

Return a subject of length word.

+

Parameters:

+
    +
  • length the number of words in the subject
  • +
  • prefix a prefix to add at the beginning of a the subject
  • +
  • uniq add an uniq identifier in the subject
  • +
  • length_min/max the words length is a random between min and max
  • +
+
+
+

getSentence

+
+ lipsum.getSentence()
+
+

Return a sentence with some separators and and a ending point.

+
+
+

getParagraph

+
+ lipsum.getParagraph(length=4)
+
+

Return a paragraph of length sentences.

+
+
+

getMessage

+
+ lipsum.getMessage(length=7)
+
+

Return a message with length Paragraphs.

+
+
+

getPhoneNumber

+
+ lipsum.getPhoneNumber(lang="fr", format="medium")
+
+

Return a random phone number.

+

Parameters:

+
    +
  • lang can be fr or en_US
  • +
  • format can be short, medium or long
  • +
+
+
+

getAddress

+
+ lipsum.getAddress(lang="fr")
+
+

Return a random address.

+
+
+
+

8.7   Utils

+

To communicate with FunkLoad + services like the credential server, there are + some wrappers in the utils module.

+
+

xmlrpc_get_credential

+
+ from funkload.utils import xmlrpc_get_credential
+ xmlrpc_get_credential(credential_host, credential_port, group=None)
+
+

Return a tuple login, password of a user that belong to group if specified.

+
+
+

xmlrpc_list_groups

+

List groups name served by the credential server.

+
+
+

xmlrpc_list_credentials

+

List all login/password served by the credential server.

+
+
+
+
+

9   FunkLoadDocTest

+

Since FunkLoad 1.5 + you can use funkload easily from a doctest:

+
+  >>> from funkload.FunkLoadDocTest import FunkLoadDocTest
+  >>> fl = FunkLoadDocTest()
+  >>> response = fl.get('http://localhost/')
+  >>> 'HTML' in response.body
+  True
+  >>> response
+  <response url="http://127.0.0.1:80/" code="200" message="OK" />
+
+

FunkLoadDocTest exposes the same API than The FunkLoadTestCase.

+
+
+

10   Other Test Cases

+
+

10.1   The ZopeTestCase

+

This class extends the FunkLoadTestCase providing common Zope tasks.

+
+

zopeRestart

+
+ zopeRestart(zope_url, admin_id, admin_pwd, time_out=600)
+
+

Stop and Start the Zope server.

+

Parameters:

+
    +
  • zope_url the zope url.
  • +
  • admin_id and admin_pwd the zope admin credential.
  • +
  • time_out maximum time to wait until the zope server restart.
  • +
+
+
+

zopePackZodb

+
+ zopePackZodb(zope_url, admin_id, admin_pwd, database="main", days=0)
+
+

Pack a zodb database.

+

Parameters:

+
    +
  • database the database to pack.
  • +
  • days removing previous revision that are older than days ago
  • +
+
+
+

zopeFlushCache

+
+ zopeFlushCache(zope_url, admin_id, admin_pwd, database="main")
+
+

Remove all objects from all ZODB in-memory caches.

+
+
+

zopeAddExternalMethod

+
+ zopeAddExternalMethod(parent_url, admin_id, admin_pwd,
+ method_id, module, function, run_it=True)
+
+

Add an External method an run it.

+
+
+
+

10.2   CPSTestCase

+

This class extends the ZopeTestCase providing common Nuxeo CPS tasks. You + need to import the CPSTestCase that works with your CPS for example + CPS338TestCAse or CPS340TestCase.

+
+

cpsCreateSite

+
+ cpsCreateSite(admin_id, admin_pwd,
+ manager_id, manager_password,
+ manager_mail, langs=None,
+ title=None, description=None,
+ interface="portlets", zope_url=None, site_id=None)
+
+

Build a new CPS site.

+

Parameters:

+
    +
  • admin_id and admin_pwd the zope admin credential.
  • +
  • manager_id and manager_pwd the cps manager credential.
  • +
  • zope_url the Zope server url [*].
  • +
  • site_id the CPS site id.
  • +
+ + + + + +
[*]if the zope_url and site_id is not given we guess it using the + server_url
+
+
+

cpsLogin

+
+ cpsLogin(login, password)
+
+

CPS log in.

+
+
+

cpsLogout

+

Logout the user logged in using cpsLogin.

+
+
+

cpsCreateGroup

+
+ cpsCreateGroup(group_name)
+
+

Create a CPS group.

+
+
+

cpsVerifyGroup

+
+ cpsVerifyGroup(group_name)
+
+

Create a CPS group if not present.

+
+
+

cpsCreateUser

+
+ cpsCreateUser(user_id=None, user_pwd=None,
+ user_givenName=None, user_sn=None,
+ user_email=None, groups=None):
+
+

Create a CPS users.

+
+
+

cpsVerifyUser

+

Create a CPS + users if not present.

+
+
+

cpsSetLocalRole

+
+ cpsSetLocalRole(url, name, role)
+
+

Grant role to name in url.

+
+
+

cpsCreateSection

+
+ cpsCreateSection(parent_url, title, description)
+
+
+
+

cpsCreateWorkspace

+
+ cpsCreateWorkspace(parent_url, title, description)
+
+
+
+

cpsCreateDocument

+
+ cpsCreateDocument(parent_url)
+
+

Create a random document in the parent_url container.

+
+
+

cpsCreateNewsItem

+
+ cpsCreateNewsItem(parent_url)
+
+

Create a simple news in the parent_url container.

+
+
+

cpsChangeUiLanguage

+
+ cpsChangeUiLanguage(lang)
+
+

Change the ui locale selection

+
+
+

cpsListDocumentHref

+
+ cpsListDocumentHref(pattern)
+
+

Return a clean list of document href that matches pattern in the previous + page fetched.

+
+
+

cpsSearchDocId

+
+ cpsSearchDocId(doc_id)
+
+

Return the list of url that ends with doc_id, using catalog search.

+
+
+
+
+

11   Todo and bugs

+ +

If you want to report a bug or if you think that something is + missing, send me an email.

+ + + + +
+
+ + + + --- funkload-1.10.0.orig/debian/fl-credential-ctl.1 +++ funkload-1.10.0/debian/fl-credential-ctl.1 @@ -0,0 +1,35 @@ +.TH "FL-CREDENTIAL-CTL" "1" "11 December 2007" "Debian Project" "Debian manual" +.SH "NAME" +fl\-credential\-ctl \- XML\-RPC credential server for funkload +.SH "SYNOPSIS" +.B fl\-credential\-ctl +.B [ options ] +.B config_file +.B [ start | startd | stop | restart | status | test ] +.SH "DESCRIPTION" +fl\-credential\-ctl controls the XML\-RPC based credential server for Funkload. This server is meant to be used in order to write benchs that require authentication. +.PP +A configuration file needs to be setup in order to use this server. Please refer to demo/cmf/credential.conf for an example. +.SH "OPTIONS" +.TP +.B \-\-version +Show program's version number and exit +.TP +.B \-\-help, \-h +Show a help message and exit +.TP +.B \-\-quiet, \-q +Verbose output +.SH "SEE ALSO" +.BR fl\-build\-report (1), +.BR fl\-import\-from\-tm\-recorder (1), +.BR fl\-install\-demo (1), +.BR fl\-monitor\-ctl (1), +.BR fl\-record (1), +.BR fl\-run\-bench (1), +.BR fl\-run\-test (1). +.SH "AUTHOR" +Funkload was written by Benoit Delbosc. +.PP +This manual page was written by Jose Parrella , +for the Debian project (but may be used by others). --- funkload-1.10.0.orig/debian/fl-run-test.1 +++ funkload-1.10.0/debian/fl-run-test.1 @@ -0,0 +1,83 @@ +.TH "FL-RUN-TEST" "1" "11 December 2007" "Debian Project" "Debian manual" +.SH "NAME" +fl\-run\-test \- runs a funkload test file +.SH "SYNOPSIS" +.B fl\-record +.B [ options ] +.B file +.B [ class.method | class | suite ] +.SH "DESCRIPTION" +A FunkLoad test can be used like a standard unittest using a unittest.main() and a 'python MyFile.py'. + +Note that fl\-run\-test can be used to launch normal unittest.TestCase and (if you use python2.4) doctest in a plain text file or embedded in a python docstring. The \-\-debug option makes doctests verbose. +.SH "OPTIONS" +.TP +.B \-\-version +show program's version number and exit +.TP +.B \-\-help, \-h +show this help message and exit +.TP +.B \-\-quiet, \-q +Minimal output. +.TP +.B \-\-verbose, \-v +Verbose output. +.TP +.B \-\-debug, \-d +FunkLoad and doctest debug output. +.TP +.B \-\-debug\-level=DEBUG_LEVEL +Debug level 2 is more verbose. +.TP +.B \-\-url=MAIN_URL, \-uMAIN_URL +Base URL to bench without ending '/'. +.TP +.B \-\-sleep\-time\-min=FTEST_SLEEP_TIME_MIN, \-mFTEST_SLEEP_TIME_MIN +Minumum sleep time between request. +.TP +.B \-\-sleep\-time\-max=FTEST_SLEEP_TIME_MAX, \-MFTEST_SLEEP_TIME_MAX +Maximum sleep time between request. +.TP +.B \-\-dump\-directory=DUMP_DIR +Directory to dump html pages. +.TP +.B \-\-firefox\-view, \-V +Real time view using firefox, you must have a running instance of firefox in the same host. +.TP +.B \-\-no\-color +Monochrome output. +.TP +.B \-\-loop\-on\-pages=LOOP_STEPS, \-lLOOP_STEPS +Loop as fast as possible without concurrency on pages expect a page number or a slice like 3:5. Output some statistics. +.TP +.B \-\-loop\-number=LOOP_NUMBER, \-nLOOP_NUMBER +Number of loop. +.TP +.B \-\-accept\-invalid\-links +Do not fail if css/image links are not reachable. +.TP +.B \-\-simple\-fetch +Don't load additional links like css or images when fetching an html page. +.TP +.B \-\-stop\-on\-fail +Stop tests on first failure or error. +.TP +.B \-\-regex=REGEX, \-eREGEX +The test names must match the regex. +.TP +.B \-\-list +Just list the test names. +.SH "SEE ALSO" +.BR fl\-build\-report (1), +.BR fl\-credential\-ctl (1), +.BR fl\-import\-from\-tm\-recorder (1), +.BR fl\-install\-demo (1), +.BR fl\-monitor\-ctl (1), +.BR fl\-record (1), +.BR fl\-run\-bench (1). +.SH "AUTHOR" +Funkload was written by Benoit Delbosc. +.PP +This manual page was written by Jose Parrella , +for the Debian project (but may be used by others). --- funkload-1.10.0.orig/debian/docs +++ funkload-1.10.0/debian/docs @@ -0,0 +1,8 @@ +CHANGES.txt +INSTALL.txt +LICENSE.txt +README.txt +README.txt +TODO.txt +TODO.txt +src/funkload.egg-info --- funkload-1.10.0.orig/debian/compat +++ funkload-1.10.0/debian/compat @@ -0,0 +1 @@ +5 --- funkload-1.10.0.orig/debian/note-to-self +++ funkload-1.10.0/debian/note-to-self @@ -0,0 +1 @@ +current tree 16 --- funkload-1.10.0.orig/debian/rules +++ funkload-1.10.0/debian/rules @@ -0,0 +1,28 @@ +#!/usr/bin/make -f + +PACKAGE=funkload + +export DH_VERBOSE=1 + +UPSTREAM_VERSION=1.10.0 + + +DEB_PYTHON_SYSTEM=pycentral + +DEB_PYTHON_VERSIONS=all + + +include /usr/share/cdbs/1/rules/debhelper.mk +include /usr/share/cdbs/1/rules/simple-patchsys.mk +include /usr/share/cdbs/1/class/python-distutils.mk + +binary-install/funkload:: + cp -a CHANGES.txt debian/funkload/usr/share/doc/funkload/changelog + rm -f debian/funkload/usr/share/doc/funkload/CHANGES.txt.* + cp -a debian/funkload.html debian/funkload/usr/share/doc/funkload + (echo -n "current tree "; bzr revno ) > debian/note-to-self || true + cp -a debian/note-to-self debian/funkload/usr/share/doc/funkload + dh_installman debian/*.1 + perl debian/dh_installoverrides + rm -fr debian/funkload/usr/lib + --- funkload-1.10.0.orig/debian/control +++ funkload-1.10.0/debian/control @@ -0,0 +1,26 @@ +Source: funkload +Section: web +Priority: extra +Maintainer: Ubuntu Developers +XSBC-Original-Maintainer: Toni Mueller +Build-Depends: python, cdbs, debhelper (>= 5), docbook-to-man, python-docutils, python-central (>= 0.5), python-setuptools +XS-Python-Version: >= 2.5 +Standards-Version: 3.8.0 + +Package: funkload +Architecture: all +Depends: python (>= 2.4), python-central (>= 0.5), python-pkg-resources, python-webunit (>= 1:1.3.8) +Conflicts: python-webunit (>= 1:1.3.9), python-setuptools +Recommends: tcpwatch-httpproxy, python-gdchart2, python-docutils, gnuplot +XB-Python-Version: ${python:Versions} +Description: web testing tool + This web testing tool is designed to allow testing the functionality + and performance of web applications in the same spirit as Perl's + WWW::Mechanize. The tool supports recording clicks through a website, + saving them into a Python class which you can later modify, and + playing them back later. This allows you to script your web + applications. 'funkload' also supports performance and load testing + your applications. The package was specifically created with testing + Zope applications in mind. + . + --- funkload-1.10.0.orig/debian/fl-install-demo.1 +++ funkload-1.10.0/debian/fl-install-demo.1 @@ -0,0 +1,20 @@ +.TH "FL-INSTALL-DEMO" "1" "11 December 2007" "Debian Project" "Debian manual" +.SH "NAME" +fl\-install\-demo \- installs funkload demonstration files +.SH "SYNOPSIS" +.B fl\-install\-demo +.SH "DESCRIPTION" +fl\-install\-demo installs the funkload demonstration files in ./funkload\-demo +.SH "SEE ALSO" +.BR fl\-build\-report (1), +.BR fl\-credential\-ctl (1), +.BR fl\-import\-from\-tm\-recorder (1), +.BR fl\-monitor\-ctl (1), +.BR fl\-record (1), +.BR fl\-run\-bench (1), +.BR fl\-run\-test (1). +.SH "AUTHOR" +Funkload was written by Benoit Delbosc. +.PP +This manual page was written by Jose Parrella , +for the Debian project (but may be used by others). --- funkload-1.10.0.orig/debian/dh_installoverrides +++ funkload-1.10.0/debian/dh_installoverrides @@ -0,0 +1,69 @@ +#!/usr/bin/perl -w +# +# dh_installoverrides + +=head 1 NAME + +dh_installoverrides = install lintian/linda override files + +=cut + +use strict; +use Debian::Debhelper::Dh_Lib; + +=head 1 SYNOPSIS + +B + +=head1 DESCRIPTION + +dh_installoverrides is a debhelper program that is responsible for +installing lintian and linda overrides into package build directories. + +If a file named debian/package.lintian exists, it is installed +into /usr/share/lintian/overrides/package. +If a file named debian/package.linda exists, it is installed +into /usr/share/linda/overrides/package. + +=cut + +init(); + +foreach my $package (@{$dh{DOPACKAGES}}) { + my $tmp=tmpdir($package); + + my $file=$package; + + my $lintian_overrides=pkgfile($package,"lintian"); + my $linda_overrides=pkgfile($package,"linda"); + + if($lintian_overrides ne '') { + if(! -d "$tmp/usr/share/lintian/overrides") { + doit("install", "-d", "$tmp/usr/share/lintian/overrides"); + } + + doit("install","-p","-m644",$lintian_overrides, + "$tmp/usr/share/lintian/overrides/$file"); + } + + if($linda_overrides ne '') { + if (! -d "$tmp/usr/share/linda/overrides") { + doit("install", "-d", "$tmp/usr/share/linda/overrides"); + } + + doit("install", "-p", "-m644", $linda_overrides, + "$tmp/usr/share/linda/overrides/$file"); + } +} + +=head1 SEE ALSO + +L + +This program is a part of debhelper + +=head1 AUTHOR + +Rene Engelhard + +=cut --- funkload-1.10.0.orig/debian/fl-build-report.1 +++ funkload-1.10.0/debian/fl-build-report.1 @@ -0,0 +1,37 @@ +.TH "FL-BUILD-REPORT" "1" "11 December 2007" "Debian Project" "Debian manual" +.SH "NAME" +fl\-build\-report \- converts a testmaker script into a FunkLoad test +.SH "SYNOPSIS" +.B fl\-build\-report +.B [options] +.B xmlfile +.SH "DESCRIPTION" +fl\-build\-report analyzes a FunkLoad XML result file and outputs a report in HTML or ReST. +.PP +You can preview the report for cycles that have been done while the bench is still running by invoking fl\-build\-report. +.SH "OPTIONS" +.TP +.B \-\-version +Show program's version number and exit +.TP +.B \-\-help, \-h +Shows a help message and exit +.TP +.B \-\-html, \-H +Produce an HTML report +.TP +.B \-\-output\-directory=OUTPUT_DIR, \-oOUTPUT_DIR +Defines the directory where reports are outputted +.SH "SEE ALSO" +.BR fl\-credential\-ctl (1), +.BR fl\-import\-from\-tm\-recorder (1), +.BR fl\-install\-demo (1), +.BR fl\-monitor\-ctl (1), +.BR fl\-record (1), +.BR fl\-run\-bench (1), +.BR fl\-run\-test (1). +.SH "AUTHOR" +Funkload was written by Benoit Delbosc. +.PP +This manual page was written by Jose Parrella , +for the Debian project (but may be used by others). --- funkload-1.10.0.orig/debian/dirs +++ funkload-1.10.0/debian/dirs @@ -0,0 +1 @@ +usr/bin --- funkload-1.10.0.orig/debian/copyright +++ funkload-1.10.0/debian/copyright @@ -0,0 +1,28 @@ +This package was debianized by Toni Mueller on +Wed, 12 Dec 2007 17:07:33 +0100. + +It was downloaded from http://funkload.nuxeo.com/, which is also the +homepage of the project. + +Upstream Author: Benoit Delbosc + +Copyright: (C) Copyright 2005 Nuxeo SAS (http://nuxeo.com). + +License (taken verbatim from the upstream's LICENSE.txt file): + +---- cut +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. +---- cut + +You should have received a copy of the GNU General Public License +along with this program. If not, see . + + +The Debian packaging is (C) 2007, Toni Mueller and +is licensed under the GPL, see `/usr/share/common-licenses/GPL'. + --- funkload-1.10.0.orig/debian/NO-postrm +++ funkload-1.10.0/debian/NO-postrm @@ -0,0 +1,39 @@ +#!/bin/sh +# postrm script for funkload +# +# see: dh_installdeb(1) + +set -e + +# summary of how this script can be called: +# * `remove' +# * `purge' +# * `upgrade' +# * `failed-upgrade' +# * `abort-install' +# * `abort-install' +# * `abort-upgrade' +# * `disappear' +# +# for details, see http://www.debian.org/doc/debian-policy/ or +# the debian-policy package + + +case "$1" in + purge|remove|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear) + ;; + + *) + echo "postrm called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 + + --- funkload-1.10.0.orig/debian/pycompat +++ funkload-1.10.0/debian/pycompat @@ -0,0 +1 @@ +2 --- funkload-1.10.0.orig/debian/funkload.lintian +++ funkload-1.10.0/debian/funkload.lintian @@ -0,0 +1,4 @@ +funkload: package-contains-upstream-install-documentation usr/share/doc/funkload/INSTALL.txt.gz +funkload: extra-license-file usr/share/doc/funkload/LICENSE.txt.gz +funkload: script-not-executable ./usr/share/pycentral/funkload/site-packages/funkload/BenchRunner.py +funkload: script-not-executable ./usr/share/pycentral/funkload/site-packages/funkload/TestRunner.py --- funkload-1.10.0.orig/debian/changelog +++ funkload-1.10.0/debian/changelog @@ -0,0 +1,61 @@ +funkload (1.10.0-0ubuntu1) karmic; urgency=low + + * New upstream release (LP: #403721) + - Fix a crash when using fl-build-report (LP: #325844) + * debian/rules: Update upstream version. + * debian/control: + - Set XS-Python-Version to >= 2.5 instead of hardcoding versions. + - Add python-setuptools to depends, it doesn't start without it. + - Add gnuplot as recommends, it's necessary to run tests. + * debian/patches: Drop, merged upstream. + * debian/docs Update funkload.egg-info location. + * debian/watch: Update. + + -- Julien Lavergne Thu, 13 Aug 2009 23:26:50 +0200 + +funkload (1.6.2-6) unstable; urgency=low + + * changed dependencies wrt. python-webunit to require at least + 1:1.3.8, but to conflict with 1:1.3.9. + * added python-docutils (closes: #493205) + + -- Toni Mueller Mon, 04 Aug 2008 10:09:36 +0200 + +funkload (1.6.2-5) unstable; urgency=low + + * added python-docutils (closes: #493205) + * suggests -> recommends due to the high usability impact + * fixed python-webunit at 1.3.8 (compatibilty issue with 1.3.9) + + -- Toni Mueller Fri, 01 Aug 2008 11:11:58 +0200 + +funkload (1.6.2-4) unstable; urgency=low + + * upgraded to new standards version + * dropped runtime dependency on python-setuptools (Closes: #468733) + * dropped python-xml dependency (Closes: #468593) + * rebuild with new python-central (Closes: #490464) + + -- Toni Mueller Thu, 10 Jul 2008 23:23:25 +0200 + +funkload (1.6.2-3) unstable; urgency=low + + * renamed recommends "tcpwatch" to "tcpwatch-httpproxy" + * added python-setup to build-depends (closes: #457240) + * added Jose Miguel Parrella Romero's manpages (thank you!) + * fixed typos in the control file (closes: #457344) + + -- Toni Mueller Fri, 21 Dec 2007 23:19:17 +0100 + +funkload (1.6.2-2) unstable; urgency=low + + * added missing dependency + + -- Toni Mueller Wed, 19 Dec 2007 11:33:38 +0100 + +funkload (1.6.2-1) unstable; urgency=low + + * Initial release (Closes: #351082) + + -- Toni Mueller Wed, 12 Dec 2007 17:07:33 +0100 + --- funkload-1.10.0.orig/debian/manpage.sgml +++ funkload-1.10.0/debian/manpage.sgml @@ -0,0 +1,157 @@ + manpage.1'. You may view + the manual page with: `docbook-to-man manpage.sgml | nroff -man | + less'. A typical entry in a Makefile or Makefile.am is: + +manpage.1: manpage.sgml + docbook-to-man $< > $@ + + + The docbook-to-man binary is found in the docbook-to-man package. + Please remember that if you create the nroff version in one of the + debian/rules file targets (such as build), you will need to include + docbook-to-man in your Build-Depends control field. + + --> + + + Toni"> + Müller"> + + December 13, 2007"> + + 1"> + toni@debian.org"> + + FUNKLOAD"> + + + Debian"> + GNU"> + GPL"> +]> + + + +
+ &dhemail; +
+ + &dhfirstname; + &dhsurname; + + + 2003 + &dhusername; + + &dhdate; +
+ + &dhucpackage; + + &dhsection; + + + &dhpackage; + + is a package to support testing and benchmarking of + web applications + + + + &dhpackage; + + + + + + + + DESCRIPTION + + This manual page documents briefly the + &dhpackage; and bar + commands. + + This manual page was written for the &debian; distribution + because the original program does not have a manual page. + Instead, it has documentation in the &gnu; + Info format; see below. + + &dhpackage; is a program that... + + + + OPTIONS + + These programs follow the usual &gnu; command line syntax, + with long options starting with two dashes (`-'). A summary of + options is included below. For a complete description, see the + Info files. + + + + + + + + Show summary of options. + + + + + + + + Show version of program. + + + + + + SEE ALSO + + bar (1), baz (1). + + The programs are documented fully by The Rise and + Fall of a Fooish Bar available via the + Info system. + + + AUTHOR + + This manual page was written by &dhusername; &dhemail; for + the &debian; system (but may be used by others). Permission is + granted to copy, distribute and/or modify this document under + the terms of the &gnu; General Public License, Version 2 any + later version published by the Free Software Foundation. + + + On Debian systems, the complete text of the GNU General Public + License can be found in /usr/share/common-licenses/GPL. + + + +
+ + + + --- funkload-1.10.0.orig/debian/fl-import-from-tm-recorder.1 +++ funkload-1.10.0/debian/fl-import-from-tm-recorder.1 @@ -0,0 +1,31 @@ +.TH "FL-IMPORT-FROM-TM-RECORDER" "1" "11 December 2007" "Debian Project" "Debian manual" +.SH "NAME" +fl\-import\-from\-tm\-recorder \- converts TestMaker scripts into funkload scripts +.SH "SYNOPSIS" +.B fl\-import\-from\-tm\-recorder +.B [ options ] +.B tm_script +.SH "DESCRIPTION" +fl\-import\-from\-tm\-recorder converts a TestMaker script built with the TM Recorder into a FunkLoad script and configuration file. +.PP +Given any *.tm file, this script will generate scenarioName.py and scenarioName.conf, which are then usable by fl\-run\-test. +.SH "OPTIONS" +.TP +.B \-\-help, \-h +Show a help message and exit +.TP +.B \-\-output\-directory=OUTPUT_DIR, \-o OUTPUT_DIR +Directory where HTML pages will be dumped +.SH "SEE ALSO" +.BR fl\-build\-report (1), +.BR fl\-credential\-ctl (1), +.BR fl\-install\-demo (1), +.BR fl\-monitor\-ctl (1), +.BR fl\-record (1), +.BR fl\-run\-bench (1), +.BR fl\-run\-test (1). +.SH "AUTHOR" +Funkload was written by Benoit Delbosc. +.PP +This manual page was written by Jose Parrella , +for the Debian project (but may be used by others). --- funkload-1.10.0.orig/debian/fl-record.1 +++ funkload-1.10.0/debian/fl-record.1 @@ -0,0 +1,38 @@ +.TH "FL-RECORD" "1" "11 December 2007" "Debian Project" "Debian manual" +.SH "NAME" +fl\-record \- records a live funkload test using TCPWatch +.SH "SYNOPSIS" +.B fl\-record +.B [ options ] +.B test_case +.SH "DESCRIPTION" +fl\-record uses TCPWatch to setup a proxy server which is then used by a browser and records activities. It generates a Funkload script or a unit test if a name is passed to the script. +.SH "OPTIONS" +.TP +.B \-\-version +Show program's version number and exit +.TP +.B \-\-help, \-h +Show a help message and exit +.TP +.B \-\-verbose, \-v +Verbose output +.TP +.B \-\-port=PORT, \-p PORT +TCP port where the proxy listens (Defaults to 8090) +.TP +.B \-\-tcp\-watch\-input=TCPWATCH_PATH, \-i TCPWATCH_PATH +Path to an existing TCPWatch capture +.SH "SEE ALSO" +.BR fl\-build\-report (1), +.BR fl\-credential\-ctl (1), +.BR fl\-import\-from\-tm\-recorder (1), +.BR fl\-install\-demo (1), +.BR fl\-monitor\-ctl (1), +.BR fl\-run\-bench (1), +.BR fl\-run\-test (1). +.SH "AUTHOR" +Funkload was written by Benoit Delbosc. +.PP +This manual page was written by Jose Parrella , +for the Debian project (but may be used by others). --- funkload-1.10.0.orig/debian/README.Debian +++ funkload-1.10.0/debian/README.Debian @@ -0,0 +1,8 @@ +I included upstream documentation for reference, but of course, under +Debian, it's usually much more preferable to use the Debian ways of +doing things. + +The manpages were kindly donated by Jose Parella. I included the full +HTML documentation from the original website, but cleaned up the HTML on +the way. + --- funkload-1.10.0.orig/debian/fl-monitor-ctl.1 +++ funkload-1.10.0/debian/fl-monitor-ctl.1 @@ -0,0 +1,35 @@ +.TH "FL-MONITOR-CTL" "1" "11 December 2007" "Debian Project" "Debian manual" +.SH "NAME" +fl\-monitor\-ctl \- monitors server health during funkload benchs +.SH "SYNOPSIS" +.B fl\-monitor\-ctl +.B [ options ] +.B config_file +.B [ start | startd | stop | restart | status | test ] +.SH "DESCRIPTION" +fl\-monitor\-ctl monitors server health during a Funkload bench. It is implemented as an XML\-RPC server. +.PP +A configuration file needs to be setup in order to use this server. Please refer to demo/simple/credential.conf for an example. +.SH "OPTIONS" +.TP +.B \-\-version +Show program's version number and exit +.TP +.B \-\-help, \-h +Show a help message and exit +.TP +.B \-\-quiet, \-q +Verbose output +.SH "SEE ALSO" +.BR fl\-build\-report (1), +.BR fl\-credential\-ctl (1), +.BR fl\-import\-from\-tm\-recorder (1), +.BR fl\-install\-demo (1), +.BR fl\-record (1), +.BR fl\-run\-bench (1), +.BR fl\-run\-test (1). +.SH "AUTHOR" +Funkload was written by Benoit Delbosc. +.PP +This manual page was written by Jose Parrella , +for the Debian project (but may be used by others). --- funkload-1.10.0.orig/debian/prerm +++ funkload-1.10.0/debian/prerm @@ -0,0 +1,40 @@ +#!/bin/sh +# prerm script for funkload +# +# see: dh_installdeb(1) + +set -e + +# summary of how this script can be called: +# * `remove' +# * `upgrade' +# * `failed-upgrade' +# * `remove' `in-favour' +# * `deconfigure' `in-favour' +# `removing' +# +# for details, see http://www.debian.org/doc/debian-policy/ or +# the debian-policy package + + +case "$1" in + remove|upgrade|deconfigure) + ;; + + failed-upgrade) + ;; + + *) + echo "prerm called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 + + --- funkload-1.10.0.orig/debian/preinst +++ funkload-1.10.0/debian/preinst @@ -0,0 +1,37 @@ +#!/bin/sh +# preinst script for funkload +# +# see: dh_installdeb(1) + +set -e + +# summary of how this script can be called: +# * `install' +# * `install' +# * `upgrade' +# * `abort-upgrade' +# for details, see http://www.debian.org/doc/debian-policy/ or +# the debian-policy package + + +case "$1" in + install|upgrade) + ;; + + abort-upgrade) + ;; + + *) + echo "preinst called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 + + --- funkload-1.10.0.orig/debian/postinst +++ funkload-1.10.0/debian/postinst @@ -0,0 +1,41 @@ +#!/bin/sh +# postinst script for funkload +# +# see: dh_installdeb(1) + +set -e + +# summary of how this script can be called: +# * `configure' +# * `abort-upgrade' +# * `abort-remove' `in-favour' +# +# * `abort-remove' +# * `abort-deconfigure' `in-favour' +# `removing' +# +# for details, see http://www.debian.org/doc/debian-policy/ or +# the debian-policy package + + +case "$1" in + configure) + ;; + + abort-upgrade|abort-remove|abort-deconfigure) + ;; + + *) + echo "postinst called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 + + --- funkload-1.10.0.orig/debian/watch +++ funkload-1.10.0/debian/watch @@ -0,0 +1,3 @@ +# watch control file for uscan +version=3 +http://pypi.python.org/packages/source/f/funkload/ funkload-([\d+\.]+|\d+)[a-z]*\.tar\.gz