Merge pull request #12280 from eileenmcnaughton/line_endings
[civicrm-core.git] / tests / phpunit / CRM / Utils / versionCheckTest.php
CommitLineData
986e458b
CW
1<?php
2
7fe37828
EM
3/**
4 * Class CRM_Utils_versionCheckTest
acb109b7 5 * @group headless
7fe37828 6 */
986e458b
CW
7class CRM_Utils_versionCheckTest extends CiviUnitTestCase {
8
00be9182 9 public function setUp() {
986e458b
CW
10 parent::setUp();
11 }
12
13 /**
14 * @var array
15 */
16 protected $sampleVersionInfo = array(
17 '4.2' => array(
18 'status' => 'eol',
19 'releases' => array(
20 array('version' => '4.2.0', 'date' => '2012-08-20'),
21 array('version' => '4.2.1', 'date' => '2012-09-12'),
22 array('version' => '4.2.2', 'date' => '2012-09-27'),
23 array('version' => '4.2.4', 'date' => '2012-10-18'),
6c6e6187
TO
24 array('version' => '4.2.6', 'date' => '2012-11-01', 'security' => TRUE),
25 array('version' => '4.2.7', 'date' => '2013-01-02', 'security' => TRUE),
986e458b
CW
26 array('version' => '4.2.8', 'date' => '2013-02-20'),
27 array('version' => '4.2.9', 'date' => '2013-04-03'),
6c6e6187 28 array('version' => '4.2.10', 'date' => '2013-07-29', 'security' => TRUE),
986e458b 29 array('version' => '4.2.11', 'date' => '2013-09-25'),
6c6e6187
TO
30 array('version' => '4.2.12', 'date' => '2013-10-02', 'security' => TRUE),
31 array('version' => '4.2.13', 'date' => '2013-11-06', 'security' => TRUE),
986e458b 32 array('version' => '4.2.14', 'date' => '2013-11-20'),
6c6e6187 33 array('version' => '4.2.15', 'date' => '2014-02-07', 'security' => TRUE),
986e458b 34 array('version' => '4.2.16', 'date' => '2014-02-18'),
6c6e6187 35 array('version' => '4.2.17', 'date' => '2014-07-01', 'security' => TRUE),
986e458b 36 array('version' => '4.2.18', 'date' => '2014-08-06'),
21dfd5f5 37 array('version' => '4.2.19', 'date' => '2014-09-17', 'security' => TRUE),
986e458b
CW
38 ),
39 ),
40 '4.3' => array(
41 'status' => 'lts',
42 'releases' => array(
43 array('version' => '4.3.0', 'date' => '2013-04-10'),
44 array('version' => '4.3.1', 'date' => '2013-04-18'),
45 array('version' => '4.3.2', 'date' => '2013-05-02'),
46 array('version' => '4.3.3', 'date' => '2013-05-08'),
6c6e6187
TO
47 array('version' => '4.3.4', 'date' => '2013-06-10', 'security' => TRUE),
48 array('version' => '4.3.5', 'date' => '2013-07-08', 'security' => TRUE),
986e458b 49 array('version' => '4.3.6', 'date' => '2013-09-25'),
6c6e6187
TO
50 array('version' => '4.3.7', 'date' => '2013-10-02', 'security' => TRUE),
51 array('version' => '4.3.8', 'date' => '2013-11-06', 'security' => TRUE),
21dfd5f5 52 array('version' => '4.3.9', 'date' => '2014-09-07', 'security' => TRUE),
986e458b
CW
53 ),
54 ),
55 '4.4' => array(
56 'status' => 'lts',
57 'releases' => array(
58 array('version' => '4.4.0', 'date' => '2013-10-23'),
6c6e6187 59 array('version' => '4.4.1', 'date' => '2013-11-06', 'security' => TRUE),
986e458b
CW
60 array('version' => '4.4.2', 'date' => '2013-11-20'),
61 array('version' => '4.4.3', 'date' => '2013-12-05'),
6c6e6187 62 array('version' => '4.4.4', 'date' => '2014-02-07', 'security' => TRUE),
986e458b 63 array('version' => '4.4.5', 'date' => '2014-04-17'),
6c6e6187
TO
64 array('version' => '4.4.6', 'date' => '2014-07-01', 'security' => TRUE),
65 array('version' => '4.4.7', 'date' => '2014-09-17', 'security' => TRUE),
986e458b
CW
66 array('version' => '4.4.8', 'date' => '2014-10-14'),
67 array('version' => '4.4.9', 'date' => '2014-11-05'),
68 array('version' => '4.4.10', 'date' => '2014-11-19'),
21dfd5f5 69 array('version' => '4.4.11', 'date' => '2014-12-17', 'security' => TRUE),
986e458b
CW
70 ),
71 ),
72 '4.5' => array(
73 'status' => 'stable',
74 'releases' => array(
75 array('version' => '4.5.0', 'date' => '2014-09-18'),
76 array('version' => '4.5.1', 'date' => '2014-10-09'),
77 array('version' => '4.5.2', 'date' => '2014-10-14'),
78 array('version' => '4.5.3', 'date' => '2014-11-05'),
79 array('version' => '4.5.4', 'date' => '2014-11-19'),
6c6e6187 80 array('version' => '4.5.5', 'date' => '2014-12-17', 'security' => TRUE),
21dfd5f5 81 ),
986e458b
CW
82 ),
83 '4.6' => array(
84 'status' => 'testing',
85 'releases' => array(
86 array('version' => '4.6.alpha1', 'date' => '2015-02-01'),
87 array('version' => '4.6.beta1', 'date' => '2015-03-01'),
21dfd5f5 88 ),
986e458b
CW
89 ),
90 );
91
88790378
TO
92 public function tearDown() {
93 parent::tearDown();
86448e8d 94 $vc = new CRM_Utils_VersionCheck();
88790378
TO
95 if (file_exists($vc->cacheFile)) {
96 unlink($vc->cacheFile);
97 }
986e458b 98 }
96025800 99
074e8131
CW
100 public function testCronFallback() {
101 // Fake "remote" source data
102 $tmpSrc = '/tmp/versionCheckTestFile.json';
103 file_put_contents($tmpSrc, json_encode($this->sampleVersionInfo));
104
105 $vc = new CRM_Utils_VersionCheck();
106 $vc->pingbackUrl = $tmpSrc;
107
108 // If the cachefile doesn't exist, fallback should kick in
109 if (file_exists($vc->cacheFile)) {
110 unlink($vc->cacheFile);
111 }
112 $vc->initialize();
113 $this->assertEquals($this->sampleVersionInfo, $vc->versionInfo);
114 unset($vc);
115
116 // Update "remote" source data
117 $remoteData = array('4.3' => $this->sampleVersionInfo['4.3']);
118 file_put_contents($tmpSrc, json_encode($remoteData));
119
120 // Cache was just updated, so fallback should not happen - assert we are still using cached data
121 $vc = new CRM_Utils_VersionCheck();
122 $vc->pingbackUrl = $tmpSrc;
123 $vc->initialize();
124 $this->assertEquals($this->sampleVersionInfo, $vc->versionInfo);
125 unset($vc);
126
127 // Ensure fallback happens if file is too old
128 $vc = new CRM_Utils_VersionCheck();
129 $vc->pingbackUrl = $tmpSrc;
130 // Set cachefile to be 1 minute older than expire time
131 touch($vc->cacheFile, time() - 60 - $vc::CACHEFILE_EXPIRE);
132 clearstatcache();
133 $vc->initialize();
134 $this->assertEquals($remoteData, $vc->versionInfo);
135 }
136
142a9b5f
AS
137 public function testGetSiteStats() {
138 // Create domain address so the domain country will come up in the stats.
139 $country_params = array(
140 'sequential' => 1,
141 'options' => array(
142 'limit' => 1,
143 ),
144 );
145 $country_result = civicrm_api3('country', 'get', $country_params);
146 $country = $country_result['values'][0];
147
148 $domain_params = array(
149 'id' => CRM_Core_Config::domainID(),
150 );
151 CRM_Core_BAO_Domain::retrieve($domain_params, $domain_defaults);
152 $location_type = CRM_Core_BAO_LocationType::getDefault();
153 $address_params = array(
154 'contact_id' => $domain_defaults['contact_id'],
155 'location_type_id' => $location_type->id,
156 'is_primary' => '1',
157 'is_billing' => '0',
158 'street_address' => '1 Main St.',
159 'city' => 'Anywhere',
160 'postal_code' => '99999',
161 'country_id' => $country['id'],
162 );
163 $address_result = civicrm_api3('address', 'create', $address_params);
164
165 // Build stats and test them.
166 $vc = new ReflectionClass('CRM_Utils_VersionCheck');
167 $vc_instance = $vc->newInstance();
168
169 $statsBuilder = $vc->getMethod('getSiteStats');
170 $statsBuilder->setAccessible(TRUE);
171 $statsBuilder->invoke($vc_instance, NULL);
172
173 $statsProperty = $vc->getProperty('stats');
174 $statsProperty->setAccessible(TRUE);
175 $stats = $statsProperty->getValue($vc_instance);
176
177 // Stats array should have correct elements.
178 $this->assertArrayHasKey('version', $stats);
142a9b5f 179
692d270e
AH
180 // See CRM_Utils_VersionCheck::getSiteStats where alpha versions don't get
181 // full stats generated
8be29698 182 if (array_key_exists('version', $stats) && strpos($stats['version'], 'alpha') === FALSE) {
692d270e
AH
183 $this->assertArrayHasKey('hash', $stats);
184 $this->assertArrayHasKey('uf', $stats);
185 $this->assertArrayHasKey('lang', $stats);
186 $this->assertArrayHasKey('co', $stats);
187 $this->assertArrayHasKey('ufv', $stats);
188 $this->assertArrayHasKey('PHP', $stats);
189 $this->assertArrayHasKey('MySQL', $stats);
190 $this->assertArrayHasKey('communityMessagesUrl', $stats);
191 $this->assertArrayHasKey('domain_isoCode', $stats);
192 $this->assertArrayHasKey('PPTypes', $stats);
193 $this->assertArrayHasKey('entities', $stats);
194 $this->assertArrayHasKey('extensions', $stats);
195 $this->assertType('array', $stats['entities']);
196 $this->assertType('array', $stats['extensions']);
197
198 // Assert $stats['domain_isoCode'] is correct.
199 $this->assertEquals($country['iso_code'], $stats['domain_isoCode']);
200
201 $entity_names = array();
202 foreach ($stats['entities'] as $entity) {
203 $entity_names[] = $entity['name'];
204 $this->assertType('int', $entity['size'], "Stats entity {$entity['name']} has integer size?");
205 }
206
207 $expected_entity_names = array(
208 'Activity',
209 'Case',
210 'Contact',
211 'Relationship',
212 'Campaign',
213 'Contribution',
214 'ContributionPage',
215 'ContributionProduct',
216 'Widget',
217 'Discount',
218 'PriceSetEntity',
219 'UFGroup',
220 'Event',
221 'Participant',
222 'Friend',
223 'Grant',
224 'Mailing',
225 'Membership',
226 'MembershipBlock',
227 'Pledge',
228 'PledgeBlock',
229 'Delivered',
230 );
231 sort($entity_names);
232 sort($expected_entity_names);
233 $this->assertEquals($expected_entity_names, $entity_names);
234
235 // TODO: Also test for enabled extensions.
236 }
142a9b5f
AS
237 }
238
986e458b 239}