|
12 | 12 | import org.elasticsearch.test.ESTestCase;
|
13 | 13 |
|
14 | 14 | import java.util.Arrays;
|
| 15 | +import java.util.List; |
15 | 16 |
|
16 | 17 | import static org.hamcrest.CoreMatchers.is;
|
17 | 18 | import static org.hamcrest.Matchers.containsString;
|
@@ -76,16 +77,91 @@ public void testGetCloseableCharsAfterSecureStringClosed() {
|
76 | 77 | }
|
77 | 78 |
|
78 | 79 | public void testEquals() {
|
79 |
| - final String string = randomAlphaOfLengthBetween(8, 128); |
80 |
| - final SecureString secureString = new SecureString(string.toCharArray()); |
81 |
| - final StringBuilder stringBuilder = new StringBuilder(string); |
| 80 | + final List<String> strings = List.of( |
| 81 | + randomAlphaOfLengthBetween(8, 128), |
| 82 | + (char) 0 + randomAlphanumericOfLength(9), |
| 83 | + Character.MAX_VALUE + randomAlphanumericOfLength(10), |
| 84 | + randomAlphanumericOfLength(11) + (char) 0, |
| 85 | + randomAlphanumericOfLength(12) + Character.MAX_VALUE, |
| 86 | + randomAlphanumericOfLength(3) + (char) 0 + randomAlphanumericOfLength(10), |
| 87 | + randomAlphanumericOfLength(4) + Character.MAX_VALUE + randomAlphanumericOfLength(10) |
| 88 | + ); |
| 89 | + for (var string : strings) { |
| 90 | + final SecureString secureString = new SecureString(string.toCharArray()); |
| 91 | + |
| 92 | + verifyEquals(secureString, string, true); |
| 93 | + |
| 94 | + // Comparison has extra character in the middle |
| 95 | + final int split = randomIntBetween(1, string.length() - 1); |
| 96 | + final String altString = string.substring(0, split) + randomAlphanumericOfLength(1) + string.substring(split); |
| 97 | + verifyEquals(secureString, altString, false); |
| 98 | + |
| 99 | + // Comparison has extra characters at beginning |
| 100 | + verifyEquals(secureString, randomAlphanumericOfLength(1) + string, false); |
| 101 | + verifyEquals(secureString, randomAlphaOfLengthBetween(2, 8) + string, false); |
| 102 | + verifyEquals(secureString, "\0" + string, false); |
| 103 | + verifyEquals(secureString, (char) -1 + string, false); |
| 104 | + |
| 105 | + // Comparison has extra characters at end |
| 106 | + verifyEquals(secureString, string + randomAlphanumericOfLength(1), false); |
| 107 | + verifyEquals(secureString, string + randomAlphaOfLengthBetween(2, 8), false); |
| 108 | + verifyEquals(secureString, string + '\0', false); |
| 109 | + verifyEquals(secureString, string + (char) -1, false); |
| 110 | + |
| 111 | + // Comparison is missing characters at beginning |
| 112 | + verifyEquals(secureString, string.substring(1), false); |
| 113 | + verifyEquals(secureString, string.substring(randomIntBetween(2, string.length() - 2)), false); |
| 114 | + |
| 115 | + // Comparison is missing characters at end |
| 116 | + verifyEquals(secureString, string.substring(0, string.length() - 1), false); |
| 117 | + verifyEquals(secureString, string.substring(0, string.length() - randomIntBetween(2, string.length() - 2)), false); |
| 118 | + |
| 119 | + // Comparison has different character at beginning |
| 120 | + verifyEquals( |
| 121 | + secureString, |
| 122 | + randomValueOtherThan(string.substring(0, 1), () -> randomAlphanumericOfLength(1)) + string.substring(1), |
| 123 | + false |
| 124 | + ); |
| 125 | + if (string.charAt(0) != 0) { |
| 126 | + verifyEquals(secureString, "\0" + string.substring(1), false); |
| 127 | + } |
| 128 | + if (string.charAt(0) != (char) -1) { |
| 129 | + verifyEquals(secureString, (char) -1 + string.substring(1), false); |
| 130 | + } |
| 131 | + // Comparison has different character at end |
| 132 | + verifyEquals( |
| 133 | + secureString, |
| 134 | + string.substring(0, string.length() - 1) + randomValueOtherThan( |
| 135 | + string.substring(string.length() - 1), |
| 136 | + () -> randomAlphanumericOfLength(1) |
| 137 | + ), |
| 138 | + false |
| 139 | + ); |
| 140 | + if (string.endsWith("\0") == false) { |
| 141 | + verifyEquals(secureString, string.substring(0, string.length() - 1) + '\0', false); |
| 142 | + } |
| 143 | + if (string.charAt(string.length() - 1) != (char) -1) { |
| 144 | + verifyEquals(secureString, string.substring(0, string.length() - 1) + (char) -1, false); |
| 145 | + } |
82 | 146 |
|
83 |
| - assertThat(secureString.equals(string), is(true)); |
84 |
| - assertThat(secureString.equals(stringBuilder), is(true)); |
| 147 | + assertThat(secureString.equals(""), is(false)); |
| 148 | + final Object obj = null; |
| 149 | + // noinspection ConstantValue |
| 150 | + assertThat(secureString.equals(obj), is(false)); |
| 151 | + |
| 152 | + final CharSequence cs = null; |
| 153 | + assertThat(secureString.equals(cs), is(false)); |
| 154 | + } |
| 155 | + |
| 156 | + } |
85 | 157 |
|
86 |
| - final int split = randomIntBetween(1, string.length() - 1); |
87 |
| - final String altString = string.substring(0, split) + randomAlphanumericOfLength(1) + string.substring(split); |
88 |
| - assertThat(secureString.equals(altString), is(false)); |
| 158 | + @SuppressWarnings("EqualsBetweenInconvertibleTypes") |
| 159 | + private void verifyEquals(SecureString secure, String string, boolean expected) { |
| 160 | + // Verify that we get the same result for different types of CharSequence |
| 161 | + assertThat(secure + " == " + string, secure.equals(string), is(expected)); |
| 162 | + assertThat(secure.equals(new SecureString(string.toCharArray())), is(expected)); |
| 163 | + assertThat(secure.equals(new StringBuilder(string)), is(expected)); |
| 164 | + assertThat(secure.equals((Object) string), is(expected)); |
89 | 165 | }
|
90 | 166 |
|
91 | 167 | public void testStartsWith() {
|
|
0 commit comments