c541e6079470c7a522ec0056bf415c3bb5310be9
[civicrm-core.git] /
1 <?php
2
3 /**
4 * @file
5 * Tests for ccrm_extensionvalidation.module.
6 */
7
8 /**
9 * Tests version validation/formatting logic
10 */
11 class CcrmExtensionValidatationTestCase extends DrupalUnitTestCase {
12
13 public static function getInfo() {
14 return array(
15 'name' => 'Version Formatting',
16 'description' => 'Tests version validation/formatting logic',
17 'group' => 'ccrm_extensionvalidation',
18 );
19 }
20
21 public function setUp() {
22 parent::setUp();
23 module_load_include('version.inc', 'ccrm_extensionvalidation');
24 }
25
26 public function testIsValid() {
27 $valids = array(
28 '1',
29 '1.1',
30 '1.2.3.4',
31 '1.2-3',
32 '1.2.alpha2',
33 '1.2.rc2',
34 '2012-01-01-1',
35 '2012-01-01',
36 'r456',
37 'r5000',
38 );
39 $invalids = array(
40 'Four',
41 '1.2 alpha',
42 '1 2',
43 '1.2-a',
44 '1/2',
45 '1,2',
46 '1.2-generalrelease',
47 '123456789', // exceeds padding limit
48 '20120101', // exceeds padding limit
49 '20120101124556', // exceeds padding limit
50 'XIV',
51 '1.pre10',
52 );
53
54 foreach ($valids as $valid) {
55 $this->assertEqual(
56 TRUE,
57 ccrm_extensionvalidation_version_isValid($valid),
58 "Expected that '$valid' is valid"
59 );
60 }
61 foreach ($invalids as $invalid) {
62 $this->assertEqual(
63 FALSE,
64 ccrm_extensionvalidation_version_isValid($invalid),
65 "Expected that '$invalid' is invalid"
66 );
67 }
68 }
69
70 public function testSortNormalizedValues() {
71 $cases = array(
72 array('1.alpha1', '1.alpha2', '1.beta', '1.0', '1.0.1', '1.1'),
73 array('1.alpha.1', '1.beta2','1.rc1'),
74 array('4.2.alpha1', '4.2.alpha2', '4.2.beta1', '4.2.beta2', '4.2.0'),
75 array('1.9', '1.9.1', '1.10', '1.10.1'),
76 array('r1', 'r9', 'r10', 'r900', 'r1001'),
77 array('1', '2', '9', '10', '11'),
78 array('1.0', '1.1', '2.0', '2.1', '3.0', '3.1'),
79 );
80 foreach ($cases as $case) {
81 $expectedOrder = array();
82 foreach ($case as $ver) {
83 $expectedOrder[] = ccrm_extensionvalidation_version_normalize($ver);
84 }
85
86 // shuffle and sort using MySQL ordering
87 $actualOrder = $expectedOrder;
88 shuffle($actualOrder);
89 //$actualOrder = self::sqlSort($actualOrder);
90 usort($actualOrder, array(__CLASS__, 'cmpSql'));
91
92 // did we get it right?
93 $this->assertEqual($expectedOrder, $actualOrder);
94 }
95 }
96
97 public function testSplit() {
98 $cases = array(
99 '1' => array('z0000001'),
100 '1.1' => array('z0000001', 'z0000001'),
101 '1.2.3.4' => array('z0000001', 'z0000002', 'z0000003', 'z0000004'),
102 '1.2-3' => array('z0000001', 'z0000002', 'z0000003'),
103 '1.2.alpha2' => array('z0000001', 'z0000002', 'pre010', 'z0000002'),
104 '1.2beta2' => array('z0000001', 'z0000002', 'pre020', 'z0000002'),
105 '2012-01-01-1' => array('z0002012', 'z0000001', 'z0000001', 'z0000001'),
106 '20120101' => array('invalid'),
107 'r456' => array('z0000456'),
108 'r5000' => array('z0005000'),
109 'whiz' => array('whiz'),
110 );
111 foreach ($cases as $input => $expect) {
112 $actual = ccrm_extensionvalidation_version_split($input, CCRM_VALIDATEEXTRELEASE_PAD);
113 $this->assertEqual($actual, $expect, sprintf("input=[%s] expect=[%s] actual=[%s]",
114 $input,
115 implode('/', $expect),
116 implode('/', $actual)
117 ));
118 }
119 }
120
121
122 /**
123 * Sort a list using MySQL's default sort for VARCHARs
124 *
125 static protected function sqlSort($values) {
126 db_query("CREATE TEMPORARY TABLE tmp_sort (value VARCHAR(128)) ENGINE=MEMORY")->execute();
127
128 foreach ($values as $value) {
129 db_query("INSERT INTO tmp_sort (value) VALUES ('$value')");
130 //db_query("INSERT INTO tmp_sort (value) VALUES (:value)", array(
131 // ':value' => $value,
132 //));
133 }
134 $result = array();
135 $q = db_query("SELECT value FROM tmp_sort ORDER BY value");
136 $q->execute();
137 while ($row = $q->fetchAssoc()) {
138 $result[] = $row['value'];
139 }
140
141 db_query("DROP TEMPORARY TABLE tmp_sort")->execute();
142 return $result;
143 } */
144
145 /**
146 * Compare two values using MySQL string comparison
147 *
148 * Note: SQL injection because WTF but doesn't matter because inputs are controlled test data
149 */
150 static protected function cmpSql($a, $b) {
151 // Note: SQL injection from test data
152 $q = db_query("SELECT IF('$a' < '$b', 'lt','gte') as lt, IF('$a' = '$b', 'eq','ne') as eq");
153 /*
154 $q = db_query("SELECT IF(:a < :b,'lt','gte') as lt, IF(:a = :b,'eq','ne') as eq", array(
155 ':a' => $a,
156 ':b' => $b,
157 ));
158 */
159 $q->execute();
160 $res = $q->fetchAssoc();
161
162 if ($res['eq'] == 'eq') {
163 return 0;
164 } elseif ($res['lt'] == 'lt') {
165 return -1;
166 } else {
167 return 1;
168 }
169 }
170 }