blob: 64c3ba76d7764000a9c836b4a6ae677a5059a418 [file] [log] [blame]
// Copyright (c) 2019, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
package proto2;
import com.android.tools.r8.proto2.Graph.IsExtendedWithOptional;
import com.android.tools.r8.proto2.Graph.IsExtendedWithRequiredField;
import com.android.tools.r8.proto2.Graph.IsRepeatedlyExtendedWithRequiredField;
import com.android.tools.r8.proto2.Graph.UsedRoot;
import com.android.tools.r8.proto2.Shrinking.ContainsFlaggedOffField;
import com.android.tools.r8.proto2.Shrinking.HasFlaggedOffExtension;
import com.android.tools.r8.proto2.Shrinking.PartiallyUsed;
import com.android.tools.r8.proto2.Shrinking.PartiallyUsedWithExtension;
import com.android.tools.r8.proto2.Shrinking.UsedViaHazzer;
import com.android.tools.r8.proto2.Shrinking.UsedViaOneofCase;
import com.android.tools.r8.proto2.Shrinking.UsesOnlyRepeatedFields;
import com.android.tools.r8.proto2.TestProto.Primitives;
import com.google.protobuf.ExtensionRegistryLite;
import com.google.protobuf.InvalidProtocolBufferException;
import com.google.protobuf.WireFormat;
import java.nio.ByteBuffer;
public class TestClass {
public static void main(String[] args) {
roundtrip();
partiallyUsed_proto2();
usedViaHazzer();
usedViaOneofCase();
usesOnlyRepeatedFields();
containsFlaggedOffField();
hasFlaggedOffExtension();
useOneExtension();
keepMapAndRequiredFields();
}
// A protobuf payload indicating that varint field 1 is set to 42.
// See https://developers.google.com/protocol-buffers/docs/encoding
//
// Since serialization and deserialization use the same schema (which we're modifying), testing
// against wire-format data is preferred.
private static final byte[] FIELD1_SET_TO_42 =
new byte[] {(1 << 3) | WireFormat.WIRETYPE_VARINT, 42};
// A protobuf payload indicating that field 10 is a message whose field 1 is set to 42.
private static final byte[] MESSAGE10_WITH_FIELD1_SET_TO_42 =
ByteBuffer.allocate(4)
.put(
new byte[] {
(10 << 3) | WireFormat.WIRETYPE_LENGTH_DELIMITED, (byte) FIELD1_SET_TO_42.length
})
.put(FIELD1_SET_TO_42)
.array();
// smoke test
static void roundtrip() {
System.out.println("--- roundtrip ---");
Primitives primitives =
Primitives.newBuilder()
.setFooInt32(123)
.setOneofString("asdf")
.setBarInt64(Long.MAX_VALUE)
.setQuxString("qwerty")
.build();
Primitives roundtripped;
try {
roundtripped = Primitives.parseFrom(primitives.toByteArray());
} catch (InvalidProtocolBufferException e) {
System.out.println("Unexpected exception: " + e);
throw new RuntimeException(e);
}
System.out.println(roundtripped.equals(primitives));
System.out.println(roundtripped.getFooInt32());
System.out.println(roundtripped.getOneofString());
System.out.println(roundtripped.getBarInt64());
System.out.println(roundtripped.getQuxString());
}
static void partiallyUsed_proto2() {
System.out.println("--- partiallyUsed_proto2 ---");
PartiallyUsed pu;
try {
pu = PartiallyUsed.parseFrom(FIELD1_SET_TO_42);
} catch (InvalidProtocolBufferException e) {
System.out.println("Unexpected exception: " + e);
throw new RuntimeException(e);
}
System.out.println(pu.hasUsed());
System.out.println(pu.getUsed());
}
static void usedViaHazzer() {
System.out.println("--- usedViaHazzer ---");
UsedViaHazzer uvh;
try {
uvh = UsedViaHazzer.parseFrom(FIELD1_SET_TO_42);
} catch (InvalidProtocolBufferException e) {
System.out.println("Unexpected exception: " + e);
throw new RuntimeException(e);
}
System.out.println(uvh.hasUsed());
}
static void usedViaOneofCase() {
System.out.println("--- usedViaOneofCase ---");
UsedViaOneofCase msg;
try {
msg = UsedViaOneofCase.parseFrom(FIELD1_SET_TO_42);
} catch (InvalidProtocolBufferException e) {
System.out.println("Unexpected exception: " + e);
throw new RuntimeException(e);
}
System.out.println(msg.hasUsed());
}
static void usesOnlyRepeatedFields() {
System.out.println("--- usesOnlyRepeatedFields ---");
UsesOnlyRepeatedFields msg;
try {
msg = UsesOnlyRepeatedFields.parseFrom(FIELD1_SET_TO_42);
} catch (InvalidProtocolBufferException e) {
System.out.println("Unexpected exception: " + e);
throw new RuntimeException(e);
}
System.out.println(msg.getUsedCount());
}
static void containsFlaggedOffField() {
System.out.println("--- containsFlaggedOffField ---");
ContainsFlaggedOffField.Builder builder = ContainsFlaggedOffField.newBuilder();
if (alwaysFalse()) {
builder.setConditionallyUsed(1);
}
System.out.println(builder.build().getSerializedSize());
}
static void hasFlaggedOffExtension() {
System.out.println("--- hasFlaggedOffExtension ---");
HasFlaggedOffExtension msg;
try {
msg =
HasFlaggedOffExtension.parseFrom(
MESSAGE10_WITH_FIELD1_SET_TO_42, ExtensionRegistryLite.getGeneratedRegistry());
} catch (InvalidProtocolBufferException e) {
System.out.println("Unexpected exception: " + e);
throw new RuntimeException(e);
}
if (alwaysFalse()) {
System.out.println(msg.getExtension(HasFlaggedOffExtension.Ext.ext).getX());
}
System.out.println(msg.getSerializedSize());
}
static boolean alwaysFalse() {
return false;
}
static void useOneExtension() {
System.out.println("--- useOneExtension ---");
PartiallyUsedWithExtension msg;
try {
msg =
PartiallyUsedWithExtension.parseFrom(
MESSAGE10_WITH_FIELD1_SET_TO_42, ExtensionRegistryLite.getGeneratedRegistry());
} catch (InvalidProtocolBufferException e) {
System.out.println("Unexpected exception: " + e);
throw new RuntimeException(e);
}
PartiallyUsedWithExtension.ExtA ext = msg.getExtension(PartiallyUsedWithExtension.ExtA.extA);
System.out.println(ext.getX());
}
static void keepMapAndRequiredFields() {
System.out.println("--- keepMapAndRequiredFields ---");
UsedRoot msg;
try {
msg = UsedRoot.parseFrom(new byte[0], ExtensionRegistryLite.getGeneratedRegistry());
} catch (InvalidProtocolBufferException e) {
System.out.println("Unexpected exception: " + e);
throw new RuntimeException(e);
}
System.out.println(msg.isInitialized());
// Force extension edges to be kept. This test is for verifying that we keep *fields* which
// lead to extensions with required fields. b/123031088 is for keeping the extensions.
System.out.println(IsExtendedWithRequiredField.Ext.ext.getNumber());
System.out.println(IsRepeatedlyExtendedWithRequiredField.Ext.ext.getNumber());
System.out.println(IsExtendedWithOptional.Ext.ext.getNumber());
}
}