1
|
<?php
|
2
|
|
3
|
/**
|
4
|
* @file
|
5
|
* Simpletest for ldap servers.
|
6
|
*/
|
7
|
|
8
|
if (function_exists('ldap_servers_module_load_include')) {
|
9
|
ldap_servers_module_load_include('php', 'ldap_test', 'LdapTestCase.class');
|
10
|
}
|
11
|
else {
|
12
|
module_load_include('php', 'ldap_test', 'LdapTestCase.class');
|
13
|
}
|
14
|
/**
|
15
|
*
|
16
|
*/
|
17
|
class LdapServersTestCase extends LdapTestCase {
|
18
|
|
19
|
/**
|
20
|
*
|
21
|
*/
|
22
|
public static function getInfo() {
|
23
|
return [
|
24
|
'name' => 'LDAP Servers Tests',
|
25
|
'description' => 'Test ldap servers. Servers module is primarily a storage
|
26
|
tool for ldap server configuration, so most of testing is just form and db testing.
|
27
|
there are some api like functions that are also tested.',
|
28
|
'group' => 'LDAP Servers',
|
29
|
];
|
30
|
}
|
31
|
|
32
|
/**
|
33
|
*
|
34
|
*/
|
35
|
public function __construct($test_id = NULL) {
|
36
|
parent::__construct($test_id);
|
37
|
}
|
38
|
|
39
|
public $module_name = 'ldap_servers';
|
40
|
protected $ldap_test_data;
|
41
|
|
42
|
/**
|
43
|
* Create one or more server configurations in such as way
|
44
|
* that this setUp can be a prerequisite for ldap_authentication and ldap_authorization.
|
45
|
*/
|
46
|
public function setUp() {
|
47
|
parent::setUp(['ldap_test']);
|
48
|
variable_set('ldap_simpletest', 2);
|
49
|
}
|
50
|
|
51
|
/**
|
52
|
*
|
53
|
*/
|
54
|
public function tearDown() {
|
55
|
parent::tearDown();
|
56
|
variable_del('ldap_help_watchdog_detail');
|
57
|
variable_del('ldap_simpletest');
|
58
|
}
|
59
|
|
60
|
/**
|
61
|
*
|
62
|
*/
|
63
|
public function testApiFunctions() {
|
64
|
|
65
|
$group = 'ldap_servers: functions';
|
66
|
|
67
|
// , 'activedirectory1'.
|
68
|
foreach (['openldap1', 'activedirectory1'] as $sid) {
|
69
|
$ldap_type = ($sid == 'openldap1') ? 'Open Ldap' : 'Active Directory';
|
70
|
$this->prepTestData('hogwarts', [$sid]);
|
71
|
|
72
|
$group = "ldap_servers: functions: $ldap_type";
|
73
|
$test_data = variable_get('ldap_test_server__' . $sid, []);
|
74
|
ldap_servers_module_load_include('php', 'ldap_test', 'LdapServerTest.class');
|
75
|
$ldap_server = LdapServerTest::getLdapServerObjects($sid, NULL, TRUE);
|
76
|
|
77
|
// Check against csv data rather than ldap array to make sure csv to ldap conversion is correct.
|
78
|
$user_csv_entry = $test_data['csv']['users']['101'];
|
79
|
$user_dn = $user_csv_entry['dn'];
|
80
|
$user_cn = $user_csv_entry['cn'];
|
81
|
$user_ldap_entry = $test_data['ldap'][$user_dn];
|
82
|
|
83
|
$username = $ldap_server->userUsernameFromLdapEntry($user_ldap_entry);
|
84
|
$this->assertTrue($username == $user_csv_entry['cn'], 'LdapServer::userUsernameFromLdapEntry works when LdapServer::user_attr attribute used', $group);
|
85
|
|
86
|
$bogus_ldap_entry = [];
|
87
|
$username = $ldap_server->userUsernameFromLdapEntry($bogus_ldap_entry);
|
88
|
$this->assertTrue($username === FALSE, 'LdapServer::userUsernameFromLdapEntry fails correctly', $group);
|
89
|
|
90
|
$username = $ldap_server->userUsernameFromDn($user_dn);
|
91
|
$this->assertTrue($username == $user_cn, 'LdapServer::userUsernameFromDn works when LdapServer::user_attr attribute used', $group);
|
92
|
|
93
|
$username = $ldap_server->userUsernameFromDn('bogus dn');
|
94
|
$this->assertTrue($username === FALSE, 'LdapServer::userUsernameFromDn fails correctly', $group);
|
95
|
|
96
|
$desired = [];
|
97
|
$desired[0] = [
|
98
|
0 => 'cn=gryffindor,ou=groups,dc=hogwarts,dc=edu',
|
99
|
1 => 'cn=students,ou=groups,dc=hogwarts,dc=edu',
|
100
|
2 => 'cn=honors students,ou=groups,dc=hogwarts,dc=edu',
|
101
|
];
|
102
|
$desired[1] = array_merge($desired[0], ['cn=users,ou=groups,dc=hogwarts,dc=edu']);
|
103
|
|
104
|
foreach ([0, 1] as $nested) {
|
105
|
|
106
|
$nested_display = ($nested) ? 'nested' : 'not nested';
|
107
|
$desired_count = ($nested) ? 4 : 3;
|
108
|
$ldap_module_user_entry = ['attr' => $user_ldap_entry, 'dn' => $user_dn];
|
109
|
$groups_desired = $desired[$nested];
|
110
|
|
111
|
$suffix = ",desired=$desired_count, nested=" . (boolean) $nested;
|
112
|
|
113
|
// Test parent function groupMembershipsFromUser.
|
114
|
$groups = $ldap_server->groupMembershipsFromUser($ldap_module_user_entry, 'group_dns', $nested);
|
115
|
$count = count($groups);
|
116
|
$diff1 = array_diff($groups_desired, $groups);
|
117
|
$diff2 = array_diff($groups, $groups_desired);
|
118
|
$pass = (count($diff1) == 0 && count($diff2) == 0 && $count == $desired_count);
|
119
|
$this->assertTrue($pass, "LdapServer::groupMembershipsFromUser nested=$nested", $group . $suffix);
|
120
|
if (!$pass) {
|
121
|
debug('groupMembershipsFromUser');debug($groups); debug($diff1); debug($diff2); debug($groups_desired);
|
122
|
}
|
123
|
|
124
|
// Test parent groupUserMembershipsFromUserAttr, for openldap should be false, for ad should work.
|
125
|
$groups = $ldap_server->groupUserMembershipsFromUserAttr($ldap_module_user_entry, $nested);
|
126
|
$count = is_array($groups) ? count($groups) : $count;
|
127
|
$pass = $count === FALSE;
|
128
|
if ($sid == 'openldap1') {
|
129
|
$pass = ($groups === FALSE);
|
130
|
}
|
131
|
else {
|
132
|
$pass = (count($diff1) == 0 && count($diff2) == 0 && $count == $desired_count);
|
133
|
}
|
134
|
$this->assertTrue($pass, "LdapServer::groupUserMembershipsFromUserAttr $nested_display, $ldap_type, is false because not configured", $group . $suffix);
|
135
|
if (!$pass) {
|
136
|
debug('groupUserMembershipsFromUserAttr');debug($groups); debug($diff1); debug($diff2);
|
137
|
}
|
138
|
|
139
|
$groups = $ldap_server->groupUserMembershipsFromEntry($ldap_module_user_entry, $nested);
|
140
|
$count = count($groups);
|
141
|
$diff1 = array_diff($groups_desired, $groups);
|
142
|
$diff2 = array_diff($groups, $groups_desired);
|
143
|
$pass = (count($diff1) == 0 && count($diff2) == 0 && $count == $desired_count);
|
144
|
$this->assertTrue($pass, "LdapServer::groupUserMembershipsFromEntry $nested_display works", $group . $suffix);
|
145
|
if (!$pass) {
|
146
|
debug('groupUserMembershipsFromEntry'); debug($groups); debug($diff1); debug($diff2); debug($groups_desired);
|
147
|
}
|
148
|
}
|
149
|
}
|
150
|
}
|
151
|
|
152
|
/**
|
153
|
*
|
154
|
*/
|
155
|
public function testInstall() {
|
156
|
// TODO: Fix failing tests, excluding to make branch pass.
|
157
|
return;
|
158
|
$group = 'ldap_servers: install and uninstall';
|
159
|
$install_tables = ['ldap_servers'];
|
160
|
// disable, uninstall, and enable/install module.
|
161
|
$modules = [$this->module_name];
|
162
|
$ldap_module_uninstall_sequence = ['ldap_authentication', 'ldap_test', 'ldap_user', 'ldap_group', 'ldap_servers'];
|
163
|
// Disable dependent modules.
|
164
|
module_disable($ldap_module_uninstall_sequence);
|
165
|
drupal_uninstall_modules($ldap_module_uninstall_sequence);
|
166
|
module_enable($modules, TRUE);
|
167
|
foreach ($install_tables as $table) {
|
168
|
$this->assertTrue(db_table_exists($table), $table . ' table creates', $group);
|
169
|
}
|
170
|
$var_created = $this->assertTrue(TRUE, 'ldap_servers_encryption variable initialized', $group);
|
171
|
$var_created = $this->assertTrue(variable_get('ldap_servers_encrypt_key', drupal_get_hash_salt()), 'ldap_servers_encrypt_key variable initialized', $group);
|
172
|
|
173
|
// Disable dependent modules.
|
174
|
module_disable($modules, TRUE);
|
175
|
// Unistall dependent modules.
|
176
|
drupal_uninstall_modules($modules, TRUE);
|
177
|
foreach ($install_tables as $table) {
|
178
|
$this->assertFalse(db_table_exists($table), $table . ' table removed', $group);
|
179
|
}
|
180
|
$var_created = $this->assertFalse(variable_get('ldap_servers_encryption', FALSE), 'ldap_servers_encryption variable removed', $group);
|
181
|
$var_created = $this->assertFalse(variable_get('ldap_servers_encrypt_key', FALSE), 'ldap_servers_encrypt_key variable removed', $group);
|
182
|
|
183
|
// Test tokens, see http://drupal.org/node/1245736
|
184
|
$ldap_entry = [
|
185
|
'dn' => 'cn=hpotter,ou=people,dc=hogwarts,dc=edu',
|
186
|
'mail' => [0 => 'hpotter@hogwarts.edu', 'count' => 1],
|
187
|
'sAMAccountName' => [0 => 'hpotter', 'count' => 1],
|
188
|
'house' => [0 => 'Gryffindor', 1 => 'Privet Drive', 'count' => 2],
|
189
|
'guid' => [0 => 'sdafsdfsdf', 'count' => 1],
|
190
|
'count' => 3,
|
191
|
];
|
192
|
|
193
|
$this->ldapTestId = 'ldap_server.tokens';
|
194
|
|
195
|
$dn = ldap_servers_token_replace($ldap_entry, '[dn]');
|
196
|
$this->assertTrue($dn == $ldap_entry['dn'], t('[dn] token worked on ldap_servers_token_replace().'), $this->ldapTestId);
|
197
|
|
198
|
$house0 = ldap_servers_token_replace($ldap_entry, '[house:0]');
|
199
|
$this->assertTrue($house0 == $ldap_entry['house'][0], t("[house:0] token worked ($house0) on ldap_servers_token_replace()."), $this->ldapTestId);
|
200
|
|
201
|
$mixed = ldap_servers_token_replace($ldap_entry, 'thisold[house:0]');
|
202
|
$this->assertTrue($mixed == 'thisold' . $ldap_entry['house'][0], t("thisold[house:0] token worked ($mixed) on ldap_servers_token_replace()."), $this->ldapTestId);
|
203
|
|
204
|
$compound = ldap_servers_token_replace($ldap_entry, '[samaccountname:0][house:0]');
|
205
|
$this->assertTrue($compound == $ldap_entry['sAMAccountName'][0] . $ldap_entry['house'][0], t("[samaccountname:0][house:0] compound token worked ($mixed) on ldap_servers_token_replace()."), $this->ldapTestId);
|
206
|
|
207
|
$literalvalue = ldap_servers_token_replace($ldap_entry, 'literalvalue');
|
208
|
$this->assertTrue($literalvalue == 'literalvalue', t("'literalvalue' token worked ($literalvalue) on ldap_servers_token_replace()."), $this->ldapTestId);
|
209
|
|
210
|
$house0 = ldap_servers_token_replace($ldap_entry, '[house]');
|
211
|
$this->assertTrue($house0 == $ldap_entry['house'][0], t("[house] token worked ($house0) on ldap_servers_token_replace()."), $this->ldapTestId);
|
212
|
|
213
|
$house1 = ldap_servers_token_replace($ldap_entry, '[house:last]');
|
214
|
$this->assertTrue($house1 == $ldap_entry['house'][1], t('[house:last] token worked on ldap_servers_token_replace().'), $this->ldapTestId);
|
215
|
|
216
|
$sAMAccountName = ldap_servers_token_replace($ldap_entry, '[samaccountname:0]');
|
217
|
$this->assertTrue($sAMAccountName == $ldap_entry['sAMAccountName'][0], t('[samaccountname:0] token worked on ldap_servers_token_replace().'), $this->ldapTestId);
|
218
|
|
219
|
$sAMAccountNameMixedCase = ldap_servers_token_replace($ldap_entry, '[sAMAccountName:0]');
|
220
|
$this->assertTrue($sAMAccountNameMixedCase == $ldap_entry['sAMAccountName'][0], t('[sAMAccountName:0] token worked on ldap_servers_token_replace().'), $this->ldapTestId);
|
221
|
|
222
|
$sAMAccountName2 = ldap_servers_token_replace($ldap_entry, '[samaccountname]');
|
223
|
$this->assertTrue($sAMAccountName2 == $ldap_entry['sAMAccountName'][0], t('[samaccountname] token worked on ldap_servers_token_replace().'), $this->ldapTestId);
|
224
|
|
225
|
$sAMAccountName3 = ldap_servers_token_replace($ldap_entry, '[sAMAccountName]');
|
226
|
$this->assertTrue($sAMAccountName2 == $ldap_entry['sAMAccountName'][0], t('[sAMAccountName] token worked on ldap_servers_token_replace().'), $this->ldapTestId);
|
227
|
|
228
|
$base64encode = ldap_servers_token_replace($ldap_entry, '[guid;base64_encode]');
|
229
|
$this->assertTrue($base64encode == base64_encode($ldap_entry['guid'][0]), t('[guid;base64_encode] token worked on ldap_servers_token_replace().'), $this->ldapTestId);
|
230
|
|
231
|
$bin2hex = ldap_servers_token_replace($ldap_entry, '[guid;bin2hex]');
|
232
|
$this->assertTrue($bin2hex == bin2hex($ldap_entry['guid'][0]), t('[guid;bin2hex] token worked on ldap_servers_token_replace().'), $this->ldapTestId);
|
233
|
|
234
|
$msguid = ldap_servers_token_replace($ldap_entry, '[guid;msguid]');
|
235
|
$this->assertTrue($msguid == ldap_servers_msguid($ldap_entry['guid'][0]), t('[guid;msguid] token worked on ldap_servers_token_replace().'), $this->ldapTestId);
|
236
|
|
237
|
$binary = ldap_servers_token_replace($ldap_entry, '[guid;binary]');
|
238
|
$this->assertTrue($binary == ldap_servers_binary($ldap_entry['guid'][0]), t('[guid;binary] token worked on ldap_servers_token_replace().'), $this->ldapTestId);
|
239
|
module_enable($modules, TRUE);
|
240
|
}
|
241
|
|
242
|
/**
|
243
|
*
|
244
|
*/
|
245
|
public function testUIForms() {
|
246
|
|
247
|
foreach ([1] as $ctools_enabled) {
|
248
|
$this->ldapTestId = "testUIForms.ctools.$ctools_enabled";
|
249
|
if ($ctools_enabled) {
|
250
|
module_enable(['ctools']);
|
251
|
}
|
252
|
|
253
|
$ldap_simpletest_initial = variable_get('ldap_simpletest', 2);
|
254
|
// Need to be out of fake server mode to test ui.
|
255
|
variable_del('ldap_simpletest');
|
256
|
$this->privileged_user = $this->drupalCreateUser([
|
257
|
'administer site configuration',
|
258
|
]);
|
259
|
$this->drupalLogin($this->privileged_user);
|
260
|
|
261
|
$sid = 'server1';
|
262
|
$server_data = [];
|
263
|
$server_data[$sid] = [
|
264
|
'sid' => [$sid, $sid],
|
265
|
'name' => ["Server $sid", "My Server $sid"],
|
266
|
'status' => [1, 1],
|
267
|
'ldap_type' => ['openldap', 'ad'],
|
268
|
'address' => ["${sid}.ldap.fake", "${sid}.ldap.fake"],
|
269
|
'port' => [389, 7000],
|
270
|
'tls' => [TRUE, FALSE],
|
271
|
'bind_method' => [1, 3],
|
272
|
'binddn' => ['cn=service-account,ou=people,dc=hogwarts,dc=edu', ''],
|
273
|
'bindpw' => ['sdfsdafsdfasdf', 'sdfsdafsdfasdf'],
|
274
|
'user_attr' => ['sAMAccountName', 'blah'],
|
275
|
'account_name_attr' => ['sAMAccountName', 'blah'],
|
276
|
'mail_attr' => ['mail', ''],
|
277
|
'mail_template' => ['' , '[email]'],
|
278
|
'unique_persistent_attr' => ['dn', 'uniqueregistryid'],
|
279
|
'unique_persistent_attr_binary' => [1, 1, 1, 1],
|
280
|
'user_dn_expression' => ['cn=%cn,%basedn', 'cn=%username,%basedn'],
|
281
|
'ldap_to_drupal_user' => ['code', 'different code'],
|
282
|
|
283
|
'testing_drupal_username' => ['hpotter', 'hpotter'],
|
284
|
'testing_drupal_user_dn' => ['cn=hpotter,ou=people,dc=hogwarts,dc=edu', 'cn=hpotter,ou=people,dc=hogwarts,dc=edu'],
|
285
|
|
286
|
'grp_unused' => [FALSE, FALSE],
|
287
|
'grp_object_cat' => ['group', 'group'],
|
288
|
'grp_nested' => [FALSE, FALSE],
|
289
|
|
290
|
'grp_user_memb_attr_exists' => [1, 1],
|
291
|
'grp_user_memb_attr' => ['memberof', 'memberof'],
|
292
|
|
293
|
'grp_memb_attr' => ['member', 'member'],
|
294
|
'grp_memb_attr_match_user_attr' => ['dn', 'dn'],
|
295
|
|
296
|
'grp_derive_from_dn' => [1, 1],
|
297
|
'grp_derive_from_dn_attr' => ['ou', 'ou'],
|
298
|
|
299
|
'grp_test_grp_dn' => ['cn=students,ou=groups,dc=hogwarts,dc=edu', 'cn=students,ou=groups,dc=hogwarts,dc=edu'],
|
300
|
'grp_test_grp_dn_writeable' => ['cn=students,ou=groups,dc=hogwarts,dc=edu', 'cn=students,ou=groups,dc=hogwarts,dc=edu'],
|
301
|
|
302
|
];
|
303
|
|
304
|
$lcase_transformed = [
|
305
|
'user_attr',
|
306
|
'account_name_attr',
|
307
|
'mail_attr',
|
308
|
'unique_persistent_attr',
|
309
|
'grp_user_memb_attr',
|
310
|
'grp_memb_attr_match_user_attr',
|
311
|
'grp_derive_from_dn_attr',
|
312
|
];
|
313
|
|
314
|
if (!module_exists('php')) {
|
315
|
unset($server_data[$sid]['ldap_to_drupal_user']);
|
316
|
}
|
317
|
|
318
|
/** add server conf test **/
|
319
|
$this->drupalGet('admin/config/people/ldap/servers/add');
|
320
|
|
321
|
$edit = [];
|
322
|
foreach ($server_data['server1'] as $input_name => $input_values) {
|
323
|
$edit[$input_name] = $input_values[0];
|
324
|
}
|
325
|
$this->drupalPost('admin/config/people/ldap/servers/add', $edit, t('Add'));
|
326
|
$field_to_prop_map = LdapServer::field_to_properties_map();
|
327
|
$field_to_prop_map['bindpw'] = 'bindpw';
|
328
|
$ldap_servers = ldap_servers_get_servers(NULL, 'all', FALSE, TRUE);
|
329
|
$this->assertTrue(count(array_keys($ldap_servers)) == 1, 'Add form for ldap server added server.', $this->ldapTestId . ' Add Server');
|
330
|
$this->assertText('LDAP Server Server server1 added', 'Add form confirmation message', $this->ldapTestId . ' Add Server');
|
331
|
// Assert one ldap server exists in db table
|
332
|
// Assert load of server has correct properties for each input.
|
333
|
$mismatches = $this->compareFormToProperties($ldap_servers['server1'], $server_data['server1'], 0, $field_to_prop_map, $lcase_transformed);
|
334
|
if (count($mismatches)) {
|
335
|
debug('mismatches between ldap server properties and form submitted values');
|
336
|
debug($mismatches);
|
337
|
debug($ldap_servers);
|
338
|
debug($server_data['server1']);
|
339
|
}
|
340
|
$this->assertTrue(count($mismatches) == 0, 'Add form for ldap server properties match values submitted.', $this->ldapTestId . ' Add Server');
|
341
|
|
342
|
/** update server conf test **/
|
343
|
|
344
|
$this->drupalGet('admin/config/people/ldap/servers/edit/server1');
|
345
|
|
346
|
$edit = [];
|
347
|
foreach ($server_data['server1'] as $input_name => $input_values) {
|
348
|
if ($input_values[1] !== NULL) {
|
349
|
$edit[$input_name] = $input_values[1];
|
350
|
}
|
351
|
}
|
352
|
|
353
|
unset($edit['sid']);
|
354
|
$this->drupalPost('admin/config/people/ldap/servers/edit/server1', $edit, t('Update'));
|
355
|
$ldap_servers = ldap_servers_get_servers(NULL, 'all', FALSE, TRUE);
|
356
|
$this->assertTrue(count(array_keys($ldap_servers)) == 1, 'Update form for ldap server didnt delete or add another server.', $this->ldapTestId . '.Update Server');
|
357
|
// Assert confirmation message without error
|
358
|
// assert one ldap server exists in db table
|
359
|
// assert load of server has correct properties for each input.
|
360
|
$mismatches = $this->compareFormToProperties($ldap_servers['server1'], $server_data['server1'], 1, $field_to_prop_map, $lcase_transformed);
|
361
|
if (count($mismatches)) {
|
362
|
debug('mismatches between ldap server properties and form submitted values'); debug($mismatches);
|
363
|
}
|
364
|
$this->assertTrue(count($mismatches) == 0, 'Update form for ldap server properties match values submitted.', $this->ldapTestId . '.Update Server');
|
365
|
|
366
|
/** delete server conf test **/
|
367
|
$this->drupalGet('admin/config/people/ldap/servers/delete/server1');
|
368
|
$this->drupalPost('admin/config/people/ldap/servers/delete/server1', [], t('Delete'));
|
369
|
|
370
|
$ldap_servers = ldap_servers_get_servers(NULL, 'all', FALSE, TRUE);
|
371
|
|
372
|
$this->assertTrue(count(array_keys($ldap_servers)) == 0, 'Delete form for ldap server deleted server.', $this->ldapTestId . '.Delete Server');
|
373
|
|
374
|
// Return to fake server mode.
|
375
|
variable_set('ldap_simpletest', $ldap_simpletest_initial);
|
376
|
}
|
377
|
}
|
378
|
|
379
|
/**
|
380
|
*
|
381
|
*/
|
382
|
public function serverConfCount() {
|
383
|
$records = db_query('SELECT * FROM {ldap_servers}')->fetchAllAssoc('sid');
|
384
|
return count(array_keys($records));
|
385
|
}
|
386
|
|
387
|
/**
|
388
|
*
|
389
|
*/
|
390
|
public function compareFormToProperties($object, $data, $item_id, $map, $lcase_transformed) {
|
391
|
|
392
|
$mismatches = [];
|
393
|
foreach ($data as $field_id => $values) {
|
394
|
$field_id = drupal_strtolower($field_id);
|
395
|
if (!isset($map[$field_id])) {
|
396
|
continue;
|
397
|
}
|
398
|
$property = $map[$field_id];
|
399
|
if (!property_exists($object, $property) && !property_exists($object, drupal_strtolower($property))) {
|
400
|
continue;
|
401
|
}
|
402
|
$property_value = $object->{$property};
|
403
|
|
404
|
// For cases where string input is not same as array.
|
405
|
$field_value = isset($values[$item_id + 2]) ? $values[$item_id + 2] : $values[$item_id];
|
406
|
|
407
|
if ($field_id == 'bindpw') {
|
408
|
continue;
|
409
|
}
|
410
|
if ($field_id == 'basedn') {
|
411
|
$pass = count($property_value) == 2;
|
412
|
if (!$pass) {
|
413
|
debug($property_value);
|
414
|
}
|
415
|
}
|
416
|
else {
|
417
|
if (in_array($field_id, $lcase_transformed) && is_scalar($field_value)) {
|
418
|
$field_value = drupal_strtolower($field_value);
|
419
|
}
|
420
|
$property_value_show = (is_scalar($property_value)) ? $property_value : serialize($property_value);
|
421
|
$field_value_show = (is_scalar($field_value)) ? $field_value : serialize($field_value);
|
422
|
|
423
|
if (is_array($property_value) && is_array($field_value)) {
|
424
|
$pass = count(array_diff($property_value, $field_value)) == 0;
|
425
|
}
|
426
|
elseif (is_scalar($property_value) && is_scalar($field_value)) {
|
427
|
$pass = ($property_value == $field_value);
|
428
|
}
|
429
|
else {
|
430
|
$pass = FALSE;
|
431
|
}
|
432
|
}
|
433
|
if (!$pass) {
|
434
|
$mismatches[] = "property $property ($property_value_show) does not match field $field_id value ($field_value_show)";
|
435
|
}
|
436
|
}
|
437
|
|
438
|
return $mismatches;
|
439
|
}
|
440
|
|
441
|
}
|