| // 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()); | 
 |   } | 
 | } |