Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[TS-1468] Null fields encoding/decoding support. #14

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# JSON Codec v0.8.0
# JSON Codec v0.9.0

This microservice can encode and decode JSON messages received via HTTP or any other transport

Expand Down Expand Up @@ -147,6 +147,13 @@ so we exclude Gradle metadata for these repositories.
It's been verified that Sailfish itself is compatible with versions from BOM and therefore safe to use.

## Changelog
### v0.9.0

#### Changed:
* Updated sailfish from `3.3.54` to `3.3.106`
* Null json values encoding/decoding support.
* OWASP vulnerability check added.

### v0.8.0

#### Changed:
Expand Down
25 changes: 20 additions & 5 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
plugins {
id 'com.palantir.docker' version '0.25.0' apply false
id 'org.jetbrains.kotlin.jvm' version "${kotlin_version}"
id "org.owasp.dependencycheck" version "7.2.0"
id "org.owasp.dependencycheck" version "8.2.1"
id 'org.jetbrains.kotlin.kapt' version "${kotlin_version}"
}

Expand All @@ -16,8 +16,8 @@ apply plugin: 'com.palantir.docker'

ext {
sharedDir = file("${project.rootDir}/shared")
sailfishVersion = '3.3.54'
commonVersion = '3.44.0'
sailfishVersion = '3.3.106'
commonVersion = '3.44.1'
}

group = 'com.exactpro.th2'
Expand Down Expand Up @@ -100,11 +100,11 @@ jar {
}

dependencies {
api platform('com.exactpro.th2:bom:4.1.0')
api platform('com.exactpro.th2:bom:4.2.0')

implementation "com.exactpro.th2:common:${commonVersion}"
implementation 'com.exactpro.th2:codec:4.7.5'
implementation 'com.exactpro.th2:sailfish-utils:3.14.0'
implementation 'com.exactpro.th2:sailfish-utils:3.15.0'

implementation "com.exactpro.sf:service-http:${sailfishVersion}"

Expand Down Expand Up @@ -155,3 +155,18 @@ compileTestKotlin {
jvmTarget = "11"
}
}

dependencyLocking {
lockAllConfigurations()
}

dependencyCheck {
formats=['SARIF', 'JSON', 'HTML']
failBuildOnCVSS=5

analyzers {
assemblyEnabled = false
nugetconfEnabled = false
nodeEnabled = false
}
}
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
kotlin.code.style=official

kotlin_version=1.6.21
release_version=0.8.0
release_version=0.9.0

vcs_url=https://github.com/th2-net/th2-codec-json
71 changes: 64 additions & 7 deletions src/test/kotlin/com/exactpro/th2/codec/json/ConstantMessageType.kt
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,22 @@ import com.exactpro.th2.common.assertString
import com.exactpro.th2.common.grpc.AnyMessage
import com.exactpro.th2.common.grpc.MessageGroup
import com.exactpro.th2.common.grpc.RawMessage
import com.exactpro.th2.common.grpc.Value
import com.exactpro.th2.common.message.addField
import com.exactpro.th2.common.message.get
import com.exactpro.th2.common.message.message
import com.exactpro.th2.common.message.messageType
import com.exactpro.th2.common.value.add
import com.exactpro.th2.common.value.listValue
import com.exactpro.th2.common.value.nullValue
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.databind.node.ObjectNode
import com.google.protobuf.ByteString
import com.google.protobuf.NullValue
import com.google.protobuf.Value.KindCase
import kotlin.test.assertEquals
import kotlin.test.assertNotNull
import kotlin.test.assertTrue
import org.junit.jupiter.api.Assertions
import org.junit.jupiter.api.Test

