Ejemplo n.º 1
0
    def test_split_or_merge__split(self):
        
        # setup 

        rrpair00 = self._get_rrpair('controller', action='a1')
        rrpair0 = self._get_rrpair('controller', action='a2')
        rrpair1 = self._get_rrpair('controller', action='a1')
        
        rrpair2 = self._get_rrpair('controller', action='a3')
        rrpair3 = self._get_rrpair('controller', action='a3')
        
        rrpair4 = self._get_rrpair('controller', action='a4')
        rrpair5 = self._get_rrpair('controller', action='a4')
        
        line1 = AilLine()
        line1.sample_rrpairs = [rrpair00, rrpair0, rrpair1]
        line1.request_pattern = RequestPattern(rrpair1.request)
        
        line2 = AilLine()
        line2.sample_rrpairs = [rrpair2, rrpair3]
        
        line3 = AilLine()
        line3.sample_rrpairs = [rrpair4, rrpair5]
        
        ail_spec = AilSpecification()
        ail_spec.lines = [line1, line2, line3]
        
        # test
        
        new_lines = split_or_merge_lines([line1, line2]) 
        
        # other problems, split should both split the current line and insert
        # parts of other lines into the new line
Ejemplo n.º 2
0
def _do_split(lines, features):

    if features is None:
        features = []

    new_lines = {}

    for line in lines:
        for rrpair in line.sample_rrpairs:
            value = []

            for feature in features:
                value.append(get_value_from_rrpair(rrpair, feature))

            value = tuple(value)

            if not new_lines.has_key(value):
                new_lines[value] = AilLine()

            new_lines[value].sample_rrpairs.append(rrpair)
            new_lines[value].response_types.update(line.response_types)

    for value, line in new_lines.items():
        line.request_pattern = RequestPattern(line.sample_rrpairs[0].request)

        for feature in features:
            line.request_pattern.tighten_feature(feature)

    return new_lines.values()
Ejemplo n.º 3
0
    def test_split_or_merge__merge_equal(self):
        
        # setup 

        rrpair1 = self._get_rrpair('controller', action='a1', pid=108)
        
        rrpair2 = self._get_rrpair('controller', action='a1', pid=108)
        
        line1 = AilLine()
        line1.sample_rrpairs = [rrpair1]
        line1.request_pattern = RequestPattern(rrpair1.request)
        
        line2 = AilLine()
        line2.sample_rrpairs = [rrpair2]
        
        ail_spec = AilSpecification()
        ail_spec.lines = [line1, line2]
        
        # test
        
        new_lines = split_or_merge_lines([line1, line2])
Ejemplo n.º 4
0
def refine_ail(partial_ail_spec):
    queue = []
    queue.extend(partial_ail_spec.lines)

    while len(queue) > 0:
        line = queue.pop()

        # filter empty lines
        if len(line.sample_rrpairs) == 0:

            partial_ail_spec.lines.remove(line)
            continue

        line.request_pattern = RequestPattern(line.sample_rrpairs[0].request)

        # split line if the requests are disjoint
        # e.g. different number of arguments or differet request method
        matching = []
        nonmatching = []

        for rrpair in line.sample_rrpairs:
            if line.request_pattern.includes(rrpair.request):
                matching.append(rrpair)
            else:
                nonmatching.append(rrpair)

        if len(nonmatching) > 0:
            new_line = AilLine()
            new_line.response_types = line.response_types
            new_line.sample_rrpairs = nonmatching

            partial_ail_spec.lines.append(new_line)
            queue.append(new_line)

            line.sample_rrpairs = matching

    conflicting_lines = {}

    for line in partial_ail_spec.lines:
        signature = line.request_pattern.signature

        if not conflicting_lines.has_key(signature):
            conflicting_lines[signature] = []

        conflicting_lines[signature].append(line)

    for signature,lines in conflicting_lines.items():
        if len(lines) == 1:
            continue

        added, removed = split_or_merge_lines(lines), lines

        for line in removed:
            partial_ail_spec.lines.remove(line)

        for line in added:
            partial_ail_spec.lines.append(line)

    # make it pretty
    for line in partial_ail_spec.lines:
        for feature in line.request_pattern.features:
            values = set()
            for rrpair in line.sample_rrpairs:
                value = get_value_from_rrpair(rrpair, feature)
                values.add(value)

            if len(values) == 1:
                line.request_pattern.tighten_feature(feature)

    return partial_ail_spec
Ejemplo n.º 5
0
def refine_ail(partial_ail_spec):
    queue = []
    queue.extend(partial_ail_spec.lines)

    while len(queue) > 0:
        line = queue.pop()

        # filter empty lines
        if len(line.sample_rrpairs) == 0:

            partial_ail_spec.lines.remove(line)
            continue

        line.request_pattern = RequestPattern(line.sample_rrpairs[0].request)

        # split line if the requests are disjoint
        # e.g. different number of arguments or differet request method
        matching = []
        nonmatching = []

        for rrpair in line.sample_rrpairs:
            if line.request_pattern.includes(rrpair.request):
                matching.append(rrpair)
            else:
                nonmatching.append(rrpair)

        if len(nonmatching) > 0:
            new_line = AilLine()
            new_line.response_types = line.response_types
            new_line.sample_rrpairs = nonmatching

            partial_ail_spec.lines.append(new_line)
            queue.append(new_line)

            line.sample_rrpairs = matching

    conflicting_lines = {}

    for line in partial_ail_spec.lines:
        signature = line.request_pattern.signature

        if not conflicting_lines.has_key(signature):
            conflicting_lines[signature] = []

        conflicting_lines[signature].append(line)

    for signature, lines in conflicting_lines.items():
        if len(lines) == 1:
            continue

        added, removed = split_or_merge_lines(lines), lines

        for line in removed:
            partial_ail_spec.lines.remove(line)

        for line in added:
            partial_ail_spec.lines.append(line)

    # make it pretty
    for line in partial_ail_spec.lines:
        for feature in line.request_pattern.features:
            values = set()
            for rrpair in line.sample_rrpairs:
                value = get_value_from_rrpair(rrpair, feature)
                values.add(value)

            if len(values) == 1:
                line.request_pattern.tighten_feature(feature)

    return partial_ail_spec