diff options
author | 2018-02-07 16:47:27 -0800 | |
---|---|---|
committer | 2018-02-07 16:50:57 -0800 | |
commit | 800de7ede085f3dde65dd387160320dcb939b35e (patch) | |
tree | 792346875fec8e0c2d49082c38e2e1f5e3b2ec23 /src/test/java/com/google/devtools/build | |
parent | fb7b4ac17fd6e13662515ddf771e36ce18eaae60 (diff) |
Extract registry functionality from ObjectCodecs
This partially solves the age old problem of how to find a codec for a value we
don't know the type of at compile time, and allows us to represent such values
on the wire more compactly. @AutoCodec's injecting codec should be able to make
use of this right away - we'll need to make an API change to the ObjectCodec
interface to allow the existing system to make use.
PiperOrigin-RevId: 184918173
Diffstat (limited to 'src/test/java/com/google/devtools/build')
4 files changed, 140 insertions, 23 deletions
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/serialization/BUILD b/src/test/java/com/google/devtools/build/lib/skyframe/serialization/BUILD index bd3b55bfc7..b2fd6f5154 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/serialization/BUILD +++ b/src/test/java/com/google/devtools/build/lib/skyframe/serialization/BUILD @@ -21,6 +21,7 @@ java_library( "//src/main/java/com/google/devtools/build/lib/skyframe/serialization", "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/testutils", "//src/main/java/com/google/devtools/build/lib/vfs", + "//src/test/java/com/google/devtools/build/lib:testutil", "//third_party:guava", "//third_party:guava-testlib", "//third_party:jsr305", diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/serialization/ObjectCodecRegistryTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/serialization/ObjectCodecRegistryTest.java new file mode 100644 index 0000000000..c4391ecbd6 --- /dev/null +++ b/src/test/java/com/google/devtools/build/lib/skyframe/serialization/ObjectCodecRegistryTest.java @@ -0,0 +1,114 @@ +// Copyright 2018 The Bazel Authors. All rights reserved. +// +// 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 +// +// http://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 com.google.devtools.build.lib.skyframe.serialization; + +import static com.google.common.truth.Truth.assertThat; +import static com.google.devtools.build.lib.testutil.MoreAsserts.assertThrows; + +import com.google.devtools.build.lib.skyframe.serialization.ObjectCodecRegistry.CodecDescriptor; +import com.google.devtools.build.lib.skyframe.serialization.SerializationException.NoCodecException; +import com.google.protobuf.ByteString; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +/** Tests for {@link ObjectCodecRegistry}. */ +@RunWith(JUnit4.class) +public class ObjectCodecRegistryTest { + + @Test + public void testDescriptorLookups() throws NoCodecException { + SingletonCodec<String> codec1 = SingletonCodec.of("value1", "mnemonic1"); + SingletonCodec<String> codec2 = SingletonCodec.of("value2", "mnemonic2"); + + ObjectCodecRegistry underTest = ObjectCodecRegistry.newBuilder() + .setAllowDefaultCodec(false) + .add("foo", codec1) + .add("bar", codec2) + .build(); + + CodecDescriptor fooDescriptor = underTest.getCodecDescriptor("foo"); + assertThat(fooDescriptor.getCodec()).isSameAs(codec1); + assertThat(underTest.getCodecDescriptor(ByteString.copyFromUtf8("foo"))) + .isSameAs(fooDescriptor); + assertThat(underTest.getCodecDescriptorByTag(fooDescriptor.getTag())).isSameAs(fooDescriptor); + + CodecDescriptor barDescriptor = underTest.getCodecDescriptor("bar"); + assertThat(barDescriptor.getCodec()).isSameAs(codec2); + assertThat(underTest.getCodecDescriptor(ByteString.copyFromUtf8("bar"))) + .isSameAs(barDescriptor); + assertThat(underTest.getCodecDescriptorByTag(barDescriptor.getTag())).isSameAs(barDescriptor); + + assertThat(barDescriptor.getTag()).isNotEqualTo(fooDescriptor.getTag()); + + assertThrows(NoCodecException.class, () -> underTest.getCodecDescriptor("baz")); + assertThrows( + NoCodecException.class, + () -> underTest.getCodecDescriptor(ByteString.copyFromUtf8("baz"))); + assertThrows(NoCodecException.class, () -> underTest.getCodecDescriptorByTag(42)); + } + + @Test + public void testDefaultCodecFallback() throws NoCodecException { + SingletonCodec<String> codec = SingletonCodec.of("value1", "mnemonic1"); + + ObjectCodecRegistry underTest = ObjectCodecRegistry.newBuilder() + .setAllowDefaultCodec(true) + .add("foo", codec) + .build(); + + CodecDescriptor fooDescriptor = underTest.getCodecDescriptor("foo"); + assertThat(fooDescriptor.getCodec()).isSameAs(codec); + + CodecDescriptor barDefaultDescriptor = underTest.getCodecDescriptor("bar"); + assertThat(barDefaultDescriptor.getCodec()).isNotSameAs(codec); + assertThat(barDefaultDescriptor.getTag()).isNotEqualTo(fooDescriptor.getTag()); + assertThat(underTest.getCodecDescriptorByTag(barDefaultDescriptor.getTag())) + .isSameAs(barDefaultDescriptor); + + assertThat(underTest.getCodecDescriptor("baz")).isSameAs(barDefaultDescriptor); + + // Bogus tags still throw. + assertThrows(NoCodecException.class, () -> underTest.getCodecDescriptorByTag(42)); + } + + @Test + public void testStableTagOrdering() throws NoCodecException { + SingletonCodec<String> codec1 = SingletonCodec.of("value1", "mnemonic1"); + SingletonCodec<String> codec2 = SingletonCodec.of("value2", "mnemonic2"); + + ObjectCodecRegistry underTest1 = ObjectCodecRegistry.newBuilder() + .setAllowDefaultCodec(true) + .add("foo", codec1) + .add("bar", codec2) + .build(); + + ObjectCodecRegistry underTest2 = ObjectCodecRegistry.newBuilder() + .setAllowDefaultCodec(true) + .add("bar", codec2) + .add("foo", codec1) + .build(); + + assertThat(underTest1.getCodecDescriptor("foo").getTag()) + .isEqualTo(underTest2.getCodecDescriptor("foo").getTag()); + assertThat(underTest1.getCodecDescriptor("bar").getTag()) + .isEqualTo(underTest2.getCodecDescriptor("bar").getTag()); + // Default codec. + assertThat(underTest1.getCodecDescriptor("baz").getTag()) + .isEqualTo(underTest2.getCodecDescriptor("baz").getTag()); + + + } +} diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/serialization/ObjectCodecsTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/serialization/ObjectCodecsTest.java index 3ad0d3c7b1..7e98f045b5 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/serialization/ObjectCodecsTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/serialization/ObjectCodecsTest.java @@ -15,6 +15,7 @@ package com.google.devtools.build.lib.skyframe.serialization; import static com.google.common.truth.Truth.assertThat; +import static com.google.devtools.build.lib.testutil.MoreAsserts.expectThrows; import static org.junit.Assert.fail; import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; @@ -78,7 +79,10 @@ public class ObjectCodecsTest { @Before public final void setup() { spyObjectCodec = spy(new IntegerCodec()); - this.underTest = ObjectCodecs.newBuilder().add(KNOWN_CLASSIFIER, spyObjectCodec).build(); + this.underTest = new ObjectCodecs( + ObjectCodecRegistry.newBuilder() + .add(KNOWN_CLASSIFIER, spyObjectCodec) + .build()); } @Test @@ -207,30 +211,28 @@ public class ObjectCodecsTest { @Test public void testSerializeFailsWhenNoCustomCodecAndFallbackDisabled() throws Exception { - try { - ObjectCodecs.newBuilder().setAllowDefaultCodec(false).build().serialize("X", "Y"); - fail("Expected exception"); - } catch (SerializationException e) { - assertThat(e) - .hasMessageThat() - .isEqualTo("No codec available for X and default fallback disabled"); - } + ObjectCodecs underTest = new ObjectCodecs( + ObjectCodecRegistry.newBuilder().setAllowDefaultCodec(false).build()); + SerializationException.NoCodecException expected = expectThrows( + SerializationException.NoCodecException.class, + () -> underTest.serialize("X", "Y")); + assertThat(expected) + .hasMessageThat() + .isEqualTo("No codec available for X and default fallback disabled"); } @Test public void testDeserializeFailsWhenNoCustomCodecAndFallbackDisabled() throws Exception { ByteString serialized = ByteString.copyFromUtf8("doesn't matter"); - try { - ObjectCodecs.newBuilder() - .setAllowDefaultCodec(false) - .build() - .deserialize(ByteString.copyFromUtf8("X"), serialized); - fail("Expected exception"); - } catch (SerializationException e) { - assertThat(e) - .hasMessageThat() - .isEqualTo("No codec available for X and default fallback disabled"); - } + ObjectCodecs underTest = new ObjectCodecs( + ObjectCodecRegistry.newBuilder().setAllowDefaultCodec(false).build()); + SerializationException.NoCodecException expected = expectThrows( + SerializationException.NoCodecException.class, + () -> underTest.deserialize(ByteString.copyFromUtf8("X"), serialized)); + + assertThat(expected) + .hasMessageThat() + .isEqualTo("No codec available for X and default fallback disabled"); } @Test diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/serialization/PrecomputedValueCodecTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/serialization/PrecomputedValueCodecTest.java index 692f602bc2..f6532fcb61 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/serialization/PrecomputedValueCodecTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/serialization/PrecomputedValueCodecTest.java @@ -30,13 +30,13 @@ public class PrecomputedValueCodecTest extends AbstractObjectCodecTest<Precomput public PrecomputedValueCodecTest() { super( new PrecomputedValueCodec( - () -> - ObjectCodecs.newBuilder() + () -> new ObjectCodecs( + ObjectCodecRegistry.newBuilder() .asClassKeyedBuilder() // Note no PathFragmentCodec. .add(String.class, StringCodecs.asciiOptimized()) .add(Label.class, LabelCodec.INSTANCE) - .build()), + .build())), new PrecomputedValue(PathFragment.create("java serializable 1")), new PrecomputedValue(PathFragment.create("java serializable 2")), new PrecomputedValue("first string"), |