Update v21 tests for some missing methods, ensure we are calling and

using the right classes.
stix2.1
Emmanuelle Vargas-Gonzalez 2018-07-05 15:21:09 -04:00
parent bfa86bf87e
commit 2c5ddc14af
9 changed files with 117 additions and 105 deletions

View File

@ -100,7 +100,7 @@ def test_bundle_with_wrong_type():
with pytest.raises(stix2.exceptions.InvalidValueError) as excinfo: with pytest.raises(stix2.exceptions.InvalidValueError) as excinfo:
stix2.v21.Bundle(type="not-a-bundle") stix2.v21.Bundle(type="not-a-bundle")
assert excinfo.value.cls == stix2.Bundle assert excinfo.value.cls == stix2.v21.Bundle
assert excinfo.value.prop_name == "type" assert excinfo.value.prop_name == "type"
assert excinfo.value.reason == "must equal 'bundle'." assert excinfo.value.reason == "must equal 'bundle'."
assert str(excinfo.value) == "Invalid value for Bundle 'type': must equal 'bundle'." assert str(excinfo.value) == "Invalid value for Bundle 'type': must equal 'bundle'."
@ -110,7 +110,7 @@ def test_bundle_id_must_start_with_bundle():
with pytest.raises(stix2.exceptions.InvalidValueError) as excinfo: with pytest.raises(stix2.exceptions.InvalidValueError) as excinfo:
stix2.v21.Bundle(id='my-prefix--') stix2.v21.Bundle(id='my-prefix--')
assert excinfo.value.cls == stix2.Bundle assert excinfo.value.cls == stix2.v21.Bundle
assert excinfo.value.prop_name == "id" assert excinfo.value.prop_name == "id"
assert excinfo.value.reason == "must start with 'bundle--'." assert excinfo.value.reason == "must start with 'bundle--'."
assert str(excinfo.value) == "Invalid value for Bundle 'id': must start with 'bundle--'." assert str(excinfo.value) == "Invalid value for Bundle 'id': must start with 'bundle--'."
@ -179,7 +179,7 @@ def test_parse_bundle(version):
assert bundle.type == "bundle" assert bundle.type == "bundle"
assert bundle.id.startswith("bundle--") assert bundle.id.startswith("bundle--")
assert type(bundle.objects[0]) is stix2.v21.sdo.Indicator assert type(bundle.objects[0]) is stix2.v21.Indicator
assert bundle.objects[0].type == 'indicator' assert bundle.objects[0].type == 'indicator'
assert bundle.objects[1].type == 'malware' assert bundle.objects[1].type == 'malware'
assert bundle.objects[2].type == 'relationship' assert bundle.objects[2].type == 'relationship'

View File

