]> git-server-git.apps.pok.os.sepia.ceph.com Git - s3-tests.git/commitdiff
S3 Fuzzer: began writing graph descent
authorKyle Marsh <kyle.marsh@dreamhost.com>
Tue, 9 Aug 2011 18:56:38 +0000 (11:56 -0700)
committerKyle Marsh <kyle.marsh@dreamhost.com>
Mon, 12 Sep 2011 19:52:37 +0000 (12:52 -0700)
still missing headers and choice weights

request_decision_graph.yml
s3tests/functional/test_fuzzer.py
s3tests/fuzz_headers.py

index 774d391b2413b7247dd4c22e4128180dfa636c2d..d7b020659eeb564ed0fb3eb18a1a09afc0d298a1 100644 (file)
@@ -1,5 +1,5 @@
 start:
-    set: null
+    set: {}
     choice:
         - bucket
 
@@ -22,15 +22,15 @@ bucket_delete:
 delete_bucket:
     set:
         query: null
-    choice: null
+    choice: []
 
 delete_bucket_policy:
     set:
         query: 'policy'
-    choice: null
+    choice: []
 
 delete_bucket_website:
     set:
         query: 'website'
-    choice: null
+    choice: []
 
index 0b2865369141f250d054374303754925952554c8..69dd8fc63ff45d51bff44e5c569ad488534c48a2 100644 (file)
@@ -19,17 +19,60 @@ def check_access_denied(fn, *args, **kwargs):
     eq(e.error_code, 'AccessDenied')
 
 
-def read_graph():
+def build_graph():
+    graph = {}
+    graph['start'] = {
+        'set': {},
+        'choices': ['node1']
+    }
+    graph['leaf'] = {
+        'set': {
+            'key1': 'value1',
+            'key2': 'value2'
+        },
+        'choices': []
+    }
+    graph['node1'] = {
+        'set': {
+            'key3': 'value3'
+        },
+        'choices': ['leaf']
+    }
+    graph['bad_node'] = {
+        'set': {
+            'key1': 'value1'
+        },
+        'choices': ['leaf']
+    }
+    return graph
+
+
+def test_load_graph():
     graph_file = open('request_decision_graph.yml', 'r')
-    return yaml.safe_load(graph_file)
+    graph = yaml.safe_load(graph_file)
+    graph['start']
+
+
+def test_descend_leaf_node():
+    graph = build_graph()
+    prng = random.Random(1)
+    decision = descend_graph(graph, 'leaf', prng)
+
+    eq(decision['key1'], 'value1')
+    eq(decision['key2'], 'value2')
+    e = assert_raises(KeyError, lambda x: decision[x], 'key3')
+
+def test_descend_node():
+    graph = build_graph()
+    prng = random.Random(1)
+    decision = descend_graph(graph, 'node1', prng)
 
+    eq(decision['key1'], 'value1')
+    eq(decision['key2'], 'value2')
+    eq(decision['key3'], 'value3')
 
-def test_assemble_decision():
-    graph = read_graph()
+def test_descend_bad_node():
+    graph = build_graph()
     prng = random.Random(1)
-    decision = assemble_decision(graph, prng)
-    decision['path']
-    decision['method']
-    decision['body']
-    decision['headers']
+    assert_raises(KeyError, descend_graph, graph, 'bad_node', prng)
 
index 9886b25d5bb09ab5f2795349ac7fed8d59a3932e..5d538dd197f9d6c9502058653c16f4431313b71d 100644 (file)
@@ -14,7 +14,27 @@ def assemble_decision(decision_graph, prng):
     """ Take in a graph describing the possible decision space and a random
         number generator and traverse the graph to build a decision
     """
-    raise NotImplementedError
+    return descend_graph(decision_graph, 'start', prng)
+
+
+def descend_graph(decision_graph, node_name, prng):
+    """ Given a graph and a particular node in that graph, set the values in
+        the node's "set" list, pick a choice from the "choice" list, and
+        recurse.  Finally, return dictionary of values
+    """
+    try:
+        choice = prng.choice(decision_graph[node_name]['choices'])
+        decision = descend_graph(decision_graph, choice, prng)
+    except IndexError:
+        decision = {}
+
+    node = decision_graph[node_name]
+
+    for key in node['set']:
+        if decision.has_key(key):
+            raise KeyError("Node %s tried to set '%s', but that key was already set by a lower node!" %(node_name, key))
+        decision[key] = node['set'][key]
+    return decision
 
 
 def expand_decision(decision, prng):