ContextTest.php 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. <?php
  2. namespace tests;
  3. use ArrayObject;
  4. use PHPUnit\Framework\TestCase;
  5. use Workerman\Coroutine\Context;
  6. use Workerman\Coroutine;
  7. // Now, the test cases
  8. class ContextTest extends TestCase
  9. {
  10. public function testContextSetAndGetWithinCoroutine()
  11. {
  12. Coroutine::create(function () {
  13. $key = 'testContextSetAndGetWithinCoroutine';
  14. Context::set($key, 'value');
  15. $this->assertEquals('value', Context::get($key));
  16. });
  17. }
  18. public function testContextGet()
  19. {
  20. Context::reset(new ArrayObject(['not_exist' => 'value']));
  21. $key = 'testContextGet';
  22. Context::reset(new ArrayObject([$key => 'value']));
  23. $context = Context::get();
  24. $this->assertArrayNotHasKey('not_exist', $context);
  25. $this->assertObjectNotHasProperty('not_exist', $context);
  26. $this->assertArrayHasKey($key, $context);
  27. $this->assertObjectHasProperty($key, $context);
  28. $this->assertEquals('value', $context[$key]);
  29. $this->assertEquals('value', $context->$key);
  30. $this->assertInstanceOf('ArrayObject', $context);
  31. unset($context[$key]);
  32. $this->assertNull(Context::get($key));
  33. $context[$key] = 'value';
  34. $this->assertEquals('value', Context::get($key));
  35. unset($context->$key);
  36. $this->assertNull(Context::get($key));
  37. $context->$key = 'value';
  38. $this->assertEquals('value', Context::get($key));
  39. }
  40. public function testContextIsolationBetweenCoroutines()
  41. {
  42. $values = [];
  43. Coroutine::create(function () use (&$values) {
  44. Context::set('key', 'value1');
  45. $values[] = Context::get('key');
  46. // Ensure the value is not available after coroutine ends
  47. Context::destroy();
  48. });
  49. Coroutine::create(function () use (&$values) {
  50. Context::set('key', 'value2');
  51. $values[] = Context::get('key');
  52. // Ensure the value is not available after coroutine ends
  53. Context::destroy();
  54. });
  55. $this->assertEquals(['value1', 'value2'], $values);
  56. }
  57. public function testContextDestroyedAfterCoroutineEnds()
  58. {
  59. Coroutine::create(function () {
  60. Context::set('key', 'value');
  61. $this->assertTrue(Context::has('key'));
  62. // Simulate coroutine end and context destruction
  63. Context::destroy();
  64. });
  65. // After coroutine ends, the context should be destroyed
  66. // Need to simulate this by trying to access context outside coroutine
  67. $this->assertNull(Context::get('key'));
  68. $this->assertFalse(Context::has('key'));
  69. }
  70. public function testContextHasMethod()
  71. {
  72. Coroutine::create(function () {
  73. $this->assertFalse(Context::has('key'));
  74. Context::set('key', 'value');
  75. $this->assertTrue(Context::has('key'));
  76. });
  77. }
  78. public function testContextResetMethod()
  79. {
  80. Coroutine::create(function () {
  81. Context::reset(new ArrayObject(['key3' => 'value1']));
  82. Context::reset(new ArrayObject(['key1' => 'value1', 'key2' => 'value2']));
  83. $this->assertEquals('value1', Context::get('key1'));
  84. $this->assertEquals('value2', Context::get('key2'));
  85. // Test that other keys are not set
  86. $this->assertNull(Context::get('key3'));
  87. });
  88. }
  89. public function testContextDataNotSharedBetweenCoroutines()
  90. {
  91. $result = [];
  92. Coroutine::create(function () use (&$result) {
  93. Context::set('counter', 1);
  94. $result[] = Context::get('counter');
  95. Context::destroy();
  96. });
  97. Coroutine::create(function () use (&$result) {
  98. $this->assertNull(Context::get('counter'));
  99. Context::set('counter', 2);
  100. $result[] = Context::get('counter');
  101. Context::destroy();
  102. });
  103. $this->assertEquals([1, 2], $result);
  104. }
  105. public function testContextDefaultValues()
  106. {
  107. Coroutine::create(function () {
  108. $this->assertEquals('default', Context::get('non_existing_key', 'default'));
  109. });
  110. }
  111. public function testContextSetOverrideValue()
  112. {
  113. Coroutine::create(function () {
  114. Context::set('key', 'initial');
  115. $this->assertEquals('initial', Context::get('key'));
  116. Context::set('key', 'overridden');
  117. $this->assertEquals('overridden', Context::get('key'));
  118. });
  119. }
  120. public function testContextMultipleKeys()
  121. {
  122. Coroutine::create(function () {
  123. Context::set('key1', 'value1');
  124. Context::set('key2', 'value2');
  125. $this->assertEquals('value1', Context::get('key1'));
  126. $this->assertEquals('value2', Context::get('key2'));
  127. });
  128. }
  129. public function testContextPersistenceWithinCoroutine()
  130. {
  131. Coroutine::create(function () {
  132. Context::set('key', 'value');
  133. // Simulate asynchronous operation within coroutine
  134. $this->someAsyncOperation(function () {
  135. $this->assertEquals('value', Context::get('key'));
  136. });
  137. // Context should persist throughout the coroutine
  138. $this->assertEquals('value', Context::get('key'));
  139. });
  140. }
  141. private function someAsyncOperation(callable $callback)
  142. {
  143. // Simulate async operation
  144. $callback();
  145. }
  146. }