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
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])
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
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