DescriptorsTest.php 9.9 KB

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