--- /dev/null
+<?php
+
+namespace Drupal\system\Tests\Cache;
+
+use Drupal\Core\Url;
+use Drupal\simpletest\WebTestBase;
+
+/**
+ * Tests the 'session.exists' cache context service.
+ *
+ * @group Cache
+ */
+class SessionExistsCacheContextTest extends WebTestBase {
+
+ /**
+ * Modules to enable.
+ *
+ * @var array
+ */
+ public static $modules = ['session_exists_cache_context_test'];
+
+ /**
+ * Tests \Drupal\Core\Cache\Context\SessionExistsCacheContext::getContext().
+ */
+ public function testCacheContext() {
+ $this->dumpHeaders = TRUE;
+
+ // 1. No session (anonymous).
+ $this->assertSessionCookieOnClient(FALSE);
+ $this->drupalGet(Url::fromRoute('<front>'));
+ $this->assertSessionCookieOnClient(FALSE);
+ $this->assertRaw('Session does not exist!');
+ $this->assertRaw('[session.exists]=0');
+
+ // 2. Session (authenticated).
+ $this->assertSessionCookieOnClient(FALSE);
+ $this->drupalLogin($this->rootUser);
+ $this->assertSessionCookieOnClient(TRUE);
+ $this->assertRaw('Session exists!');
+ $this->assertRaw('[session.exists]=1');
+ $this->drupalLogout();
+ $this->assertSessionCookieOnClient(FALSE);
+ $this->assertRaw('Session does not exist!');
+ $this->assertRaw('[session.exists]=0');
+
+ // 3. Session (anonymous).
+ $this->assertSessionCookieOnClient(FALSE);
+ $this->drupalGet(Url::fromRoute('<front>', [], ['query' => ['trigger_session' => 1]]));
+ $this->assertSessionCookieOnClient(TRUE);
+ $this->assertRaw('Session does not exist!');
+ $this->assertRaw('[session.exists]=0');
+ $this->drupalGet(Url::fromRoute('<front>'));
+ $this->assertSessionCookieOnClient(TRUE);
+ $this->assertRaw('Session exists!');
+ $this->assertRaw('[session.exists]=1');
+ }
+
+ /**
+ * Asserts whether a session cookie is present on the client or not.
+ */
+ public function assertSessionCookieOnClient($expected_present) {
+ $non_deleted_cookies = array_filter($this->cookies, function ($item) { return $item['value'] !== 'deleted'; });
+ $this->assertEqual($expected_present, isset($non_deleted_cookies[$this->getSessionName()]), 'Session cookie exists.');
+ }
+
+}