CRM-13672 - Add unit test coverage for CRM_Utils_VersionCheck
authorColeman Watts <coleman@civicrm.org>
Wed, 24 Dec 2014 01:00:46 +0000 (20:00 -0500)
committerColeman Watts <coleman@civicrm.org>
Tue, 30 Dec 2014 01:50:56 +0000 (20:50 -0500)
CRM/Utils/VersionCheck.php
tests/phpunit/CRM/Utils/versionCheckTest.php [new file with mode: 0644]

index e8cdf969a737bddc32b5d84adf6f334d96105b93..c63bad04f37d733f3fb51ed434d54584f1421004 100644 (file)
@@ -184,7 +184,8 @@ class CRM_Utils_VersionCheck {
     $localVersionDate = CRM_Utils_Array::value('date', $thisVersion, 0);
     foreach ($this->versionInfo as $majorVersion) {
       foreach ($majorVersion['releases'] as $release) {
-        if (!empty($release['security']) && $release['date'] > $localVersionDate) {
+        if (!empty($release['security']) && $release['date'] > $localVersionDate
+          && version_compare($this->localVersion, $release['version']) < 0) {
           if (!$this->ignoreDate || $this->ignoreDate < $release['date']) {
             return TRUE;
           }
diff --git a/tests/phpunit/CRM/Utils/versionCheckTest.php b/tests/phpunit/CRM/Utils/versionCheckTest.php
new file mode 100644 (file)
index 0000000..1153fc4
--- /dev/null
@@ -0,0 +1,176 @@
+<?php
+
+require_once 'CiviTest/CiviUnitTestCase.php';
+
+class CRM_Utils_versionCheckTest extends CiviUnitTestCase {
+
+  /**
+   * @return array
+   */
+  function get_info() {
+    return array(
+      'name' => 'VersionCheck Test',
+      'description' => 'Test versionCheck functionality',
+      'group' => 'CiviCRM BAO Tests',
+    );
+  }
+
+  function setUp() {
+    parent::setUp();
+  }
+
+  /**
+   * @var array
+   */
+  protected $sampleVersionInfo = array(
+    '4.2' => array(
+      'status' => 'eol',
+      'releases' => array(
+        array('version' => '4.2.0', 'date' => '2012-08-20'),
+        array('version' => '4.2.1', 'date' => '2012-09-12'),
+        array('version' => '4.2.2', 'date' => '2012-09-27'),
+        array('version' => '4.2.4', 'date' => '2012-10-18'),
+        array('version' => '4.2.6', 'date' => '2012-11-01', 'security' => true),
+        array('version' => '4.2.7', 'date' => '2013-01-02', 'security' => true),
+        array('version' => '4.2.8', 'date' => '2013-02-20'),
+        array('version' => '4.2.9', 'date' => '2013-04-03'),
+        array('version' => '4.2.10', 'date' => '2013-07-29', 'security' => true),
+        array('version' => '4.2.11', 'date' => '2013-09-25'),
+        array('version' => '4.2.12', 'date' => '2013-10-02', 'security' => true),
+        array('version' => '4.2.13', 'date' => '2013-11-06', 'security' => true),
+        array('version' => '4.2.14', 'date' => '2013-11-20'),
+        array('version' => '4.2.15', 'date' => '2014-02-07', 'security' => true),
+        array('version' => '4.2.16', 'date' => '2014-02-18'),
+        array('version' => '4.2.17', 'date' => '2014-07-01', 'security' => true),
+        array('version' => '4.2.18', 'date' => '2014-08-06'),
+        array('version' => '4.2.19', 'date' => '2014-09-17', 'security' => true)
+      ),
+    ),
+    '4.3' => array(
+      'status' => 'lts',
+      'releases' => array(
+        array('version' => '4.3.0', 'date' => '2013-04-10'),
+        array('version' => '4.3.1', 'date' => '2013-04-18'),
+        array('version' => '4.3.2', 'date' => '2013-05-02'),
+        array('version' => '4.3.3', 'date' => '2013-05-08'),
+        array('version' => '4.3.4', 'date' => '2013-06-10', 'security' => true),
+        array('version' => '4.3.5', 'date' => '2013-07-08', 'security' => true),
+        array('version' => '4.3.6', 'date' => '2013-09-25'),
+        array('version' => '4.3.7', 'date' => '2013-10-02', 'security' => true),
+        array('version' => '4.3.8', 'date' => '2013-11-06', 'security' => true),
+        array('version' => '4.3.9', 'date' => '2014-09-07', 'security' => true)
+      ),
+    ),
+    '4.4' => array(
+      'status' => 'lts',
+      'releases' => array(
+        array('version' => '4.4.0', 'date' => '2013-10-23'),
+        array('version' => '4.4.1', 'date' => '2013-11-06', 'security' => true),
+        array('version' => '4.4.2', 'date' => '2013-11-20'),
+        array('version' => '4.4.3', 'date' => '2013-12-05'),
+        array('version' => '4.4.4', 'date' => '2014-02-07', 'security' => true),
+        array('version' => '4.4.5', 'date' => '2014-04-17'),
+        array('version' => '4.4.6', 'date' => '2014-07-01', 'security' => true),
+        array('version' => '4.4.7', 'date' => '2014-09-17', 'security' => true),
+        array('version' => '4.4.8', 'date' => '2014-10-14'),
+        array('version' => '4.4.9', 'date' => '2014-11-05'),
+        array('version' => '4.4.10', 'date' => '2014-11-19'),
+        array('version' => '4.4.11', 'date' => '2014-12-17', 'security' => true)
+      ),
+    ),
+    '4.5' => array(
+      'status' => 'stable',
+      'releases' => array(
+        array('version' => '4.5.0', 'date' => '2014-09-18'),
+        array('version' => '4.5.1', 'date' => '2014-10-09'),
+        array('version' => '4.5.2', 'date' => '2014-10-14'),
+        array('version' => '4.5.3', 'date' => '2014-11-05'),
+        array('version' => '4.5.4', 'date' => '2014-11-19'),
+        array('version' => '4.5.5', 'date' => '2014-12-17', 'security' => true),
+      )
+    ),
+    '4.6' => array(
+      'status' => 'testing',
+      'releases' => array(
+        array('version' => '4.6.alpha1', 'date' => '2015-02-01'),
+        array('version' => '4.6.beta1', 'date' => '2015-03-01'),
+      )
+    ),
+  );
+
+  /**
+   * @dataProvider newerVersionDataProvider
+   * @param string $localVersion
+   * @param array $versionInfo
+   * @param mixed $expectedResult
+   */
+  function testNewerVersion($localVersion, $versionInfo, $expectedResult) {
+    $vc = CRM_Utils_VersionCheck::singleton();
+    // These values are set by the constructor but for testing we override them
+    $vc->localVersion = $localVersion;
+    $vc->localMajorVersion = $vc->getMajorVersion($localVersion);
+    $vc->versionInfo = $versionInfo;
+    $this->assertEquals($vc->isNewerVersionAvailable(), $expectedResult);
+  }
+
+  /**
+   * @return array (localVersion, versionInfo, expectedResult)
+   */
+  function newerVersionDataProvider() {
+    $data = array();
+
+    // Make sure we do not get unstable release updates for a stable localVersion
+    $data[] = array('4.5.5', $this->sampleVersionInfo, NULL);
+
+    // Make sure we do get unstable release updates for unstable localVersion
+    $data[] = array('4.6.alpha1', $this->sampleVersionInfo, '4.6.beta1');
+
+    // Make sure we get nothing (and no errors) if no versionInfo available
+    $data[] = array('4.7.beta1', array(), NULL);
+
+    // Make sure alerts prioritize the localMajorVersion
+    $data[] = array('4.4.1', $this->sampleVersionInfo, '4.4.11');
+
+    return $data;
+  }
+
+  /**
+   * @dataProvider securityUpdateDataProvider
+   * @param string $localVersion
+   * @param array $versionInfo
+   * @param bool $expectedResult
+   */
+  function testSecurityUpdate($localVersion, $versionInfo, $expectedResult) {
+    $vc = CRM_Utils_VersionCheck::singleton();
+    // These values are set by the constructor but for testing we override them
+    $vc->localVersion = $localVersion;
+    $vc->localMajorVersion = $vc->getMajorVersion($localVersion);
+    $vc->versionInfo = $versionInfo;
+    $this->assertEquals($vc->isSecurityUpdateAvailable(), $expectedResult);
+  }
+
+  /**
+   * @return array (localVersion, versionInfo, expectedResult)
+   */
+  function securityUpdateDataProvider() {
+    $data = array();
+
+    // Make sure we get alerted if a security release is available
+    $data[] = array('4.5.1', $this->sampleVersionInfo, TRUE);
+
+    // Make sure we do not get alerted if a security release is not available
+    $data[] = array('4.5.5', $this->sampleVersionInfo, FALSE);
+
+    // Make sure we get false (and no errors) if no versionInfo available (this will be the case for pre-alphas)
+    $data[] = array('4.7.alpha1', array(), FALSE);
+
+    // If there are 2 security updates on the same day (e.g. lts and stable majorVersions)
+    // we should not get alerted to one if we are using the other
+    $data[] = array('4.4.11', $this->sampleVersionInfo, FALSE);
+
+    // This version predates the ones in the info array, it should be assumed to be EOL and insecure
+    $data[] = array('4.0.1', $this->sampleVersionInfo, TRUE);
+
+    return $data;
+  }
+}