diff options
author | 2018-01-16 08:21:37 -0800 | |
---|---|---|
committer | 2018-01-16 08:23:08 -0800 | |
commit | ba23ae2a4ae20d14f98475a482715821e2d0dd61 (patch) | |
tree | 622579156962084bd90bd7ababa5fa7f60708223 /src/test/java/com/google/devtools/build/lib | |
parent | 32d8dc9caba84136340e0354656c9d2bd790b21f (diff) |
Fix value collision in builtins registry
If two values compared equal (e.g., MethodLibrary#bool and SkylarkAttr#bool), we were dropping one of them in favor of the other.
RELNOTES: None
PiperOrigin-RevId: 182057611
Diffstat (limited to 'src/test/java/com/google/devtools/build/lib')
-rw-r--r-- | src/test/java/com/google/devtools/build/lib/syntax/RuntimeTest.java | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/RuntimeTest.java b/src/test/java/com/google/devtools/build/lib/syntax/RuntimeTest.java index a559f34d1b..60df36ba70 100644 --- a/src/test/java/com/google/devtools/build/lib/syntax/RuntimeTest.java +++ b/src/test/java/com/google/devtools/build/lib/syntax/RuntimeTest.java @@ -19,7 +19,7 @@ import static com.google.common.truth.Truth.assertThat; import com.google.devtools.build.lib.skylarkinterface.SkylarkPrinter; import com.google.devtools.build.lib.skylarkinterface.SkylarkValue; import java.lang.reflect.Field; -import java.util.Set; +import java.util.List; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; @@ -28,7 +28,6 @@ import org.junit.runners.JUnit4; @RunWith(JUnit4.class) public final class RuntimeTest { - private static final Object DUMMY = new Object(); private static final BuiltinFunction DUMMY_FUNC = new BuiltinFunction("dummyFunc") { // This would normally be done by @SkylarkSignature annotation and configure(), but a simple // stub suffices. @@ -47,9 +46,10 @@ public final class RuntimeTest { @Test public void checkRegistry_GetBuiltins() { + Object dummy = new Object(); Runtime.BuiltinRegistry reg = new Runtime.BuiltinRegistry(); - reg.registerBuiltin(DummyType.class, "dummy", DUMMY); - assertThat(reg.getBuiltins()).contains(DUMMY); + reg.registerBuiltin(DummyType.class, "dummy", dummy); + assertThat(reg.getBuiltins()).contains(dummy); } @Test @@ -66,6 +66,22 @@ public final class RuntimeTest { assertThat(reg.getFunctionNames(DummyType.class)).contains("dummyFunc"); } + /** Ensures that we still register all builtins, even when some are equal to one another. */ + @Test + public void checkRegistry_EqualBuiltinsDontClash() { + // Create two distinct objects that compare equal under Object#equals. Use toCharArray() to + // not worry about whether the JVM does string interning. + String equalValue1 = "abc"; + String equalValue2 = new String(equalValue1.toCharArray()); + Runtime.BuiltinRegistry reg = new Runtime.BuiltinRegistry(); + reg.registerBuiltin(DummyType.class, "eq1", equalValue1); + reg.registerBuiltin(DummyType.class, "eq2", equalValue2); + List<Object> values = reg.getBuiltins(); + assertThat(values).hasSize(2); + assertThat(values.get(0)).isSameAs(equalValue1); + assertThat(values.get(1)).isSameAs(equalValue2); + } + @Test public void checkStaticallyRegistered_Method() throws Exception { Field splitField = MethodLibrary.class.getDeclaredField("split"); @@ -80,7 +96,7 @@ public final class RuntimeTest { Field lenField = MethodLibrary.class.getDeclaredField("len"); lenField.setAccessible(true); Object lenFieldValue = lenField.get(null); - Set<Object> builtins = Runtime.getBuiltinRegistry().getBuiltins(); + List<Object> builtins = Runtime.getBuiltinRegistry().getBuiltins(); assertThat(builtins).contains(lenFieldValue); } } |