Expand All @@ -39,7 +49,7 @@ class ConstantMessageType {
val group = MessageGroup.newBuilder().addMessages(AnyMessage.newBuilder().setRawMessage(rawMessage)).build()
val decodeResult = codec.decode(group)
decodeResult.messagesList[0].message.apply {
Assertions.assertEquals("Constant", messageType)
assertEquals("Constant", messageType)
assertString("SimpleOne", "SimpleOne Value")
assertString("SimpleTwo", "SimpleTwo Value")
assertString("SimpleThree", "SimpleThree Value")
Expand All @@ -57,9 +67,9 @@ class ConstantMessageType {
val decodeResult = codec.encode(group)
decodeResult.messagesList[0].rawMessage.apply {
val json = mapper.readTree(body.toStringUtf8()) as ObjectNode
Assertions.assertEquals("SimpleOne Value", json.get("SimpleOne")?.asText())
Assertions.assertEquals("SimpleTwo Value", json.get("SimpleTwo")?.asText())
Assertions.assertEquals("SimpleThree Value", json.get("SimpleThree")?.asText())
assertEquals("SimpleOne Value", json.get("SimpleOne")?.asText())
assertEquals("SimpleTwo Value", json.get("SimpleTwo")?.asText())
assertEquals("SimpleThree Value", json.get("SimpleThree")?.asText())
}
}

Expand All @@ -70,12 +80,59 @@ class ConstantMessageType {
val decodeResult = codec.encode(group)
decodeResult.messagesList[0].rawMessage.apply {
val json = mapper.readTree(body.toStringUtf8()) as ObjectNode
Assertions.assertEquals("test1", json.get("SimpleOne")?.asText())
Assertions.assertEquals("test2", json.get("SimpleTwo")?.asText())
Assertions.assertEquals("test3", json.get("SimpleThree")?.asText())
assertEquals("test1", json.get("SimpleOne")?.asText())
assertEquals("test2", json.get("SimpleTwo")?.asText())
assertEquals("test3", json.get("SimpleThree")?.asText())
}
}

@Test
fun `simple constant messageType test decode with null values`() {
val json = """{"SimpleOne": null, "SimpleTwo": null, "SimpleThree": null, "SimpleCollection": ["1", null, "2"]}"""
val rawMessage = RawMessage.newBuilder().setBody(ByteString.copyFrom(json.toByteArray())).build()
val group = MessageGroup.newBuilder().addMessages(AnyMessage.newBuilder().setRawMessage(rawMessage)).build()
val decodeResult = codec.decode(group)
decodeResult.messagesList[0].message.apply {
assertEquals("Constant", messageType)
assertEquals(get("SimpleOne")?.kindCase, Value.KindCase.NULL_VALUE)
assertEquals(get("SimpleTwo")?.kindCase, Value.KindCase.NULL_VALUE)
assertEquals(get("SimpleThree")?.kindCase, Value.KindCase.NULL_VALUE)
val simpleCollection = get("SimpleCollection")
assertNotNull(simpleCollection)
assertTrue(simpleCollection.hasListValue())
simpleCollection.listValue.valuesList.apply {
assertEquals(3, size)
assertEquals("1", get(0).simpleValue)
assertEquals(Value.KindCase.NULL_VALUE, get(1).kindCase)
assertEquals("2", get(2).simpleValue)
}
}
}

@Test
fun `simple constant messageType test encode with null values`() {
val message = message("Constant").apply {
addField("SimpleOne", nullValue())
addField("SimpleTwo", nullValue())
addField("SimpleThree", nullValue())
addField("SimpleCollection", listValue().add(nullValue()).add(Value.newBuilder().setSimpleValue("1")).build())
}
val group = MessageGroup.newBuilder().addMessages(AnyMessage.newBuilder().setMessage(message)).build()
val decodeResult = codec.encode(group)

decodeResult.messagesList[0].rawMessage.apply {
val json = mapper.readTree(body.toStringUtf8()) as ObjectNode
assertTrue(json.get("SimpleOne")?.isNull ?: false)
assertTrue(json.get("SimpleTwo")?.isNull ?: false)
assertTrue(json.get("SimpleThree")?.isNull ?: false)
val simpleCollection = json.get("SimpleCollection")
assertNotNull(simpleCollection)
assertTrue(simpleCollection.isArray)
val simpleCollectionElements = simpleCollection.elements()
assertTrue(simpleCollectionElements.next()?.isNull ?: false)
assertEquals("1", simpleCollectionElements.next()?.asText())
}
}

companion object {
val codec = JsonPipelineCodecFactory().apply {
Expand Down
1 change: 1 addition & 0 deletions src/test/resources/constant_message.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
<field name="SimpleOne" type="java.lang.String"/>
<field name="SimpleTwo" type="java.lang.String"/>
<field name="SimpleThree" type="java.lang.String"/>
<field name="SimpleCollection" type="java.lang.String" isCollection="true"/>
</message>

<message id="M_Constant_Default" name="Constant_Default">
Expand Down