@ -2,7 +2,6 @@ import pytest
import stix2 import stix2
import stix2.base import stix2.base
import stix2.v21.sdo
from .constants import FAKE_TIME, MARKING_DEFINITION_ID from .constants import FAKE_TIME, MARKING_DEFINITION_ID
@ -263,7 +262,7 @@ def test_identity_custom_property_edit_markings():
def test_custom_marking_no_init_1(): def test_custom_marking_no_init_1():
@stix2.CustomMarking('x-new-obj', [ @stix2.v21.CustomMarking('x-new-obj', [
('property1', stix2.v21.properties.StringProperty(required=True)), ('property1', stix2.v21.properties.StringProperty(required=True)),
]) ])
class NewObj(): class NewObj():
@ -274,7 +273,7 @@ def test_custom_marking_no_init_1():
def test_custom_marking_no_init_2(): def test_custom_marking_no_init_2():
@stix2.CustomMarking('x-new-obj2', [ @stix2.v21.CustomMarking('x-new-obj2', [
('property1', stix2.v21.properties.StringProperty(required=True)), ('property1', stix2.v21.properties.StringProperty(required=True)),
]) ])
class NewObj2(object): class NewObj2(object):
@ -284,7 +283,7 @@ def test_custom_marking_no_init_2():
assert no2.property1 == 'something' assert no2.property1 == 'something'
@stix2.sdo.CustomObject('x-new-type', [ @stix2.v21.CustomObject('x-new-type', [
('property1', stix2.v21.properties.StringProperty(required=True)), ('property1', stix2.v21.properties.StringProperty(required=True)),
('property2', stix2.v21.properties.IntegerProperty()), ('property2', stix2.v21.properties.IntegerProperty()),
]) ])
@ -317,8 +316,8 @@ def test_custom_object_type():
def test_custom_object_no_init_1(): def test_custom_object_no_init_1():
@stix2.sdo.CustomObject('x-new-obj', [ @stix2.v21.CustomObject('x-new-obj', [
('property1', stix2.properties.StringProperty(required=True)), ('property1', stix2.v21.properties.StringProperty(required=True)),
]) ])
class NewObj(): class NewObj():
pass pass
@ -328,8 +327,8 @@ def test_custom_object_no_init_1():
def test_custom_object_no_init_2(): def test_custom_object_no_init_2():
@stix2.sdo.CustomObject('x-new-obj2', [ @stix2.v21.CustomObject('x-new-obj2', [
('property1', stix2.properties.StringProperty(required=True)), ('property1', stix2.v21.properties.StringProperty(required=True)),
]) ])
class NewObj2(object): class NewObj2(object):
pass pass
@ -340,16 +339,16 @@ def test_custom_object_no_init_2():
def test_custom_object_invalid_type_name(): def test_custom_object_invalid_type_name():
with pytest.raises(ValueError) as excinfo: with pytest.raises(ValueError) as excinfo:
@stix2.sdo.CustomObject('x', [ @stix2.v21.CustomObject('x', [
('property1', stix2.properties.StringProperty(required=True)), ('property1', stix2.v21.properties.StringProperty(required=True)),
]) ])
class NewObj(object): class NewObj(object):
pass # pragma: no cover pass # pragma: no cover
assert "Invalid type name 'x': " in str(excinfo.value) assert "Invalid type name 'x': " in str(excinfo.value)
with pytest.raises(ValueError) as excinfo: with pytest.raises(ValueError) as excinfo:
@stix2.sdo.CustomObject('x_new_object', [ @stix2.v21.CustomObject('x_new_object', [
('property1', stix2.properties.StringProperty(required=True)), ('property1', stix2.v21.properties.StringProperty(required=True)),
]) ])
class NewObj2(object): class NewObj2(object):
pass # pragma: no cover pass # pragma: no cover
@ -375,7 +374,7 @@ def test_parse_unregistered_custom_object_type():
}""" }"""
with pytest.raises(stix2.exceptions.ParseError) as excinfo: with pytest.raises(stix2.exceptions.ParseError) as excinfo:
stix2.parse(nt_string) stix2.parse(nt_string, version="2.1")
assert "Can't parse unknown object type" in str(excinfo.value) assert "Can't parse unknown object type" in str(excinfo.value)
assert "use the CustomObject decorator." in str(excinfo.value) assert "use the CustomObject decorator." in str(excinfo.value)
@ -390,14 +389,14 @@ def test_parse_unregistered_custom_object_type_w_allow_custom():
"property1": "something" "property1": "something"
}""" }"""
custom_obj = stix2.parse(nt_string, allow_custom=True) custom_obj = stix2.parse(nt_string, version="2.1", allow_custom=True)
assert custom_obj["type"] == "x-foobar-observable" assert custom_obj["type"] == "x-foobar-observable"
@stix2.observables.CustomObservable('x-new-observable', [ @stix2.v21.CustomObservable('x-new-observable', [
('property1', stix2.properties.StringProperty(required=True)), ('property1', stix2.v21.properties.StringProperty(required=True)),
('property2', stix2.properties.IntegerProperty()), ('property2', stix2.v21.properties.IntegerProperty()),
('x_property3', stix2.properties.BooleanProperty()), ('x_property3', stix2.v21.properties.BooleanProperty()),
]) ])
class NewObservable(): class NewObservable():
def __init__(self, property2=None, **kwargs): def __init__(self, property2=None, **kwargs):
@ -433,8 +432,8 @@ def test_custom_observable_raises_exception():
def test_custom_observable_object_no_init_1(): def test_custom_observable_object_no_init_1():
@stix2.observables.CustomObservable('x-new-observable', [ @stix2.v21.CustomObservable('x-new-observable', [
('property1', stix2.properties.StringProperty()), ('property1', stix2.v21.properties.StringProperty()),
]) ])
class NewObs(): class NewObs():
pass pass
@ -444,8 +443,8 @@ def test_custom_observable_object_no_init_1():
def test_custom_observable_object_no_init_2(): def test_custom_observable_object_no_init_2():
@stix2.observables.CustomObservable('x-new-obs2', [ @stix2.v21.CustomObservable('x-new-obs2', [
('property1', stix2.properties.StringProperty()), ('property1', stix2.v21.properties.StringProperty()),
]) ])
class NewObs2(object): class NewObs2(object):
pass pass
@ -456,16 +455,16 @@ def test_custom_observable_object_no_init_2():
def test_custom_observable_object_invalid_type_name(): def test_custom_observable_object_invalid_type_name():
with pytest.raises(ValueError) as excinfo: with pytest.raises(ValueError) as excinfo:
@stix2.observables.CustomObservable('x', [ @stix2.v21.CustomObservable('x', [
('property1', stix2.properties.StringProperty()), ('property1', stix2.v21.properties.StringProperty()),
]) ])
class NewObs(object): class NewObs(object):
pass # pragma: no cover pass # pragma: no cover
assert "Invalid observable type name 'x':" in str(excinfo.value) assert "Invalid observable type name 'x':" in str(excinfo.value)
with pytest.raises(ValueError) as excinfo: with pytest.raises(ValueError) as excinfo:
@stix2.observables.CustomObservable('x_new_obs', [ @stix2.v21.CustomObservable('x_new_obs', [
('property1', stix2.properties.StringProperty()), ('property1', stix2.v21.properties.StringProperty()),
]) ])
class NewObs2(object): class NewObs2(object):
pass # pragma: no cover pass # pragma: no cover
@ -474,8 +473,8 @@ def test_custom_observable_object_invalid_type_name():
def test_custom_observable_object_invalid_ref_property(): def test_custom_observable_object_invalid_ref_property():
with pytest.raises(ValueError) as excinfo: with pytest.raises(ValueError) as excinfo:
@stix2.observables.CustomObservable('x-new-obs', [ @stix2.v21.CustomObservable('x-new-obs', [
('property_ref', stix2.properties.StringProperty()), ('property_ref', stix2.v21.properties.StringProperty()),
]) ])
class NewObs(): class NewObs():
pass pass
@ -484,8 +483,8 @@ def test_custom_observable_object_invalid_ref_property():
def test_custom_observable_object_invalid_refs_property(): def test_custom_observable_object_invalid_refs_property():
with pytest.raises(ValueError) as excinfo: with pytest.raises(ValueError) as excinfo:
@stix2.observables.CustomObservable('x-new-obs', [ @stix2.v21.CustomObservable('x-new-obs', [
('property_refs', stix2.properties.StringProperty()), ('property_refs', stix2.v21.properties.StringProperty()),
]) ])
class NewObs(): class NewObs():
pass pass
@ -494,8 +493,8 @@ def test_custom_observable_object_invalid_refs_property():
def test_custom_observable_object_invalid_refs_list_property(): def test_custom_observable_object_invalid_refs_list_property():
with pytest.raises(ValueError) as excinfo: with pytest.raises(ValueError) as excinfo:
@stix2.observables.CustomObservable('x-new-obs', [ @stix2.v21.CustomObservable('x-new-obs', [
('property_refs', stix2.properties.ListProperty(stix2.properties.StringProperty)), ('property_refs', stix2.v21.properties.ListProperty(stix2.v21.properties.StringProperty)),
]) ])
class NewObs(): class NewObs():
pass pass
@ -503,9 +502,9 @@ def test_custom_observable_object_invalid_refs_list_property():
def test_custom_observable_object_invalid_valid_refs(): def test_custom_observable_object_invalid_valid_refs():
@stix2.observables.CustomObservable('x-new-obs', [ @stix2.v21.CustomObservable('x-new-obs', [
('property1', stix2.properties.StringProperty(required=True)), ('property1', stix2.v21.properties.StringProperty(required=True)),
('property_ref', stix2.properties.ObjectReferenceProperty(valid_types='email-addr')), ('property_ref', stix2.v21.properties.ObjectReferenceProperty(valid_types='email-addr')),
]) ])
class NewObs(): class NewObs():
pass pass
@ -520,7 +519,7 @@ def test_custom_observable_object_invalid_valid_refs():
def test_custom_no_properties_raises_exception(): def test_custom_no_properties_raises_exception():
with pytest.raises(ValueError): with pytest.raises(ValueError):
@stix2.sdo.CustomObject('x-new-object-type') @stix2.v21.CustomObject('x-new-object-type')
class NewObject1(object): class NewObject1(object):
pass pass
@ -528,7 +527,7 @@ def test_custom_no_properties_raises_exception():
def test_custom_wrong_properties_arg_raises_exception(): def test_custom_wrong_properties_arg_raises_exception():
with pytest.raises(ValueError): with pytest.raises(ValueError):
@stix2.observables.CustomObservable('x-new-object-type', (("prop", stix2.properties.BooleanProperty()))) @stix2.v21.CustomObservable('x-new-object-type', (("prop", stix2.v21.properties.BooleanProperty())))
class NewObject2(object): class NewObject2(object):
pass pass
@ -539,7 +538,7 @@ def test_parse_custom_observable_object():
"property1": "something" "property1": "something"
}""" }"""
nt = stix2.parse_observable(nt_string, []) nt = stix2.parse_observable(nt_string, [], version='2.1')
assert isinstance(nt, stix2.base._STIXBase) assert isinstance(nt, stix2.base._STIXBase)
assert nt.property1 == 'something' assert nt.property1 == 'something'
@ -551,10 +550,10 @@ def test_parse_unregistered_custom_observable_object():
}""" }"""
with pytest.raises(stix2.exceptions.CustomContentError) as excinfo: with pytest.raises(stix2.exceptions.CustomContentError) as excinfo:
stix2.parse_observable(nt_string) stix2.parse_observable(nt_string, version='2.1')
assert "Can't parse unknown observable type" in str(excinfo.value) assert "Can't parse unknown observable type" in str(excinfo.value)
parsed_custom = stix2.parse_observable(nt_string, allow_custom=True) parsed_custom = stix2.parse_observable(nt_string, allow_custom=True, version='2.1')
assert parsed_custom['property1'] == 'something' assert parsed_custom['property1'] == 'something'
with pytest.raises(AttributeError) as excinfo: with pytest.raises(AttributeError) as excinfo:
assert parsed_custom.property1 == 'something' assert parsed_custom.property1 == 'something'
@ -567,7 +566,7 @@ def test_parse_unregistered_custom_observable_object_with_no_type():
}""" }"""
with pytest.raises(stix2.exceptions.ParseError) as excinfo: with pytest.raises(stix2.exceptions.ParseError) as excinfo:
stix2.parse_observable(nt_string, allow_custom=True) stix2.parse_observable(nt_string, allow_custom=True, version='2.1')
assert "Can't parse observable with no 'type' property" in str(excinfo.value) assert "Can't parse observable with no 'type' property" in str(excinfo.value)
@ -587,7 +586,7 @@ def test_parse_observed_data_with_custom_observable():
} }
} }
}""" }"""
parsed = stix2.parse(input_str, allow_custom=True) parsed = stix2.parse(input_str, version="2.1", allow_custom=True)
assert parsed.objects['0']['property1'] == 'something' assert parsed.objects['0']['property1'] == 'something'
@ -597,7 +596,7 @@ def test_parse_invalid_custom_observable_object():
}""" }"""
with pytest.raises(stix2.exceptions.ParseError) as excinfo: with pytest.raises(stix2.exceptions.ParseError) as excinfo:
stix2.parse_observable(nt_string) stix2.parse_observable(nt_string, version='2.1')
assert "Can't parse observable with no 'type' property" in str(excinfo.value) assert "Can't parse observable with no 'type' property" in str(excinfo.value)
@ -639,7 +638,7 @@ def test_observable_custom_property_allowed():
def test_observed_data_with_custom_observable_object(): def test_observed_data_with_custom_observable_object():
no = NewObservable(property1='something') no = NewObservable(property1='something')
ob_data = stix2.ObservedData( ob_data = stix2.v21.ObservedData(
first_observed=FAKE_TIME, first_observed=FAKE_TIME,
last_observed=FAKE_TIME, last_observed=FAKE_TIME,
number_observed=1, number_observed=1,
@ -649,9 +648,9 @@ def test_observed_data_with_custom_observable_object():
assert ob_data.objects['0'].property1 == 'something' assert ob_data.objects['0'].property1 == 'something'
@stix2.observables.CustomExtension(stix2.DomainName, 'x-new-ext', [ @stix2.v21.CustomExtension(stix2.v21.DomainName, 'x-new-ext', [
('property1', stix2.properties.StringProperty(required=True)), ('property1', stix2.v21.properties.StringProperty(required=True)),
('property2', stix2.properties.IntegerProperty()), ('property2', stix2.v21.properties.IntegerProperty()),
]) ])
class NewExtension(): class NewExtension():
def __init__(self, property2=None, **kwargs): def __init__(self, property2=None, **kwargs):
@ -686,10 +685,11 @@ def test_custom_extension_wrong_observable_type():
# NewExtension is an extension of DomainName, not File # NewExtension is an extension of DomainName, not File
ext = NewExtension(property1='something') ext = NewExtension(property1='something')
with pytest.raises(ValueError) as excinfo: with pytest.raises(ValueError) as excinfo:
stix2.File(name="abc.txt", stix2.v21.File(
extensions={ name="abc.txt",
"ntfs-ext": ext, extensions={
}) "ntfs-ext": ext,
})
assert 'Cannot determine extension type' in excinfo.value.reason assert 'Cannot determine extension type' in excinfo.value.reason
@ -705,8 +705,8 @@ def test_custom_extension_wrong_observable_type():
}""", }""",
]) ])
def test_custom_extension_with_list_and_dict_properties_observable_type(data): def test_custom_extension_with_list_and_dict_properties_observable_type(data):
@stix2.observables.CustomExtension(stix2.UserAccount, 'some-extension', [ @stix2.v21.CustomExtension(stix2.v21.UserAccount, 'some-extension', [
('keys', stix2.properties.ListProperty(stix2.properties.DictionaryProperty, required=True)) ('keys', stix2.v21.properties.ListProperty(stix2.v21.properties.DictionaryProperty, required=True))
]) ])
class SomeCustomExtension: class SomeCustomExtension:
pass pass
@ -721,29 +721,29 @@ def test_custom_extension_invalid_observable():
class Foo(object): class Foo(object):
pass pass
with pytest.raises(ValueError) as excinfo: with pytest.raises(ValueError) as excinfo:
@stix2.observables.CustomExtension(Foo, 'x-new-ext', [ @stix2.v21.CustomExtension(Foo, 'x-new-ext', [
('property1', stix2.properties.StringProperty(required=True)), ('property1', stix2.v21.properties.StringProperty(required=True)),
]) ])
class FooExtension(): class FooExtension():
pass # pragma: no cover pass # pragma: no cover
assert str(excinfo.value) == "'observable' must be a valid Observable class!" assert str(excinfo.value) == "'observable' must be a valid Observable class!"
class Bar(stix2.observables._Observable): class Bar(stix2.v21.observables._Observable):
pass pass
with pytest.raises(ValueError) as excinfo: with pytest.raises(ValueError) as excinfo:
@stix2.observables.CustomExtension(Bar, 'x-new-ext', [ @stix2.v21.CustomExtension(Bar, 'x-new-ext', [
('property1', stix2.properties.StringProperty(required=True)), ('property1', stix2.v21.properties.StringProperty(required=True)),
]) ])
class BarExtension(): class BarExtension():
pass pass
assert "Unknown observable type" in str(excinfo.value) assert "Unknown observable type" in str(excinfo.value)
assert "Custom observables must be created with the @CustomObservable decorator." in str(excinfo.value) assert "Custom observables must be created with the @CustomObservable decorator." in str(excinfo.value)
class Baz(stix2.observables._Observable): class Baz(stix2.v21.observables._Observable):
_type = 'Baz' _type = 'Baz'
with pytest.raises(ValueError) as excinfo: with pytest.raises(ValueError) as excinfo:
@stix2.observables.CustomExtension(Baz, 'x-new-ext', [ @stix2.v21.CustomExtension(Baz, 'x-new-ext', [
('property1', stix2.properties.StringProperty(required=True)), ('property1', stix2.v21.properties.StringProperty(required=True)),
]) ])
class BazExtension(): class BazExtension():
pass pass
@ -753,16 +753,16 @@ def test_custom_extension_invalid_observable():
def test_custom_extension_invalid_type_name(): def test_custom_extension_invalid_type_name():
with pytest.raises(ValueError) as excinfo: with pytest.raises(ValueError) as excinfo:
@stix2.observables.CustomExtension(stix2.File, 'x', { @stix2.v21.CustomExtension(stix2.v21.File, 'x', {
'property1': stix2.properties.StringProperty(required=True), 'property1': stix2.v21.properties.StringProperty(required=True),
}) })
class FooExtension(): class FooExtension():
pass # pragma: no cover pass # pragma: no cover
assert "Invalid extension type name 'x':" in str(excinfo.value) assert "Invalid extension type name 'x':" in str(excinfo.value)
with pytest.raises(ValueError) as excinfo: with pytest.raises(ValueError) as excinfo:
@stix2.observables.CustomExtension(stix2.File, 'x_new_ext', { @stix2.v21.CustomExtension(stix2.v21.File, 'x_new_ext', {
'property1': stix2.properties.StringProperty(required=True), 'property1': stix2.v21.properties.StringProperty(required=True),
}) })
class BlaExtension(): class BlaExtension():
pass # pragma: no cover pass # pragma: no cover
@ -771,7 +771,7 @@ def test_custom_extension_invalid_type_name():
def test_custom_extension_no_properties(): def test_custom_extension_no_properties():
with pytest.raises(ValueError) as excinfo: with pytest.raises(ValueError) as excinfo:
@stix2.observables.CustomExtension(stix2.DomainName, 'x-new-ext2', None) @stix2.v21.CustomExtension(stix2.v21.DomainName, 'x-new-ext2', None)
class BarExtension(): class BarExtension():
pass pass
assert "Must supply a list, containing tuples." in str(excinfo.value) assert "Must supply a list, containing tuples." in str(excinfo.value)
@ -779,7 +779,7 @@ def test_custom_extension_no_properties():
def test_custom_extension_empty_properties(): def test_custom_extension_empty_properties():
with pytest.raises(ValueError) as excinfo: with pytest.raises(ValueError) as excinfo:
@stix2.observables.CustomExtension(stix2.DomainName, 'x-new-ext2', []) @stix2.v21.CustomExtension(stix2.v21.DomainName, 'x-new-ext2', [])
class BarExtension(): class BarExtension():
pass pass
assert "Must supply a list, containing tuples." in str(excinfo.value) assert "Must supply a list, containing tuples." in str(excinfo.value)
@ -787,15 +787,15 @@ def test_custom_extension_empty_properties():
def test_custom_extension_dict_properties(): def test_custom_extension_dict_properties():
with pytest.raises(ValueError) as excinfo: with pytest.raises(ValueError) as excinfo:
@stix2.observables.CustomExtension(stix2.DomainName, 'x-new-ext2', {}) @stix2.v21.CustomExtension(stix2.v21.DomainName, 'x-new-ext2', {})
class BarExtension(): class BarExtension():
pass pass
assert "Must supply a list, containing tuples." in str(excinfo.value) assert "Must supply a list, containing tuples." in str(excinfo.value)
def test_custom_extension_no_init_1(): def test_custom_extension_no_init_1():
@stix2.observables.CustomExtension(stix2.DomainName, 'x-new-extension', [ @stix2.v21.CustomExtension(stix2.v21.DomainName, 'x-new-extension', [
('property1', stix2.properties.StringProperty(required=True)), ('property1', stix2.v21.properties.StringProperty(required=True)),
]) ])
class NewExt(): class NewExt():
pass pass
@ -805,8 +805,8 @@ def test_custom_extension_no_init_1():
def test_custom_extension_no_init_2(): def test_custom_extension_no_init_2():
@stix2.observables.CustomExtension(stix2.DomainName, 'x-new-ext2', [ @stix2.v21.CustomExtension(stix2.v21.DomainName, 'x-new-ext2', [
('property1', stix2.properties.StringProperty(required=True)), ('property1', stix2.v21.properties.StringProperty(required=True)),
]) ])
class NewExt2(object): class NewExt2(object):
pass pass
@ -827,7 +827,7 @@ def test_parse_observable_with_custom_extension():
} }
}""" }"""
parsed = stix2.parse_observable(input_str) parsed = stix2.parse_observable(input_str, version='2.1')
assert parsed.extensions['x-new-ext'].property2 == 12 assert parsed.extensions['x-new-ext'].property2 == 12
@ -844,10 +844,10 @@ def test_parse_observable_with_unregistered_custom_extension():
}""" }"""
with pytest.raises(ValueError) as excinfo: with pytest.raises(ValueError) as excinfo:
stix2.parse_observable(input_str) stix2.parse_observable(input_str, version='2.1')
assert "Can't parse unknown extension type" in str(excinfo.value) assert "Can't parse unknown extension type" in str(excinfo.value)
parsed_ob = stix2.parse_observable(input_str, allow_custom=True) parsed_ob = stix2.parse_observable(input_str, allow_custom=True, version='2.1')
assert parsed_ob['extensions']['x-foobar-ext']['property1'] == 'foo' assert parsed_ob['extensions']['x-foobar-ext']['property1'] == 'foo'
assert not isinstance(parsed_ob['extensions']['x-foobar-ext'], stix2.base._STIXBase) assert not isinstance(parsed_ob['extensions']['x-foobar-ext'], stix2.base._STIXBase)
@ -857,14 +857,14 @@ def test_register_custom_object():
class CustomObject2(object): class CustomObject2(object):
_type = 'awesome-object' _type = 'awesome-object'
stix2._register_type(CustomObject2) stix2._register_object(CustomObject2, version="2.1")
# Note that we will always check against newest OBJ_MAP. # Note that we will always check against newest OBJ_MAP.
assert (CustomObject2._type, CustomObject2) in stix2.OBJ_MAP.items() assert (CustomObject2._type, CustomObject2) in stix2.v21.OBJ_MAP.items()
def test_extension_property_location(): def test_extension_property_location():
assert 'extensions' in stix2.v21.observables.OBJ_MAP_OBSERVABLE['x-new-observable']._properties assert 'extensions' in stix2.v21.OBJ_MAP_OBSERVABLE['x-new-observable']._properties
assert 'extensions' not in stix2.v21.observables.EXT_MAP['domain-name']['x-new-ext']._properties assert 'extensions' not in stix2.v21.EXT_MAP['domain-name']['x-new-ext']._properties
@pytest.mark.parametrize("data", [ @pytest.mark.parametrize("data", [
@ -883,7 +883,7 @@ def test_extension_property_location():
}""", }""",
]) ])
def test_custom_object_nested_dictionary(data): def test_custom_object_nested_dictionary(data):
@stix2.sdo.CustomObject('x-example', [ @stix2.v21.CustomObject('x-example', [
('dictionary', stix2.v21.properties.DictionaryProperty()), ('dictionary', stix2.v21.properties.DictionaryProperty()),
]) ])
class Example(object): class Example(object):

