]> git-server-git.apps.pok.os.sepia.ceph.com Git - s3-tests.git/commitdiff
S3 Fuzzer: Add skeleton for a targeted S3 Fuzzer
authorKyle Marsh <kyle.marsh@dreamhost.com>
Thu, 4 Aug 2011 00:00:02 +0000 (17:00 -0700)
committerKyle Marsh <kyle.marsh@dreamhost.com>
Mon, 12 Sep 2011 19:49:12 +0000 (12:49 -0700)
s3tests/fuzz_headers.py [new file with mode: 0644]
setup.py

diff --git a/s3tests/fuzz_headers.py b/s3tests/fuzz_headers.py
new file mode 100644 (file)
index 0000000..c649080
--- /dev/null
@@ -0,0 +1,73 @@
+from boto.s3 import S3Connection
+from optparse import OptionParser
+from . import common
+
+import traceback
+import random
+import string
+import sys
+
+
+class FuzzyRequest(object):
+    # Initialized with a seed to be reproducible.
+    # string repr needs to look like:
+    # METHOD PATH HTTP/1.1
+    # HEADER_KEY: HEADER_VALUE[, HEADER_VALUE...]
+    # [        : HEADER_VALUE[, HEADER_VALUE...]
+    # <additional headers>
+    #
+    # BODY
+    pass
+
+def parse_options():
+    parser = OptionParser()
+    parser.add_option('-O', '--outfile', help='write output to FILE. Defaults to STDOUT', metavar='FILE')
+    parser.add_option('--seed', dest='seed', help='initial seed for the random number generator', metavar='SEED')
+    parser.add_option('--seed-file', dest='seedfile', help='read seeds for specific requests from FILE', metavar='FILE')
+    parser.add_option('-n', dest='num_requests', help='issue NUM requests before stopping', metavar='NUM')
+
+    return parser.parse_args()
+
+
+def randomlist(n, seed=None):
+    """ Returns a generator function that spits out a list of random numbers n elements long.
+    """
+    rng = random.Random()
+    rng.seed(seed if seed else None)
+    for _ in xrange(n):
+        yield rng.random()
+
+
+def _main():
+    """ The main script
+    """
+    (options, args) = parse_options()
+    random.seed(options.seed if options.seed else None)
+    s3_connection = config.s3.main
+
+    request_seeds
+    if options.seedfile:
+        FH = open(options.seedfile, 'r')
+        request_seeds = FH.readlines()
+    else:
+        request_seeds = randomlist(options.num_requests, options.seed)
+
+    for i in request_seeds:
+        fuzzy = FuzzyRequest(request_seed)
+
+        http_connection = s3_connection.get_http_connection(s3_connection.host, s3_connection.is_secure)
+        http_connection.request(fuzzy.method, fuzzy.path, body=fuzzy.body, headers=fuzzy.headers)
+
+        response = http_connection.getresponse()
+        if response.status == 500 or response.status == 503:
+            print 'Request generated with seed %d failed:\n%s' % (request_seed, fuzzy)
+
+
+def main():
+    common.setup()
+    try:
+        _main()
+    except Exception as e:
+        traceback.print_exc()
+        common.teardown()
+
index 1fc636cd5b2adeacd35fe0f5ac0eb21051e509eb..edcab1abb36f98dda5aac9d68b91081c551b02bc 100644 (file)
--- a/setup.py
+++ b/setup.py
@@ -25,6 +25,7 @@ setup(
             's3tests-generate-objects = s3tests.generate_objects:main',
             's3tests-test-readwrite = s3tests.readwrite:main',
             's3tests-test-roundtrip = s3tests.roundtrip:main',
+            's3tests-fuzz-headers = s3tests.fuzz_headers:main',
             ],
         },