Skip to content

Commit 84b3f43

Browse files
committed
fix: [tests] Better tests for Campaign objects conversion
- Updated samples and tests for STIX 2.x Campaign objects import to cover all supported fields - Added tests for custom Galaxy Clusters imported from STIX 2.x Campaign objects conversion back to STIX 2.x
1 parent c63a568 commit 84b3f43

8 files changed

+124
-4
lines changed

tests/_test_stix_export.py

+7
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,13 @@ def _check_attribute_vulnerability_features(self, vulnerability, attribute, iden
164164
self.assertEqual(vulnerability.created, timestamp)
165165
self.assertEqual(vulnerability.modified, timestamp)
166166

167+
def _check_campaign_meta_fields(self, stix_object, meta):
168+
self.assertEqual(stix_object.aliases, meta['synonyms'])
169+
self.assertEqual(
170+
stix_object.last_seen, self._datetime_from_str(meta['last_seen'])
171+
)
172+
self.assertEqual(stix_object.objective, meta['objective'])
173+
167174
def _check_course_of_action_meta_fields(self, stix_object, meta):
168175
self.assertEqual(stix_object.external_references[0].external_id, meta['external_id'])
169176
for external_ref, ref in zip(stix_object.external_references[1:], meta['refs']):

tests/test_events.py

+33
Original file line numberDiff line numberDiff line change
@@ -985,6 +985,25 @@
985985
"uuid": "2d018cbb-4236-53c8-aeba-0aa1b51e636e"
986986
}
987987

988+
_TEST_CUSTOM_CAMPAIGN_GALAXY = {
989+
"GalaxyCluster": [
990+
{
991+
"meta": {
992+
"synonyms": [
993+
"Doppelganger"
994+
],
995+
"last_seen": "2020-10-25T16:22:00Z",
996+
"objective": "manipulation"
997+
},
998+
"uuid": "0dd0896b-8834-5025-a4d4-c0f4bbf7d403",
999+
"value": "RRN",
1000+
"description": "Active since 2008, this campaign mostly targets the financial services industry, though we have also seen activity in the telecom, government, and defense sectors."
1001+
}
1002+
],
1003+
"description": "A Campaign is a grouping of adversarial behaviors that describes a set of malicious activities or attacks (sometimes called waves) that occur over a period of time against a specific set of targets. Campaigns usually have well defined objectives and may be part of an Intrusion Set.",
1004+
"uuid": "3d29c2ad-cb5a-5173-8ef6-1afd3bd2ed34"
1005+
}
1006+
9881007
_TEST_INTRUSION_SET_GALAXY = {
9891008
"uuid": "1023f364-7831-11e7-8318-43b5531983ab",
9901009
"name": "Intrusion Set",
@@ -3361,6 +3380,20 @@ def get_event_with_custom_attack_pattern_galaxy(version: str):
33613380
return event
33623381

33633382

3383+
def get_event_with_custom_campaign_galaxy(version: str):
3384+
event = deepcopy(_BASE_EVENT)
3385+
custom_galaxy = deepcopy(_TEST_CUSTOM_CAMPAIGN_GALAXY)
3386+
custom_galaxy['GalaxyCluster'][0]['type'] = f'stix-{version}-campaign'
3387+
custom_galaxy.update(
3388+
{
3389+
'type': f'stix-{version}-campaign',
3390+
'name': f'STIX {version} Campaign'
3391+
}
3392+
)
3393+
event['Event']['Galaxy'] = [custom_galaxy]
3394+
return event
3395+
3396+
33643397
def get_event_with_custom_galaxy():
33653398
event = deepcopy(_BASE_EVENT)
33663399
event['Event']['Galaxy'] = [

tests/test_external_stix20_bundles.py

+1
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@
171171
"aliases": [
172172
"Doppelganger"
173173
],
174+
"objective": "manipulation",
174175
"description": "Active since 2008, this campaign mostly targets the financial services industry, though we have also seen activity in the telecom, government, and defense sectors.",
175176
"first_seen": "2020-10-25T16:22:00.000Z"
176177
},

tests/test_external_stix20_import.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -83,12 +83,14 @@ def test_stix20_bundle_with_campaign_galaxy(self):
8383
_, report, event_campaign, indicator, attribute_campaign, _ = bundle.objects
8484
self._check_misp_event_features(event, report)
8585
meta = self._check_galaxy_features(event.galaxies, event_campaign)
86-
self.assertEqual(meta, {'synonyms': event_campaign.aliases})
86+
self.assertEqual(meta['synonyms'], event_campaign.aliases)
87+
self.assertEqual(meta['objective'], event_campaign.objective)
88+
self.assertEqual(meta['first_seen'], event_campaign.first_seen)
8789
self.assertEqual(len(event.attributes), 1)
8890
attribute = event.attributes[0]
8991
self.assertEqual(attribute.uuid, indicator.id.split('--')[1])
9092
meta = self._check_galaxy_features(attribute.galaxies, attribute_campaign)
91-
self.assertEqual(meta, {})
93+
self.assertEqual(meta, {'first_seen': attribute_campaign.first_seen})
9294

9395
def test_stix20_bundle_with_course_of_action_galaxy(self):
9496
bundle = TestExternalSTIX20Bundles.get_bundle_with_course_of_action_galaxy()

tests/test_external_stix21_bundles.py

+1
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,7 @@
324324
"aliases": [
325325
"Doppelganger"
326326
],
327+
"objective": "manipulation",
327328
"description": "Active since 2008, this campaign mostly targets the financial services industry, though we have also seen activity in the telecom, government, and defense sectors.",
328329
"first_seen": "2020-10-25T16:22:00.000Z"
329330
},