View File

@ -439,7 +439,7 @@ def test_filesystem_object_with_custom_property_in_bundle(fs_store):
def test_filesystem_custom_object(fs_store): def test_filesystem_custom_object(fs_store):
@stix2.CustomObject('x-new-obj', [ @stix2.v21.CustomObject('x-new-obj', [
('property1', stix2.v21.properties.StringProperty(required=True)), ('property1', stix2.v21.properties.StringProperty(required=True)),
]) ])
class NewObj(): class NewObj():

View File

@ -63,14 +63,14 @@ def test_object_factory_obj_markings():
stmt_marking = stix2.v21.StatementMarking("Copyright 2016, Example Corp") stmt_marking = stix2.v21.StatementMarking("Copyright 2016, Example Corp")
mark_def = stix2.v21.MarkingDefinition(definition_type="statement", mark_def = stix2.v21.MarkingDefinition(definition_type="statement",
definition=stmt_marking) definition=stmt_marking)
factory = stix2.ObjectFactory(object_marking_refs=[mark_def, stix2.TLP_AMBER]) factory = stix2.ObjectFactory(object_marking_refs=[mark_def, stix2.v21.TLP_AMBER])
ind = factory.create(stix2.v21.Indicator, **INDICATOR_KWARGS) ind = factory.create(stix2.v21.Indicator, **INDICATOR_KWARGS)
assert mark_def.id in ind.object_marking_refs assert mark_def.id in ind.object_marking_refs
assert stix2.TLP_AMBER.id in ind.object_marking_refs assert stix2.v21.TLP_AMBER.id in ind.object_marking_refs
factory = stix2.ObjectFactory(object_marking_refs=stix2.TLP_RED) factory = stix2.ObjectFactory(object_marking_refs=stix2.v21.TLP_RED)
ind = factory.create(stix2.v21.Indicator, **INDICATOR_KWARGS) ind = factory.create(stix2.v21.Indicator, **INDICATOR_KWARGS)
assert stix2.TLP_RED.id in ind.object_marking_refs assert stix2.v21.TLP_RED.id in ind.object_marking_refs
def test_object_factory_list_append(): def test_object_factory_list_append():
@ -200,7 +200,7 @@ def test_parse_malware():
], ],
"is_family": false "is_family": false
}""" }"""
mal = env.parse(data) mal = env.parse(data, version="2.1")
assert mal.type == 'malware' assert mal.type == 'malware'
assert mal.spec_version == '2.1' assert mal.spec_version == '2.1'

