package com.netflix.discovery.converters; import javax.ws.rs.core.MediaType; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.nio.charset.Charset; import java.util.Iterator; import com.netflix.appinfo.InstanceInfo; import com.netflix.appinfo.InstanceInfo.ActionType; import com.netflix.discovery.shared.Application; import com.netflix.discovery.shared.Applications; import com.netflix.discovery.util.EurekaEntityComparators; import com.netflix.discovery.util.InstanceInfoGenerator; import org.junit.Test; import static org.junit.Assert.assertTrue; /** * @author Tomasz Bak */ public class EurekaJacksonCodecTest { public static final InstanceInfo INSTANCE_INFO_1_A1; public static final InstanceInfo INSTANCE_INFO_2_A1; public static final InstanceInfo INSTANCE_INFO_1_A2; public static final InstanceInfo INSTANCE_INFO_2_A2; public static final Application APPLICATION_1; public static final Application APPLICATION_2; public static final Applications APPLICATIONS; static { Iterator<InstanceInfo> infoIterator = InstanceInfoGenerator.newBuilder(4, 2).withMetaData(true).build().serviceIterator(); INSTANCE_INFO_1_A1 = infoIterator.next(); INSTANCE_INFO_1_A1.setActionType(ActionType.ADDED); INSTANCE_INFO_1_A2 = infoIterator.next(); INSTANCE_INFO_1_A2.setActionType(ActionType.ADDED); INSTANCE_INFO_2_A1 = infoIterator.next(); INSTANCE_INFO_1_A2.setActionType(ActionType.ADDED); INSTANCE_INFO_2_A2 = infoIterator.next(); INSTANCE_INFO_2_A2.setActionType(ActionType.ADDED); APPLICATION_1 = new Application(INSTANCE_INFO_1_A1.getAppName()); APPLICATION_1.addInstance(INSTANCE_INFO_1_A1); APPLICATION_1.addInstance(INSTANCE_INFO_2_A1); APPLICATION_2 = new Application(INSTANCE_INFO_1_A2.getAppName()); APPLICATION_2.addInstance(INSTANCE_INFO_1_A2); APPLICATION_2.addInstance(INSTANCE_INFO_2_A2); APPLICATIONS = new Applications(); APPLICATIONS.addApplication(APPLICATION_1); APPLICATIONS.addApplication(APPLICATION_2); } private final EurekaJacksonCodec codec = new EurekaJacksonCodec(); @Test public void testInstanceInfoJacksonEncodeDecode() throws Exception { // Encode ByteArrayOutputStream captureStream = new ByteArrayOutputStream(); codec.writeTo(INSTANCE_INFO_1_A1, captureStream); byte[] encoded = captureStream.toByteArray(); // Decode InputStream source = new ByteArrayInputStream(encoded); InstanceInfo decoded = codec.readValue(InstanceInfo.class, source); assertTrue(EurekaEntityComparators.equal(decoded, INSTANCE_INFO_1_A1)); } @Test public void testInstanceInfoJacksonEncodeDecodeWithoutMetaData() throws Exception { InstanceInfo noMetaDataInfo = InstanceInfoGenerator.newBuilder(1, 1).withMetaData(false).build().serviceIterator().next(); // Encode ByteArrayOutputStream captureStream = new ByteArrayOutputStream(); codec.writeTo(noMetaDataInfo, captureStream); byte[] encoded = captureStream.toByteArray(); // Decode InputStream source = new ByteArrayInputStream(encoded); InstanceInfo decoded = codec.readValue(InstanceInfo.class, source); assertTrue(EurekaEntityComparators.equal(decoded, noMetaDataInfo)); } @Test public void testInstanceInfoXStreamEncodeJacksonDecode() throws Exception { InstanceInfo original = INSTANCE_INFO_1_A1; // Encode ByteArrayOutputStream captureStream = new ByteArrayOutputStream(); new EntityBodyConverter().write(original, captureStream, MediaType.APPLICATION_JSON_TYPE); byte[] encoded = captureStream.toByteArray(); // Decode InputStream source = new ByteArrayInputStream(encoded); InstanceInfo decoded = codec.readValue(InstanceInfo.class, source); assertTrue(EurekaEntityComparators.equal(decoded, original)); } @Test public void testInstanceInfoJacksonEncodeXStreamDecode() throws Exception { // Encode ByteArrayOutputStream captureStream = new ByteArrayOutputStream(); codec.writeTo(INSTANCE_INFO_1_A1, captureStream); byte[] encoded = captureStream.toByteArray(); // Decode InputStream source = new ByteArrayInputStream(encoded); InstanceInfo decoded = (InstanceInfo) new EntityBodyConverter().read(source, InstanceInfo.class, MediaType.APPLICATION_JSON_TYPE); assertTrue(EurekaEntityComparators.equal(decoded, INSTANCE_INFO_1_A1)); } @Test public void testApplicationJacksonEncodeDecode() throws Exception { // Encode ByteArrayOutputStream captureStream = new ByteArrayOutputStream(); codec.writeTo(APPLICATION_1, captureStream); byte[] encoded = captureStream.toByteArray(); // Decode InputStream source = new ByteArrayInputStream(encoded); Application decoded = codec.readValue(Application.class, source); assertTrue(EurekaEntityComparators.equal(decoded, APPLICATION_1)); } @Test public void testApplicationXStreamEncodeJacksonDecode() throws Exception { Application original = APPLICATION_1; // Encode ByteArrayOutputStream captureStream = new ByteArrayOutputStream(); new EntityBodyConverter().write(original, captureStream, MediaType.APPLICATION_JSON_TYPE); byte[] encoded = captureStream.toByteArray(); // Decode InputStream source = new ByteArrayInputStream(encoded); Application decoded = codec.readValue(Application.class, source); assertTrue(EurekaEntityComparators.equal(decoded, original)); } @Test public void testApplicationJacksonEncodeXStreamDecode() throws Exception { // Encode ByteArrayOutputStream captureStream = new ByteArrayOutputStream(); codec.writeTo(APPLICATION_1, captureStream); byte[] encoded = captureStream.toByteArray(); // Decode InputStream source = new ByteArrayInputStream(encoded); Application decoded = (Application) new EntityBodyConverter().read(source, Application.class, MediaType.APPLICATION_JSON_TYPE); assertTrue(EurekaEntityComparators.equal(decoded, APPLICATION_1)); } @Test public void testApplicationsJacksonEncodeDecode() throws Exception { // Encode ByteArrayOutputStream captureStream = new ByteArrayOutputStream(); codec.writeTo(APPLICATIONS, captureStream); byte[] encoded = captureStream.toByteArray(); // Decode InputStream source = new ByteArrayInputStream(encoded); Applications decoded = codec.readValue(Applications.class, source); assertTrue(EurekaEntityComparators.equal(decoded, APPLICATIONS)); } @Test public void testApplicationsXStreamEncodeJacksonDecode() throws Exception { Applications original = APPLICATIONS; // Encode ByteArrayOutputStream captureStream = new ByteArrayOutputStream(); new EntityBodyConverter().write(original, captureStream, MediaType.APPLICATION_JSON_TYPE); byte[] encoded = captureStream.toByteArray(); // Decode InputStream source = new ByteArrayInputStream(encoded); Applications decoded = codec.readValue(Applications.class, source); assertTrue(EurekaEntityComparators.equal(decoded, original)); } @Test public void testApplicationsJacksonEncodeXStreamDecode() throws Exception { // Encode ByteArrayOutputStream captureStream = new ByteArrayOutputStream(); codec.writeTo(APPLICATIONS, captureStream); byte[] encoded = captureStream.toByteArray(); // Decode InputStream source = new ByteArrayInputStream(encoded); Applications decoded = (Applications) new EntityBodyConverter().read(source, Applications.class, MediaType.APPLICATION_JSON_TYPE); assertTrue(EurekaEntityComparators.equal(decoded, APPLICATIONS)); } @Test public void testJacksonWriteToString() throws Exception { String jsonValue = codec.writeToString(INSTANCE_INFO_1_A1); InstanceInfo decoded = codec.readValue(InstanceInfo.class, new ByteArrayInputStream(jsonValue.getBytes(Charset.defaultCharset()))); assertTrue(EurekaEntityComparators.equal(decoded, INSTANCE_INFO_1_A1)); } @Test public void testJacksonWrite() throws Exception { // Encode ByteArrayOutputStream captureStream = new ByteArrayOutputStream(); codec.writeTo(INSTANCE_INFO_1_A1, captureStream); byte[] encoded = captureStream.toByteArray(); // Decode value InputStream source = new ByteArrayInputStream(encoded); InstanceInfo decoded = codec.readValue(InstanceInfo.class, source); assertTrue(EurekaEntityComparators.equal(decoded, INSTANCE_INFO_1_A1)); } }