gc-test.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. #include "test_common.h"
  2. TEST(gc, root) {
  3. PikaObj* root = newRootObj("root", New_PikaMain);
  4. EXPECT_EQ(obj_refcntNow(root), 1);
  5. Arg* refArg = arg_setRef(NULL, "", root);
  6. EXPECT_EQ(obj_refcntNow(root), 2);
  7. arg_deinit(refArg);
  8. EXPECT_EQ(obj_refcntNow(root), 1);
  9. obj_deinit(root);
  10. EXPECT_EQ(pikaMemNow(), 0);
  11. }
  12. TEST(gc, ref1) {
  13. /* init */
  14. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  15. /* run */
  16. obj_run(pikaMain, "mem = PikaStdLib.MemChecker()");
  17. PikaObj* mem = (PikaObj*)obj_getPtr(pikaMain, "mem");
  18. EXPECT_EQ(obj_refcntNow(mem), 1);
  19. /* deinit */
  20. obj_deinit(pikaMain);
  21. EXPECT_EQ(pikaMemNow(), 0);
  22. }
  23. TEST(gc, ref121) {
  24. /* init */
  25. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  26. /* run */
  27. obj_run(pikaMain, "mem = PikaStdLib.MemChecker()");
  28. PikaObj* mem = (PikaObj*)obj_getPtr(pikaMain, "mem");
  29. EXPECT_EQ(obj_refcntNow(mem), 1);
  30. obj_run(pikaMain, "mem2 = mem");
  31. EXPECT_EQ(obj_refcntNow(mem), 2);
  32. obj_removeArg(pikaMain, "mem2");
  33. EXPECT_EQ(obj_refcntNow(mem), 1);
  34. /* deinit */
  35. obj_deinit(pikaMain);
  36. EXPECT_EQ(pikaMemNow(), 0);
  37. }
  38. TEST(gc, ref12) {
  39. /* init */
  40. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  41. /* run */
  42. obj_run(pikaMain, "mem = PikaStdLib.MemChecker()");
  43. PikaObj* mem = (PikaObj*)obj_getPtr(pikaMain, "mem");
  44. EXPECT_EQ(obj_refcntNow(mem), 1);
  45. obj_run(pikaMain, "mem2 = mem");
  46. EXPECT_EQ(obj_refcntNow(mem), 2);
  47. /* deinit */
  48. obj_deinit(pikaMain);
  49. EXPECT_EQ(pikaMemNow(), 0);
  50. }
  51. TEST(gc, ref1210) {
  52. /* init */
  53. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  54. /* run */
  55. obj_run(pikaMain, "mem = PikaStdLib.MemChecker()");
  56. PikaObj* mem = (PikaObj*)obj_getPtr(pikaMain, "mem");
  57. EXPECT_EQ(obj_refcntNow(mem), 1);
  58. obj_run(pikaMain, "mem2 = mem");
  59. EXPECT_EQ(obj_refcntNow(mem), 2);
  60. obj_removeArg(pikaMain, "mem2");
  61. EXPECT_EQ(obj_refcntNow(mem), 1);
  62. /* deinit */
  63. obj_deinit(pikaMain);
  64. EXPECT_EQ(pikaMemNow(), 0);
  65. }
  66. TEST(gc, ref_move) {
  67. /* init */
  68. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  69. /* run */
  70. obj_run(pikaMain, "mem = PikaStdLib.MemChecker()");
  71. PikaObj* mem = (PikaObj*)obj_getPtr(pikaMain, "mem");
  72. EXPECT_EQ(obj_refcntNow(mem), 1);
  73. obj_run(pikaMain, "mem2 = mem");
  74. EXPECT_EQ(obj_refcntNow(mem), 2);
  75. obj_removeArg(pikaMain, "mem");
  76. EXPECT_EQ(obj_refcntNow(mem), 1);
  77. /* deinit */
  78. obj_deinit(pikaMain);
  79. EXPECT_EQ(pikaMemNow(), 0);
  80. }
  81. TEST(gc, factory) {
  82. /* init */
  83. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  84. /* run */
  85. obj_run(pikaMain,
  86. "def factory():\n"
  87. " _mem = PikaStdLib.MemChecker()\n"
  88. " return _mem\n"
  89. "mem = factory()\n");
  90. /* collect */
  91. PikaObj* mem = obj_getObj(pikaMain, "mem");
  92. EXPECT_EQ(obj_refcntNow(mem), 1);
  93. /* deinit */
  94. obj_deinit(pikaMain);
  95. EXPECT_EQ(pikaMemNow(), 0);
  96. }
  97. TEST(gc, not_out) {
  98. /* init */
  99. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  100. /* run */
  101. obj_run(pikaMain, "PikaStdLib.MemChecker()\n");
  102. /* deinit */
  103. obj_deinit(pikaMain);
  104. EXPECT_EQ(pikaMemNow(), 0);
  105. }
  106. TEST(gc, heap_failed1) {
  107. /* init */
  108. PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
  109. /* run */
  110. obj_run(pikaMain,
  111. "recv_buf = PikaStdData.List()\n"
  112. "RECV_MAX_SIZE=128\n"
  113. "iteri = 0\n"
  114. "for i in range(0, int(RECV_MAX_SIZE)):\n"
  115. " recv_buf.append(0)\n"
  116. " iteri += 1\n"
  117. "iteri");
  118. /* assert */
  119. EXPECT_STREQ("128\r\n", log_buff[0]);
  120. /* deinit */
  121. obj_deinit(pikaMain);
  122. EXPECT_EQ(pikaMemNow(), 0);
  123. }