tests/phpunit/** - Remove unnecessary "require_once" statements
[civicrm-core.git] / tests / phpunit / CRM / Utils / versionCheckTest.php
CommitLineData
986e458b
CW
1<?php
2
7fe37828
EM
3/**
4 * Class CRM_Utils_versionCheckTest
5 */
986e458b
CW
6class CRM_Utils_versionCheckTest extends CiviUnitTestCase {
7
8 /**
9 * @return array
10 */
00be9182 11 public function get_info() {
986e458b
CW
12 return array(
13 'name' => 'VersionCheck Test',
14 'description' => 'Test versionCheck functionality',
15 'group' => 'CiviCRM BAO Tests',
16 );
17 }
18
00be9182 19 public function setUp() {
986e458b
CW
20 parent::setUp();
21 }
22
23 /**
24 * @var array
25 */
26 protected $sampleVersionInfo = array(
27 '4.2' => array(
28 'status' => 'eol',
29 'releases' => array(
30 array('version' => '4.2.0', 'date' => '2012-08-20'),
31 array('version' => '4.2.1', 'date' => '2012-09-12'),
32 array('version' => '4.2.2', 'date' => '2012-09-27'),
33 array('version' => '4.2.4', 'date' => '2012-10-18'),
6c6e6187
TO
34 array('version' => '4.2.6', 'date' => '2012-11-01', 'security' => TRUE),
35 array('version' => '4.2.7', 'date' => '2013-01-02', 'security' => TRUE),
986e458b
CW
36 array('version' => '4.2.8', 'date' => '2013-02-20'),
37 array('version' => '4.2.9', 'date' => '2013-04-03'),
6c6e6187 38 array('version' => '4.2.10', 'date' => '2013-07-29', 'security' => TRUE),
986e458b 39 array('version' => '4.2.11', 'date' => '2013-09-25'),
6c6e6187
TO
40 array('version' => '4.2.12', 'date' => '2013-10-02', 'security' => TRUE),
41 array('version' => '4.2.13', 'date' => '2013-11-06', 'security' => TRUE),
986e458b 42 array('version' => '4.2.14', 'date' => '2013-11-20'),
6c6e6187 43 array('version' => '4.2.15', 'date' => '2014-02-07', 'security' => TRUE),
986e458b 44 array('version' => '4.2.16', 'date' => '2014-02-18'),
6c6e6187 45 array('version' => '4.2.17', 'date' => '2014-07-01', 'security' => TRUE),
986e458b 46 array('version' => '4.2.18', 'date' => '2014-08-06'),
21dfd5f5 47 array('version' => '4.2.19', 'date' => '2014-09-17', 'security' => TRUE),
986e458b
CW
48 ),
49 ),
50 '4.3' => array(
51 'status' => 'lts',
52 'releases' => array(
53 array('version' => '4.3.0', 'date' => '2013-04-10'),
54 array('version' => '4.3.1', 'date' => '2013-04-18'),
55 array('version' => '4.3.2', 'date' => '2013-05-02'),
56 array('version' => '4.3.3', 'date' => '2013-05-08'),
6c6e6187
TO
57 array('version' => '4.3.4', 'date' => '2013-06-10', 'security' => TRUE),
58 array('version' => '4.3.5', 'date' => '2013-07-08', 'security' => TRUE),
986e458b 59 array('version' => '4.3.6', 'date' => '2013-09-25'),
6c6e6187
TO
60 array('version' => '4.3.7', 'date' => '2013-10-02', 'security' => TRUE),
61 array('version' => '4.3.8', 'date' => '2013-11-06', 'security' => TRUE),
21dfd5f5 62 array('version' => '4.3.9', 'date' => '2014-09-07', 'security' => TRUE),
986e458b
CW
63 ),
64 ),
65 '4.4' => array(
66 'status' => 'lts',
67 'releases' => array(
68 array('version' => '4.4.0', 'date' => '2013-10-23'),
6c6e6187 69 array('version' => '4.4.1', 'date' => '2013-11-06', 'security' => TRUE),
986e458b
CW
70 array('version' => '4.4.2', 'date' => '2013-11-20'),
71 array('version' => '4.4.3', 'date' => '2013-12-05'),
6c6e6187 72 array('version' => '4.4.4', 'date' => '2014-02-07', 'security' => TRUE),
986e458b 73 array('version' => '4.4.5', 'date' => '2014-04-17'),
6c6e6187
TO
74 array('version' => '4.4.6', 'date' => '2014-07-01', 'security' => TRUE),
75 array('version' => '4.4.7', 'date' => '2014-09-17', 'security' => TRUE),
986e458b
CW
76 array('version' => '4.4.8', 'date' => '2014-10-14'),
77 array('version' => '4.4.9', 'date' => '2014-11-05'),
78 array('version' => '4.4.10', 'date' => '2014-11-19'),
21dfd5f5 79 array('version' => '4.4.11', 'date' => '2014-12-17', 'security' => TRUE),
986e458b
CW
80 ),
81 ),
82 '4.5' => array(
83 'status' => 'stable',
84 'releases' => array(
85 array('version' => '4.5.0', 'date' => '2014-09-18'),
86 array('version' => '4.5.1', 'date' => '2014-10-09'),
87 array('version' => '4.5.2', 'date' => '2014-10-14'),
88 array('version' => '4.5.3', 'date' => '2014-11-05'),
89 array('version' => '4.5.4', 'date' => '2014-11-19'),
6c6e6187 90 array('version' => '4.5.5', 'date' => '2014-12-17', 'security' => TRUE),
21dfd5f5 91 ),
986e458b
CW
92 ),
93 '4.6' => array(
94 'status' => 'testing',
95 'releases' => array(
96 array('version' => '4.6.alpha1', 'date' => '2015-02-01'),
97 array('version' => '4.6.beta1', 'date' => '2015-03-01'),
21dfd5f5 98 ),
986e458b
CW
99 ),
100 );
101
102 /**
103 * @dataProvider newerVersionDataProvider
104 * @param string $localVersion
105 * @param array $versionInfo
106 * @param mixed $expectedResult
107 */
00be9182 108 public function testNewerVersion($localVersion, $versionInfo, $expectedResult) {
86448e8d 109 $vc = new CRM_Utils_VersionCheck();
986e458b
CW
110 // These values are set by the constructor but for testing we override them
111 $vc->localVersion = $localVersion;
112 $vc->localMajorVersion = $vc->getMajorVersion($localVersion);
9684b976 113 $vc->setVersionInfo($versionInfo);
06576a03
AH
114 $available = $vc->isNewerVersionAvailable();
115 $this->assertEquals($available['version'], $expectedResult);
986e458b
CW
116 }
117
118 /**
a6c01b45
CW
119 * @return array
120 * (localVersion, versionInfo, expectedResult)
986e458b 121 */
00be9182 122 public function newerVersionDataProvider() {
986e458b
CW
123 $data = array();
124
125 // Make sure we do not get unstable release updates for a stable localVersion
126 $data[] = array('4.5.5', $this->sampleVersionInfo, NULL);
127
128 // Make sure we do get unstable release updates for unstable localVersion
129 $data[] = array('4.6.alpha1', $this->sampleVersionInfo, '4.6.beta1');
130
131 // Make sure we get nothing (and no errors) if no versionInfo available
132 $data[] = array('4.7.beta1', array(), NULL);
133
134 // Make sure alerts prioritize the localMajorVersion
135 $data[] = array('4.4.1', $this->sampleVersionInfo, '4.4.11');
136
06576a03
AH
137 // Make sure new security release on newest version doesn't trigger security
138 // notice on site running LTS version that doesn't have a security release
139 $data[] = array('4.3.9', $this->sampleVersionInfo, NULL);
140
141 // Make sure new security release on newest version DOES trigger security
142 // notice on site running EOL version that doesn't have a security release
143 $data[] = array('4.2.19', $this->sampleVersionInfo, '4.5.5');
144
986e458b
CW
145 return $data;
146 }
147
148 /**
149 * @dataProvider securityUpdateDataProvider
150 * @param string $localVersion
151 * @param array $versionInfo
152 * @param bool $expectedResult
153 */
00be9182 154 public function testSecurityUpdate($localVersion, $versionInfo, $expectedResult) {
86448e8d 155 $vc = new CRM_Utils_VersionCheck();
986e458b
CW
156 // These values are set by the constructor but for testing we override them
157 $vc->localVersion = $localVersion;
158 $vc->localMajorVersion = $vc->getMajorVersion($localVersion);
9684b976 159 $vc->setVersionInfo($versionInfo);
06576a03
AH
160 $available = $vc->isNewerVersionAvailable();
161 $this->assertEquals($available['upgrade'], $expectedResult);
986e458b
CW
162 }
163
164 /**
a6c01b45
CW
165 * @return array
166 * (localVersion, versionInfo, expectedResult)
986e458b 167 */
00be9182 168 public function securityUpdateDataProvider() {
986e458b
CW
169 $data = array();
170
171 // Make sure we get alerted if a security release is available
06576a03 172 $data[] = array('4.5.1', $this->sampleVersionInfo, 'security');
986e458b
CW
173
174 // Make sure we do not get alerted if a security release is not available
06576a03 175 $data[] = array('4.5.5', $this->sampleVersionInfo, NULL);
986e458b
CW
176
177 // Make sure we get false (and no errors) if no versionInfo available (this will be the case for pre-alphas)
06576a03 178 $data[] = array('4.7.alpha1', array(), NULL);
986e458b
CW
179
180 // If there are 2 security updates on the same day (e.g. lts and stable majorVersions)
181 // we should not get alerted to one if we are using the other
182 $data[] = array('4.4.11', $this->sampleVersionInfo, FALSE);
183
184 // This version predates the ones in the info array, it should be assumed to be EOL and insecure
06576a03
AH
185 $data[] = array('4.0.1', $this->sampleVersionInfo, 'security');
186
187 // Make sure new security release on newest version doesn't trigger security
188 // notice on site running LTS version that doesn't have a security release
189 $data[] = array('4.3.9', $this->sampleVersionInfo, NULL);
190
191 // Make sure new security release on newest version DOES trigger security
192 // notice on site running EOL version that doesn't have a security release
193 $data[] = array('4.2.19', $this->sampleVersionInfo, 'security');
986e458b
CW
194
195 return $data;
196 }
96025800 197
074e8131
CW
198 public function testCronFallback() {
199 // Fake "remote" source data
200 $tmpSrc = '/tmp/versionCheckTestFile.json';
201 file_put_contents($tmpSrc, json_encode($this->sampleVersionInfo));
202
203 $vc = new CRM_Utils_VersionCheck();
204 $vc->pingbackUrl = $tmpSrc;
205
206 // If the cachefile doesn't exist, fallback should kick in
207 if (file_exists($vc->cacheFile)) {
208 unlink($vc->cacheFile);
209 }
210 $vc->initialize();
211 $this->assertEquals($this->sampleVersionInfo, $vc->versionInfo);
212 unset($vc);
213
214 // Update "remote" source data
215 $remoteData = array('4.3' => $this->sampleVersionInfo['4.3']);
216 file_put_contents($tmpSrc, json_encode($remoteData));
217
218 // Cache was just updated, so fallback should not happen - assert we are still using cached data
219 $vc = new CRM_Utils_VersionCheck();
220 $vc->pingbackUrl = $tmpSrc;
221 $vc->initialize();
222 $this->assertEquals($this->sampleVersionInfo, $vc->versionInfo);
223 unset($vc);
224
225 // Ensure fallback happens if file is too old
226 $vc = new CRM_Utils_VersionCheck();
227 $vc->pingbackUrl = $tmpSrc;
228 // Set cachefile to be 1 minute older than expire time
229 touch($vc->cacheFile, time() - 60 - $vc::CACHEFILE_EXPIRE);
230 clearstatcache();
231 $vc->initialize();
232 $this->assertEquals($remoteData, $vc->versionInfo);
233 }
234
986e458b 235}