memory_leak_test.php 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. <?php
  2. # phpunit has memory leak by itself. Thus, it cannot be used to test memory leak.
  3. class HasDestructor
  4. {
  5. function __construct() {
  6. $this->foo = $this;
  7. }
  8. function __destruct() {
  9. new Foo\TestMessage();
  10. }
  11. }
  12. require_once('../vendor/autoload.php');
  13. require_once('test_util.php');
  14. $has_destructor = new HasDestructor();
  15. use Google\Protobuf\Internal\RepeatedField;
  16. use Google\Protobuf\Internal\GPBType;
  17. use Foo\TestAny;
  18. use Foo\TestMessage;
  19. use Foo\TestMessage\Sub;
  20. $from = new TestMessage();
  21. TestUtil::setTestMessage($from);
  22. TestUtil::assertTestMessage($from);
  23. $data = $from->serializeToString();
  24. $to = new TestMessage();
  25. $to->mergeFromString($data);
  26. TestUtil::assertTestMessage($to);
  27. $from = new TestMessage();
  28. TestUtil::setTestMessage2($from);
  29. $data = $from->serializeToString();
  30. $to->mergeFromString($data);
  31. // TODO(teboring): This causes following tests fail in php7.
  32. # $from->setRecursive($from);
  33. $arr = new RepeatedField(GPBType::MESSAGE, TestMessage::class);
  34. $arr[] = new TestMessage;
  35. $arr[0]->SetRepeatedRecursive($arr);
  36. // Test oneof fields.
  37. $m = new TestMessage();
  38. $m->setOneofInt32(1);
  39. assert(1 === $m->getOneofInt32());
  40. assert(0.0 === $m->getOneofFloat());
  41. assert('' === $m->getOneofString());
  42. assert(NULL === $m->getOneofMessage());
  43. $data = $m->serializeToString();
  44. $n = new TestMessage();
  45. $n->mergeFromString($data);
  46. assert(1 === $n->getOneofInt32());
  47. $m->setOneofFloat(2.0);
  48. assert(0 === $m->getOneofInt32());
  49. assert(2.0 === $m->getOneofFloat());
  50. assert('' === $m->getOneofString());
  51. assert(NULL === $m->getOneofMessage());
  52. $data = $m->serializeToString();
  53. $n = new TestMessage();
  54. $n->mergeFromString($data);
  55. assert(2.0 === $n->getOneofFloat());
  56. $m->setOneofString('abc');
  57. assert(0 === $m->getOneofInt32());
  58. assert(0.0 === $m->getOneofFloat());
  59. assert('abc' === $m->getOneofString());
  60. assert(NULL === $m->getOneofMessage());
  61. $data = $m->serializeToString();
  62. $n = new TestMessage();
  63. $n->mergeFromString($data);
  64. assert('abc' === $n->getOneofString());
  65. $sub_m = new Sub();
  66. $sub_m->setA(1);
  67. $m->setOneofMessage($sub_m);
  68. assert(0 === $m->getOneofInt32());
  69. assert(0.0 === $m->getOneofFloat());
  70. assert('' === $m->getOneofString());
  71. assert(1 === $m->getOneofMessage()->getA());
  72. $data = $m->serializeToString();
  73. $n = new TestMessage();
  74. $n->mergeFromString($data);
  75. assert(1 === $n->getOneofMessage()->getA());
  76. $m = new TestMessage();
  77. $m->mergeFromString(hex2bin('F80601'));
  78. assert('f80601' === bin2hex($m->serializeToString()));
  79. // Test create repeated field via array.
  80. $str_arr = array("abc");
  81. $m = new TestMessage();
  82. $m->setRepeatedString($str_arr);
  83. // Test create map field via array.
  84. $str_arr = array("abc"=>"abc");
  85. $m = new TestMessage();
  86. $m->setMapStringString($str_arr);
  87. // Test unset
  88. $from = new TestMessage();
  89. TestUtil::setTestMessage($from);
  90. unset($from);
  91. // Test wellknown
  92. $from = new \Google\Protobuf\Timestamp();
  93. $from->setSeconds(1);
  94. assert(1, $from->getSeconds());
  95. $timestamp = new \Google\Protobuf\Timestamp();
  96. date_default_timezone_set('UTC');
  97. $from = new DateTime('2011-01-01T15:03:01.012345UTC');
  98. $timestamp->fromDateTime($from);
  99. assert($from->format('U') == $timestamp->getSeconds());
  100. assert(1000 * $from->format('u') == $timestamp->getNanos());
  101. $to = $timestamp->toDateTime();
  102. assert(\DateTime::class == get_class($to));
  103. assert($from->format('U') == $to->format('U'));
  104. $from = new \Google\Protobuf\Value();
  105. $from->setNumberValue(1);
  106. assert(1, $from->getNumberValue());
  107. // Test discard unknown in message.
  108. $m = new TestMessage();
  109. $from = hex2bin('F80601');
  110. $m->mergeFromString($from);
  111. $m->discardUnknownFields();
  112. $to = $m->serializeToString();
  113. assert("" === bin2hex($to));
  114. // Test clear
  115. $m = new TestMessage();
  116. TestUtil::setTestMessage($m);
  117. $m->clear();
  118. // Test unset map element
  119. $m = new TestMessage();
  120. $map = $m->getMapStringString();
  121. $map[1] = 1;
  122. unset($map[1]);
  123. // Test descriptor
  124. $pool = \Google\Protobuf\DescriptorPool::getGeneratedPool();
  125. $desc = $pool->getDescriptorByClassName("\Foo\TestMessage");
  126. $field = $desc->getField(1);
  127. $from = new TestMessage();
  128. $to = new TestMessage();
  129. TestUtil::setTestMessage($from);
  130. $to->mergeFrom($from);
  131. TestUtil::assertTestMessage($to);
  132. // Test decode Any
  133. // Make sure packed message has been created at least once.
  134. $packed = new TestMessage();
  135. $m = new TestAny();
  136. $m->mergeFromJsonString(
  137. "{\"any\":" .
  138. " {\"@type\":\"type.googleapis.com/foo.TestMessage\"," .
  139. " \"optionalInt32\":1}}");
  140. assert("type.googleapis.com/foo.TestMessage" ===
  141. $m->getAny()->getTypeUrl());
  142. assert("0801" === bin2hex($m->getAny()->getValue()));