Monday, May 11, 2009

"Chester the test-data molester" comes to town

Introduction

"Chester the test-data molester" is a http test server that delivers various error scenarios consistently.

In the p2 project we have the need to test various communication error scenarios, such as when a web server reports illegal last modified dates, reports the wrong file size, endlessly redirects, hits internal server errors, when connection is made via a "hotel style" payment service etc. This was a real pain to set up in an ad-hoc manner, so I decided to create a small equinox based http testserver that is now ready for use.

The testserver has already been invaluable in finding trasport related issues. I thought it was worth writing this short introduction as it may help others test and fix error reporting issues in RCP apps with custom p2 user interface, for those that need to be able to replicate p2 problems where for security/practical reasons it is not possible to access the real repositories, as well as for those that simply need a http server that can create various error scenarios consistently.

How to get it

The testserver resides in the p2 CVS repository - org.eclipse.equinox.p2.testserver. To use it you need to check it out, as well as the org.eclipse.equinox.http bundle. (If you use the p2 team project sets in the p2 releng project you will get everything you need). There is a launch configuration in the testserver project that starts the testserver on "localhost:8080". (You can change the port in the launch configuration if you want).

Basic Services

The testserver starts some basic testing services on the following paths:

  • /timeout[/anything] - will wait 10 minutes and then produce no response
  • /status/nnn[/anything] - returns html content with the http response status code set to nnn, e.g. /status/500 for an internal server error
  • /redirect/nnn[/location] - redirects nnn times and then redirects to location (a path on testserver). If no location given, a html page with a message is generated as the final redirect. Examples:
    • /redirect/3/status/500 - redirects 3 times and then generates a 500 - internal error.
    • /redirect/3 - redirects 3 times and produces a message
    • /redirect/30 - redirects 30 times, and will trigger "too many redirects error" in most configurations
  • /never[/anything] - has basic authentication turned on, but will not accept any username/password as valid.

Content Delivery

The testserver also has content available - there is an index.html in the project, as well as some p2 repository test data. The testserver has also "mounted" the eclipse updates 3.4 repository on different paths with different types of wrappers/"molestors" in place.
This set of paths goes to the testserver bundle's web content - i.e. index.html and some p2 test data:
  • /public/... - normal access
  • /private/... - same as public but requires login with "Aladdin" and password "open sesame"
  • /truncated/... - truncates files by delivering less content than stated in length e.g. /truncated/index.html
  • /molested/... - returns garbage instead of real content in the later part of the file e.g. /molested/index.html
  • /decelerate/... - delivers content chopped up in small packets with delay, e.c. /decelerate/index.html (interesting to watch in firefox which delivers content as it comes in).
This set of paths has mounted http://download.eclipse.org/eclipse/updates/3.4 with various "molestors":
  • /proxy/private/... - requires login with "Aladdin" and password "open sesame"
  • /proxy/public/... - unmolested access (useful in redirects)
  • /proxy/decelerate/... - chops up content and delays delivery
  • /proxy/decelerate2/.... - chops up content and delays the last 20% of the delivery
  • /proxy/truncated/... - truncates all files
  • /proxy/molested/... - generates gibberish for later part of all files
  • /proxy/modified/... - delivers various errors in "last modified" (see below)
    • .../zero/... - all times are returned as 0
    • .../old/... - all times are very old
    • .../now/... - all times are the same as the request time
    • .../future/... - all times are in the future (which is illegal in HTTP)
    • .../bad/... - the time is not a date at all - the client should throw an error
  • /proxy/length/... - delivers various content length errors (see below)
    • .../zero/... - length is reported as 0 (but all content written to stream)
    • .../less/... - less than the correct size is reported (all content written)
    • .../more/... - double the correct size is reported (but only available content is written)

Get in touch

I had fun writing this - I mean, how often do you get to write classes called "Molestor" :). I hope you find the testserver useful, and that if you would like it to perform other forms of content maiming and mutilation that you contribute by submitting patches to the "p2" project marking issues with the text [testserver].