View File

@ -1,6 +1,7 @@
import pytest import pytest
from stix2 import TLP_RED, Malware, markings from stix2 import markings
from stix2.v21 import Malware, TLP_RED
from stix2.exceptions import MarkingNotFoundError from stix2.exceptions import MarkingNotFoundError
from .constants import MALWARE_MORE_KWARGS as MALWARE_KWARGS_CONST from .constants import MALWARE_MORE_KWARGS as MALWARE_KWARGS_CONST

View File

@ -4,7 +4,7 @@ import pytest
import pytz import pytz
import stix2 import stix2
from stix2 import TLP_WHITE from stix2.v21 import TLP_WHITE
from .constants import MARKING_DEFINITION_ID from .constants import MARKING_DEFINITION_ID
@ -166,6 +166,7 @@ def test_campaign_with_granular_markings_example():
EXPECTED_TLP_MARKING_DEFINITION, EXPECTED_TLP_MARKING_DEFINITION,
{ {
"id": "marking-definition--613f2e26-407d-48c7-9eca-b8e91df99dc9", "id": "marking-definition--613f2e26-407d-48c7-9eca-b8e91df99dc9",
"spec_version": "2.1",
"type": "marking-definition", "type": "marking-definition",
"created": "2017-01-20T00:00:00Z", "created": "2017-01-20T00:00:00Z",
"definition": { "definition": {
@ -185,7 +186,7 @@ def test_parse_marking_definition(data):
assert gm.definition_type == "tlp" assert gm.definition_type == "tlp"
@stix2.common.CustomMarking('x-new-marking-type', [ @stix2.v21.CustomMarking('x-new-marking-type', [
('property1', stix2.v21.properties.StringProperty(required=True)), ('property1', stix2.v21.properties.StringProperty(required=True)),
('property2', stix2.v21.properties.IntegerProperty()), ('property2', stix2.v21.properties.IntegerProperty()),
]) ])
@ -223,7 +224,7 @@ def test_registered_custom_marking_raises_exception():
def test_not_registered_marking_raises_exception(): def test_not_registered_marking_raises_exception():
with pytest.raises(ValueError) as excinfo: with pytest.raises(ValueError) as excinfo:
# Used custom object on purpose to demonstrate a not-registered marking # Used custom object on purpose to demonstrate a not-registered marking
@stix2.sdo.CustomObject('x-new-marking-type2', [ @stix2.v21.CustomObject('x-new-marking-type2', [
('property1', stix2.v21.properties.StringProperty(required=True)), ('property1', stix2.v21.properties.StringProperty(required=True)),
('property2', stix2.v21.properties.IntegerProperty()), ('property2', stix2.v21.properties.IntegerProperty()),
]) ])
@ -246,7 +247,7 @@ def test_not_registered_marking_raises_exception():
def test_marking_wrong_type_construction(): def test_marking_wrong_type_construction():
with pytest.raises(ValueError) as excinfo: with pytest.raises(ValueError) as excinfo:
# Test passing wrong type for properties. # Test passing wrong type for properties.
@stix2.CustomMarking('x-new-marking-type2', ("a", "b")) @stix2.v21.CustomMarking('x-new-marking-type2', ("a", "b"))
class NewObject3(object): class NewObject3(object):
pass pass

View File

@ -3,9 +3,9 @@ import shutil
import pytest import pytest
from stix2 import (Bundle, Campaign, CustomObject, Filter, Identity, Indicator, from stix2 import (Filter, MemorySource, MemoryStore, properties)
Malware, MemorySource, MemoryStore, Relationship, from stix2.v21 import (Bundle, Campaign, CustomObject, Identity, Indicator,
properties) Malware, Relationship)
from stix2.datastore import make_id from stix2.datastore import make_id
from .constants import (CAMPAIGN_ID, CAMPAIGN_KWARGS, IDENTITY_ID, from .constants import (CAMPAIGN_ID, CAMPAIGN_KWARGS, IDENTITY_ID,
@ -21,6 +21,7 @@ IND1 = {
"modified": "2017-01-27T13:49:53.935Z", "modified": "2017-01-27T13:49:53.935Z",
"name": "Malicious site hosting downloader", "name": "Malicious site hosting downloader",
"pattern": "[url:value = 'http://x4z9arb.cn/4712']", "pattern": "[url:value = 'http://x4z9arb.cn/4712']",
"spec_version": "2.1",
"type": "indicator", "type": "indicator",
"valid_from": "2017-01-27T13:49:53.935382Z" "valid_from": "2017-01-27T13:49:53.935382Z"
} }
@ -33,6 +34,7 @@ IND2 = {
"modified": "2017-01-27T13:49:53.935Z", "modified": "2017-01-27T13:49:53.935Z",
"name": "Malicious site hosting downloader", "name": "Malicious site hosting downloader",
"pattern": "[url:value = 'http://x4z9arb.cn/4712']", "pattern": "[url:value = 'http://x4z9arb.cn/4712']",
"spec_version": "2.1",
"type": "indicator", "type": "indicator",
"valid_from": "2017-01-27T13:49:53.935382Z" "valid_from": "2017-01-27T13:49:53.935382Z"
} }
@ -45,6 +47,7 @@ IND3 = {
"modified": "2017-01-27T13:49:53.936Z", "modified": "2017-01-27T13:49:53.936Z",
"name": "Malicious site hosting downloader", "name": "Malicious site hosting downloader",
"pattern": "[url:value = 'http://x4z9arb.cn/4712']", "pattern": "[url:value = 'http://x4z9arb.cn/4712']",
"spec_version": "2.1",
"type": "indicator", "type": "indicator",
"valid_from": "2017-01-27T13:49:53.935382Z" "valid_from": "2017-01-27T13:49:53.935382Z"
} }
@ -57,6 +60,7 @@ IND4 = {
"modified": "2017-01-27T13:49:53.935Z", "modified": "2017-01-27T13:49:53.935Z",
"name": "Malicious site hosting downloader", "name": "Malicious site hosting downloader",
"pattern": "[url:value = 'http://x4z9arb.cn/4712']", "pattern": "[url:value = 'http://x4z9arb.cn/4712']",
"spec_version": "2.1",
"type": "indicator", "type": "indicator",
"valid_from": "2017-01-27T13:49:53.935382Z" "valid_from": "2017-01-27T13:49:53.935382Z"
} }
@ -69,6 +73,7 @@ IND5 = {
"modified": "2017-01-27T13:49:53.935Z", "modified": "2017-01-27T13:49:53.935Z",
"name": "Malicious site hosting downloader", "name": "Malicious site hosting downloader",
"pattern": "[url:value = 'http://x4z9arb.cn/4712']", "pattern": "[url:value = 'http://x4z9arb.cn/4712']",
"spec_version": "2.1",
"type": "indicator", "type": "indicator",
"valid_from": "2017-01-27T13:49:53.935382Z" "valid_from": "2017-01-27T13:49:53.935382Z"
} }
@ -81,6 +86,7 @@ IND6 = {
"modified": "2017-01-31T13:49:53.935Z", "modified": "2017-01-31T13:49:53.935Z",
"name": "Malicious site hosting downloader", "name": "Malicious site hosting downloader",
"pattern": "[url:value = 'http://x4z9arb.cn/4712']", "pattern": "[url:value = 'http://x4z9arb.cn/4712']",
"spec_version": "2.1",
"type": "indicator", "type": "indicator",
"valid_from": "2017-01-27T13:49:53.935382Z" "valid_from": "2017-01-27T13:49:53.935382Z"
} }
@ -93,6 +99,7 @@ IND7 = {
"modified": "2017-01-27T13:49:53.935Z", "modified": "2017-01-27T13:49:53.935Z",
"name": "Malicious site hosting downloader", "name": "Malicious site hosting downloader",
"pattern": "[url:value = 'http://x4z9arb.cn/4712']", "pattern": "[url:value = 'http://x4z9arb.cn/4712']",
"spec_version": "2.1",
"type": "indicator", "type": "indicator",
"valid_from": "2017-01-27T13:49:53.935382Z" "valid_from": "2017-01-27T13:49:53.935382Z"
} }
@ -105,6 +112,7 @@ IND8 = {
"modified": "2017-01-27T13:49:53.935Z", "modified": "2017-01-27T13:49:53.935Z",
"name": "Malicious site hosting downloader", "name": "Malicious site hosting downloader",
"pattern": "[url:value = 'http://x4z9arb.cn/4712']", "pattern": "[url:value = 'http://x4z9arb.cn/4712']",
"spec_version": "2.1",
"type": "indicator", "type": "indicator",
"valid_from": "2017-01-27T13:49:53.935382Z" "valid_from": "2017-01-27T13:49:53.935382Z"
} }

