descriptors_test.php 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  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. 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. #########################################################
  74. # Test enum descriptor.
  75. #########################################################
  76. public function testEnumDescriptor()
  77. {
  78. // WARNINIG - we need to do this so that TestDescriptorsEnum is registered!!?
  79. new TestDescriptorsMessage();
  80. $pool = DescriptorPool::getGeneratedPool();
  81. $enumDesc = $pool->getEnumDescriptorByClassName(get_class(new TestDescriptorsEnum()));
  82. // Build map of enum values
  83. $enumDescMap = [];
  84. for ($i = 0; $i < $enumDesc->getValueCount(); $i++) {
  85. $enumValueDesc = $enumDesc->getValue($i);
  86. $this->assertInstanceOf('\Google\Protobuf\EnumValueDescriptor', $enumValueDesc);
  87. $enumDescMap[$enumValueDesc->getNumber()] = $enumValueDesc->getName();
  88. }
  89. $this->assertSame('ZERO', $enumDescMap[0]);
  90. $this->assertSame('ONE', $enumDescMap[1]);
  91. $this->assertSame(2, $enumDesc->getValueCount());
  92. }
  93. #########################################################
  94. # Test field descriptor.
  95. #########################################################
  96. public function testFieldDescriptor()
  97. {
  98. $pool = DescriptorPool::getGeneratedPool();
  99. $desc = $pool->getDescriptorByClassName(get_class(new TestDescriptorsMessage()));
  100. $fieldDescMap = $this->buildFieldMap($desc);
  101. // Optional int field
  102. $fieldDesc = $fieldDescMap[1];
  103. $this->assertSame('optional_int32', $fieldDesc->getName());
  104. $this->assertSame(1, $fieldDesc->getNumber());
  105. $this->assertSame(self::GPBLABEL_OPTIONAL, $fieldDesc->getLabel());
  106. $this->assertSame(self::GPBTYPE_INT32, $fieldDesc->getType());
  107. $this->assertFalse($fieldDesc->isMap());
  108. // Optional enum field
  109. $fieldDesc = $fieldDescMap[16];
  110. $this->assertSame('optional_enum', $fieldDesc->getName());
  111. $this->assertSame(16, $fieldDesc->getNumber());
  112. $this->assertSame(self::GPBLABEL_OPTIONAL, $fieldDesc->getLabel());
  113. $this->assertSame(self::GPBTYPE_ENUM, $fieldDesc->getType());
  114. $this->assertInstanceOf('\Google\Protobuf\EnumDescriptor', $fieldDesc->getEnumType());
  115. $this->assertFalse($fieldDesc->isMap());
  116. // Optional message field
  117. $fieldDesc = $fieldDescMap[17];
  118. $this->assertSame('optional_message', $fieldDesc->getName());
  119. $this->assertSame(17, $fieldDesc->getNumber());
  120. $this->assertSame(self::GPBLABEL_OPTIONAL, $fieldDesc->getLabel());
  121. $this->assertSame(self::GPBTYPE_MESSAGE, $fieldDesc->getType());
  122. $this->assertInstanceOf('\Google\Protobuf\Descriptor', $fieldDesc->getMessageType());
  123. $this->assertFalse($fieldDesc->isMap());
  124. // Repeated int field
  125. $fieldDesc = $fieldDescMap[31];
  126. $this->assertSame('repeated_int32', $fieldDesc->getName());
  127. $this->assertSame(31, $fieldDesc->getNumber());
  128. $this->assertSame(self::GPBLABEL_REPEATED, $fieldDesc->getLabel());
  129. $this->assertSame(self::GPBTYPE_INT32, $fieldDesc->getType());
  130. $this->assertFalse($fieldDesc->isMap());
  131. // Repeated message field
  132. $fieldDesc = $fieldDescMap[47];
  133. $this->assertSame('repeated_message', $fieldDesc->getName());
  134. $this->assertSame(47, $fieldDesc->getNumber());
  135. $this->assertSame(self::GPBLABEL_REPEATED, $fieldDesc->getLabel());
  136. $this->assertSame(self::GPBTYPE_MESSAGE, $fieldDesc->getType());
  137. $this->assertInstanceOf('\Google\Protobuf\Descriptor', $fieldDesc->getMessageType());
  138. $this->assertFalse($fieldDesc->isMap());
  139. // Oneof int field
  140. // Tested further in testOneofDescriptor()
  141. $fieldDesc = $fieldDescMap[51];
  142. $this->assertSame('oneof_int32', $fieldDesc->getName());
  143. $this->assertSame(51, $fieldDesc->getNumber());
  144. $this->assertSame(self::GPBLABEL_OPTIONAL, $fieldDesc->getLabel());
  145. $this->assertSame(self::GPBTYPE_INT32, $fieldDesc->getType());
  146. $this->assertFalse($fieldDesc->isMap());
  147. // Map int-enum field
  148. $fieldDesc = $fieldDescMap[71];
  149. $this->assertSame('map_int32_enum', $fieldDesc->getName());
  150. $this->assertSame(71, $fieldDesc->getNumber());
  151. $this->assertSame(self::GPBLABEL_REPEATED, $fieldDesc->getLabel());
  152. $this->assertSame(self::GPBTYPE_MESSAGE, $fieldDesc->getType());
  153. $this->assertTrue($fieldDesc->isMap());
  154. $mapDesc = $fieldDesc->getMessageType();
  155. $this->assertSame('descriptors.TestDescriptorsMessage.MapInt32EnumEntry', $mapDesc->getFullName());
  156. $this->assertSame(self::GPBTYPE_INT32, $mapDesc->getField(0)->getType());
  157. $this->assertSame(self::GPBTYPE_ENUM, $mapDesc->getField(1)->getType());
  158. }
  159. /**
  160. * @expectedException \Exception
  161. */
  162. public function testFieldDescriptorEnumException()
  163. {
  164. $pool = DescriptorPool::getGeneratedPool();
  165. $desc = $pool->getDescriptorByClassName(get_class(new TestDescriptorsMessage()));
  166. $fieldDesc = $desc->getField(0);
  167. $fieldDesc->getEnumType();
  168. }
  169. /**
  170. * @expectedException \Exception
  171. */
  172. public function testFieldDescriptorMessageException()
  173. {
  174. $pool = DescriptorPool::getGeneratedPool();
  175. $desc = $pool->getDescriptorByClassName(get_class(new TestDescriptorsMessage()));
  176. $fieldDesc = $desc->getField(0);
  177. $fieldDesc->getMessageType();
  178. }
  179. #########################################################
  180. # Test oneof descriptor.
  181. #########################################################
  182. public function testOneofDescriptor()
  183. {
  184. $pool = DescriptorPool::getGeneratedPool();
  185. $desc = $pool->getDescriptorByClassName(get_class(new TestDescriptorsMessage()));
  186. $fieldDescMap = $this->buildFieldMap($desc);
  187. $fieldDesc = $fieldDescMap[51];
  188. $oneofDesc = $desc->getOneofDecl(0);
  189. $this->assertSame('my_oneof', $oneofDesc->getName());
  190. $fieldDescFromOneof = $oneofDesc->getField(0);
  191. $this->assertSame($fieldDesc, $fieldDescFromOneof);
  192. $this->assertSame(1, $oneofDesc->getFieldCount());
  193. }
  194. private function buildFieldMap($desc)
  195. {
  196. $fieldDescMap = [];
  197. for ($i = 0; $i < $desc->getFieldCount(); $i++) {
  198. $fieldDesc = $desc->getField($i);
  199. $fieldDescMap[$fieldDesc->getNumber()] = $fieldDesc;
  200. }
  201. return $fieldDescMap;
  202. }
  203. }