{ "info": { "author": "David Villa Alises", "author_email": "David.Villa@gmail.com", "bugtrack_url": null, "classifiers": [ "Intended Audience :: Developers", "License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.0", "Programming Language :: Python :: 3.1", "Programming Language :: Python :: 3.2", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Topic :: Software Development", "Topic :: Software Development :: Quality Assurance", "Topic :: Software Development :: Testing" ], "description": "Prego is a system/integration test framework running as Python unittest testcases.\n\nPrego is a library consisting on a set of clases and hamcrest matchers usefull\nto specify shell command interactions through files, environment variables,\nnetwork ports. It provides support to run shell commands on background, send\nsignal to processes, set assertions on command stdout or stderr, etc.\n\n\nConcepts\n========\n\n**First:** a Task() is a set of assertions.\n\nThree assertion checkers are available:\n\n- task.assert_that, for single shot checking.\n- task.wait_that, for polling recurrent checking.\n- task.command, to run arbitrary shell command.\n\nSubjects (and their associated assertions):\n\n- Task()\n\n - running()\n - terminated()\n\n- File(path)\n\n - exists()\n\n- File().content\n\n - any hamcrest string matchers (ie: contains_string)\n\n- Variable\n\n - exists()\n - any hamcrest string matchers (ie: contains_string)\n\n- Command\n\n - running()\n - exits_with(value)\n - killed_by(signal)\n\n- Host(hostname)\n\n - listen_port(number, proto='tcp')\n - reachable()\n\n\nExecution model\n===============\n\n\n\ncommand\n=======\n\n\ncontext\n=======\n\nThe ``context`` is an object whose attributes may be automatically interpolated in command\nand filename paths.\n\nSome of them are set as default values for command() parameters too. If ``context.cwd`` is\nset, all commands in the same test method will use that value as CWD (Current Working\nDirectory) unless you define a different value as ``command()`` keyarg.\n\nContext attributes that defaults command() parameters are ``cwd``, ``timeout``,\n``signal`` and ``expected``.\n\n\nInterpolation\n=============\n\nAvailable interpolation variables are:\n\n- $basedir: the directory where prego is executed (relative).\n- $fullbasedir: absolute path of $basedir.\n- $testdir: the directory where the running test file is.\n- $fulltestdir: absolute path of $testdir.\n- $testfilename: the file name of the running test.\n- $tmpbase: a safe directory (per user) to put temporary files.\n- $tmp: a safe directory (per user and prego instance) to put temporary files.\n- $pid: the prego instance PID.\n\n\nExamples\n========\n\nTesting ncat\n------------\n\n::\n\n import hamcrest\n from prego import Task, TestCase, context as ctx, running\n from prego.net import localhost, listen_port\n from prego.debian import Package, installed\n\n\n class Net(TestCase):\n def test_netcat(self):\n ctx.port = 2000\n server = Task(desc='ncat server', detach=True)\n server.assert_that(Package('nmap'), installed())\n server.assert_that(localhost,\n hamcrest.is_not(listen_port(ctx.port)))\n cmd = server.command('ncat -l -p $port')\n server.assert_that(cmd.stdout.content,\n hamcrest.contains_string('bye'))\n\n client = Task(desc='ncat client')\n client.wait_that(server, running())\n client.wait_that(localhost, listen_port(ctx.port))\n client.command('ncat -c \"echo bye\" localhost $port')\n\n\nThis test may be executed using nosetest::\n\n $ nosetests examples/netcat.py\n .\n ----------------------------------------------------------------------\n Ran 1 test in 1.414s\n\n OK\n\n\nBut prego provides a wrapper (the ``prego`` command) that has some interesting options::\n\n $ prego -h\n usage: prego [-h] [-c FILE] [-k] [-d] [-o] [-e] [-v] [-p] ...\n\n positional arguments:\n nose-args\n\n optional arguments:\n -h, --help show this help message and exit\n -c FILE, --config FILE\n explicit config file\n -k, --keep-going continue even with failed assertion or tests\n -d, --dirty do not remove generated files\n -o, --stdout print tests stdout\n -e, --stderr print tests stderr\n -v, --verbose increase log verbosity\n\n\nSame ncat test invoking ``prego``::\n\n [II] ------ Net.test_netcat BEGIN\n [II] [ ok ] B.0 wait that A is running\n [II] [ ok ] A.0 assert that nmap package is installed\n [II] [ ok ] A.1 assert that localhost not port 2000/tcp to be open\n [II] [fail] B.1 wait that localhost port 2000/tcp to be open\n [II] [ ok ] B.1 wait that localhost port 2000/tcp to be open\n [II] A.2.out| bye\n [II] [ ok ] B.2 Command 'ncat -c \"echo bye\" localhost 2000' code (0:0) time 5:1.28\n [II] [ ok ] B.3 assert that command B.2 returncode to be 0\n [II] [ ok ] B.4 assert that command B.2 execution time to be a value less than <5>s\n [II] [ OK ] B Task end - elapsed: 1.17s\n [II] [ ok ] A.2 Command 'ncat -l -p 2000' code (0:0) time 5:1.33\n [II] [ ok ] A.3 assert that command A.2 returncode to be 0\n [II] [ ok ] A.4 assert that command A.2 execution time to be a value less than <5>s\n [II] [ ok ] A.5 assert that File '/tmp/prego-david/26245/A.2.out' content a string containing 'bye'\n [II] [ OK ] A Task end - elapsed: 1.32s\n [II] [ OK ] Net.test_netcat END\n ----------------------------------------------------------------------\n Ran 1 test in 1.396s\n\n OK\n\n\nTesting google.com reachability\n===============================\n\n::\n\n import hamcrest\n from prego import TestCase, Task\n from prego.net import Host, reachable\n\n class GoogleTest(TestCase):\n def test_is_reachable(self):\n link = Task(desc=\"Is interface link up?\")\n link.command('ip link | grep wlan0 | grep \"state UP\"')\n\n router = Task(desc=\"Is the local router reachable?\")\n router.command(\"ping -c2 $(ip route | grep ^default | cut -d' ' -f 3)\")\n\n for line in file('/etc/resolv.conf'):\n if line.startswith('nameserver'):\n server = line.split()[1]\n test = Task(desc=\"Is DNS server {0} reachable?\".format(server))\n test.command('ping -c 2 {0}'.format(server))\n\n resolve = Task(desc=\"may google name be resolved?\")\n resolve.command('host www.google.com')\n\n ping = Task(desc=\"Is google reachable?\")\n ping.command('ping -c 1 www.google.com')\n ping.assert_that(Host('www.google.com'), reachable())\n ping.assert_that(Host('www.googlewrong.com'), hamcrest.is_not(reachable()))\n\n web = Task(desc=\"get index.html\")\n cmd = web.command('wget http://www.google.com/webhp?hl=en -O-')\n web.assert_that(cmd.stdout.content,\n hamcrest.contains_string('value=\"I\\'m Feeling Lucky\"'))\n\n.. Local Variables:\n.. coding: utf-8\n.. mode: flyspell\n.. ispell-local-dictionary: \"american\"\n.. End:", "description_content_type": null, "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://bitbucket.org/arco_group/prego", "keywords": "", "license": "GPLv3", "maintainer": "", "maintainer_email": "", "name": "prego", "package_url": "https://pypi.org/project/prego/", "platform": "", "project_url": "https://pypi.org/project/prego/", "project_urls": { "Homepage": "https://bitbucket.org/arco_group/prego" }, "release_url": "https://pypi.org/project/prego/0.20170123/", "requires_dist": null, "requires_python": "", "summary": "System test framework over POSIX shells", "version": "0.20170123" }, "last_serial": 2625636, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "2abd3bf3647ced715a6f99fff0002bc5", "sha256": "58d16edd0b6e351ab00e96d3865d6f1bb0a3a1586f7794f68a8451145489d5ad" }, "downloads": -1, "filename": "prego-0.1.tar.gz", "has_sig": false, "md5_digest": "2abd3bf3647ced715a6f99fff0002bc5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5933, "upload_time": "2012-09-04T15:21:40", "url": "https://files.pythonhosted.org/packages/76/4b/53e2af5cc63a4bca6771c5ee52f6331b35788f292526e6236617cef9a3bb/prego-0.1.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "d90219549c5379cbf3ffdec5da2224f3", "sha256": "8d7755bd3c52777b9d3f5f960b875270ffd78dc0ef00dae6315e06f35278651d" }, "downloads": -1, "filename": "prego-0.1.1.tar.gz", "has_sig": false, "md5_digest": "d90219549c5379cbf3ffdec5da2224f3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5939, "upload_time": "2012-09-07T07:41:24", "url": "https://files.pythonhosted.org/packages/55/47/aa64462c5af6d7d09d4722817a545530076ddbcaf9669701992a0196927b/prego-0.1.1.tar.gz" } ], "0.20130116": [ { "comment_text": "", "digests": { "md5": "5d9e23d8ddaddbd1f7c04accb0eef3c7", "sha256": "24348e85396b9e568c06bdeb2d60ad7efc06eb69250f1d8afa69258b48818cc0" }, "downloads": -1, "filename": "prego-0.20130116.tar.gz", "has_sig": false, "md5_digest": "5d9e23d8ddaddbd1f7c04accb0eef3c7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14897, "upload_time": "2013-01-17T12:38:35", "url": "https://files.pythonhosted.org/packages/bd/f9/1a11fb25e36003e702ee5a30002503a8abfbb120c003de815c404a487bfe/prego-0.20130116.tar.gz" } ], "0.20130218.1": [ { "comment_text": "", "digests": { "md5": "3ad0c001badba25f33be0e359852dad5", "sha256": "4d45ce4a80e5b0a55959fe07e0c5c5edb6ee76120eaffeb8a1502fedee52e8fa" }, "downloads": -1, "filename": "prego-0.20130218.1.tar.gz", "has_sig": false, "md5_digest": "3ad0c001badba25f33be0e359852dad5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22320, "upload_time": "2013-04-19T17:37:22", "url": "https://files.pythonhosted.org/packages/81/f8/9a799e77dad0194eab3138d9d07ec1e707f978ddc3bd6d4baf5b923984a8/prego-0.20130218.1.tar.gz" } ], "0.20130419.1": [ { "comment_text": "", "digests": { "md5": "95a52e4c857194c6ffe901ffcdc48dbf", "sha256": "db8e2a287aa87b52f41e5a4fa3b64da1a2224d9ea209f372cf90472d06af56ec" }, "downloads": -1, "filename": "prego-0.20130419.1.tar.gz", "has_sig": false, "md5_digest": "95a52e4c857194c6ffe901ffcdc48dbf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22321, "upload_time": "2013-04-19T17:37:36", "url": "https://files.pythonhosted.org/packages/d4/cb/ecb9f75db9d2141cc76af234e99dacd968923d9ede6c9f223ba94abc1fae/prego-0.20130419.1.tar.gz" } ], "0.20130425": [ { "comment_text": "", "digests": { "md5": "0f12e8269b96daedc85c899d8961c585", "sha256": "4cd34ded1f6933823b63d4a9a4e35edc115d4bf03ea8058c858d049bcfb0f3b0" }, "downloads": -1, "filename": "prego-0.20130425.tar.gz", "has_sig": false, "md5_digest": "0f12e8269b96daedc85c899d8961c585", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20684, "upload_time": "2013-04-25T20:39:35", "url": "https://files.pythonhosted.org/packages/c8/e8/ebe01f87bfa8a50cc88b524672a6555037c064901ed6e8cdb996b28ed39d/prego-0.20130425.tar.gz" } ], "0.20130426": [ { "comment_text": "", "digests": { "md5": "99ee7c5423a819753b5a26dbd77d3f13", "sha256": "b52e295111eeedc266df5d77f5a36c6222a4c5994e80b7a9791205d19d0cd6f9" }, "downloads": -1, "filename": "prego-0.20130426.tar.gz", "has_sig": false, "md5_digest": "99ee7c5423a819753b5a26dbd77d3f13", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21118, "upload_time": "2013-04-26T08:19:49", "url": "https://files.pythonhosted.org/packages/33/10/8eaabb9ea1be0dbf9cc336cbae62ad664eac578badcde23ef3d5f4acbd91/prego-0.20130426.tar.gz" } ], "0.20130427": [ { "comment_text": "", "digests": { "md5": "13477f9a00592e17e04b7b1ddc76f602", "sha256": "589095c305bde21d5f2d499627ecf5ef9c2d3e7deeba85ce8ee0974226cfec79" }, "downloads": -1, "filename": "prego-0.20130427.tar.gz", "has_sig": false, "md5_digest": "13477f9a00592e17e04b7b1ddc76f602", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21101, "upload_time": "2013-04-26T22:22:07", "url": "https://files.pythonhosted.org/packages/70/d1/b74ccddc03a4eb7784982dd72eee0e8ca69c9164d5aecc3948fc6b362af0/prego-0.20130427.tar.gz" } ], "0.20130429": [ { "comment_text": "", "digests": { "md5": "3e9f0903589847cf198d71c411a07edb", "sha256": "86ed5c09eb16e5852bcd06f237cc29e8e82ed64382c4c629f3a3aad442d6dcd4" }, "downloads": -1, "filename": "prego-0.20130429.tar.gz", "has_sig": false, "md5_digest": "3e9f0903589847cf198d71c411a07edb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22770, "upload_time": "2013-04-29T09:45:58", "url": "https://files.pythonhosted.org/packages/58/8f/8c6ca992acf57774ac64fe30428372ba8c0b9692d8d9d8e549e49b1fdb56/prego-0.20130429.tar.gz" } ], "0.20130516": [ { "comment_text": "", "digests": { "md5": "f37777b9b11882479ff47e8f4b356d09", "sha256": "287b9ec61fed60f3072ceed2b1c493cd4eb5d1a192d0e96abd2e5834a7e8afaa" }, "downloads": -1, "filename": "prego-0.20130516.tar.gz", "has_sig": false, "md5_digest": "f37777b9b11882479ff47e8f4b356d09", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22828, "upload_time": "2013-05-16T16:08:26", "url": "https://files.pythonhosted.org/packages/f1/ad/c614ee3e5c916b90c4604d8ed3610f193d0fd7f6f5bf18c86264cf142409/prego-0.20130516.tar.gz" } ], "0.20130516.1": [ { "comment_text": "", "digests": { "md5": "b61bb764c35d02c4db475639792d5adb", "sha256": "d5646774d1b83116b3b2c7f4190835fb4d22c0fc9cb14e31b22f47e5e9b874bc" }, "downloads": -1, "filename": "prego-0.20130516.1.tar.gz", "has_sig": false, "md5_digest": "b61bb764c35d02c4db475639792d5adb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22875, "upload_time": "2013-05-16T17:25:21", "url": "https://files.pythonhosted.org/packages/70/2c/a50822de7ed439b282c8f43d5ba7114dc8e45870d3808c72dd946b2fafee/prego-0.20130516.1.tar.gz" } ], "0.20130701": [ { "comment_text": "", "digests": { "md5": "498d5ee1ded5baa71e5f4f2831acb092", "sha256": "102b3b10b400f78ac279ea709410f11c5000d9abc12812cd47079ade34969bc4" }, "downloads": -1, "filename": "prego-0.20130701.tar.gz", "has_sig": false, "md5_digest": "498d5ee1ded5baa71e5f4f2831acb092", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21184, "upload_time": "2013-07-01T16:11:01", "url": "https://files.pythonhosted.org/packages/08/62/5e4919590fd5b2b37da070f4ff2c9fb8e74c90187725c3cfe6e8811e4a19/prego-0.20130701.tar.gz" } ], "0.20150306": [ { "comment_text": "", "digests": { "md5": "b1d2bc4cb7f32a6f49b89534103d36e6", "sha256": "453329bacac901247ec3ccc7fa752cf0da46bc8ec1d5cabd83514bfc1820d508" }, "downloads": -1, "filename": "prego-0.20150306.tar.gz", "has_sig": false, "md5_digest": "b1d2bc4cb7f32a6f49b89534103d36e6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21159, "upload_time": "2015-03-16T12:12:36", "url": "https://files.pythonhosted.org/packages/e0/ba/8bddc06bcdb30a1c0416732dfbf9e3b97c99c01f7e546cb6d5152fddee76/prego-0.20150306.tar.gz" } ], "0.20170123": [ { "comment_text": "", "digests": { "md5": "d47ea3cf19a3d831c15196dc9c36bc69", "sha256": "e7f9004a9f97d21eb2d7dbeca2a4a46c67c642dd1018d863e4a9fd5184a5c40b" }, "downloads": -1, "filename": "prego-0.20170123.tar.gz", "has_sig": false, "md5_digest": "d47ea3cf19a3d831c15196dc9c36bc69", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24194, "upload_time": "2017-02-07T16:13:15", "url": "https://files.pythonhosted.org/packages/8d/a9/424d5f8ac2e2003a70da344eb736b82c4298dcc9e2290eca4f72218f9474/prego-0.20170123.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "d47ea3cf19a3d831c15196dc9c36bc69", "sha256": "e7f9004a9f97d21eb2d7dbeca2a4a46c67c642dd1018d863e4a9fd5184a5c40b" }, "downloads": -1, "filename": "prego-0.20170123.tar.gz", "has_sig": false, "md5_digest": "d47ea3cf19a3d831c15196dc9c36bc69", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24194, "upload_time": "2017-02-07T16:13:15", "url": "https://files.pythonhosted.org/packages/8d/a9/424d5f8ac2e2003a70da344eb736b82c4298dcc9e2290eca4f72218f9474/prego-0.20170123.tar.gz" } ] }