View File

@ -1,6 +1,7 @@
import pytest import pytest
from stix2 import TLP_AMBER, Malware, exceptions, markings from stix2 import exceptions, markings
from stix2.v21 import TLP_AMBER, Malware
from .constants import FAKE_TIME, MALWARE_ID from .constants import FAKE_TIME, MALWARE_ID
from .constants import MALWARE_KWARGS as MALWARE_KWARGS_CONST from .constants import MALWARE_KWARGS as MALWARE_KWARGS_CONST

View File

@ -275,12 +275,12 @@ def test_parse_autonomous_system_valid(data):
}""", }""",
]) ])
def test_parse_email_address(data): def test_parse_email_address(data):
odata = stix2.parse_observable(data, {"0": "user-account"}) odata = stix2.parse_observable(data, {"0": "user-account"}, version='2.1')
assert odata.type == "email-addr" assert odata.type == "email-addr"
odata_str = re.compile('"belongs_to_ref": "0"', re.DOTALL).sub('"belongs_to_ref": "3"', data) odata_str = re.compile('"belongs_to_ref": "0"', re.DOTALL).sub('"belongs_to_ref": "3"', data)
with pytest.raises(stix2.exceptions.InvalidObjRefError): with pytest.raises(stix2.exceptions.InvalidObjRefError):
stix2.parse_observable(odata_str, {"0": "user-account"}) stix2.parse_observable(odata_str, {"0": "user-account"}, version='2.1')
@pytest.mark.parametrize("data", [ @pytest.mark.parametrize("data", [
@ -332,7 +332,7 @@ def test_parse_email_message(data):
"4": "artifact", "4": "artifact",
"5": "file", "5": "file",
} }
odata = stix2.parse_observable(data, valid_refs) odata = stix2.parse_observable(data, valid_refs, version='2.1')
assert odata.type == "email-message" assert odata.type == "email-message"
assert odata.body_multipart[0].content_disposition == "inline" assert odata.body_multipart[0].content_disposition == "inline"
@ -356,7 +356,7 @@ def test_parse_email_message_not_multipart(data):
"1": "email-addr", "1": "email-addr",
} }
with pytest.raises(stix2.exceptions.DependentPropertiesError) as excinfo: with pytest.raises(stix2.exceptions.DependentPropertiesError) as excinfo:
stix2.parse_observable(data, valid_refs) stix2.parse_observable(data, valid_refs, version='2.1')
assert excinfo.value.cls == stix2.v21.EmailMessage assert excinfo.value.cls == stix2.v21.EmailMessage
assert excinfo.value.dependencies == [("is_multipart", "body")] assert excinfo.value.dependencies == [("is_multipart", "body")]
@ -455,7 +455,7 @@ def test_parse_email_message_with_at_least_one_error(data):
"5": "file", "5": "file",
} }
with pytest.raises(stix2.exceptions.AtLeastOnePropertyError) as excinfo: with pytest.raises(stix2.exceptions.AtLeastOnePropertyError) as excinfo:
stix2.parse_observable(data, valid_refs) stix2.parse_observable(data, valid_refs, version='2.1')
assert excinfo.value.cls == stix2.v21.EmailMIMEComponent assert excinfo.value.cls == stix2.v21.EmailMIMEComponent
assert excinfo.value.properties == ["body", "body_raw_ref"] assert excinfo.value.properties == ["body", "body_raw_ref"]
@ -476,7 +476,8 @@ def test_parse_email_message_with_at_least_one_error(data):
""" """
]) ])
def test_parse_basic_tcp_traffic(data): def test_parse_basic_tcp_traffic(data):
odata = stix2.parse_observable(data, {"0": "ipv4-addr", "1": "ipv4-addr"}) odata = stix2.parse_observable(data, {"0": "ipv4-addr", "1": "ipv4-addr"},
version='2.1')
assert odata.type == "network-traffic" assert odata.type == "network-traffic"
assert odata.src_ref == "0" assert odata.src_ref == "0"
@ -504,7 +505,7 @@ def test_parse_basic_tcp_traffic(data):
]) ])
def test_parse_basic_tcp_traffic_with_error(data): def test_parse_basic_tcp_traffic_with_error(data):
with pytest.raises(stix2.exceptions.AtLeastOnePropertyError) as excinfo: with pytest.raises(stix2.exceptions.AtLeastOnePropertyError) as excinfo:
stix2.parse_observable(data, {"4": "network-traffic"}) stix2.parse_observable(data, {"4": "network-traffic"}, version='2.1')
assert excinfo.value.cls == stix2.v21.NetworkTraffic assert excinfo.value.cls == stix2.v21.NetworkTraffic
assert excinfo.value.properties == ["dst_ref", "src_ref"] assert excinfo.value.properties == ["dst_ref", "src_ref"]