DescriptorsTest.php 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. <?php
  2. require_once('test_base.php');
  3. require_once('test_util.php');
  4. use Google\Protobuf\DescriptorPool;
  5. use Google\Protobuf\Internal\RepeatedField;
  6. use Google\Protobuf\Internal\MapField;
  7. use Descriptors\TestDescriptorsEnum;
  8. use Descriptors\TestDescriptorsMessage;
  9. use Descriptors\TestDescriptorsMessage\Sub;
  10. use Foo\TestMessage;
  11. use Bar\TestInclude;
  12. class DescriptorsTest extends TestBase
  13. {
  14. // Redefine these here for compatibility with c extension
  15. const GPBLABEL_OPTIONAL = 1;
  16. const GPBLABEL_REQUIRED = 2;
  17. const GPBLABEL_REPEATED = 3;
  18. const GPBTYPE_DOUBLE = 1;
  19. const GPBTYPE_FLOAT = 2;
  20. const GPBTYPE_INT64 = 3;
  21. const GPBTYPE_UINT64 = 4;
  22. const GPBTYPE_INT32 = 5;
  23. const GPBTYPE_FIXED64 = 6;
  24. const GPBTYPE_FIXED32 = 7;
  25. const GPBTYPE_BOOL = 8;
  26. const GPBTYPE_STRING = 9;
  27. const GPBTYPE_GROUP = 10;
  28. const GPBTYPE_MESSAGE = 11;
  29. const GPBTYPE_BYTES = 12;
  30. const GPBTYPE_UINT32 = 13;
  31. const GPBTYPE_ENUM = 14;
  32. const GPBTYPE_SFIXED32 = 15;
  33. const GPBTYPE_SFIXED64 = 16;
  34. const GPBTYPE_SINT32 = 17;
  35. const GPBTYPE_SINT64 = 18;
  36. #########################################################
  37. # Test descriptor pool.
  38. #########################################################
  39. public function testDescriptorPool()
  40. {
  41. $pool = DescriptorPool::getGeneratedPool();
  42. $desc = $pool->getDescriptorByClassName(get_class(new TestDescriptorsMessage()));
  43. $this->assertInstanceOf('\Google\Protobuf\Descriptor', $desc);
  44. $enumDesc = $pool->getEnumDescriptorByClassName(get_class(new TestDescriptorsEnum()));
  45. $this->assertInstanceOf('\Google\Protobuf\EnumDescriptor', $enumDesc);
  46. }
  47. public function testDescriptorPoolIncorrectArgs()
  48. {
  49. $pool = DescriptorPool::getGeneratedPool();
  50. $desc = $pool->getDescriptorByClassName('NotAClass');
  51. $this->assertNull($desc);
  52. $desc = $pool->getDescriptorByClassName(get_class(new TestDescriptorsEnum()));
  53. $this->assertNull($desc);
  54. $enumDesc = $pool->getEnumDescriptorByClassName(get_class(new TestDescriptorsMessage()));
  55. $this->assertNull($enumDesc);
  56. }
  57. #########################################################
  58. # Test descriptor.
  59. #########################################################
  60. public function testDescriptor()
  61. {
  62. $pool = DescriptorPool::getGeneratedPool();
  63. $class = get_class(new TestDescriptorsMessage());
  64. $this->assertSame('Descriptors\TestDescriptorsMessage', $class);
  65. $desc = $pool->getDescriptorByClassName($class);
  66. $this->assertSame('descriptors.TestDescriptorsMessage', $desc->getFullName());
  67. $this->assertSame($class, $desc->getClass());
  68. $this->assertInstanceOf('\Google\Protobuf\FieldDescriptor', $desc->getField(0));
  69. $this->assertSame(7, $desc->getFieldCount());
  70. $this->assertInstanceOf('\Google\Protobuf\OneofDescriptor', $desc->getOneofDecl(0));
  71. $this->assertSame(1, $desc->getOneofDeclCount());
  72. }
  73. public function testDescriptorForIncludedMessage()
  74. {
  75. $pool = DescriptorPool::getGeneratedPool();
  76. $class = get_class(new TestMessage());
  77. $this->assertSame('Foo\TestMessage', $class);
  78. $desc = $pool->getDescriptorByClassName($class);
  79. $fielddesc = $desc->getField(17);
  80. $subdesc = $fielddesc->getMessageType();
  81. $this->assertSame('Bar\TestInclude', $subdesc->getClass());
  82. }
  83. #########################################################
  84. # Test enum descriptor.
  85. #########################################################
  86. public function testEnumDescriptor()
  87. {
  88. // WARNING - we need to do this so that TestDescriptorsEnum is registered!!?
  89. new TestDescriptorsMessage();
  90. $pool = DescriptorPool::getGeneratedPool();
  91. $enumDesc = $pool->getEnumDescriptorByClassName(get_class(new TestDescriptorsEnum()));
  92. // Build map of enum values
  93. $enumDescMap = [];
  94. for ($i = 0; $i < $enumDesc->getValueCount(); $i++) {
  95. $enumValueDesc = $enumDesc->getValue($i);
  96. $this->assertInstanceOf('\Google\Protobuf\EnumValueDescriptor', $enumValueDesc);
  97. $enumDescMap[$enumValueDesc->getNumber()] = $enumValueDesc->getName();
  98. }
  99. $this->assertSame('ZERO', $enumDescMap[0]);
  100. $this->assertSame('ONE', $enumDescMap[1]);
  101. $this->assertSame(2, $enumDesc->getValueCount());
  102. }
  103. #########################################################
  104. # Test field descriptor.
  105. #########################################################
  106. public function testFieldDescriptor()
  107. {
  108. $pool = DescriptorPool::getGeneratedPool();
  109. $desc = $pool->getDescriptorByClassName(get_class(new TestDescriptorsMessage()));
  110. $fieldDescMap = $this->buildFieldMap($desc);
  111. // Optional int field
  112. $fieldDesc = $fieldDescMap[1];
  113. $this->assertSame('optional_int32', $fieldDesc->getName());
  114. $this->assertSame(1, $fieldDesc->getNumber());
  115. $this->assertSame(self::GPBLABEL_OPTIONAL, $fieldDesc->getLabel());
  116. $this->assertSame(self::GPBTYPE_INT32, $fieldDesc->getType());
  117. $this->assertFalse($fieldDesc->isMap());
  118. // Optional enum field
  119. $fieldDesc = $fieldDescMap[16];
  120. $this->assertSame('optional_enum', $fieldDesc->getName());
  121. $this->assertSame(16, $fieldDesc->getNumber());
  122. $this->assertSame(self::GPBLABEL_OPTIONAL, $fieldDesc->getLabel());
  123. $this->assertSame(self::GPBTYPE_ENUM, $fieldDesc->getType());
  124. $this->assertInstanceOf('\Google\Protobuf\EnumDescriptor', $fieldDesc->getEnumType());
  125. $this->assertFalse($fieldDesc->isMap());
  126. // Optional message field
  127. $fieldDesc = $fieldDescMap[17];
  128. $this->assertSame('optional_message', $fieldDesc->getName());
  129. $this->assertSame(17, $fieldDesc->getNumber());
  130. $this->assertSame(self::GPBLABEL_OPTIONAL, $fieldDesc->getLabel());
  131. $this->assertSame(self::GPBTYPE_MESSAGE, $fieldDesc->getType());
  132. $this->assertInstanceOf('\Google\Protobuf\Descriptor', $fieldDesc->getMessageType());
  133. $this->assertFalse($fieldDesc->isMap());
  134. // Repeated int field
  135. $fieldDesc = $fieldDescMap[31];
  136. $this->assertSame('repeated_int32', $fieldDesc->getName());
  137. $this->assertSame(31, $fieldDesc->getNumber());
  138. $this->assertSame(self::GPBLABEL_REPEATED, $fieldDesc->getLabel());
  139. $this->assertSame(self::GPBTYPE_INT32, $fieldDesc->getType());
  140. $this->assertFalse($fieldDesc->isMap());
  141. // Repeated message field
  142. $fieldDesc = $fieldDescMap[47];
  143. $this->assertSame('repeated_message', $fieldDesc->getName());
  144. $this->assertSame(47, $fieldDesc->getNumber());
  145. $this->assertSame(self::GPBLABEL_REPEATED, $fieldDesc->getLabel());
  146. $this->assertSame(self::GPBTYPE_MESSAGE, $fieldDesc->getType());
  147. $this->assertInstanceOf('\Google\Protobuf\Descriptor', $fieldDesc->getMessageType());
  148. $this->assertFalse($fieldDesc->isMap());
  149. // Oneof int field
  150. // Tested further in testOneofDescriptor()
  151. $fieldDesc = $fieldDescMap[51];
  152. $this->assertSame('oneof_int32', $fieldDesc->getName());
  153. $this->assertSame(51, $fieldDesc->getNumber());
  154. $this->assertSame(self::GPBLABEL_OPTIONAL, $fieldDesc->getLabel());
  155. $this->assertSame(self::GPBTYPE_INT32, $fieldDesc->getType());
  156. $this->assertFalse($fieldDesc->isMap());
  157. // Map int-enum field
  158. $fieldDesc = $fieldDescMap[71];
  159. $this->assertSame('map_int32_enum', $fieldDesc->getName());
  160. $this->assertSame(71, $fieldDesc->getNumber());
  161. $this->assertSame(self::GPBLABEL_REPEATED, $fieldDesc->getLabel());
  162. $this->assertSame(self::GPBTYPE_MESSAGE, $fieldDesc->getType());
  163. $this->assertTrue($fieldDesc->isMap());
  164. $mapDesc = $fieldDesc->getMessageType();
  165. $this->assertSame('descriptors.TestDescriptorsMessage.MapInt32EnumEntry', $mapDesc->getFullName());
  166. $this->assertSame(self::GPBTYPE_INT32, $mapDesc->getField(0)->getType());
  167. $this->assertSame(self::GPBTYPE_ENUM, $mapDesc->getField(1)->getType());
  168. }
  169. public function testFieldDescriptorEnumException()
  170. {
  171. $this->expectException(Exception::class);
  172. $pool = DescriptorPool::getGeneratedPool();
  173. $desc = $pool->getDescriptorByClassName(get_class(new TestDescriptorsMessage()));
  174. $fieldDesc = $desc->getField(0);
  175. $fieldDesc->getEnumType();
  176. }
  177. public function testFieldDescriptorMessageException()
  178. {
  179. $this->expectException(Exception::class);
  180. $pool = DescriptorPool::getGeneratedPool();
  181. $desc = $pool->getDescriptorByClassName(get_class(new TestDescriptorsMessage()));
  182. $fieldDesc = $desc->getField(0);
  183. $fieldDesc->getMessageType();
  184. }
  185. #########################################################
  186. # Test oneof descriptor.
  187. #########################################################
  188. public function testOneofDescriptor()
  189. {
  190. $pool = DescriptorPool::getGeneratedPool();
  191. $desc = $pool->getDescriptorByClassName(get_class(new TestDescriptorsMessage()));
  192. $fieldDescMap = $this->buildFieldMap($desc);
  193. $fieldDesc = $fieldDescMap[51];
  194. $oneofDesc = $desc->getOneofDecl(0);
  195. $this->assertSame('my_oneof', $oneofDesc->getName());
  196. $fieldDescFromOneof = $oneofDesc->getField(0);
  197. $this->assertSame($fieldDesc, $fieldDescFromOneof);
  198. $this->assertSame(1, $oneofDesc->getFieldCount());
  199. }
  200. private function buildFieldMap($desc)
  201. {
  202. $fieldDescMap = [];
  203. for ($i = 0; $i < $desc->getFieldCount(); $i++) {
  204. $fieldDesc = $desc->getField($i);
  205. $fieldDescMap[$fieldDesc->getNumber()] = $fieldDesc;
  206. }
  207. return $fieldDescMap;
  208. }
  209. }