GoogleCloudStorageTest.php 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. <?php
  2. use Google\Auth\HttpHandler\HttpHandlerFactory;
  3. use GuzzleHttp\Client;
  4. use PrivateBin\Data\GoogleCloudStorage;
  5. class GoogleCloudStorageTest extends PHPUnit_Framework_TestCase
  6. {
  7. private static $_client;
  8. private static $_bucket;
  9. public static function setUpBeforeClass()
  10. {
  11. $httpClient = new Client(array('debug'=>false));
  12. $handler = HttpHandlerFactory::build($httpClient);
  13. $name = 'pb-';
  14. $alphabet = 'abcdefghijklmnopqrstuvwxyz';
  15. for ($i = 0; $i < 29; ++$i) {
  16. $name .= $alphabet[rand(0, strlen($alphabet) - 1)];
  17. }
  18. self::$_client = new StorageClientStub(array());
  19. self::$_bucket = self::$_client->createBucket($name);
  20. }
  21. public function setUp()
  22. {
  23. ini_set('error_log', stream_get_meta_data(tmpfile())['uri']);
  24. $this->_model = new GoogleCloudStorage(array(
  25. 'bucket' => self::$_bucket->name(),
  26. 'prefix' => 'pastes',
  27. ));
  28. }
  29. public function tearDown()
  30. {
  31. foreach (self::$_bucket->objects() as $object) {
  32. $object->delete();
  33. }
  34. }
  35. public static function tearDownAfterClass()
  36. {
  37. self::$_bucket->delete();
  38. }
  39. public function testFileBasedDataStoreWorks()
  40. {
  41. $this->_model->delete(Helper::getPasteId());
  42. // storing pastes
  43. $paste = Helper::getPaste(2, array('expire_date' => 1344803344));
  44. $this->assertFalse($this->_model->exists(Helper::getPasteId()), 'paste does not yet exist');
  45. $this->assertTrue($this->_model->create(Helper::getPasteId(), $paste), 'store new paste');
  46. $this->assertTrue($this->_model->exists(Helper::getPasteId()), 'paste exists after storing it');
  47. $this->assertFalse($this->_model->create(Helper::getPasteId(), $paste), 'unable to store the same paste twice');
  48. $this->assertEquals($paste, $this->_model->read(Helper::getPasteId()));
  49. // storing comments
  50. $this->assertFalse($this->_model->existsComment(Helper::getPasteId(), Helper::getPasteId(), Helper::getCommentId()), 'comment does not yet exist');
  51. $this->assertTrue($this->_model->createComment(Helper::getPasteId(), Helper::getPasteId(), Helper::getCommentId(), Helper::getComment()), 'store comment');
  52. $this->assertTrue($this->_model->existsComment(Helper::getPasteId(), Helper::getPasteId(), Helper::getCommentId()), 'comment exists after storing it');
  53. $this->assertFalse($this->_model->createComment(Helper::getPasteId(), Helper::getPasteId(), Helper::getCommentId(), Helper::getComment()), 'unable to store the same comment twice');
  54. $comment = Helper::getComment();
  55. $comment['id'] = Helper::getCommentId();
  56. $comment['parentid'] = Helper::getPasteId();
  57. $this->assertEquals(
  58. array($comment['meta']['created'] => $comment),
  59. $this->_model->readComments(Helper::getPasteId())
  60. );
  61. // deleting pastes
  62. $this->_model->delete(Helper::getPasteId());
  63. $this->assertFalse($this->_model->exists(Helper::getPasteId()), 'paste successfully deleted');
  64. $this->assertFalse($this->_model->existsComment(Helper::getPasteId(), Helper::getPasteId(), Helper::getCommentId()), 'comment was deleted with paste');
  65. $this->assertFalse($this->_model->read(Helper::getPasteId()), 'paste can no longer be found');
  66. }
  67. /**
  68. * pastes a-g are expired and should get deleted, x never expires and y-z expire in an hour
  69. */
  70. public function testPurge()
  71. {
  72. $expired = Helper::getPaste(2, array('expire_date' => 1344803344));
  73. $paste = Helper::getPaste(2, array('expire_date' => time() + 3600));
  74. $keys = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'x', 'y', 'z');
  75. $ids = array();
  76. foreach ($keys as $key) {
  77. $ids[$key] = hash('fnv164', $key);
  78. $this->assertFalse($this->_model->exists($ids[$key]), "paste $key does not yet exist");
  79. if (in_array($key, array('x', 'y', 'z'))) {
  80. $this->assertTrue($this->_model->create($ids[$key], $paste), "store $key paste");
  81. } elseif ($key === 'x') {
  82. $this->assertTrue($this->_model->create($ids[$key], Helper::getPaste()), "store $key paste");
  83. } else {
  84. $this->assertTrue($this->_model->create($ids[$key], $expired), "store $key paste");
  85. }
  86. $this->assertTrue($this->_model->exists($ids[$key]), "paste $key exists after storing it");
  87. }
  88. $this->_model->purge(10);
  89. foreach ($ids as $key => $id) {
  90. if (in_array($key, array('x', 'y', 'z'))) {
  91. $this->assertTrue($this->_model->exists($id), "paste $key exists after purge");
  92. $this->_model->delete($id);
  93. } else {
  94. $this->assertFalse($this->_model->exists($id), "paste $key was purged");
  95. }
  96. }
  97. }
  98. public function testErrorDetection()
  99. {
  100. $this->_model->delete(Helper::getPasteId());
  101. $paste = Helper::getPaste(2, array('expire' => "Invalid UTF-8 sequence: \xB1\x31"));
  102. $this->assertFalse($this->_model->exists(Helper::getPasteId()), 'paste does not yet exist');
  103. $this->assertFalse($this->_model->create(Helper::getPasteId(), $paste), 'unable to store broken paste');
  104. $this->assertFalse($this->_model->exists(Helper::getPasteId()), 'paste does still not exist');
  105. }
  106. public function testCommentErrorDetection()
  107. {
  108. $this->_model->delete(Helper::getPasteId());
  109. $comment = Helper::getComment(1, array('nickname' => "Invalid UTF-8 sequence: \xB1\x31"));
  110. $this->assertFalse($this->_model->exists(Helper::getPasteId()), 'paste does not yet exist');
  111. $this->assertTrue($this->_model->create(Helper::getPasteId(), Helper::getPaste()), 'store new paste');
  112. $this->assertTrue($this->_model->exists(Helper::getPasteId()), 'paste exists after storing it');
  113. $this->assertFalse($this->_model->existsComment(Helper::getPasteId(), Helper::getPasteId(), Helper::getCommentId()), 'comment does not yet exist');
  114. $this->assertFalse($this->_model->createComment(Helper::getPasteId(), Helper::getPasteId(), Helper::getCommentId(), $comment), 'unable to store broken comment');
  115. $this->assertFalse($this->_model->existsComment(Helper::getPasteId(), Helper::getPasteId(), Helper::getCommentId()), 'comment does still not exist');
  116. }
  117. /**
  118. * @throws Exception
  119. */
  120. public function testKeyValueStore()
  121. {
  122. $salt = bin2hex(random_bytes(256));
  123. $this->_model->setValue($salt, 'salt', '');
  124. $storedSalt = $this->_model->getValue('salt', '');
  125. $this->assertEquals($salt, $storedSalt);
  126. $this->_model->purgeValues('salt', time() + 60);
  127. $this->assertEquals('', $this->_model->getValue('salt', 'master'));
  128. $client = hash_hmac('sha512', '127.0.0.1', $salt);
  129. $expire = time();
  130. $this->_model->setValue(strval($expire), 'traffic_limiter', $client);
  131. $storedExpired = $this->_model->getValue('traffic_limiter', $client);
  132. $this->assertEquals(strval($expire), $storedExpired);
  133. $this->_model->purgeValues('traffic_limiter', time() - 60);
  134. $this->assertEquals($storedExpired, $this->_model->getValue('traffic_limiter', $client));
  135. $this->_model->purgeValues('traffic_limiter', time() + 60);
  136. $this->assertEquals('', $this->_model->getValue('traffic_limiter', $client));
  137. $purgeAt = $expire + (15 * 60);
  138. $this->_model->setValue(strval($purgeAt), 'purge_limiter', '');
  139. $storedPurgedAt = $this->_model->getValue('purge_limiter', '');
  140. $this->assertEquals(strval($purgeAt), $storedPurgedAt);
  141. $this->_model->purgeValues('purge_limiter', $purgeAt + 60);
  142. $this->assertEquals('', $this->_model->getValue('purge_limiter', ''));
  143. $this->assertEquals('', $this->_model->getValue('purge_limiter', 'at'));
  144. }
  145. /**
  146. * @throws Exception
  147. */
  148. public function testKeyValuePurgeTrafficLimiter()
  149. {
  150. $salt = bin2hex(random_bytes(256));
  151. $client = hash_hmac('sha512', '127.0.0.1', $salt);
  152. $expire = time();
  153. $this->_model->setValue(strval($expire), 'traffic_limiter', $client);
  154. $storedExpired = $this->_model->getValue('traffic_limiter', $client);
  155. $this->assertEquals(strval($expire), $storedExpired);
  156. $this->_model->purgeValues('traffic_limiter', time() - 60);
  157. $this->assertEquals($storedExpired, $this->_model->getValue('traffic_limiter', $client));
  158. $this->_model->purgeValues('traffic_limiter', time() + 60);
  159. $this->assertEquals('', $this->_model->getValue('traffic_limiter', $client));
  160. }
  161. }