Source code for stix2generator.test.test_stix21_registry

import pytest
import stix2
import stix2.exceptions

import stix2generator
import stix2generator.language.builder
import stix2generator.generation.object_generator


[docs]def get_stix21_spec_names(): """ Gets the spec names from the STIX 2.1 registry. We need to know this to be able to test those specifications. """ registry = stix2generator._get_registry("2.1") return registry.keys()
STIX21_SPEC_NAMES = get_stix21_spec_names()
[docs]@pytest.fixture(scope="module") def generator_random_props(): """ Creates a generator which randomly includes or excludes properties. """ config = stix2generator.generation.object_generator.Config( minimize_ref_properties=False ) generator = stix2generator.create_object_generator(config, None, "2.1") return generator
[docs]@pytest.fixture(scope="module") def generator_min_props(): """ Creates a generator which omits all optional properties. """ config = stix2generator.generation.object_generator.Config( minimize_ref_properties=False, optional_property_probability=0 ) generator = stix2generator.create_object_generator(config, None, "2.1") return generator
[docs]@pytest.fixture(scope="module") def generator_all_props(): """ Creates a generator which includes all optional properties. """ config = stix2generator.generation.object_generator.Config( minimize_ref_properties=False, optional_property_probability=1 ) generator = stix2generator.create_object_generator(config, None, "2.1") return generator
[docs]@pytest.mark.parametrize("spec_name", STIX21_SPEC_NAMES) def test_generation_random_props(generator_random_props, spec_name, num_trials): for _ in range(num_trials): obj_dict = generator_random_props.generate(spec_name) # Distinguish between a STIX object spec and a "helper" spec used # by STIX object specs. Only makes sense to stix2.parse() the former. if spec_name[0].isupper(): try: stix2.parse(obj_dict, version="2.1") except stix2.exceptions.ParseError: # Maybe we can use this to mean this was an SCO? # Try a re-parse as an SCO. Need a better way to make the # distinction... stix2.parse_observable(obj_dict, version="2.1")
[docs]@pytest.mark.parametrize("spec_name", STIX21_SPEC_NAMES) def test_generation_min_props(generator_min_props, spec_name): obj_dict = generator_min_props.generate(spec_name) # Distinguish between a STIX object spec and a "helper" spec used # by STIX object specs. Only makes sense to stix2.parse() the former. if spec_name[0].isupper(): try: stix2.parse(obj_dict, version="2.1") except stix2.exceptions.ParseError: # Maybe we can use this to mean this was an SCO? # Try a re-parse as an SCO. Need a better way to make the # distinction... stix2.parse_observable(obj_dict, version="2.1")
[docs]@pytest.mark.parametrize("spec_name", STIX21_SPEC_NAMES) def test_generation_all_props(generator_all_props, spec_name): obj_dict = generator_all_props.generate(spec_name) # Distinguish between a STIX object spec and a "helper" spec used # by STIX object specs. Only makes sense to stix2.parse() the former. if spec_name[0].isupper(): try: stix2.parse(obj_dict, version="2.1") except stix2.exceptions.ParseError: # Maybe we can use this to mean this was an SCO? # Try a re-parse as an SCO. Need a better way to make the # distinction... stix2.parse_observable(obj_dict, version="2.1")
# Test "relationship" separately since it is lower-cased, but nevertheless # parseable by stix2. I wanted to keep it all lower-case so people # couldn't use it like an SDO/SCO in the prototyping language.
[docs]def test_generation_random_props_relationship( generator_random_props, num_trials ): for _ in range(num_trials): rel_dict = generator_random_props.generate("relationship") stix2.parse(rel_dict, version="2.1")
[docs]def test_generation_min_props_relationship(generator_min_props): rel_dict = generator_min_props.generate("relationship") stix2.parse(rel_dict, version="2.1")
[docs]def test_generation_all_props_relationship(generator_all_props): rel_dict = generator_all_props.generate("relationship") stix2.parse(rel_dict, version="2.1")
# Similar for sightings.
[docs]def test_generation_random_props_sighting( generator_random_props, num_trials ): for _ in range(num_trials): rel_dict = generator_random_props.generate("sighting") stix2.parse(rel_dict, version="2.1")
[docs]def test_generation_min_props_sighting(generator_min_props): rel_dict = generator_min_props.generate("sighting") stix2.parse(rel_dict, version="2.1")
[docs]def test_generation_all_props_sighting(generator_all_props): rel_dict = generator_all_props.generate("sighting") stix2.parse(rel_dict, version="2.1")