1fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Protocol Buffers - Google's data interchange format
2fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Copyright 2008 Google Inc.  All rights reserved.
3fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// http://code.google.com/p/protobuf/
4fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
5fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Redistribution and use in source and binary forms, with or without
6fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// modification, are permitted provided that the following conditions are
7fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// met:
8fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
9fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     * Redistributions of source code must retain the above copyright
10fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// notice, this list of conditions and the following disclaimer.
11fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     * Redistributions in binary form must reproduce the above
12fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// copyright notice, this list of conditions and the following disclaimer
13fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// in the documentation and/or other materials provided with the
14fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// distribution.
15fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     * Neither the name of Google Inc. nor the names of its
16fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// contributors may be used to endorse or promote products derived from
17fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// this software without specific prior written permission.
18fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
19fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
31fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillepackage com.google.protobuf;
32fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
33d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleimport com.google.protobuf.DescriptorProtos.DescriptorProto;
34d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleimport com.google.protobuf.DescriptorProtos.FieldDescriptorProto;
35d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleimport com.google.protobuf.DescriptorProtos.FileDescriptorProto;
36d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleimport com.google.protobuf.Descriptors.DescriptorValidationException;
37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport com.google.protobuf.Descriptors.FileDescriptor;
38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport com.google.protobuf.Descriptors.Descriptor;
39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport com.google.protobuf.Descriptors.FieldDescriptor;
40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport com.google.protobuf.Descriptors.EnumDescriptor;
41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport com.google.protobuf.Descriptors.EnumValueDescriptor;
42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport com.google.protobuf.Descriptors.ServiceDescriptor;
43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport com.google.protobuf.Descriptors.MethodDescriptor;
44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport com.google.protobuf.test.UnittestImport;
46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport com.google.protobuf.test.UnittestImport.ImportEnum;
47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport com.google.protobuf.test.UnittestImport.ImportMessage;
48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport protobuf_unittest.UnittestProto;
49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport protobuf_unittest.UnittestProto.ForeignEnum;
50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport protobuf_unittest.UnittestProto.ForeignMessage;
51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport protobuf_unittest.UnittestProto.TestAllTypes;
52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport protobuf_unittest.UnittestProto.TestAllExtensions;
53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport protobuf_unittest.UnittestProto.TestExtremeDefaultValues;
54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport protobuf_unittest.UnittestProto.TestRequired;
55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport protobuf_unittest.UnittestProto.TestService;
56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport protobuf_unittest.UnittestCustomOptions;
57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport junit.framework.TestCase;
60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport java.util.Arrays;
62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport java.util.Collections;
63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville/**
65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Unit test for {@link Descriptors}.
66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville *
67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * @author kenton@google.com Kenton Varda
68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */
69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillepublic class DescriptorsTest extends TestCase {
70d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
71d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // Regression test for bug where referencing a FieldDescriptor.Type value
72d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // before a FieldDescriptorProto.Type value would yield a
73d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // ExceptionInInitializerError.
74d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  private static final Object STATIC_INIT_TEST = FieldDescriptor.Type.BOOL;
75d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
76d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  public void testFieldTypeEnumMapping() throws Exception {
77d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    assertEquals(FieldDescriptor.Type.values().length,
78d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        FieldDescriptorProto.Type.values().length);
79d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    for (FieldDescriptor.Type type : FieldDescriptor.Type.values()) {
80d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      FieldDescriptorProto.Type protoType = type.toProto();
81d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      assertEquals("TYPE_" + type.name(), protoType.name());
82d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      assertEquals(type, FieldDescriptor.Type.valueOf(protoType));
83d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    }
84d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  }
85d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
86fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  public void testFileDescriptor() throws Exception {
87fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    FileDescriptor file = UnittestProto.getDescriptor();
88fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
89fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals("google/protobuf/unittest.proto", file.getName());
90fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals("protobuf_unittest", file.getPackage());
91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals("UnittestProto", file.getOptions().getJavaOuterClassname());
93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals("google/protobuf/unittest.proto",
94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                 file.toProto().getName());
95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
96fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(Arrays.asList(UnittestImport.getDescriptor()),
97fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                 file.getDependencies());
98fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
99fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Descriptor messageType = TestAllTypes.getDescriptor();
100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(messageType, file.getMessageTypes().get(0));
101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(messageType, file.findMessageTypeByName("TestAllTypes"));
102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertNull(file.findMessageTypeByName("NoSuchType"));
103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertNull(file.findMessageTypeByName("protobuf_unittest.TestAllTypes"));
104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    for (int i = 0; i < file.getMessageTypes().size(); i++) {
105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      assertEquals(i, file.getMessageTypes().get(i).getIndex());
106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EnumDescriptor enumType = ForeignEnum.getDescriptor();
109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(enumType, file.getEnumTypes().get(0));
110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(enumType, file.findEnumTypeByName("ForeignEnum"));
111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertNull(file.findEnumTypeByName("NoSuchType"));
112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertNull(file.findEnumTypeByName("protobuf_unittest.ForeignEnum"));
113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(Arrays.asList(ImportEnum.getDescriptor()),
114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                 UnittestImport.getDescriptor().getEnumTypes());
115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    for (int i = 0; i < file.getEnumTypes().size(); i++) {
116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      assertEquals(i, file.getEnumTypes().get(i).getIndex());
117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ServiceDescriptor service = TestService.getDescriptor();
120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(service, file.getServices().get(0));
121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(service, file.findServiceByName("TestService"));
122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertNull(file.findServiceByName("NoSuchType"));
123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertNull(file.findServiceByName("protobuf_unittest.TestService"));
124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(Collections.emptyList(),
125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                 UnittestImport.getDescriptor().getServices());
126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    for (int i = 0; i < file.getServices().size(); i++) {
127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      assertEquals(i, file.getServices().get(i).getIndex());
128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    FieldDescriptor extension =
131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      UnittestProto.optionalInt32Extension.getDescriptor();
132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(extension, file.getExtensions().get(0));
133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(extension,
134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                 file.findExtensionByName("optional_int32_extension"));
135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertNull(file.findExtensionByName("no_such_ext"));
136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertNull(file.findExtensionByName(
137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "protobuf_unittest.optional_int32_extension"));
138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(Collections.emptyList(),
139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                 UnittestImport.getDescriptor().getExtensions());
140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    for (int i = 0; i < file.getExtensions().size(); i++) {
141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      assertEquals(i, file.getExtensions().get(i).getIndex());
142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  public void testDescriptor() throws Exception {
146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Descriptor messageType = TestAllTypes.getDescriptor();
147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Descriptor nestedType = TestAllTypes.NestedMessage.getDescriptor();
148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals("TestAllTypes", messageType.getName());
150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals("protobuf_unittest.TestAllTypes", messageType.getFullName());
151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(UnittestProto.getDescriptor(), messageType.getFile());
152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertNull(messageType.getContainingType());
153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(DescriptorProtos.MessageOptions.getDefaultInstance(),
154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                 messageType.getOptions());
155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals("TestAllTypes", messageType.toProto().getName());
156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals("NestedMessage", nestedType.getName());
158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals("protobuf_unittest.TestAllTypes.NestedMessage",
159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                 nestedType.getFullName());
160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(UnittestProto.getDescriptor(), nestedType.getFile());
161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(messageType, nestedType.getContainingType());
162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    FieldDescriptor field = messageType.getFields().get(0);
164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals("optional_int32", field.getName());
165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(field, messageType.findFieldByName("optional_int32"));
166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertNull(messageType.findFieldByName("no_such_field"));
167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(field, messageType.findFieldByNumber(1));
168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertNull(messageType.findFieldByNumber(571283));
169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    for (int i = 0; i < messageType.getFields().size(); i++) {
170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      assertEquals(i, messageType.getFields().get(i).getIndex());
171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(nestedType, messageType.getNestedTypes().get(0));
174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(nestedType, messageType.findNestedTypeByName("NestedMessage"));
175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertNull(messageType.findNestedTypeByName("NoSuchType"));
176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    for (int i = 0; i < messageType.getNestedTypes().size(); i++) {
177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      assertEquals(i, messageType.getNestedTypes().get(i).getIndex());
178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EnumDescriptor enumType = TestAllTypes.NestedEnum.getDescriptor();
181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(enumType, messageType.getEnumTypes().get(0));
182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(enumType, messageType.findEnumTypeByName("NestedEnum"));
183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertNull(messageType.findEnumTypeByName("NoSuchType"));
184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    for (int i = 0; i < messageType.getEnumTypes().size(); i++) {
185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      assertEquals(i, messageType.getEnumTypes().get(i).getIndex());
186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  public void testFieldDescriptor() throws Exception {
190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Descriptor messageType = TestAllTypes.getDescriptor();
191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    FieldDescriptor primitiveField =
192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      messageType.findFieldByName("optional_int32");
193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    FieldDescriptor enumField =
194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      messageType.findFieldByName("optional_nested_enum");
195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    FieldDescriptor messageField =
196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      messageType.findFieldByName("optional_foreign_message");
197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    FieldDescriptor cordField =
198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      messageType.findFieldByName("optional_cord");
199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    FieldDescriptor extension =
200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      UnittestProto.optionalInt32Extension.getDescriptor();
201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    FieldDescriptor nestedExtension = TestRequired.single.getDescriptor();
202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals("optional_int32", primitiveField.getName());
204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals("protobuf_unittest.TestAllTypes.optional_int32",
205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                 primitiveField.getFullName());
206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(1, primitiveField.getNumber());
207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(messageType, primitiveField.getContainingType());
208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(UnittestProto.getDescriptor(), primitiveField.getFile());
209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(FieldDescriptor.Type.INT32, primitiveField.getType());
210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(FieldDescriptor.JavaType.INT, primitiveField.getJavaType());
211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(DescriptorProtos.FieldOptions.getDefaultInstance(),
212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                 primitiveField.getOptions());
213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertFalse(primitiveField.isExtension());
214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals("optional_int32", primitiveField.toProto().getName());
215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals("optional_nested_enum", enumField.getName());
217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(FieldDescriptor.Type.ENUM, enumField.getType());
218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(FieldDescriptor.JavaType.ENUM, enumField.getJavaType());
219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(TestAllTypes.NestedEnum.getDescriptor(),
220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                 enumField.getEnumType());
221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals("optional_foreign_message", messageField.getName());
223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(FieldDescriptor.Type.MESSAGE, messageField.getType());
224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(FieldDescriptor.JavaType.MESSAGE, messageField.getJavaType());
225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(ForeignMessage.getDescriptor(), messageField.getMessageType());
226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals("optional_cord", cordField.getName());
228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(FieldDescriptor.Type.STRING, cordField.getType());
229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(FieldDescriptor.JavaType.STRING, cordField.getJavaType());
230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(DescriptorProtos.FieldOptions.CType.CORD,
231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                 cordField.getOptions().getCtype());
232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals("optional_int32_extension", extension.getName());
234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals("protobuf_unittest.optional_int32_extension",
235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                 extension.getFullName());
236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(1, extension.getNumber());
237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(TestAllExtensions.getDescriptor(),
238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                 extension.getContainingType());
239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(UnittestProto.getDescriptor(), extension.getFile());
240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(FieldDescriptor.Type.INT32, extension.getType());
241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(FieldDescriptor.JavaType.INT, extension.getJavaType());
242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(DescriptorProtos.FieldOptions.getDefaultInstance(),
243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                 extension.getOptions());
244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertTrue(extension.isExtension());
245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(null, extension.getExtensionScope());
246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals("optional_int32_extension", extension.toProto().getName());
247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals("single", nestedExtension.getName());
249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals("protobuf_unittest.TestRequired.single",
250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                 nestedExtension.getFullName());
251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(TestRequired.getDescriptor(),
252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                 nestedExtension.getExtensionScope());
253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
254fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
255fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  public void testFieldDescriptorLabel() throws Exception {
256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    FieldDescriptor requiredField =
257fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      TestRequired.getDescriptor().findFieldByName("a");
258fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    FieldDescriptor optionalField =
259fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      TestAllTypes.getDescriptor().findFieldByName("optional_int32");
260fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    FieldDescriptor repeatedField =
261fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      TestAllTypes.getDescriptor().findFieldByName("repeated_int32");
262fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertTrue(requiredField.isRequired());
264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertFalse(requiredField.isRepeated());
265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertFalse(optionalField.isRequired());
266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertFalse(optionalField.isRepeated());
267fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertFalse(repeatedField.isRequired());
268fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertTrue(repeatedField.isRepeated());
269fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
270fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
271fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  public void testFieldDescriptorDefault() throws Exception {
272fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Descriptor d = TestAllTypes.getDescriptor();
273fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertFalse(d.findFieldByName("optional_int32").hasDefaultValue());
274fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(0, d.findFieldByName("optional_int32").getDefaultValue());
275fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertTrue(d.findFieldByName("default_int32").hasDefaultValue());
276fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(41, d.findFieldByName("default_int32").getDefaultValue());
277fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
278fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    d = TestExtremeDefaultValues.getDescriptor();
279fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(
280fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      ByteString.copyFrom(
281fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "\0\001\007\b\f\n\r\t\013\\\'\"\u00fe".getBytes("ISO-8859-1")),
282fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      d.findFieldByName("escaped_bytes").getDefaultValue());
283fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(-1, d.findFieldByName("large_uint32").getDefaultValue());
284fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(-1L, d.findFieldByName("large_uint64").getDefaultValue());
285fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
286fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
287fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  public void testEnumDescriptor() throws Exception {
288fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EnumDescriptor enumType = ForeignEnum.getDescriptor();
289fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EnumDescriptor nestedType = TestAllTypes.NestedEnum.getDescriptor();
290fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
291fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals("ForeignEnum", enumType.getName());
292fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals("protobuf_unittest.ForeignEnum", enumType.getFullName());
293fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(UnittestProto.getDescriptor(), enumType.getFile());
294fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertNull(enumType.getContainingType());
295fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(DescriptorProtos.EnumOptions.getDefaultInstance(),
296fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                 enumType.getOptions());
297fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
298fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals("NestedEnum", nestedType.getName());
299fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals("protobuf_unittest.TestAllTypes.NestedEnum",
300fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                 nestedType.getFullName());
301fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(UnittestProto.getDescriptor(), nestedType.getFile());
302fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(TestAllTypes.getDescriptor(), nestedType.getContainingType());
303fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
304fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EnumValueDescriptor value = ForeignEnum.FOREIGN_FOO.getValueDescriptor();
305fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(value, enumType.getValues().get(0));
306fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals("FOREIGN_FOO", value.getName());
307fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(4, value.getNumber());
308fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(value, enumType.findValueByName("FOREIGN_FOO"));
309fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(value, enumType.findValueByNumber(4));
310fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertNull(enumType.findValueByName("NO_SUCH_VALUE"));
311fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    for (int i = 0; i < enumType.getValues().size(); i++) {
312fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      assertEquals(i, enumType.getValues().get(i).getIndex());
313fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
314fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
315fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
316fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  public void testServiceDescriptor() throws Exception {
317fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ServiceDescriptor service = TestService.getDescriptor();
318fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
319fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals("TestService", service.getName());
320fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals("protobuf_unittest.TestService", service.getFullName());
321fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(UnittestProto.getDescriptor(), service.getFile());
322fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
323fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(2, service.getMethods().size());
324fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
325fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    MethodDescriptor fooMethod = service.getMethods().get(0);
326fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals("Foo", fooMethod.getName());
327fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(UnittestProto.FooRequest.getDescriptor(),
328fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                 fooMethod.getInputType());
329fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(UnittestProto.FooResponse.getDescriptor(),
330fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                 fooMethod.getOutputType());
331fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(fooMethod, service.findMethodByName("Foo"));
332fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
333fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    MethodDescriptor barMethod = service.getMethods().get(1);
334fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals("Bar", barMethod.getName());
335fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(UnittestProto.BarRequest.getDescriptor(),
336fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                 barMethod.getInputType());
337fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(UnittestProto.BarResponse.getDescriptor(),
338fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                 barMethod.getOutputType());
339fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(barMethod, service.findMethodByName("Bar"));
340fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
341fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertNull(service.findMethodByName("NoSuchMethod"));
342fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
343fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    for (int i = 0; i < service.getMethods().size(); i++) {
344fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      assertEquals(i, service.getMethods().get(i).getIndex());
345fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
346fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
347fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
348fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
349fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  public void testCustomOptions() throws Exception {
350fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Descriptor descriptor =
351fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      UnittestCustomOptions.TestMessageWithCustomOptions.getDescriptor();
352fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
353fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertTrue(
354fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      descriptor.getOptions().hasExtension(UnittestCustomOptions.messageOpt1));
355fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(Integer.valueOf(-56),
356fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      descriptor.getOptions().getExtension(UnittestCustomOptions.messageOpt1));
357fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
358fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    FieldDescriptor field = descriptor.findFieldByName("field1");
359fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertNotNull(field);
360fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
361fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertTrue(
362fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      field.getOptions().hasExtension(UnittestCustomOptions.fieldOpt1));
363fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(Long.valueOf(8765432109L),
364fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      field.getOptions().getExtension(UnittestCustomOptions.fieldOpt1));
365fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
366fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    EnumDescriptor enumType =
367fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      UnittestCustomOptions.TestMessageWithCustomOptions.AnEnum.getDescriptor();
368fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
369fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertTrue(
370fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      enumType.getOptions().hasExtension(UnittestCustomOptions.enumOpt1));
371fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(Integer.valueOf(-789),
372fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      enumType.getOptions().getExtension(UnittestCustomOptions.enumOpt1));
373fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
374fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ServiceDescriptor service =
375fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      UnittestCustomOptions.TestServiceWithCustomOptions.getDescriptor();
376fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
377fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertTrue(
378fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      service.getOptions().hasExtension(UnittestCustomOptions.serviceOpt1));
379fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(Long.valueOf(-9876543210L),
380fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      service.getOptions().getExtension(UnittestCustomOptions.serviceOpt1));
381fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
382fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    MethodDescriptor method = service.findMethodByName("Foo");
383fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertNotNull(method);
384fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
385fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertTrue(
386fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      method.getOptions().hasExtension(UnittestCustomOptions.methodOpt1));
387fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(UnittestCustomOptions.MethodOpt1.METHODOPT1_VAL2,
388fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      method.getOptions().getExtension(UnittestCustomOptions.methodOpt1));
389fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
390fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
391fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  /**
392fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville   * Test that the FieldDescriptor.Type enum is the same as the
393fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville   * WireFormat.FieldType enum.
394fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville   */
395fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  public void testFieldTypeTablesMatch() throws Exception {
396fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    FieldDescriptor.Type[] values1 = FieldDescriptor.Type.values();
397fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    WireFormat.FieldType[] values2 = WireFormat.FieldType.values();
398fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
399fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(values1.length, values2.length);
400fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
401fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    for (int i = 0; i < values1.length; i++) {
402fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      assertEquals(values1[i].toString(), values2[i].toString());
403fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
404fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
405fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
406fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  /**
407fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville   * Test that the FieldDescriptor.JavaType enum is the same as the
408fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville   * WireFormat.JavaType enum.
409fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville   */
410fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  public void testJavaTypeTablesMatch() throws Exception {
411fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    FieldDescriptor.JavaType[] values1 = FieldDescriptor.JavaType.values();
412fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    WireFormat.JavaType[] values2 = WireFormat.JavaType.values();
413fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
414fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertEquals(values1.length, values2.length);
415fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
416fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    for (int i = 0; i < values1.length; i++) {
417fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      assertEquals(values1[i].toString(), values2[i].toString());
418fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
419fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
420fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
421fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  public void testEnormousDescriptor() throws Exception {
422fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // The descriptor for this file is larger than 64k, yet it did not cause
423fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // a compiler error due to an over-long string literal.
424fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    assertTrue(
425fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        UnittestEnormousDescriptor.getDescriptor()
426fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          .toProto().getSerializedSize() > 65536);
427fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
428d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
429d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  /**
430d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville   * Tests that the DescriptorValidationException works as intended.
431d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville   */
432d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  public void testDescriptorValidatorException() throws Exception {
433d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    FileDescriptorProto fileDescriptorProto = FileDescriptorProto.newBuilder()
434d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      .setName("foo.proto")
435d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      .addMessageType(DescriptorProto.newBuilder()
436d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      .setName("Foo")
437d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        .addField(FieldDescriptorProto.newBuilder()
438d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville          .setLabel(FieldDescriptorProto.Label.LABEL_OPTIONAL)
439d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville          .setType(FieldDescriptorProto.Type.TYPE_INT32)
440d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville          .setName("foo")
441d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville          .setNumber(1)
442d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville          .setDefaultValue("invalid")
443d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville          .build())
444d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        .build())
445d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      .build();
446d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    try {
447d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      Descriptors.FileDescriptor.buildFrom(fileDescriptorProto,
448d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville          new FileDescriptor[0]);
449d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      fail("DescriptorValidationException expected");
450d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    } catch (DescriptorValidationException e) {
451d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      // Expected; check that the error message contains some useful hints
452d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      assertTrue(e.getMessage().indexOf("foo") != -1);
453d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      assertTrue(e.getMessage().indexOf("Foo") != -1);
454d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      assertTrue(e.getMessage().indexOf("invalid") != -1);
455d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      assertTrue(e.getCause() instanceof NumberFormatException);
456d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      assertTrue(e.getCause().getMessage().indexOf("invalid") != -1);
457d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    }
458d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  }
459fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
460