def test_config_continue_path_through_ref_always(num_trials,
                                                 default_object_generator):
    pattern_config = Config(
        min_pattern_size=5,
        max_pattern_size=10,
        probability_continue_path_through_ref=1,
    )

    generator = PatternGenerator(default_object_generator, "2.1",
                                 pattern_config)

    for _ in range(num_trials):
        pattern_str = generator.generate()
        pattern_obj = Pattern(pattern_str)
        pattern_data = pattern_obj.inspect()

        for comparisons in pattern_data.comparisons.values():
            for path, _, _ in comparisons:
                # If all paths continue through refs, a ref prop can't be last,
                # and a refs prop can't be second-to-last.
                path_len = len(path)
                for i, path_elt in enumerate(path):
                    if isinstance(path_elt, str):
                        assert not path_elt.endswith(
                            "_ref") or i < path_len - 1
                        assert not path_elt.endswith(
                            "_refs") or i < path_len - 2
def test_config_repeat_count(num_trials, default_object_generator):
    pattern_config = Config(
        min_repeat_count=3,
        max_repeat_count=7,
        # Ensure there are lots of qualifiers, to increase the probability we
        # will actually see some REPEATS qualifiers to test.  There's not
        # actually any guarantee any will show up in the pattern!
        # ("probability_qualifier=1" below guarantees some qualifiers will be
        # included, but not which type of qualifiers they are.)
        min_pattern_size=5,
        max_pattern_size=10,
        probability_qualifier=1,
    )
    generator = PatternGenerator(default_object_generator, "2.1",
                                 pattern_config)

    for _ in range(num_trials):
        pattern_str = generator.generate()
        pattern_obj = Pattern(pattern_str)
        pattern_data = pattern_obj.inspect()

        for qualifier in pattern_data.qualifiers:
            m = _REPEATS_RE.match(qualifier)
            if m:
                repeat_count = int(m.group(1))
                assert 3 <= repeat_count <= 7
Exemple #3
0
def test_config_probability_index_star_step_never(
        num_trials, default_object_generator
):
    pattern_config = Config(
        min_pattern_size=5,
        max_pattern_size=10,
        probability_index_star_step=0,
    )

    generator = PatternGenerator(
        default_object_generator, "2.1", pattern_config
    )

    for _ in range(num_trials):
        pattern_str = generator.generate()
        pattern_obj = Pattern(pattern_str)
        pattern_data = pattern_obj.inspect()

        for comparisons in pattern_data.comparisons.values():
            for path, _, _ in comparisons:
                # If always using integer steps into lists, there should never
                # be any star steps.
                assert not any(
                    path_elt is stix2patterns.inspector.INDEX_STAR
                    for path_elt in path
                )
def test_config_pattern_size(num_trials, default_object_generator):
    pattern_config = Config(min_pattern_size=3, max_pattern_size=7)
    generator = PatternGenerator(default_object_generator, "2.1",
                                 pattern_config)

    for _ in range(num_trials):
        pattern_str = generator.generate()
        pattern_obj = Pattern(pattern_str)
        pattern_data = pattern_obj.inspect()

        comparison_data = pattern_data.comparisons
        pattern_size = sum(
            len(comparisons) for comparisons in comparison_data.values())

        assert 3 <= pattern_size <= 7
def test_config_within_count(num_trials, default_object_generator):
    pattern_config = Config(
        min_within_count=3,
        max_within_count=7,
        min_pattern_size=5,
        max_pattern_size=10,
        probability_qualifier=1,
    )
    generator = PatternGenerator(default_object_generator, "2.1",
                                 pattern_config)

    for _ in range(num_trials):
        pattern_str = generator.generate()
        pattern_obj = Pattern(pattern_str)
        pattern_data = pattern_obj.inspect()

        for qualifier in pattern_data.qualifiers:
            m = _WITHIN_RE.match(qualifier)
            if m:
                within_count = int(m.group(1))
                assert 3 <= within_count <= 7