tests/test_external_stix21_import.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -104,12 +104,14 @@ def test_stix21_bundle_with_campaign_galaxy(self):
104104
_, grouping, event_campaign, indicator, attribute_campaign, _ = bundle.objects
105105
self._check_misp_event_features_from_grouping(event, grouping)
106106
meta = self._check_galaxy_features(event.galaxies, event_campaign)
107-
self.assertEqual(meta, {'synonyms': event_campaign.aliases})
107+
self.assertEqual(meta['synonyms'], event_campaign.aliases)
108+
self.assertEqual(meta['objective'], event_campaign.objective)
109+
self.assertEqual(meta['first_seen'], event_campaign.first_seen)
108110
self.assertEqual(len(event.attributes), 1)
109111
attribute = event.attributes[0]
110112
self.assertEqual(attribute.uuid, indicator.id.split('--')[1])
111113
meta = self._check_galaxy_features(attribute.galaxies, attribute_campaign)
112-
self.assertEqual(meta, {})
114+
self.assertEqual(meta, {'first_seen': attribute_campaign.first_seen})
113115

114116
def test_stix21_bundle_with_course_of_action_galaxy(self):
115117
bundle = TestExternalSTIX21Bundles.get_bundle_with_course_of_action_galaxy()

tests/test_stix20_export.py

+37
Original file line numberDiff line numberDiff line change
@@ -4620,6 +4620,15 @@ def _test_event_with_attack_pattern_galaxy(self, event):
46204620
self.assertEqual(attack_pattern.type, 'attack-pattern')
46214621
self._check_galaxy_features(attack_pattern, galaxy, timestamp)
46224622

4623+
def _test_event_with_campaign_galaxy(self, event):
4624+
galaxy = event['Galaxy'][0]
4625+
timestamp = event['timestamp']
4626+
if not isinstance(timestamp, datetime):
4627+
timestamp = self._datetime_from_timestamp(timestamp)
4628+
campaign = self._run_galaxy_tests(event, timestamp)
4629+
self.assertEqual(campaign.type, 'campaign')
4630+
self._check_galaxy_features(campaign, galaxy, timestamp)
4631+
46234632
def _test_event_with_course_of_action_galaxy(self, event):
46244633
galaxy = event['Galaxy'][0]
46254634
timestamp = event['timestamp']
@@ -4743,6 +4752,22 @@ def test_event_with_custom_attack_pattern_21_galaxy(self):
47434752
attack_pattern = self.parser.stix_objects[-1]
47444753
)
47454754

4755+
def test_event_with_custom_campaign_20_galaxy(self):
4756+
event = get_event_with_custom_campaign_galaxy('2.0')
4757+
self._test_event_with_campaign_galaxy(event['Event'])
4758+
self._populate_documentation(
4759+
galaxy = event['Event']['Galaxy'][0],
4760+
campaign = self.parser.stix_objects[-1]
4761+
)
4762+
4763+
def test_event_with_custom_campaign_21_galaxy(self):
4764+
event = get_event_with_custom_campaign_galaxy('2.1')
4765+
self._test_event_with_campaign_galaxy(event['Event'])
4766+
self._populate_documentation(
4767+
galaxy = event['Event']['Galaxy'][0],
4768+
campaign = self.parser.stix_objects[-1]
4769+
)
4770+
47464771
def test_event_with_custom_galaxy(self):
47474772
event = get_event_with_custom_galaxy()
47484773
self._test_event_with_custom_galaxy(event['Event'])
@@ -4828,6 +4853,18 @@ def test_event_with_custom_attack_pattern_21_galaxy(self):
48284853
misp_event.from_dict(**event)
48294854
self._test_event_with_attack_pattern_galaxy(misp_event)
48304855

