Skip to content

Commit 7e83364

Browse files
author
Ron Serruya
committed
Fix java compatability test
1 parent de85fc6 commit 7e83364

File tree

4 files changed

+110
-24
lines changed

4 files changed

+110
-24
lines changed

tests/integration/java/src/main/java/com/disasteraware/aws/schemaregistry/App.java

Lines changed: 43 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -25,29 +25,56 @@ public class App {
2525
static Map<String, Object> configs = new HashMap<>();
2626

2727
public static void main(String[] args) {
28-
configs.put(AWSSchemaRegistryConstants.DATA_FORMAT, DataFormat.AVRO.name());
28+
String dataFormat = Objects.requireNonNull(System.getenv("DATA_FORMAT"));
2929
configs.put(AWSSchemaRegistryConstants.AWS_REGION, Objects.requireNonNull(System.getenv("AWS_REGION")));
3030
configs.put(AWSSchemaRegistryConstants.REGISTRY_NAME, Objects.requireNonNull(System.getenv("REGISTRY_NAME")));
31-
//configs.put(AWSSchemaRegistryConstants.SCHEMA_NAME, Objects.requireNonNull(System.getenv("SCHEMA_NAME")));
31+
configs.put(AWSSchemaRegistryConstants.SCHEMA_NAME, Objects.requireNonNull(System.getenv("SCHEMA_NAME")));
3232
configs.put(AWSSchemaRegistryConstants.SCHEMA_AUTO_REGISTRATION_SETTING, true);
33-
configs.put(AWSSchemaRegistryConstants.AVRO_RECORD_TYPE, AvroRecordType.GENERIC_RECORD.getName());
34-
try {
35-
byte[] bytes;
36-
GenericRecord record;
37-
Schema schema;
3833

39-
bytes = System.in.readAllBytes();
34+
if (dataFormat.equals("AVRO")) {
35+
configs.put(AWSSchemaRegistryConstants.DATA_FORMAT, DataFormat.AVRO.name());
36+
configs.put(AWSSchemaRegistryConstants.AVRO_RECORD_TYPE, AvroRecordType.GENERIC_RECORD.getName());
37+
try {
38+
byte[] bytes;
39+
GenericRecord record;
40+
Schema schema;
4041

41-
GlueSchemaRegistryKafkaDeserializer deserializer = new GlueSchemaRegistryKafkaDeserializer(configs);
42-
record = (GenericRecord) deserializer.deserialize("test", bytes);
43-
schema = record.getSchema();
42+
bytes = System.in.readAllBytes();
4443

45-
GlueSchemaRegistryKafkaSerializer serializer = new GlueSchemaRegistryKafkaSerializer(configs);
46-
bytes = serializer.serialize("test", record);
44+
GlueSchemaRegistryKafkaDeserializer deserializer = new GlueSchemaRegistryKafkaDeserializer(configs);
45+
record = (GenericRecord) deserializer.deserialize("test", bytes);
46+
schema = record.getSchema();
4747

48-
System.out.write(bytes, 0, bytes.length);
49-
} catch (IOException e) {
50-
e.printStackTrace();
48+
GlueSchemaRegistryKafkaSerializer serializer = new GlueSchemaRegistryKafkaSerializer(configs);
49+
bytes = serializer.serialize("test", record);
50+
51+
System.out.write(bytes, 0, bytes.length);
52+
} catch (IOException e) {
53+
e.printStackTrace();
54+
System.exit(1);
55+
}
56+
} else if (dataFormat.equals("JSON")) {
57+
configs.put(AWSSchemaRegistryConstants.DATA_FORMAT, DataFormat.JSON.name());
58+
try {
59+
byte[] bytes;
60+
Object record;
61+
Schema schema;
62+
63+
bytes = System.in.readAllBytes();
64+
65+
GlueSchemaRegistryKafkaDeserializer deserializer = new GlueSchemaRegistryKafkaDeserializer(configs);
66+
record = deserializer.deserialize("test", bytes);
67+
68+
GlueSchemaRegistryKafkaSerializer serializer = new GlueSchemaRegistryKafkaSerializer(configs);
69+
bytes = serializer.serialize("test", record);
70+
71+
System.out.write(bytes, 0, bytes.length);
72+
} catch (IOException e) {
73+
e.printStackTrace();
74+
System.exit(1);
75+
}
76+
} else {
77+
System.out.println("Only JSON or AVRO are acceptable data formats");
5178
System.exit(1);
5279
}
5380
}

tests/integration/java/test_java_integration.py

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,11 @@
22
import os
33
import subprocess
44

5+
import pytest
6+
57
from aws_schema_registry import DataAndSchema, SchemaRegistryClient
68
from aws_schema_registry.avro import AvroSchema
9+
from aws_schema_registry.jsonschema import JsonSchema
710
from aws_schema_registry.adapter.kafka import (
811
KafkaDeserializer, KafkaSerializer
912
)
@@ -20,10 +23,18 @@
2023
with open(os.path.join(os.path.dirname(__file__), 'user.avsc'), 'r') as f:
2124
SCHEMA = AvroSchema(f.read())
2225

26+
with open(os.path.join(os.path.dirname(__file__), 'user.json'), 'r') as f:
27+
JSON_SCHEMA = JsonSchema(f.read())
28+
29+
30+
def _topic_name_schema_type_name_strategy(topic, is_key, schema):
31+
return f"{topic}-{'key' if is_key else 'value'}-{schema.data_format}"
32+
2333

24-
def test_interop_with_java_library(glue_client, registry, boto_session):
34+
@pytest.mark.parametrize("schema", [SCHEMA, JSON_SCHEMA])
35+
def test_interop_with_java_library(glue_client, registry, boto_session, schema):
2536
client = SchemaRegistryClient(glue_client, registry_name=registry)
26-
serializer = KafkaSerializer(client)
37+
serializer = KafkaSerializer(client, schema_naming_strategy=_topic_name_schema_type_name_strategy)
2738
deserializer = KafkaDeserializer(client)
2839

2940
data = {
@@ -32,7 +43,7 @@ def test_interop_with_java_library(glue_client, registry, boto_session):
3243
'favorite_color': 'red'
3344
}
3445
serialized: bytes = serializer.serialize(
35-
'test', DataAndSchema(data, SCHEMA)
46+
'test', DataAndSchema(data, schema)
3647
)
3748

3849
if not os.path.exists(JAR_LOCATION):
@@ -45,19 +56,21 @@ def test_interop_with_java_library(glue_client, registry, boto_session):
4556
input=serialized,
4657
capture_output=True,
4758
env={
59+
'DATA_FORMAT': schema.data_format,
4860
'AWS_ACCESS_KEY_ID': credentials.access_key,
4961
'AWS_SECRET_ACCESS_KEY': credentials.secret_key,
5062
'AWS_SESSION_TOKEN': credentials.token,
5163
'AWS_REGION': boto_session.region_name,
5264
'REGISTRY_NAME': registry,
53-
'SCHEMA_NAME': 'sometestschema'
65+
'SCHEMA_NAME': _topic_name_schema_type_name_strategy("test", False, schema)
5466
}
5567
)
68+
print(proc.stderr)
5669
proc.check_returncode()
5770
deserialized = deserializer.deserialize('test', proc.stdout)
5871
assert deserialized
5972
assert deserialized.data == data
60-
assert deserialized.schema == SCHEMA
73+
assert deserialized.schema == schema
6174

6275

6376
def compile_java():

tests/integration/java/user.json

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
{
2+
"$schema": "http://json-schema.org/draft-04/schema#",
3+
"type": "object",
4+
"properties": {
5+
"name": {
6+
"type": "string"
7+
},
8+
"favorite_number": {
9+
"type": "integer"
10+
},
11+
"favorite_color": {
12+
"type": "string"
13+
}
14+
},
15+
"required": [
16+
"name",
17+
"favorite_number",
18+
"favorite_color"
19+
]
20+
}

tests/test_jsonschema.py

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,35 @@ def test_readwrite():
3131
assert s.read(s.write(d)) == d
3232

3333

34+
def test_validation_during_read_write():
35+
s = JsonSchema("""{
36+
"$schema": "http://json-schema.org/draft-04/schema#",
37+
"type": "object",
38+
"properties": {
39+
"name": {
40+
"type": "string"
41+
},
42+
"age": {
43+
"type": "integer"
44+
}
45+
},
46+
"required": [
47+
"name",
48+
"age"
49+
]
50+
}""")
51+
52+
with pytest.raises(ValidationError, match=re.escape(
53+
"data.name must be string"
54+
)):
55+
s.read(b'{"name": 1, "age": 2}')
56+
57+
with pytest.raises(ValidationError, match=re.escape(
58+
"data.name must be string"
59+
)):
60+
s.write({"name": 1, "age": 2})
61+
62+
3463
def test_validation():
3564
s = JsonSchema("""{
3665
"$schema": "http://json-schema.org/draft-04/schema#",
@@ -52,12 +81,10 @@ def test_validation():
5281
with pytest.raises(ValidationError, match=re.escape(
5382
"data must contain ['name', 'age'] properties"
5483
)):
55-
5684
s.validate({'name': 'Obi-Wan'})
5785
with pytest.raises(ValidationError, match=re.escape(
5886
"data.name must be string"
5987
)):
60-
6188
s.validate({'name': 1, 'age': 2})
6289

6390
s.validate({'name': 'Jar Jar', 'age': 42, 'sith': True})
@@ -83,5 +110,4 @@ def test_validation():
83110
with pytest.raises(ValidationError, match=re.escape(
84111
"data must not contain {'sith'} properties"
85112
)):
86-
87113
s.validate({'name': 'Jar Jar', 'age': 42, 'sith': True})

0 commit comments

Comments
 (0)