mirror of
https://github.com/ceph/s3-tests.git
synced 2024-11-22 09:29:43 +00:00
S3 Fuzzer: began writing graph descent
still missing headers and choice weights
This commit is contained in:
parent
fc93c02963
commit
a9a41a2891
3 changed files with 77 additions and 14 deletions
|
@ -1,5 +1,5 @@
|
||||||
start:
|
start:
|
||||||
set: null
|
set: {}
|
||||||
choice:
|
choice:
|
||||||
- bucket
|
- bucket
|
||||||
|
|
||||||
|
@ -22,15 +22,15 @@ bucket_delete:
|
||||||
delete_bucket:
|
delete_bucket:
|
||||||
set:
|
set:
|
||||||
query: null
|
query: null
|
||||||
choice: null
|
choice: []
|
||||||
|
|
||||||
delete_bucket_policy:
|
delete_bucket_policy:
|
||||||
set:
|
set:
|
||||||
query: 'policy'
|
query: 'policy'
|
||||||
choice: null
|
choice: []
|
||||||
|
|
||||||
delete_bucket_website:
|
delete_bucket_website:
|
||||||
set:
|
set:
|
||||||
query: 'website'
|
query: 'website'
|
||||||
choice: null
|
choice: []
|
||||||
|
|
||||||
|
|
|
@ -19,17 +19,60 @@ def check_access_denied(fn, *args, **kwargs):
|
||||||
eq(e.error_code, 'AccessDenied')
|
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')
|
graph_file = open('request_decision_graph.yml', 'r')
|
||||||
return yaml.safe_load(graph_file)
|
graph = yaml.safe_load(graph_file)
|
||||||
|
graph['start']
|
||||||
|
|
||||||
|
|
||||||
def test_assemble_decision():
|
def test_descend_leaf_node():
|
||||||
graph = read_graph()
|
graph = build_graph()
|
||||||
prng = random.Random(1)
|
prng = random.Random(1)
|
||||||
decision = assemble_decision(graph, prng)
|
decision = descend_graph(graph, 'leaf', prng)
|
||||||
decision['path']
|
|
||||||
decision['method']
|
eq(decision['key1'], 'value1')
|
||||||
decision['body']
|
eq(decision['key2'], 'value2')
|
||||||
decision['headers']
|
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_descend_bad_node():
|
||||||
|
graph = build_graph()
|
||||||
|
prng = random.Random(1)
|
||||||
|
assert_raises(KeyError, descend_graph, graph, 'bad_node', prng)
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,27 @@ def assemble_decision(decision_graph, prng):
|
||||||
""" Take in a graph describing the possible decision space and a random
|
""" Take in a graph describing the possible decision space and a random
|
||||||
number generator and traverse the graph to build a decision
|
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):
|
def expand_decision(decision, prng):
|
||||||
|
|
Loading…
Reference in a new issue