<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[198842] trunk/Tools</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/198842">198842</a></dd>
<dt>Author</dt> <dd>dbates@webkit.org</dd>
<dt>Date</dt> <dd>2016-03-30 10:23:41 -0700 (Wed, 30 Mar 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>run-webkit-tests must create parent directory of user's cache directory before running tests
https://bugs.webkit.org/show_bug.cgi?id=156009
&lt;rdar://problem/25442682&gt;

Reviewed by Alexey Proskuryakov.

The script run-webkit-tests must create the parent directory of the user's cache directory
before running tests because a WebKit2 child process expects that this directory exists
when it starts.

The script run-webkit-tests influences the path chosen by a WebKit2 child process for the
user's temporary directory and user's cache directory via the environment variable
DIRHELPER_USER_DIR_SUFFIX. For the user's temporary directory, run-webkit-tests creates it
as part of setting up the test environment. But run-webkit-tests does not create the user's
cache directory. Therefore there is race between the time AppKit creates it and when the
launched WebContent and Network processes query for the path to the user's cache directory
such that the OS may return the empty string to the WebContent and Network processes if
queried for this directory before AppKit creates it.

* Scripts/webkitpy/port/base.py:
(Port._path_to_user_cache_directory): Added. Base class implementation that returns the
empty string. We will override this method for the OS X port to return the path to the
user's cache directory with the specified suffix.
(Port.remove_cache_directory): Deleted.
* Scripts/webkitpy/port/driver.py:
(Driver.__init__): Initialize self._driver_user_directory_suffix and self._driver_user_cache_directory
to the suffix to use for the user's temporary and cache directories and the path to the
user's cache directory, respectively.
(Driver._setup_environ_for_driver): Modified to set the environment variable DIRHELPER_USER_DIR_SUFFIX
to self._driver_user_directory_suffix.
(Driver._start): Compute the user directory suffix and the path to the user's cache
directory. Create the user's cache directory (if applicable).
(Driver.stop): Modified to remove directory self._driver_user_cache_directory (if applicable).
* Scripts/webkitpy/port/mac.py:
(MacPort.user_cache_directory): Added. Overrides Port._path_to_user_cache_directory().
(MacPort.remove_cache_directory): Deleted.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkToolsChangeLog">trunk/Tools/ChangeLog</a></li>
<li><a href="#trunkToolsScriptswebkitpyportbasepy">trunk/Tools/Scripts/webkitpy/port/base.py</a></li>
<li><a href="#trunkToolsScriptswebkitpyportdriverpy">trunk/Tools/Scripts/webkitpy/port/driver.py</a></li>
<li><a href="#trunkToolsScriptswebkitpyportmacpy">trunk/Tools/Scripts/webkitpy/port/mac.py</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkToolsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Tools/ChangeLog (198841 => 198842)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/ChangeLog        2016-03-30 16:50:14 UTC (rev 198841)
+++ trunk/Tools/ChangeLog        2016-03-30 17:23:41 UTC (rev 198842)
</span><span class="lines">@@ -1,3 +1,42 @@
</span><ins>+2016-03-30  Daniel Bates  &lt;dabates@apple.com&gt;
+
+        run-webkit-tests must create parent directory of user's cache directory before running tests
+        https://bugs.webkit.org/show_bug.cgi?id=156009
+        &lt;rdar://problem/25442682&gt;
+
+        Reviewed by Alexey Proskuryakov.
+
+        The script run-webkit-tests must create the parent directory of the user's cache directory
+        before running tests because a WebKit2 child process expects that this directory exists
+        when it starts.
+
+        The script run-webkit-tests influences the path chosen by a WebKit2 child process for the
+        user's temporary directory and user's cache directory via the environment variable
+        DIRHELPER_USER_DIR_SUFFIX. For the user's temporary directory, run-webkit-tests creates it
+        as part of setting up the test environment. But run-webkit-tests does not create the user's
+        cache directory. Therefore there is race between the time AppKit creates it and when the
+        launched WebContent and Network processes query for the path to the user's cache directory
+        such that the OS may return the empty string to the WebContent and Network processes if
+        queried for this directory before AppKit creates it.
+
+        * Scripts/webkitpy/port/base.py:
+        (Port._path_to_user_cache_directory): Added. Base class implementation that returns the
+        empty string. We will override this method for the OS X port to return the path to the
+        user's cache directory with the specified suffix.
+        (Port.remove_cache_directory): Deleted.
+        * Scripts/webkitpy/port/driver.py:
+        (Driver.__init__): Initialize self._driver_user_directory_suffix and self._driver_user_cache_directory
+        to the suffix to use for the user's temporary and cache directories and the path to the
+        user's cache directory, respectively.
+        (Driver._setup_environ_for_driver): Modified to set the environment variable DIRHELPER_USER_DIR_SUFFIX
+        to self._driver_user_directory_suffix.
+        (Driver._start): Compute the user directory suffix and the path to the user's cache
+        directory. Create the user's cache directory (if applicable).
+        (Driver.stop): Modified to remove directory self._driver_user_cache_directory (if applicable).
+        * Scripts/webkitpy/port/mac.py:
+        (MacPort.user_cache_directory): Added. Overrides Port._path_to_user_cache_directory().
+        (MacPort.remove_cache_directory): Deleted.
+
</ins><span class="cx"> 2016-03-29  Benjamin Poulain  &lt;bpoulain@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [WTF] Removing a smart pointer from HashTable issues two stores to the same location
</span></span></pre></div>
<a id="trunkToolsScriptswebkitpyportbasepy"></a>
<div class="modfile"><h4>Modified: trunk/Tools/Scripts/webkitpy/port/base.py (198841 => 198842)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/Scripts/webkitpy/port/base.py        2016-03-30 16:50:14 UTC (rev 198841)
+++ trunk/Tools/Scripts/webkitpy/port/base.py        2016-03-30 17:23:41 UTC (rev 198842)
</span><span class="lines">@@ -1185,8 +1185,8 @@
</span><span class="cx">     def _driver_tempdir(self):
</span><span class="cx">         return self._filesystem.mkdtemp(prefix='%s-' % self.driver_name())
</span><span class="cx"> 
</span><del>-    def remove_cache_directory(self, name):
-        pass
</del><ins>+    def _path_to_user_cache_directory(self, suffix=None):
+        return None
</ins><span class="cx"> 
</span><span class="cx">     def _path_to_webcore_library(self):
</span><span class="cx">         &quot;&quot;&quot;Returns the full path to a built copy of WebCore.&quot;&quot;&quot;
</span></span></pre></div>
<a id="trunkToolsScriptswebkitpyportdriverpy"></a>
<div class="modfile"><h4>Modified: trunk/Tools/Scripts/webkitpy/port/driver.py (198841 => 198842)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/Scripts/webkitpy/port/driver.py        2016-03-30 16:50:14 UTC (rev 198841)
+++ trunk/Tools/Scripts/webkitpy/port/driver.py        2016-03-30 17:23:41 UTC (rev 198842)
</span><span class="lines">@@ -132,6 +132,9 @@
</span><span class="cx">         self._no_timeout = no_timeout
</span><span class="cx"> 
</span><span class="cx">         self._driver_tempdir = None
</span><ins>+        self._driver_user_directory_suffix = None
+        self._driver_user_cache_directory = None
+
</ins><span class="cx">         # WebKitTestRunner/LayoutTestRelay can report back subprocess crashes by printing
</span><span class="cx">         # &quot;#CRASHED - PROCESSNAME&quot;.  Since those can happen at any time and ServerProcess
</span><span class="cx">         # won't be aware of them (since the actual tool didn't crash, just a subprocess)
</span><span class="lines">@@ -326,7 +329,7 @@
</span><span class="cx">         # Use an isolated temp directory that can be deleted after testing (especially important on Mac, as
</span><span class="cx">         # CoreMedia disk cache is in the temp directory).
</span><span class="cx">         environment['TMPDIR'] = str(self._driver_tempdir)
</span><del>-        environment['DIRHELPER_USER_DIR_SUFFIX'] = str(os.path.basename(str(self._driver_tempdir)))
</del><ins>+        environment['DIRHELPER_USER_DIR_SUFFIX'] = self._driver_user_directory_suffix
</ins><span class="cx">         # Put certain normally persistent files into the temp directory (e.g. IndexedDB storage).
</span><span class="cx">         environment['DUMPRENDERTREE_TEMP'] = str(self._driver_tempdir)
</span><span class="cx">         environment['LOCAL_RESOURCE_ROOT'] = str(self._port.layout_tests_dir())
</span><span class="lines">@@ -344,6 +347,10 @@
</span><span class="cx">         # however some subsystems on some platforms could end up using process default ones.
</span><span class="cx">         self._port._clear_global_caches_and_temporary_files()
</span><span class="cx">         self._driver_tempdir = self._port._driver_tempdir()
</span><ins>+        self._driver_user_directory_suffix = os.path.basename(str(self._driver_tempdir))
+        user_cache_directory = self._port._path_to_user_cache_directory(self._driver_user_directory_suffix)
+        if user_cache_directory:
+            self._driver_user_cache_directory = self._port._filesystem.maybe_make_directory(user_cache_directory)
</ins><span class="cx">         server_name = self._port.driver_name()
</span><span class="cx">         environment = self._port.setup_environ_for_server(server_name)
</span><span class="cx">         environment = self._setup_environ_for_driver(environment)
</span><span class="lines">@@ -370,8 +377,10 @@
</span><span class="cx"> 
</span><span class="cx">         if self._driver_tempdir:
</span><span class="cx">             self._port._filesystem.rmtree(str(self._driver_tempdir))
</span><del>-            self._port.remove_cache_directory(os.path.basename(str(self._driver_tempdir)))
</del><span class="cx">             self._driver_tempdir = None
</span><ins>+        if self._driver_user_cache_directory:
+            self._port._filesystem.rmtree(self._driver_user_cache_directory)
+            self._driver_user_cache_directory = None
</ins><span class="cx"> 
</span><span class="cx">     def cmd_line(self, pixel_tests, per_test_args):
</span><span class="cx">         cmd = self._command_wrapper()
</span></span></pre></div>
<a id="trunkToolsScriptswebkitpyportmacpy"></a>
<div class="modfile"><h4>Modified: trunk/Tools/Scripts/webkitpy/port/mac.py (198841 => 198842)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/Scripts/webkitpy/port/mac.py        2016-03-30 16:50:14 UTC (rev 198841)
+++ trunk/Tools/Scripts/webkitpy/port/mac.py        2016-03-30 17:23:41 UTC (rev 198842)
</span><span class="lines">@@ -117,8 +117,16 @@
</span><span class="cx">         self._filesystem.rmtree(os.path.expanduser('~/Library/Caches/' + self.driver_name()))
</span><span class="cx">         self._filesystem.rmtree(os.path.expanduser('~/Library/WebKit/' + self.driver_name()))
</span><span class="cx"> 
</span><del>-    def remove_cache_directory(self, name):
-        self._filesystem.rmtree(os.confstr(65538) + name)
</del><ins>+    def _path_to_user_cache_directory(self, suffix=None):
+        DIRHELPER_USER_DIR_SUFFIX = &quot;DIRHELPER_USER_DIR_SUFFIX&quot;
+        saved_suffix = None
+        if suffix is not None:
+            saved_suffix = os.environ.get(DIRHELPER_USER_DIR_SUFFIX)
+            os.environ[DIRHELPER_USER_DIR_SUFFIX] = suffix
+        result = os.confstr(65538)  # _CS_DARWIN_USER_CACHE_DIR
+        if saved_suffix is not None:
+            os.environ[DIRHELPER_USER_DIR_SUFFIX] = saved_suffix
+        return result
</ins><span class="cx"> 
</span><span class="cx">     def operating_system(self):
</span><span class="cx">         return 'mac'
</span></span></pre>
</div>
</div>

</body>
</html>