diff --git a/spring-geode-autoconfigure/src/test/java/example/java/lang/IntValueComparisonUnitTests.java b/spring-geode-autoconfigure/src/test/java/example/java/lang/IntValueComparisonUnitTests.java new file mode 100644 index 00000000..34b04638 --- /dev/null +++ b/spring-geode-autoconfigure/src/test/java/example/java/lang/IntValueComparisonUnitTests.java @@ -0,0 +1,37 @@ +/* + * Copyright 2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ +package example.java.lang; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.Test; + +/** + * Integration Tests testing different comparisons of {@link Integer#TYPE} values. + * + * @author John Blum + * @see java.lang.Integer + * @see org.junit.Test + * @since 2.3.0 + */ +public class IntValueComparisonUnitTests { + + @Test + public void zeroIsEqualToNegativeZero() { + // Of course, this better be always 'true'! + assertThat(0).isEqualTo(-0); + } +} diff --git a/spring-geode-autoconfigure/src/test/java/example/java/lang/ObjectSerializationIntegrationTests.java b/spring-geode-autoconfigure/src/test/java/example/java/lang/ObjectSerializationIntegrationTests.java new file mode 100644 index 00000000..c053c084 --- /dev/null +++ b/spring-geode-autoconfigure/src/test/java/example/java/lang/ObjectSerializationIntegrationTests.java @@ -0,0 +1,158 @@ +/* + * Copyright 2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ +package example.java.lang; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.Serializable; + +import org.junit.Test; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NonNull; +import lombok.RequiredArgsConstructor; +import lombok.ToString; + +/** + * Integration Tests asserting the functionality/behavior of Java Serialization. + * + * @author John Blum + * @see java.io.Serializable + * @see org.junit.Test + * @since 2.3.0 + */ +public class ObjectSerializationIntegrationTests { + + @SuppressWarnings("unchecked") + private T deserialize(byte[] bytes) throws ClassNotFoundException, IOException { + + try (ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(bytes))) { + return (T) in.readObject(); + } + } + + private byte[] serialize(Object obj) throws IOException { + + ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); + + try (ObjectOutputStream out = new ObjectOutputStream(byteStream)) { + out.writeObject(obj); + out.flush(); + } + + return byteStream.toByteArray(); + } + + @Test + public void serializedObjectWithUnsetIntFieldUsesTheSameSpaceAsObjectWithIntFieldSet() throws IOException { + + IntEmployee janeDoeNoAge = new IntEmployee("Jane Doe"); + + assertThat(janeDoeNoAge).isNotNull(); + assertThat(janeDoeNoAge.getName()).isEqualTo("Jane Doe"); + assertThat(janeDoeNoAge.getAge()).isEqualTo(0); + + IntegerEmployee janeDoeWithAge = new IntegerEmployee(21, "Jane Doe"); + + assertThat(janeDoeWithAge).isNotNull(); + assertThat(janeDoeWithAge.getName()).isEqualTo("Jane Doe"); + assertThat(janeDoeWithAge.getAge()).isEqualTo(21); + + byte[] janeDoeNoAgeBytes = serialize(janeDoeNoAge); + byte[] janeDoeWithAgeBytes = serialize(janeDoeWithAge); + + //System.out.printf("Jane Doe no Age [%s] Byte Length [%d] vs. Jane Doe with Age [%s] Byte Length [%d]%n", + // janeDoeNoAge, janeDoeNoAgeBytes.length, janeDoeWithAge, janeDoeWithAgeBytes.length); + + // The following assertion fails (!), I suppose unsurprisingly! + //assertThat(janeDoeNoAgeBytes.length).isEqualTo(janeDoeWithAgeBytes.length); + + assertThat(janeDoeNoAgeBytes.length).isLessThanOrEqualTo(janeDoeWithAgeBytes.length); + } + + @Test + public void serializedObjectWithNullIntegerFieldUsesLessSpaceThanObjectWithIntegerFieldSet() + throws ClassNotFoundException, IOException { + + IntegerEmployee jonDoe = new IntegerEmployee("Jon Doe"); + + //jonDoe.setAge(0); + + assertThat(jonDoe).isNotNull(); + assertThat(jonDoe.getName()).isEqualTo("Jon Doe"); + assertThat(jonDoe.getAge()).isNull(); + //assertThat(jonDoe.getAge()).isEqualTo(0); + + byte[] jonDoeNoAgeBytes = serialize(jonDoe); + + IntegerEmployee jonDoeNoAgeDeserialized = deserialize(jonDoeNoAgeBytes); + + assertThat(jonDoeNoAgeDeserialized).isEqualTo(jonDoe); + assertThat(jonDoeNoAgeDeserialized).isNotSameAs(jonDoe); + + jonDoe.setAge(45); + + assertThat(jonDoe.getName()).isEqualTo("Jon Doe"); + assertThat(jonDoe.getAge()).isEqualTo(45); + + byte[] jonDoeWithAgeBytes = serialize(jonDoe); + + IntegerEmployee jonDoeWithAgeDeserialized = deserialize(jonDoeWithAgeBytes); + + assertThat(jonDoeWithAgeDeserialized).isEqualTo(jonDoe); + assertThat(jonDoeWithAgeDeserialized).isNotSameAs(jonDoe); + + //System.out.printf("Jon Doe no Age [%s] Byte Length (%d) vs. Jon Doe with Age [%s] Byte Length [%d]%n", + // jonDoeNoAgeDeserialized, jonDoeNoAgeBytes.length, jonDoeWithAgeDeserialized, jonDoeWithAgeBytes.length); + + assertThat(jonDoeNoAgeBytes.length).isLessThan(jonDoeWithAgeBytes.length); + } + + @Data + @ToString + @AllArgsConstructor + @RequiredArgsConstructor + @EqualsAndHashCode(of = { "name", "age" }) + public static class IntEmployee implements Serializable { + + private int age; + + @NonNull + private String name; + + } + + @Data + @ToString + @AllArgsConstructor + @RequiredArgsConstructor + @EqualsAndHashCode(of = { "name", "age" }) + public static class IntegerEmployee implements Serializable { + + private Integer age; + + @NonNull + private String name; + + } +}