AbstractContext.php #1

  • //
  • guest/
  • thomas_gray/
  • jambox/
  • main/
  • swarm/
  • tests/
  • behat/
  • features/
  • bootstrap/
  • AbstractContext.php
  • View
  • Commits
  • Open Download .zip Download (5 KB)
<?php
/**
 * Perforce Swarm
 *
 * @copyright   2014 Perforce Software. All rights reserved.
 * @license     Please see LICENSE.txt in top-level folder of this distribution.
 * @version     <release>/<patch>
 */

namespace BehatTests;

use Behat\Behat\Context\BehatContext;
use Behat\Mink\Session as MinkSession;

class AbstractContext extends BehatContext
{
    protected $configParams;
    const TEST_MAX_TRY_COUNT = 10;


    public function __construct(array $parameters)
    {
        $this->configParams = $parameters;
    }

    /**
     * Helper function to access members of the P4Context class.
     *
     * @return P4Context
     */
    protected function getP4Context()
    {
        return $this->getMainContext()->getSubContext('p4');
    }

    /**
     * Helper function to access members of the MinkContext class.
     *
     * @return FeatureMinkContext  context
     */
    protected function getMinkContext()
    {
        return $this->getMainContext()->getSubContext('mink');
    }

    /**
     * Helper function to access Mink browser session.
     *
     * @return MinkSession
     */
    protected function getSession()
    {
        return $this->getMinkContext()->getSession();
    }

    /**
     * Set unique session cookie named 'SwarmDataPath' for each distinct test scenario run
     * The value of the cookie is the unique id 'uuid' generated for each distinct scenario run
     * The cookie is set on the swarm host 'base_url' that is read from the config.yml file
     */
    protected function setSwarmCookie()
    {
        $session = $this->getSession();
        // Visit the swarm host url before the cookie is set, so that the domain for the cookie gets set
        $session->visit($this->configParams['base_url']);
        // Set the cookie
        $session->setCookie('SwarmDataPath', $this->getP4Context()->getUUID());
        // Re-visit the swarm host url, after the cookie has been set
        $session->visit($this->configParams['base_url']);
    }

    /**
     * Return the value set for the cookie 'SwarmDataPath' for a given scenario run.
     * It should be equal to the unique 'uuid' value generated for the scenario
     *
     * @return null|string  UUID value set for the SwarmDataPath cookie
     */
    protected function getSwarmCookie()
    {
        return $this->getSession()->getCookie('SwarmDataPath');
    }


    /**
     * Recursively remove a directory and all of it's file contents.
     *
     * @param  string $directory The directory to remove.
     * @param  boolean $recursive when true, recursively delete directories.
     * @param  boolean $removeRoot when true, remove the root (passed) directory too
     */
    public function removeDirectory($directory, $recursive = true, $removeRoot = true)
    {

        if (is_dir($directory)) {
            chmod($directory, 0777);
            $files = new \RecursiveDirectoryIterator($directory);
            foreach ($files as $file) {
                if ($files->isDot()) {
                    continue;
                }
                if ($file->isFile()) {
                    // on Windows, it may take some time for open file handles to
                    // be closed.  We try to unlink a file for TEST_MAX_TRY_COUNT
                    // times and then bail out.
                    $count = 0;
                    chmod($file->getPathname(), 0777);
                    while ($count <= self::TEST_MAX_TRY_COUNT) {
                        try {
                            unlink($file->getPathname());
                            break;
                        } catch (\Exception $e) {
                            $count++;
                            if ($count == self::TEST_MAX_TRY_COUNT) {
                                throw new \Exception(
                                    "Can't delete '" . $file->getPathname() . "' with message " . $e->getMessage()
                                );
                            }
                        }
                    }
                } elseif ($file->isDir() && $recursive) {
                    $this->removeDirectory($file->getPathname(), true, true);
                }
            }

            if ($removeRoot) {
                chmod($directory, 0777);
                $count = 0;
                while ($count <= self::TEST_MAX_TRY_COUNT) {
                    try {
                        rmdir($directory);
                        break;
                    } catch (\Exception $e) {
                        $count++;
                        if ($count == self::TEST_MAX_TRY_COUNT) {
                            throw new \Exception(
                                "Can't delete '" . $directory->getPathname() . "' with message " . $e->getMessage()
                            );
                        }
                    }
                }
            }
        }
    }
}

# Change User Description Committed
#1 18730 Liz Lam clean up code and move things around