Commit | Line | Data |
---|---|---|
986e458b CW |
1 | <?php |
2 | ||
7fe37828 EM |
3 | /** |
4 | * Class CRM_Utils_versionCheckTest | |
5 | */ | |
986e458b CW |
6 | class 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 | } |