4856+
def test_event_with_custom_campaign_20_galaxy(self):
4857+
event = get_event_with_custom_campaign_galaxy('2.0')
4858+
misp_event = MISPEvent()
4859+
misp_event.from_dict(**event)
4860+
self._test_event_with_campaign_galaxy(misp_event)
4861+
4862+
def test_event_with_custom_campaign_21_galaxy(self):
4863+
event = get_event_with_custom_campaign_galaxy('2.1')
4864+
misp_event = MISPEvent()
4865+
misp_event.from_dict(**event)
4866+
self._test_event_with_campaign_galaxy(misp_event)
4867+
48314868
def test_event_with_custom_galaxy(self):
48324869
event = get_event_with_custom_galaxy()
48334870
misp_event = MISPEvent()

tests/test_stix21_export.py

+37
Original file line numberDiff line numberDiff line change
@@ -5840,6 +5840,15 @@ def _test_event_with_attack_pattern_galaxy(self, event):
58405840
self.assertEqual(attack_pattern.type, 'attack-pattern')
58415841
self._check_galaxy_features(attack_pattern, galaxy, timestamp)
58425842

5843+
def _test_event_with_campaign_galaxy(self, event):
5844+
galaxy = event['Galaxy'][0]
5845+
timestamp = event['timestamp']
5846+
if not isinstance(timestamp, datetime):
5847+
timestamp = self._datetime_from_timestamp(timestamp)
5848+
campaign = self._run_galaxy_tests(event, timestamp)
5849+
self.assertEqual(campaign.type, 'campaign')
5850+
self._check_galaxy_features(campaign, galaxy, timestamp)
5851+
58435852
def _test_event_with_course_of_action_galaxy(self, event):
58445853
galaxy = event['Galaxy'][0]
58455854
timestamp = event['timestamp']
@@ -6010,6 +6019,22 @@ def test_event_with_custom_attack_pattern_21_galaxy(self):
60106019
attack_pattern = self.parser.stix_objects[-1]
60116020
)
60126021

6022+
def test_event_with_custom_campaign_20_galaxy(self):
6023+
event = get_event_with_custom_campaign_galaxy('2.0')
6024+
self._test_event_with_campaign_galaxy(event['Event'])
6025+
self._populate_documentation(
6026+
galaxy = event['Event']['Galaxy'][0],
6027+
campaign = self.parser.stix_objects[-1]
6028+
)
6029+
6030+
def test_event_with_custom_campaign_21_galaxy(self):
6031+
event = get_event_with_custom_campaign_galaxy('2.1')
6032+
self._test_event_with_campaign_galaxy(event['Event'])
6033+
self._populate_documentation(
6034+
galaxy = event['Event']['Galaxy'][0],
6035+
campaign = self.parser.stix_objects[-1]
6036+
)
6037+
60136038
def test_event_with_custom_galaxy(self):
60146039
event = get_event_with_custom_galaxy()
60156040
self._test_event_with_custom_galaxy(event['Event'])
@@ -6110,6 +6135,18 @@ def test_event_with_custom_attack_pattern_21_galaxy(self):
61106135
misp_event.from_dict(**event)
61116136
self._test_event_with_attack_pattern_galaxy(misp_event)
61126137

6138+
def test_event_with_custom_campaign_20_galaxy(self):
6139+
event = get_event_with_custom_campaign_galaxy('2.0')
6140+
misp_event = MISPEvent()
6141+
misp_event.from_dict(**event)
6142+
self._test_event_with_campaign_galaxy(misp_event)
6143+
6144+
def test_event_with_custom_campaign_21_galaxy(self):
6145+
event = get_event_with_custom_campaign_galaxy('2.1')
6146+
misp_event = MISPEvent()
6147+
misp_event.from_dict(**event)
6148+
self._test_event_with_campaign_galaxy(misp_event)
6149+
61136150
def test_event_with_custom_galaxy(self):
61146151
event = get_event_with_custom_galaxy()
61156152
misp_event = MISPEvent()

0 commit comments

Comments
 (0)