From f54494d45aa5997281269f09b058ceb3335c28a0 Mon Sep 17 00:00:00 2001 From: Renato Alves Date: Sat, 17 May 2014 16:58:44 +0100 Subject: [PATCH 1/4] Unittesting basemodule merge_streams was not having the desired effect --- test/basetest/__init__.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/test/basetest/__init__.py b/test/basetest/__init__.py index 7665f467c..10dfb5fb9 100644 --- a/test/basetest/__init__.py +++ b/test/basetest/__init__.py @@ -110,7 +110,7 @@ class BaseTestCase(unittest.TestCase): command = ["./task"] command.extend(args) - p = Popen(command, stdin=stdin, stdout=PIPE, stderr=STDOUT) + p = Popen(command, stdin=stdin, stdout=PIPE, stderr=stderr) out, err = p.communicate(input) # In python3 we will be able use the following instead of the previous # line to avoid locking if task is unexpectedly waiting for input @@ -120,7 +120,6 @@ class BaseTestCase(unittest.TestCase): # p.kill() # out, err = proc.communicate() - return p.returncode, out, err @classmethod From 1d854166924d811dc431e25621029f92c5c13159 Mon Sep 17 00:00:00 2001 From: Renato Alves Date: Sat, 17 May 2014 20:45:24 +0100 Subject: [PATCH 2/4] Testing certificates Add certificates for use with taskd and task --- test/test_certs/ca.cert.pem | 24 ++++++++++++++++++++++++ test/test_certs/ca.key.pem | 32 ++++++++++++++++++++++++++++++++ test/test_certs/client.cert.pem | 24 ++++++++++++++++++++++++ test/test_certs/client.key.pem | 32 ++++++++++++++++++++++++++++++++ test/test_certs/server.cert.pem | 25 +++++++++++++++++++++++++ test/test_certs/server.crl.pem | 14 ++++++++++++++ test/test_certs/server.key.pem | 32 ++++++++++++++++++++++++++++++++ 7 files changed, 183 insertions(+) create mode 100644 test/test_certs/ca.cert.pem create mode 100644 test/test_certs/ca.key.pem create mode 100644 test/test_certs/client.cert.pem create mode 100644 test/test_certs/client.key.pem create mode 100644 test/test_certs/server.cert.pem create mode 100644 test/test_certs/server.crl.pem create mode 100644 test/test_certs/server.key.pem diff --git a/test/test_certs/ca.cert.pem b/test/test_certs/ca.cert.pem new file mode 100644 index 000000000..e024a379a --- /dev/null +++ b/test/test_certs/ca.cert.pem @@ -0,0 +1,24 @@ +-----BEGIN CERTIFICATE----- +MIIEGzCCAtOgAwIBAgIEU3emwDANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJT +RTEeMBwGA1UECgwVR8O2dGVib3JnIEJpdCBGYWN0b3J5MRIwEAYDVQQHDAlHw7Z0 +ZWJvcmcxGjAYBgNVBAgMEVbDpHN0cmEgR8O2dGFsYW5kMR4wHAYDVQQDDBVHw7Z0 +ZWJvcmcgQml0IEZhY3RvcnkwHhcNMTQwNTE3MTgxMzIwWhcNMTUwNTE3MTgxMzIw +WjB9MQswCQYDVQQGEwJTRTEeMBwGA1UECgwVR8O2dGVib3JnIEJpdCBGYWN0b3J5 +MRIwEAYDVQQHDAlHw7Z0ZWJvcmcxGjAYBgNVBAgMEVbDpHN0cmEgR8O2dGFsYW5k +MR4wHAYDVQQDDBVHw7Z0ZWJvcmcgQml0IEZhY3RvcnkwggFSMA0GCSqGSIb3DQEB +AQUAA4IBPwAwggE6AoIBMQDCQyFXOUPIymI7+4nY1T7yNfe1b+vzznJgtJpPOZxW +gPJSiT0yVPmKAYpitn9x1ADncO61FmqTowaZKauwifLhAp8cC/r5N6Y/yppxSEZ+ +czybasCNB/bsmpBB0OeTDAAZ6BF8zLzzFC/54g3JVhsSGwtYKfQlqUlfp89BeCrg +qzO1YO+uJ0K2dXPuyuFjH+Vwr6QLcVKRDvgc/I/C7lx+JKXd/lmiNS5uOc9RhFyD +0xtqCnyhWpa8Ed26Y0B8CAhHWdJWEU33iWLpvlLcfYvFus4cPnEjuIu/Ql64cgIW +xeQQ4lPZYLXVOh/2LeYwbTIBBtvNZdQb8S6VSJG9zex/nzrBq/4M9qlA9kpRW6TA +1G/eInMBzUp2LPW8V4HhspPqFo5SP2sfbaE5Pp2neCWPAgMBAAGjQzBBMA8GA1Ud +EwEB/wQFMAMBAf8wDwYDVR0PAQH/BAUDAwcEADAdBgNVHQ4EFgQUDZvEvP9T4ftv +3cVT711JQT5wPWswDQYJKoZIhvcNAQELBQADggExAC+aizDsErZVIuuSFZ0pI1+c +fsUdC7vKum/B+ANCLOezUgGzfHkohaVd1aY9Qvt7/0q0aTCd7ssiZ7pGZArx2ZEw +3vvKvU0xgwE5YZucExXDrdYqMYtjSDQ4Q+OwS4Q0AiADXpUDtjkIFcuXr7wf/5RN +M+wzl5W3fuNofAoXY6cE8MwrlgXZcjzKzkq0H2hR0ifwJ00uf1tQ0kgUHrKlTfHC +xnTD2IXcfhUNJtAutxV8eKOjmrT7X/hT2Hur2Xgp/a1K+95QaNJIc7PtdbOvfh4o +Kb4wGVy8fQNYaZXxYQgvfr8trgraTn73Vr7jYkeQAgn3yOdk5qyS14Dhnrvht2VX +DaoDPz3glAzNY6/oL3ElGbL7CVKBXUk/OdURlgyoXzKm7EPgp4zAHg8KiNtKrYk= +-----END CERTIFICATE----- diff --git a/test/test_certs/ca.key.pem b/test/test_certs/ca.key.pem new file mode 100644 index 000000000..76663d7f8 --- /dev/null +++ b/test/test_certs/ca.key.pem @@ -0,0 +1,32 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIFewIBAAKCATEAwkMhVzlDyMpiO/uJ2NU+8jX3tW/r885yYLSaTzmcVoDyUok9 +MlT5igGKYrZ/cdQA53DutRZqk6MGmSmrsIny4QKfHAv6+TemP8qacUhGfnM8m2rA +jQf27JqQQdDnkwwAGegRfMy88xQv+eINyVYbEhsLWCn0JalJX6fPQXgq4KsztWDv +ridCtnVz7srhYx/lcK+kC3FSkQ74HPyPwu5cfiSl3f5ZojUubjnPUYRcg9Mbagp8 +oVqWvBHdumNAfAgIR1nSVhFN94li6b5S3H2LxbrOHD5xI7iLv0JeuHICFsXkEOJT +2WC11Tof9i3mMG0yAQbbzWXUG/EulUiRvc3sf586wav+DPapQPZKUVukwNRv3iJz +Ac1Kdiz1vFeB4bKT6haOUj9rH22hOT6dp3gljwIDAQABAoIBMDWWCvZih341xY9C +Pa4gdLKfjGryKqYgRpDCgOZlv+hkvXNjBAyEQCl/b0r3iIQ/tNgi4NX3DwMWr1VE +l2WlR+glrvovm9VvMl7aZmvlQfzTkN5WPjMpBUYTBMQC+j4ny0daKqjAWUa8RNer +MZ5eMC14ZFK3j+9rmR/XzGYE3d8HmsXnrXXewppOH+K4+B89xy6kZJ37bokwmmza +IWWd4tcC5QvkV7Cvna9qRNkrrREeUT9xNCjeFRXHv001D0Eva5pz1nEnHiDtz5ah +keMRn+hM/edj0SJjJImBF6cUhADdt7Kp+Avlf1g5gAgLoiYn6w/tKzEKuEGuqCe7 +Sq2ACXXqzfxr+QUrNxIdVp6FNQr98kX3fBDO1ESQmQXbiSf798MQUNELxl5do8u+ +MfsxltECgZkAzQAeDNyFH17mKwO4tVpoyzURjAoBUwR+ahauiq61VawBFyKvkccP +RaDmslKWb8oFrS5GecF/aF+B4SUBjD516MEYxnAfdgMVxVZt+wIkdZXWmButfFL5 +B7kwU9CZ4HBzhpp8fdfO2BbRcXrXE117GkEDymLpGei9S2eHOJaPUJT3U5LRTg4l +qvnKNKJMbgB9sYBRat70Wv0CgZkA8pcgTJUjTlQ1nUfbf3KaMj2MPBfzyFFfl2Lm +wWdFW4RmPEF8R1RFlgRYF+2Jb3ewnu1TiEQmrmAB1kZQ6P/SeDfGK1OQVG75ClwQ +Gz4w9hr0gYQRiACZnhcfE1sNeEt3oD4Kb7TKnUK1F1Bgb/rJaV6mOA2MEQBSUSC9 +A/r9jqmLif9RJDpXo+6uzF74EQ6uMw1EzSUwhnsCgZgGXMSR/Z4cFSPrndfzuPSb +qe/7eqwD2ZXa0Q1lvHpgSFBYWXk9ewIcVRwT2MBWg9ydPVxulvTPVnd/d1iO87lR +Gf0c24n+baYVU9NiAPUEuTvJyMIfo6ua88JuN4EvGA5d1RmcBkCjMEIb1YYrUbFq +ZS4q79rwNOr7FiF6PiIAjD8I1vusAoBkyA/ghlD88QL1qVfdi0HmOQKBmQDgqtPP ++SMcjOKmigEftGxX8SZqFSjCMZKdKoxZO6JBUoo4bdGCYeqcN+O6LVRmNmwNk/AT +uEI2plWtM6wFTb+HdOgEAj0d5TShwodsI5nGo0oklMKDuUKL5g/yphYAfawJbMvP +jplDMZ9zOw5FRva3rl+0c99vc2PJHM/Q2udu81h28k0chyfZe9jJD38glP8B6tz4 +POQG9wKBmEja9a6og+oEBuSXL+kW07neMkhYl4/SegqoRItwBgUD1mWrWSp1wumG +BNyM5j0rwcVH2EATXF31AxAyRV9JvWYl9DnvZ2E5ZedBqGMrlPBlk8dVEoAowd5x +bV3wLTGXuZckvRRClLyb4a9PPWbXgrHY3pT7X34f5fyNuEDok53yxiJ6DQ9p7Rpk +chM11UKgKHb19nNDCl34 +-----END RSA PRIVATE KEY----- diff --git a/test/test_certs/client.cert.pem b/test/test_certs/client.cert.pem new file mode 100644 index 000000000..4ce558d8c --- /dev/null +++ b/test/test_certs/client.cert.pem @@ -0,0 +1,24 @@ +-----BEGIN CERTIFICATE----- +MIIEETCCAsmgAwIBAgIEU3emwTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJT +RTEeMBwGA1UECgwVR8O2dGVib3JnIEJpdCBGYWN0b3J5MRIwEAYDVQQHDAlHw7Z0 +ZWJvcmcxGjAYBgNVBAgMEVbDpHN0cmEgR8O2dGFsYW5kMR4wHAYDVQQDDBVHw7Z0 +ZWJvcmcgQml0IEZhY3RvcnkwHhcNMTQwNTE3MTgxMzIxWhcNMTUwNTE3MTgxMzIx +WjBAMR4wHAYDVQQKDBVHw7Z0ZWJvcmcgQml0IEZhY3RvcnkxHjAcBgNVBAMMFUfD +tnRlYm9yZyBCaXQgRmFjdG9yeTCCAVIwDQYJKoZIhvcNAQEBBQADggE/ADCCAToC +ggExAO6f5rY86ZHF7MxsvX03waVX7epxqPtaJHFjWByqnRl3k25nqakVUXYWWqhv +N1asRJQEPTteDqdhfWs6+Qut/5a6H/Jbco/MYqinLLEgoeot7N32bjchpQRWKTzg +fKcvfChC2Bce7QmJes4PTDMGQdSMSEbkpJFACzrsges56UW6t85/yipPJkkHBeG5 +I+bXjpmXkQPwp+cKsA8HvMrn/jdfMSbhJIhApwPoQqgjKEbKxVu4gy430Q1nRN0j +/0k0BN8PLNDnEuAE0cd7+jvR/RZvfpFVkc7JCG2Mhm//DBMue12juAuPLcw/KwJ4 +joNYPWoUzOv6HS8fVs90k5gUCEeKR8zkhTlKWLlz2jsWjhHqovYKi8720ZBAzuR1 +Tp+dr9/+x+ujCq3lZ5jo/BHgyY8CAwEAAaN2MHQwDAYDVR0TAQH/BAIwADATBgNV +HSUEDDAKBggrBgEFBQcDAjAPBgNVHQ8BAf8EBQMDB6AAMB0GA1UdDgQWBBRysTeC +R7WPMegs0+3S+ofbHnCxIDAfBgNVHSMEGDAWgBQNm8S8/1Ph+2/dxVPvXUlBPnA9 +azANBgkqhkiG9w0BAQsFAAOCATEAUxK/EELzmDJCawzDPIK0wRraozCLfnyUZHC+ +D6doLzi1xNH70wQS2WowA/zE7HLpVPfA/VrhE/xTPtWcoQx57AvcYnPYH2wkBdoR +ExpA6tPlL/g25tn90wByafQ6TnaVWClLRPkfqOYg5yV/31xp7Q5A5/8tA0vomGRI +X/U3wAkpsmwo0EhawYGNuzflsBl91EvWgEYDE3Xv1fgfsgL/mNRmIj5kFLGUbafc +iB7bl5vyD04HUuPRb86e+wrnxzmaPXA116YGb1PZolT7avCP+twjjbPA6lMCxRxR +Tv3h/Cgp2zaTRzHuMt22JSc6CPKd+KAeCsnMDNXpchpj5d7W0fjelMW9gNTIlKxz +hgG3zhyC2CXtkZyE8IK0hFCgdBfQpjv6AMmH2SNlsN0rBy71RA== +-----END CERTIFICATE----- diff --git a/test/test_certs/client.key.pem b/test/test_certs/client.key.pem new file mode 100644 index 000000000..92e3c95c9 --- /dev/null +++ b/test/test_certs/client.key.pem @@ -0,0 +1,32 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIFfAIBAAKCATEA7p/mtjzpkcXszGy9fTfBpVft6nGo+1okcWNYHKqdGXeTbmep +qRVRdhZaqG83VqxElAQ9O14Op2F9azr5C63/lrof8ltyj8xiqKcssSCh6i3s3fZu +NyGlBFYpPOB8py98KELYFx7tCYl6zg9MMwZB1IxIRuSkkUALOuyB6znpRbq3zn/K +Kk8mSQcF4bkj5teOmZeRA/Cn5wqwDwe8yuf+N18xJuEkiECnA+hCqCMoRsrFW7iD +LjfRDWdE3SP/STQE3w8s0OcS4ATRx3v6O9H9Fm9+kVWRzskIbYyGb/8MEy57XaO4 +C48tzD8rAniOg1g9ahTM6/odLx9Wz3STmBQIR4pHzOSFOUpYuXPaOxaOEeqi9gqL +zvbRkEDO5HVOn52v3/7H66MKreVnmOj8EeDJjwIDAQABAoIBMHT8y91Ya6JeCMQI +I7Y6GaP4QdoIszHXdbppXA9hzfdoWk1sYQ9WNkPQnc2qCNVjS5PNqD9s035YG2bw +2JxTR9UblwH4t2esakoI+64zM25d6ZzAbjR1ODOyEjGYVUSZ0SLj8pETRl7AmgZg +FZmGXcvYoq6u9ceIQHk47lDmaWkYK3j/yZuIhlqTKN0LKYDI+U5vslbeK1LnRiJn +nHnaco4lQyC5ccBGhisf1qCgLGGiecPgy4bFX6W+Sc4sXRg7SNt9itrW+ZNVqPnI +g8bJ6QNYOifu+gZ1XFVN5kd1IfaqfXHHCnoRe/5QRTI0ifYM+nJ71sN7NLmLe2Gx +aaNAP/ZPaU/Y+Za++2EpknGkcungSrY3ZXslHMlbzRkkIhmB96mpnSQKzrWjR48n +SFWIIBECgZkA+TbyCZGV2Mm2M9G6aMCVWfJLx8q5YvXhOaaAxHEAefpN58qP76Ww +Q3Arz7YhVIyjK88JgXnblHpRUNLw/xFy4W3yx55YWePcTZeRiYfx5MXFwPYmeyxK +wMjiq4Xf5dL465+udERADol560kBq2SK32GKoYTwgEZJTuHA/ZYEVlkalYsgTa67 +lCwMmu06MfSCnYhruesmXYMCgZkA9R8kYqjUGFMpRjRmV+JPitIb8rXW61bRQ+KE +ahQanxfVFaWkwErU+A2VkKLcZmyhBThR2xFe1YBdXbEP3JaOFCxwx3YDG/b4Zg4Q +C1oinXfFmspRoMbY1S+rtOKWw75flkg6bFptFnw1Xbda0OjWd7Nvgtk/NhPCb+4W +8pQThAIIS0CvsoKspuqT7Z86iGABTcQSr/yPUgUCgZkA1c7gBHmU17Lm0LpkdS6U +c+C+RyCTwGU236EL5H0WbY/jerN8nZvHB3SbAc899S3bZ+BuRVjonA/855yyCgNM +Tj9oBP7CygwFm8QnppitXRqYOJ52EULEt3Uhkwp+NsyzpmMO5s0PL+meYc/20Lan +tlIW/8/wDf0/M5/XVTh5bCNx/U6pXjxEzjCkd96DCQy/aqv50D4AYkUCgZkAtYEp +4CRDaP+rQGDsp4bcf161czNSwVC4BBxnEGVykPuEvVK6e+jtagAlD8SIjw9A7CyX +8C8cmdtDR20k4aJZ8nY1zHyGMN7fcDJZjw5fM1rM56GIcBTN2o5CBt8B5E/DV/SD +zlfnDw9KNOrgRHEk3d3wZGOZeuGGyHr0YwtiqA0ZNx/e+b/pOG/aucl9/h2Y2Yym +icnqFkECgZhxYTS8xvZFm6WzjjDd4QyWYfGNPNEa0vCktYpz3GJ3hxKQQGj4N/lk +w7mrGGOiOM9lR9rUmc0g8qXO7fGpxE8Djt5Os4+orO9PLNfdr0sJSp3T4Vb99d71 +NwYQWmo2j855EYPziLN0x+0OqsjLNjyvX7EJgsRJYA8nn52D1LeBxBNOJZWqrV9R +4vIwLFDO8/bpjIDJrqjMgg== +-----END RSA PRIVATE KEY----- diff --git a/test/test_certs/server.cert.pem b/test/test_certs/server.cert.pem new file mode 100644 index 000000000..6e8a08b2a --- /dev/null +++ b/test/test_certs/server.cert.pem @@ -0,0 +1,25 @@ +-----BEGIN CERTIFICATE----- +MIIEMzCCAuugAwIBAgIEU3emwDANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJT +RTEeMBwGA1UECgwVR8O2dGVib3JnIEJpdCBGYWN0b3J5MRIwEAYDVQQHDAlHw7Z0 +ZWJvcmcxGjAYBgNVBAgMEVbDpHN0cmEgR8O2dGFsYW5kMR4wHAYDVQQDDBVHw7Z0 +ZWJvcmcgQml0IEZhY3RvcnkwHhcNMTQwNTE3MTgxMzIwWhcNMTUwNTE3MTgxMzIw +WjBAMR4wHAYDVQQKDBVHw7Z0ZWJvcmcgQml0IEZhY3RvcnkxHjAcBgNVBAMMFUfD +tnRlYm9yZyBCaXQgRmFjdG9yeTCCAVIwDQYJKoZIhvcNAQEBBQADggE/ADCCAToC +ggExAM2soV1TPLKp8SjqTtxBHj+Uu9SJM56eyHaK6kwCN6DQyA8dea+cqNJLRWKw +dIyK0HqAdE9xf0Q9VkR5JuGCHB80802c3AkwnXdE3syFYEGISqTbFZr14V0m87fn +axnGHZ0dyKWoRQbJ2purbWpQ23jZIUZQUhTD4e84aqnUco9aUCyzJ3gkvDgFeBg9 +EwHMlaavkddJa+In5qOcSrTNJq+XmNrMly0ifr/CA/LfWAk7LEvqk/JjaLS5DWs+ +VnLaQSSD82CEorypFqo4mR1u/Q5G7+AWXatJEbnf4SbI0agcU/IZMLzPPhfNvNEL +jPelfrrXi3LqI+Y53w85PvdEd2S/SeS6QN1rK3KHQ8b/2QjekROfxCRBNn/SZCgN +PqcD/kwzDxSdRrqECaMcmxIVsJMCAwEAAaOBlzCBlDAMBgNVHRMBAf8EAjAAMB4G +A1UdEQQXMBWCDXRhc2t0b29scy5vcmeHBGFrjWswEwYDVR0lBAwwCgYIKwYBBQUH +AwEwDwYDVR0PAQH/BAUDAwegADAdBgNVHQ4EFgQU/CLd6IX4ns73IW9JtetxKjEz +GOcwHwYDVR0jBBgwFoAUDZvEvP9T4ftv3cVT711JQT5wPWswDQYJKoZIhvcNAQEL +BQADggExADjPCZnLCxWYK5YklECLa8avBedw5p0Z17Fu38ZkAmhnUEqpyzqy/ZQ/ +P0FrZpqs0KNnPgYm7tRqWqYKc/kPHLfJO5HZGyeMzMLc5xGKH92YNRPMJHtiGOKf +KAf9N+OIdfyzasMX+4JoVIuRiawilldJY/kolHewBBMTR8r+UK/KqfhBRFQCWAbh +/kOn/nHd0/uSYZY3AgpEePpJLZ2uVvZWRfic+JjLhqHDNYn2Xc8CViWDqjC6R6ZJ +XFovWXBcs8R4C3kWoaJOisyPNFGCg/nCELSpm2BehcUwr76TRVtMU+Ge3aOTBWjP +DoHbp2VvC2L2PI6lcksfH+nnnHAgxIqKgnP11seB6t55ecwtTiaoKrYMUd1E++iH +8hCm7ND5cJb4yJ+clGCdpXoOq+bN83k= +-----END CERTIFICATE----- diff --git a/test/test_certs/server.crl.pem b/test/test_certs/server.crl.pem new file mode 100644 index 000000000..bc53b57a9 --- /dev/null +++ b/test/test_certs/server.crl.pem @@ -0,0 +1,14 @@ +-----BEGIN X509 CRL----- +MIICKTCB4gIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJTRTEeMBwGA1UE +CgwVR8O2dGVib3JnIEJpdCBGYWN0b3J5MRIwEAYDVQQHDAlHw7Z0ZWJvcmcxGjAY +BgNVBAgMEVbDpHN0cmEgR8O2dGFsYW5kMR4wHAYDVQQDDBVHw7Z0ZWJvcmcgQml0 +IEZhY3RvcnkXDTE0MDUxNzE4MTMyMFoXDTE1MDUxNzE4MTMyMFowAKAvMC0wHwYD +VR0jBBgwFoAUDZvEvP9T4ftv3cVT711JQT5wPWswCgYDVR0UBAMCAQAwDQYJKoZI +hvcNAQEFBQADggExAJRdlrW0zbhr2R9iScc9bkflv7x2f8Cha/M+To8fik8OsDs0 +xmNOSTfbisA60YvFudBSGXwUzGyx8nAoYJgFrpIrG3gco8uCPnFPW5f2yvumelxA +KYGLic2iAIHb290UttfcM+ft/5eILciFaPkycSyppA5ZBRnJ7N20ppat071bFZOo +c+jT6+DLI3ondy6HPBkuCyfUjjVd8bJFEx2JjBFd6rjOgwlPN/j1Pb83oZ5A8ETV +JSdxADBf0DLMW7zE+J8OU4Q7aAW2bwdDqxZglBT8lNvGDkD4/BsFYAmaSvdm9JRM +iCbnTxgbFVHwR4d0x2bQ1Qy2l1CALRHlhmvha3mWdOGDNKanQRT3Xb7iOL0N02le ++1vZMtwH7W03eqTimSPH7nmgWUP7cvCA4ErldD4= +-----END X509 CRL----- diff --git a/test/test_certs/server.key.pem b/test/test_certs/server.key.pem new file mode 100644 index 000000000..85f272ef4 --- /dev/null +++ b/test/test_certs/server.key.pem @@ -0,0 +1,32 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIFfAIBAAKCATEAzayhXVM8sqnxKOpO3EEeP5S71Ikznp7IdorqTAI3oNDIDx15 +r5yo0ktFYrB0jIrQeoB0T3F/RD1WRHkm4YIcHzTzTZzcCTCdd0TezIVgQYhKpNsV +mvXhXSbzt+drGcYdnR3IpahFBsnam6ttalDbeNkhRlBSFMPh7zhqqdRyj1pQLLMn +eCS8OAV4GD0TAcyVpq+R10lr4ifmo5xKtM0mr5eY2syXLSJ+v8ID8t9YCTssS+qT +8mNotLkNaz5WctpBJIPzYISivKkWqjiZHW79Dkbv4BZdq0kRud/hJsjRqBxT8hkw +vM8+F8280QuM96V+uteLcuoj5jnfDzk+90R3ZL9J5LpA3WsrcodDxv/ZCN6RE5/E +JEE2f9JkKA0+pwP+TDMPFJ1GuoQJoxybEhWwkwIDAQABAoIBMQC6ewRP1rGZGKa0 +v0VDRLOFWHi5arDn5/XALZHj2rrPT52kvsffJv6WtXKy2WTDLPV7rM5IXZLTr31x +VhufqdWPofXb8BY9KtwLEOGltGSi5k0vjgjX2Io+aJvfqa6cztl45FFRifEUB57z +OApbs/ZaaxxVYWwascQ/nvpvA1XfjjZVYRavQzd439SUvYNnRTSGzndAKKztfjns +HX19iT6JBfO2/5rfB8zjSHe+0kcRSB/ebKoI6NGvOa/jRqxO1vJ5Xq2RWjCI38SL +abNDI6+0UynpjQn7cHZWvlMno5l1K/4DSzYPthD44rJPfx6UTrJrcYHkukuv/n+C +yN5PdK0ORTd2XvVDPWImbjbWp8BdUHE2q+R4Brl12agcQXBzR1N71BJiGl6N/i2e +iATiMA3BAoGZAOerWQ+al5i0kYEFG9OfEJUBuUB2FhLgojpM7ZuE6PJAChv99Y7Q +U/kXgUoF7j11NK3VS2CtCDrAgUSuzVdHQa9UXvj6c7DKus4OdE+vqVxci28Vmz2a +5EjFSu2Ijt6t06aDnpRCqDaqv7vwqB/Cn5YV5vaBIfSfnLSlMAGPPMzFf86MYKR2 +LYTfqiJP8VmGGTKM5UB7m89hAoGZAONGYdabtRvALgOvb6zwMiXNm2Pi5mlc1YOj +WX4CxKcCbV3psf0mTc2pM2I6nfhRsbFC2Jb2awd1qsIoG+GDsmI7Xbe38krn05U4 +lZm93xlGBkn7sbwQ5xO74SW8bgs+OSZzEkfJcfB8XQb6XQRJNrkxu1Shx9IuxhML +5eQ2a5xKilvrzzhlGQQgizCqVhy5HMFGgSpIbIhzAoGYWIhVx63HYzcWJ90g7jVq +a9c1yVmXQ+2OcYM2hmk7cGBivKHHtqUMgjOmV/h+PARPdmL9pFtbusAYZnv6wvDb +PDqc9L8ZeSVwUBCcCFvT+BTxwCjco6VOujSTVsUJ/DUnngnMj1IN4J5OGW91gHWq +8Ps7wVZF+KsKgsph1ya7EHIlTnS89fynlpC2/tfYHuMtO/E2JvdV6uECgZkA1pbi +1BYqt2wKRlKEOB6GyujKWlKnyT3tH6DBY9hLQ4FoMC7ybpqXBaNHr+y2sPq5syvx +gwBh6CYyt6XVRWXqrRNuloPpEs63GQLXRdVf6+YRFBPBKlgvRpOzrsSuhpEWtvYZ +gYxzt2RFFcyYvO4/7DZHsU4bdJnTTbKDOqojiutanhYVjyLtrtbndWiva+lgfCEM +3haJ238CgZgbnkF4IlwNat95eKl+ddIBAl3/SDAMct/McLLYN1R8j+zhtotUf5wA +/wSHZgPpa7GbBymVERycogmyIs5LbfKpIPBNcwtl2O/So6R/+qCj39uMPrVIodqp +Dkb7OBhH+uo6xzQLi/Jd2CbMAqq1MVWmDEIftJjAPacWDjJODlg6lg0+c/2MZav8 +PXsW0Mtrlz2wCGhkcaQffA== +-----END RSA PRIVATE KEY----- From 29d5de1154711827d76d948aab7314499d6c30cf Mon Sep 17 00:00:00 2001 From: Renato Alves Date: Sat, 17 May 2014 20:46:30 +0100 Subject: [PATCH 3/4] Testing Add a class to manage one or more taskd servers running on the same machine. --- test/basetest/taskd.py | 184 +++++++++++++++++++++++++++++++++++++++++ test/basetest/utils.py | 68 +++++++++++++++ 2 files changed, 252 insertions(+) create mode 100644 test/basetest/taskd.py create mode 100644 test/basetest/utils.py diff --git a/test/basetest/taskd.py b/test/basetest/taskd.py new file mode 100644 index 000000000..26d4bc095 --- /dev/null +++ b/test/basetest/taskd.py @@ -0,0 +1,184 @@ +# -*- coding: utf-8 -*- + +import os +import tempfile +import shutil +import signal +from time import sleep +from subprocess import Popen +from .utils import find_unused_port, release_port, port_used, run_cmd_wait + +try: + from subprocess import DEVNULL +except ImportError: + DEVNULL = open(os.devnull, 'w') + +# Location relative to current script location +_curdir = os.path.dirname(os.path.abspath(__file__)) +DEFAULT_CERT_PATH = os.path.abspath(os.path.join(_curdir, "..", "test_certs")) + + +class TaskdServer(object): + """Manage a taskd instance + + A temporary folder is used as data store of taskd. + This class can be instanciated multiple times if multiple taskd servers are + needed. + + This class implements mechanisms to automatically select an available port + and prevent assigning the same port to different instances. + + A server can be stopped and started multiple times, but should not be + started or stopped after being destroyed. + """ + def __init__(self, taskd="taskd", certpath=None, address="127.0.0.1"): + """Initialize a Task server that runs in the background and stores data + in a temporary folder + + :arg taskd: Taskd binary to launch the server (defaults: taskd in PATH) + :arg certpath: Folder where to find all certificates needed for taskd + :arg address: Address to bind to + """ + self.taskd = taskd + # Will hold the taskd subprocess if it's running + self.proc = None + self.datadir = tempfile.mkdtemp() + + # Make sure no TASKDDATA is defined + try: + del os.environ["TASKDDATA"] + except KeyError: + pass + + if certpath is None: + certpath = DEFAULT_CERT_PATH + self.certpath = certpath + + self.address = address + self.port = find_unused_port() + + # Keep all certificate paths public for access by TaskClients + self.client_cert = os.path.join(self.certpath, "client.cert.pem") + self.client_key = os.path.join(self.certpath, "client.key.pem") + self.server_cert = os.path.join(self.certpath, "server.cert.pem") + self.server_key = os.path.join(self.certpath, "server.key.pem") + self.server_crl = os.path.join(self.certpath, "server.crl.pem") + self.ca_cert = os.path.join(self.certpath, "ca.cert.pem") + + # Initialize taskd + cmd = (self.taskd, "init", "--data", self.datadir) + run_cmd_wait(cmd) + + self.config("server", "{0}:{1}".format(self.address, self.port)) + self.config("log", os.path.join(self.datadir, "taskd.log")) + self.config("pid.file", os.path.join(self.datadir, "taskd.pid")) + self.config("root", self.datadir) + self.config("client.allow", "^task [2-9]") + + # Setup all necessary certificates + self.config("client.cert", self.client_cert) + self.config("client.key", self.client_key) + self.config("server.cert", self.server_cert) + self.config("server.key", self.server_key) + self.config("server.crl", self.server_crl) + self.config("ca.cert", self.ca_cert) + + def config(self, var, value): + """Run setup `var` as `value` in taskd config + """ + cmd = (self.taskd, "config", "--force", "--data", self.datadir, var, + value) + run_cmd_wait(cmd) + + # If server is running send a SIGHUP to force config reload + if self.proc is not None: + try: + self.proc.send_signal(signal.SIGHUP) + except: + pass + + def status(self): + """Check the status of the server by checking if it's still running and + listening for connections + :returns: True if running and listening, False otherwise (including + crashed and not started) + """ + if self.proc is None: + return False + + if self.proc.poll() is not None: + return False + + if not port_used(port=self.port): + return False + + return True + + def start(self): + """Start the taskd server if it's not running. + If it's already running OSError will be raised + """ + if self.proc is None: + cmd = (self.taskd, "server", "--data", self.datadir) + self.proc = Popen(cmd, stdout=DEVNULL, stdin=DEVNULL) + else: + raise OSError("Taskd server is still running or crashed") + + # Wait for server to listen by checking connectivity in the port + # Wait up to 5 minutes checking once second + minutes = 5 + for i in range(minutes * 60): + if not self.status(): + sleep(1) + else: + return + + raise OSError("Task server failed to start and listen on port {0}" + " after {1} minutes".format(self.port, minutes)) + + def stop(self): + """Stop the server by sending a SIGTERM and SIGKILL if fails to + terminate. + If it's already stopped OSError will be raised + """ + if self.proc is None: + raise OSError("Taskd server is not running") + + self.proc.send_signal(signal.SIGTERM) + + # Wait ~1 sec for taskd to finish and send a SIGKILL if still running + kill = True + for i in range(10): + sleep(0.1) + if self.proc.poll() is not None: + kill = False + break + + if kill: + self.proc.kill() + + # Wait for process to end to avoid zombies + self.proc.wait() + + # Unset the process to inform that no process is running + self.proc = None + + def destroy(self): + """Cleanup the data folder and release server port for other instances + """ + # Ensure server is stopped first + if self.proc is not None: + self.stop() + + try: + shutil.rmtree(self.datadir) + except OSError as e: + if e.errno == 2: + # Directory no longer exists + pass + else: + raise + + release_port(self.port) + +# vim: ai sts=4 et sw=4 diff --git a/test/basetest/utils.py b/test/basetest/utils.py new file mode 100644 index 000000000..3628e268e --- /dev/null +++ b/test/basetest/utils.py @@ -0,0 +1,68 @@ +# -*- coding: utf-8 -*- +import socket +from subprocess import Popen, PIPE + +USED_PORTS = set() + + +def run_cmd_wait(cmd): + "Run a subprocess and wait for it to finish" + p = Popen(cmd, stdout=PIPE, stderr=PIPE) + out, err = p.communicate() + + if p.returncode != 0: + raise IOError("Failed to run '{0}', exit code was '{1}', stdout" + " '{2}' and stderr '{3}'".format(cmd, p.returncode, + out, err)) + + +def port_used(addr="localhost", port=None): + "Return True if port is in use, False otherwise" + if port is None: + raise TypeError("Argument 'port' may not be None") + + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + result = s.connect_ex((addr, port)) + s.close() + # result == 0 if connection was successful + return result == 0 + + +def find_unused_port(addr="localhost", start=53589, track=True): + """Find an unused port starting at `port` + + If track=False the returned port will not be marked as in-use and the code + will rely entirely on the ability to connect to addr:port as detection + mechanism. Note this may cause problems if ports are assigned but not used + immediately + """ + maxport = 65535 + unused = None + + for port in xrange(start, maxport): + if not port_used(addr, port): + if track and port in USED_PORTS: + continue + + unused = port + break + + if unused is None: + raise ValueError("No available port in the range {0}-{1}".format( + start, maxport)) + + if track: + USED_PORTS.add(unused) + + return unused + + +def release_port(port): + """Forget that given port was marked as'in-use + """ + try: + USED_PORTS.remove(port) + except KeyError: + pass + +# vim: ai sts=4 et sw=4 From 08c11da7022c424ce1301d2b3923b254c8e7a305 Mon Sep 17 00:00:00 2001 From: Renato Alves Date: Sat, 17 May 2014 22:05:30 +0100 Subject: [PATCH 4/4] Testing Expose location of taskd.log and taskd.pid --- test/basetest/taskd.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/test/basetest/taskd.py b/test/basetest/taskd.py index 26d4bc095..d36489ef8 100644 --- a/test/basetest/taskd.py +++ b/test/basetest/taskd.py @@ -43,6 +43,8 @@ class TaskdServer(object): # Will hold the taskd subprocess if it's running self.proc = None self.datadir = tempfile.mkdtemp() + self.tasklog = os.path.join(self.datadir, "taskd.log") + self.taskpid = os.path.join(self.datadir, "taskd.pid") # Make sure no TASKDDATA is defined try: @@ -70,8 +72,8 @@ class TaskdServer(object): run_cmd_wait(cmd) self.config("server", "{0}:{1}".format(self.address, self.port)) - self.config("log", os.path.join(self.datadir, "taskd.log")) - self.config("pid.file", os.path.join(self.datadir, "taskd.pid")) + self.config("log", self.tasklog) + self.config("pid.file", self.taskpid) self.config("root", self.datadir) self.config("client.allow", "^task [2-9]")