You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

MethodPropertyMemoryConsumptionTest.java 4.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. package com.vaadin.v7.data.util;
  2. import static org.junit.Assert.assertNotNull;
  3. import static org.junit.Assert.assertSame;
  4. import java.io.ByteArrayInputStream;
  5. import java.io.ByteArrayOutputStream;
  6. import java.io.IOException;
  7. import java.io.ObjectInputStream;
  8. import java.io.ObjectOutputStream;
  9. import java.io.Serializable;
  10. import java.lang.reflect.Field;
  11. import org.junit.Test;
  12. /**
  13. * Test for MethodProperty: don't allocate unnecessary Object arrays.
  14. *
  15. * @since 7.2
  16. * @author Vaadin Ltd
  17. */
  18. public class MethodPropertyMemoryConsumptionTest {
  19. @Test
  20. public void testSetArguments()
  21. throws NoSuchFieldException, SecurityException,
  22. IllegalArgumentException, IllegalAccessException {
  23. TestBean bean = new TestBean();
  24. TestMethodProperty<String> property = new TestMethodProperty<String>(
  25. bean, "name");
  26. Object[] getArgs = property.getGetArgs();
  27. Object[] setArgs = property.getSetArgs();
  28. Field getArgsField = TestMethodProperty.class
  29. .getDeclaredField("getArgs");
  30. getArgsField.setAccessible(true);
  31. Field setArgsField = TestMethodProperty.class
  32. .getDeclaredField("setArgs");
  33. setArgsField.setAccessible(true);
  34. assertSame(
  35. "setArguments method sets non-default instance"
  36. + " of empty Object array for getArgs",
  37. getArgsField.get(property), getArgs);
  38. assertSame(
  39. "setArguments method sets non-default instance"
  40. + " of empty Object array for setArgs",
  41. setArgsField.get(property), setArgs);
  42. }
  43. @Test
  44. public void testDefaultCtor() {
  45. TestBean bean = new TestBean();
  46. TestMethodProperty<String> property = new TestMethodProperty<String>(
  47. bean, "name");
  48. Object[] getArgs = property.getGetArgs();
  49. Object[] setArgs = property.getSetArgs();
  50. TestBean otherBean = new TestBean();
  51. TestMethodProperty<String> otherProperty = new TestMethodProperty<String>(
  52. otherBean, "name");
  53. assertSame(
  54. "setArguments method uses different instance"
  55. + " of empty Object array for getArgs",
  56. getArgs, otherProperty.getGetArgs());
  57. assertSame(
  58. "setArguments method uses different instance"
  59. + " of empty Object array for setArgs",
  60. setArgs, otherProperty.getSetArgs());
  61. }
  62. @Test
  63. public void testDefaultArgsSerialization()
  64. throws IOException, ClassNotFoundException {
  65. TestBean bean = new TestBean();
  66. TestMethodProperty<String> property = new TestMethodProperty<String>(
  67. bean, "name");
  68. ByteArrayOutputStream sourceOutStream = new ByteArrayOutputStream();
  69. ObjectOutputStream outStream = new ObjectOutputStream(sourceOutStream);
  70. outStream.writeObject(property);
  71. ObjectInputStream inputStream = new ObjectInputStream(
  72. new ByteArrayInputStream(sourceOutStream.toByteArray()));
  73. Object red = inputStream.readObject();
  74. TestMethodProperty<?> deserialized = (TestMethodProperty<?>) red;
  75. assertNotNull("Deseriliation doesn't call setArguments method",
  76. deserialized.getGetArgs());
  77. assertNotNull("Deseriliation doesn't call setArguments method",
  78. deserialized.getSetArgs());
  79. }
  80. public static class TestMethodProperty<T> extends MethodProperty<T> {
  81. public TestMethodProperty(Object instance, String beanPropertyName) {
  82. super(instance, beanPropertyName);
  83. }
  84. @Override
  85. public void setArguments(Object[] getArgs, Object[] setArgs,
  86. int setArgumentIndex) {
  87. super.setArguments(getArgs, setArgs, setArgumentIndex);
  88. this.getArgs = getArgs;
  89. this.setArgs = setArgs;
  90. }
  91. Object[] getGetArgs() {
  92. return getArgs;
  93. }
  94. Object[] getSetArgs() {
  95. return setArgs;
  96. }
  97. private transient Object[] getArgs;
  98. private transient Object[] setArgs;
  99. }
  100. public static class TestBean implements Serializable {
  101. private String name;
  102. public String getName() {
  103. return name;
  104. }
  105. public void setName(String name) {
  106. this.name = name;
  107. }
  108. }
  109. }