1# Copyright (c) 2017, The MITRE Corporation. All rights reserved.
2# See LICENSE.txt for complete terms.
3
4import unittest
5
6from stix.test import EntityTestCase, TypedListTestCase, assert_warnings
7import stix.test.data_marking_test as data_marking_test
8from stix.test.common import (
9    confidence_test, information_source_test, statement_test, related_test,
10    activity_test
11)
12
13from stix.test import assert_warnings
14from stix.core import STIXPackage
15import stix.campaign as campaign
16
17
18class NamesTests(EntityTestCase, unittest.TestCase):
19    klass = campaign.Names
20
21    _full_dict = {
22        'names': [
23            "Dancing Hippos",
24            "Crazy Squirrels",
25            {
26                'value': "Medium",
27                'xsi:type':'stixVocabs:HighMediumLowVocab-1.0'
28            }
29        ]
30    }
31
32
33class IntendedEffectsTests(TypedListTestCase, unittest.TestCase):
34    klass = campaign.Campaign
35
36    _partial_dict = [
37        statement_test.StatementTests._full_dict
38    ]
39
40    _full_dict = {
41        'intended_effects': _partial_dict,
42    }
43
44class RelatedTTPsTest(EntityTestCase, unittest.TestCase):
45    klass = campaign.RelatedTTPs
46
47    _full_dict = {
48        'scope': 'exclusive',
49        'ttps': [
50            related_test.RelatedTTPTests._full_dict,
51        ]
52    }
53
54
55class RelatedIncidentsTests(EntityTestCase, unittest.TestCase):
56    klass = campaign.RelatedIncidents
57
58    _full_dict = {
59        'incidents': [
60            related_test.RelatedIncidentTests._full_dict
61        ]
62    }
63
64
65class RelatedIndicatorsTests(EntityTestCase, unittest.TestCase):
66    klass = campaign.RelatedIndicators
67
68    _full_dict = {
69        'indicators': [
70            related_test.RelatedIndicatorTests._full_dict
71        ]
72    }
73
74class AttributionTests(EntityTestCase, unittest.TestCase):
75    klass = campaign.Attribution
76
77    _full_dict = {
78        'scope': 'exclusive',
79        'threat_actors': [
80            related_test.RelatedThreatActorTests._full_dict,
81        ]
82    }
83
84
85class AttributionListTests(TypedListTestCase, unittest.TestCase):
86    klass = campaign.Campaign
87
88    _full_dict = { 'attribution': [
89        AttributionTests._full_dict
90    ] }
91
92
93class AssociatedCampaignsTests(EntityTestCase, unittest.TestCase):
94    klass = campaign.AssociatedCampaigns
95
96    _full_dict = {
97        'scope': 'inclusive',
98        'campaigns': [
99            related_test.RelatedCampaignTests._full_dict
100        ]
101    }
102
103
104class ActivityTests(TypedListTestCase, unittest.TestCase):
105    klass = campaign.Activity
106
107    _full_dict = activity_test.ActivityTests._full_dict
108
109
110
111class CampaignTest(EntityTestCase, unittest.TestCase):
112    klass = campaign.Campaign
113    _full_dict = {
114        'id': "example:test-1",
115        'timestamp': "2014-01-31T06:14:46",
116        'version': '1.2',
117        'title': 'Purple Elephant',
118        'description': 'A pretty novice set of actors.',
119        'short_description': 'novices',
120        'names': NamesTests._full_dict,
121        'intended_effects': IntendedEffectsTests._partial_dict,
122        'status': {
123            'value': "Ongoing",
124            'xsi:type':'stixVocabs:CampaignStatusVocab-1.0'
125        },
126        'related_ttps': RelatedTTPsTest._full_dict,
127        'related_incidents': RelatedIncidentsTests._full_dict,
128        'related_indicators': RelatedIndicatorsTests._full_dict,
129        'attribution': [AttributionTests._full_dict],
130        'associated_campaigns': AssociatedCampaignsTests._full_dict,
131        'confidence': confidence_test.ConfidenceTests._full_dict,
132        'activity': [ActivityTests._full_dict],
133        'information_source': information_source_test.InformationSourceTests._full_dict,
134        'handling': data_marking_test.MarkingTests._full_dict,
135        'related_packages': related_test.RelatedPackageRefsTests._full_dict
136    }
137
138    def test_add_description(self):
139        o1 = self.klass()
140        o2 = self.klass()
141
142        o1.add_description("Test")
143        o2.descriptions.add("Test")
144
145        self.assertEqual(
146            o1.descriptions.to_dict(),
147            o2.descriptions.to_dict()
148        )
149
150    def test_add_short_description(self):
151        o1 = self.klass()
152        o2 = self.klass()
153
154        o1.add_short_description("Test")
155        o2.short_descriptions.add("Test")
156
157        self.assertEqual(
158            o1.short_descriptions.to_dict(),
159            o2.short_descriptions.to_dict()
160        )
161
162    @assert_warnings
163    def test_deprecated_related_packages(self):
164        c = campaign.Campaign()
165        c.related_packages.append(STIXPackage())
166
167    @assert_warnings
168    def test_deprecated_related_indicators(self):
169        from stix.indicator import Indicator
170
171        c = campaign.Campaign()
172        c.related_indicators.append(Indicator())
173        self.assertEqual(1, len(c.related_indicators))
174
175
176if __name__ == "__main__":
177    unittest.main()
178