From 31a25fb469de1ca41c6a3c990ef80c2e62cf1e33 Mon Sep 17 00:00:00 2001
From: Alex Pott <alex.a.pott@googlemail.com>
Date: Sat, 18 May 2019 11:32:48 +0200
Subject: [PATCH] Issue #3049437 by mfb, amateescu: SharedTempStore not
 serializable on PHP 7.3

---
 .../Drupal/Core/TempStore/SharedTempStore.php |  3 ++
 .../Core/TempStore/SharedTempStoreTest.php    | 29 +++++++++++++++++++
 2 files changed, 32 insertions(+)

diff --git a/core/lib/Drupal/Core/TempStore/SharedTempStore.php b/core/lib/Drupal/Core/TempStore/SharedTempStore.php
index 2555e22ca88d..6bc034075275 100644
--- a/core/lib/Drupal/Core/TempStore/SharedTempStore.php
+++ b/core/lib/Drupal/Core/TempStore/SharedTempStore.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\Core\TempStore;
 
+use Drupal\Core\DependencyInjection\DependencySerializationTrait;
 use Drupal\Core\KeyValueStore\KeyValueStoreExpirableInterface;
 use Drupal\Core\Lock\LockBackendInterface;
 use Symfony\Component\HttpFoundation\RequestStack;
@@ -37,6 +38,8 @@
  */
 class SharedTempStore {
 
+  use DependencySerializationTrait;
+
   /**
    * The key/value storage object used for this data.
    *
diff --git a/core/tests/Drupal/Tests/Core/TempStore/SharedTempStoreTest.php b/core/tests/Drupal/Tests/Core/TempStore/SharedTempStoreTest.php
index f37ddbb95626..fccb432f8f7a 100644
--- a/core/tests/Drupal/Tests/Core/TempStore/SharedTempStoreTest.php
+++ b/core/tests/Drupal/Tests/Core/TempStore/SharedTempStoreTest.php
@@ -6,6 +6,7 @@
 use Drupal\Tests\UnitTestCase;
 use Drupal\Core\TempStore\SharedTempStore;
 use Drupal\Core\TempStore\TempStoreException;
+use Symfony\Component\DependencyInjection\ContainerInterface;
 use Symfony\Component\HttpFoundation\Request;
 use Symfony\Component\HttpFoundation\RequestStack;
 
@@ -382,4 +383,32 @@ public function testDeleteIfOwner() {
     $this->assertFalse($this->tempStore->deleteIfOwner('test_3'));
   }
 
+  /**
+   * Tests the serialization of a shared temp store.
+   */
+  public function testSerialization() {
+    // Add an unserializable request to the request stack. If the tempstore
+    // didn't use DependencySerializationTrait, the exception would be thrown
+    // when we try to serialize the tempstore.
+    $request = $this->prophesize(Request::class);
+    $request->willImplement('\Serializable');
+    $request->serialize()->willThrow(new \LogicException('Oops!'));
+    $unserializable_request = $request->reveal();
+
+    $this->requestStack->push($unserializable_request);
+    $this->requestStack->_serviceId = 'request_stack';
+
+    $container = $this->prophesize(ContainerInterface::class);
+    $container->get('request_stack')->willReturn($this->requestStack);
+    $container->has('request_stack')->willReturn(TRUE);
+    \Drupal::setContainer($container->reveal());
+
+    $store = unserialize(serialize($this->tempStore));
+    $this->assertInstanceOf(SharedTempStore::class, $store);
+
+    $request_stack = $this->getObjectAttribute($store, 'requestStack');
+    $this->assertEquals($this->requestStack, $request_stack);
+    $this->assertSame($unserializable_request, $request_stack->pop());
+  }
+
 }
-- 
GitLab