Skip to content

Commit 8f7a602

Browse files
authored
Add End to End Unit Testing for JSON De/Serialization (#79)
* update names of mock methods * fix naming of json annotations for proper updates * Updates to support proper sequence generation * add printing of object and json outputs for manual review and update test description * adds support for IdentitySDO * add identity SDO testing support * Add random label generator * Add support for Campaign SDO * remove tabs * Add course of action, intrusion set tests + fixes to related SDOs + cleanup * add Malware, ObservedData + Artifact + Fix for hashes pluralization * remove old imports * Fix misnamed method * Add Autonomous System COO * Add DirectoryCOO * Add Domain Name COO * Add Email Address COO * removing inner Set<String> from headers to conform to spec, even though its a issue The spec dictates this is a "Dictionary" field. But a dictionary cannot have duplicate fields. oasis-tcs/cti-stix2#138 * Add Email Message COO + MimePartType which is used in email message * Fix bad business rule for email message * add comment * fix bad naming of jsonpropertydescription * Add dupluralizeDictionary values for better method naming * reorder methods to match the ordering in the spec * Add support for File Coo * Cleanup on COO Extension serializer and deserializer for better output * Remove unneeded Annotations as the MimePartType only exists as a sub object and has not "typing" * Add Valid annotation to getBodyMultipart so the MimePartTypeObj is validated against the EmailMessage validation * cleanup + fix file coo issues * add missing GenericValdiation extends on COO inner types * Remove valid anotation as it will be handled by the GenericValidation interface of MimePartTypeObj * convert list mocking to use fromStrings() method provided by mockneat * remove old code for better Mimes dictionary * adjust default range for sector generation in identites * change custom props to generate with prepend * fix regression with threat actor sdo * Add IVP4 COO supporte * Add IPV6 COO support * Add Mac Address COO + MacAddress generation support on IVP4 and IPV6 COO * fix types * Add Mutex and NetworkTraffic COO * Fix type in method name * Add Process COO support * Remove regex until better working pattern can be created * Add Software COO * Add URL coo * fix vocab placement * Add UserAccount COO and cleanup * Add user account coo to Observed Object generator * fix vocab annotation placement * cleanup todo * Add Windows Registry Key Coo support * Fix network traffic annotations for range * fix regex pattern annotaiton placement * Cleanup to fix bugs * Cleanup + Add depluralize dictionary support * Add X509 cert COO support * Add TheatActor, Report, Tool, Vulnerability SDO support plus cleanup * Add alias/aliases dictionary for depluralization of methods * Fix annotation for vocab on labels * Fix business rule that was using incorrect methods (isEmpty vs isPresent) * Add jsonassert * Update attack pattern with use of objectmapper and json assert * Update for using ObjectMapper for serialization/deserialization within specs * cleanup imports * remove unneeded imports from groovy.json * Remove unneeded Style annotation * Add custom properties support onto the Bundle object * Add mock bundle support * Remove old tests that are not needed * remove old json files from tests * refactor and add readme context for test resources * refactor mockDatagenerator groovy trait location * Add custom props support to Marking Objects and Granular Marking Objects * fix javadoc * Add Granular Marking, Object Marking, Statement and TLP support + updated all SDOs with CreatedByRef + Updated Report and Bundle to generate Object Markings * remove markovs are they are way too slow! * rename method for clearner usage * Add Markings Definition support + JsontypeName support for TLP and Statement Markings * refactor vocabularies into clearner packages * update deps and add missing imports for refactor of vocabs packages * Add Relationship and Sighting SROs support. Added to Bundle and Report + Add individual Spec tests
1 parent d9c98ec commit 8f7a602

File tree

110 files changed

+3230
-977
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

110 files changed

+3230
-977
lines changed

pom.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,13 @@
153153
<scope>test</scope>
154154
</dependency>
155155

156+
<dependency>
157+
<groupId>org.skyscreamer</groupId>
158+
<artifactId>jsonassert</artifactId>
159+
<version>1.5.0</version>
160+
<scope>test</scope>
161+
</dependency>
162+
156163
</dependencies>
157164

158165
<build>

src/main/java/io/digitalstate/stix/bundle/BundleObject.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
88
import com.fasterxml.jackson.databind.node.ArrayNode;
99
import com.fasterxml.jackson.databind.node.ObjectNode;
10+
import io.digitalstate.stix.common.StixCustomProperties;
1011
import io.digitalstate.stix.helpers.StixSpecVersion;
1112
import io.digitalstate.stix.json.StixParsers;
1213
import io.digitalstate.stix.validation.GenericValidation;
@@ -34,7 +35,7 @@
3435
@Value.Style(typeImmutable = "Bundle", validationMethod = Value.Style.ValidationMethod.NONE, additionalJsonAnnotations = {JsonTypeName.class}, depluralize = true)
3536
@JsonSerialize(as = Bundle.class) @JsonDeserialize(builder = Bundle.Builder.class)
3637
@JsonPropertyOrder({"type", "id", "spec_version", "objects"})
37-
public interface BundleObject extends GenericValidation, Serializable {
38+
public interface BundleObject extends GenericValidation, Serializable, StixCustomProperties {
3839

3940
@NotBlank
4041
@JsonProperty("type")
@@ -67,6 +68,7 @@ default String getSpecVersion() {
6768
default String toJsonString() {
6869
JsonNode response = StixParsers.getJsonMapper(true).valueToTree(this);
6970
ObjectNode responseNode = (ObjectNode) response;
71+
//@TODO Refactor as this is causing custom properties to come before the Objects prop:
7072
responseNode.putArray("objects");
7173
ArrayNode objects = (ArrayNode) response.get("objects");
7274

src/main/java/io/digitalstate/stix/common/StixCustomProperties.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,12 @@
55
import com.fasterxml.jackson.annotation.JsonUnwrapped;
66
import io.digitalstate.stix.validation.contraints.startswith.StartsWith;
77
import org.hibernate.validator.constraints.Length;
8-
import org.immutables.value.Value;
98

109
import java.util.Map;
1110

1211
/**
1312
* Stix Custom Properties
1413
*/
15-
16-
@Value.Style(validationMethod = Value.Style.ValidationMethod.NONE)
1714
public interface StixCustomProperties {
1815

1916
/**

src/main/java/io/digitalstate/stix/coo/extension/types/NetworkSocketExtensionExt.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@
99
import io.digitalstate.stix.validation.contraints.defaulttypevalue.DefaultTypeValue;
1010
import io.digitalstate.stix.validation.contraints.vocab.Vocab;
1111
import io.digitalstate.stix.validation.groups.DefaultValuesProcessor;
12-
import io.digitalstate.stix.vocabularies.NetworkSocketAddressFamilies;
13-
import io.digitalstate.stix.vocabularies.NetworkSocketProtocolFamilies;
14-
import io.digitalstate.stix.vocabularies.NetworkSocketTypes;
12+
import io.digitalstate.stix.vocabulary.vocabularies.NetworkSocketAddressFamilies;
13+
import io.digitalstate.stix.vocabulary.vocabularies.NetworkSocketProtocolFamilies;
14+
import io.digitalstate.stix.vocabulary.vocabularies.NetworkSocketTypes;
1515
import org.immutables.serial.Serial;
1616
import org.immutables.value.Value;
1717

src/main/java/io/digitalstate/stix/coo/extension/types/WindowsPeBinaryFileExtensionExt.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@
1313
import io.digitalstate.stix.validation.contraints.hashingvocab.HashingVocab;
1414
import io.digitalstate.stix.validation.contraints.vocab.Vocab;
1515
import io.digitalstate.stix.validation.groups.DefaultValuesProcessor;
16-
import io.digitalstate.stix.vocabularies.HashingAlgorithms;
17-
import io.digitalstate.stix.vocabularies.WindowsPeBinaryTypes;
16+
import io.digitalstate.stix.vocabulary.vocabularies.HashingAlgorithms;
17+
import io.digitalstate.stix.vocabulary.vocabularies.WindowsPeBinaryTypes;
1818
import org.hibernate.validator.constraints.Length;
1919
import org.immutables.serial.Serial;
2020
import org.immutables.value.Value;

src/main/java/io/digitalstate/stix/coo/extension/types/WindowsServiceExtensionExt.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@
99
import io.digitalstate.stix.validation.contraints.defaulttypevalue.DefaultTypeValue;
1010
import io.digitalstate.stix.validation.contraints.vocab.Vocab;
1111
import io.digitalstate.stix.validation.groups.DefaultValuesProcessor;
12-
import io.digitalstate.stix.vocabularies.WindowsServiceStartTypes;
13-
import io.digitalstate.stix.vocabularies.WindowsServiceStatuses;
14-
import io.digitalstate.stix.vocabularies.WindowsServiceTypes;
12+
import io.digitalstate.stix.vocabulary.vocabularies.WindowsServiceStartTypes;
13+
import io.digitalstate.stix.vocabulary.vocabularies.WindowsServiceStatuses;
14+
import io.digitalstate.stix.vocabulary.vocabularies.WindowsServiceTypes;
1515
import org.immutables.serial.Serial;
1616
import org.immutables.value.Value;
1717

src/main/java/io/digitalstate/stix/coo/json/extension/CyberObservableExtensionsFieldDeserializer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public Set<CyberObservableExtension> deserialize(JsonParser p, DeserializationCo
3535
CyberObservableExtension extension = node.traverse(p.getCodec()).readValueAs(CyberObservableExtension.class);
3636
extensions.add(extension);
3737
} catch (IOException e) {
38-
e.printStackTrace();
38+
throw new IllegalStateException("Cannot deserialize COO extension: ", e);
3939
}
4040
});
4141

src/main/java/io/digitalstate/stix/coo/json/observables/CyberObservableSetFieldDeserializer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public Set<CyberObservableObject> deserialize(JsonParser p, DeserializationConte
3030
tree.fieldNames().forEachRemaining(f->{
3131
ObjectNode node = (ObjectNode)tree.get(f);
3232
node.put("observable_object_key", f);
33-
System.out.println(node.toString());
33+
// System.out.println(node.toString());
3434
try {
3535
CyberObservableObject object = node.traverse(p.getCodec())
3636
.readValueAs(CyberObservableObject.class);

src/main/java/io/digitalstate/stix/coo/objects/ArtifactCoo.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import io.digitalstate.stix.validation.contraints.defaulttypevalue.DefaultTypeValue;
99
import io.digitalstate.stix.validation.contraints.hashingvocab.HashingVocab;
1010
import io.digitalstate.stix.validation.groups.DefaultValuesProcessor;
11-
import io.digitalstate.stix.vocabularies.HashingAlgorithms;
11+
import io.digitalstate.stix.vocabulary.vocabularies.HashingAlgorithms;
1212
import org.hibernate.validator.constraints.Length;
1313
import org.immutables.serial.Serial;
1414
import org.immutables.value.Value;
@@ -27,7 +27,7 @@
2727
*/
2828
@Value.Immutable @Serial.Version(1L)
2929
@DefaultTypeValue(value = "artifact", groups = {DefaultValuesProcessor.class})
30-
@Value.Style(typeAbstract="*Coo", typeImmutable="*", validationMethod = Value.Style.ValidationMethod.NONE, additionalJsonAnnotations = {JsonTypeName.class}, depluralize = true)
30+
@Value.Style(typeAbstract="*Coo", typeImmutable="*", validationMethod = Value.Style.ValidationMethod.NONE, additionalJsonAnnotations = {JsonTypeName.class}, depluralize = true, depluralizeDictionary = {"hash:hashes"})
3131
@JsonTypeName("artifact")
3232
@JsonSerialize(as = Artifact.class) @JsonDeserialize(builder = Artifact.Builder.class)
3333
@JsonPropertyOrder({"type", "extensions", "mime_type", "payload_bin", "url", "hashes"})
@@ -47,8 +47,9 @@ public interface ArtifactCoo extends CyberObservableObject {
4747

4848
@JsonProperty("payload_bin")
4949
@JsonPropertyDescription("Specifies the binary data contained in the artifact as a base64-encoded string.")
50-
Optional<@Pattern(regexp = "^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{4}|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)$")
51-
String> getPayloadBin();
50+
//Removed the @pattern from within the optional until it is clear on the usage and expectation.
51+
//@Pattern(regexp = "^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{4}|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)$")
52+
Optional<String> getPayloadBin();
5253

5354
/**
5455
* url-regex

src/main/java/io/digitalstate/stix/coo/objects/DirectoryCoo.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public interface DirectoryCoo extends CyberObservableObject {
4242
@JsonProperty("path_enc")
4343
@JsonPropertyDescription("Specifies the observed encoding for the path.")
4444
Optional<@Pattern(regexp = "^[a-zA-Z0-9/\\.+_:-]{2,250}$")
45-
String> getName();
45+
String> getPathEnc();
4646

4747
@JsonFormat(pattern = StixDataFormats.TIMESTAMP_PATTERN, timezone = "UTC")
4848
@JsonProperty("created")

0 commit comments

Comments
 (0)