MDL-51723 ldap: Normalise the user objectclass
[moodle.git] / enrol / ldap / tests / ldap_test.php
1 <?php
2 // This file is part of Moodle - http://moodle.org/
3 //
4 // Moodle is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
8 //
9 // Moodle is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 // GNU General Public License for more details.
13 //
14 // You should have received a copy of the GNU General Public License
15 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
17 /**
18  * LDAP enrolment plugin tests.
19  *
20  * NOTE: in order to execute this test you need to set up
21  *       OpenLDAP server with core, cosine, nis and internet schemas
22  *       and add configuration constants to config.php or phpunit.xml configuration file:
23  *
24  * define('TEST_ENROL_LDAP_HOST_URL', 'ldap://127.0.0.1');
25  * define('TEST_ENROL_LDAP_BIND_DN', 'cn=someuser,dc=example,dc=local');
26  * define('TEST_ENROL_LDAP_BIND_PW', 'somepassword');
27  * define('TEST_ENROL_LDAP_DOMAIN', 'dc=example,dc=local');
28  *
29  * @package    enrol_ldap
30  * @category   phpunit
31  * @copyright  2013 Petr Skoda {@link http://skodak.org}
32  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
33  */
35 defined('MOODLE_INTERNAL') || die();
37 global $CFG;
40 class enrol_ldap_testcase extends advanced_testcase {
42     public function test_enrol_ldap() {
43         global $CFG, $DB;
45         if (!extension_loaded('ldap')) {
46             $this->markTestSkipped('LDAP extension is not loaded.');
47         }
49         $this->resetAfterTest();
51         require_once($CFG->dirroot.'/enrol/ldap/lib.php');
52         require_once($CFG->libdir.'/ldaplib.php');
54         if (!defined('TEST_ENROL_LDAP_HOST_URL') or !defined('TEST_ENROL_LDAP_BIND_DN') or !defined('TEST_ENROL_LDAP_BIND_PW') or !defined('TEST_ENROL_LDAP_DOMAIN')) {
55             $this->markTestSkipped('External LDAP test server not configured.');
56         }
58         // Make sure we can connect the server.
59         $debuginfo = '';
60         if (!$connection = ldap_connect_moodle(TEST_ENROL_LDAP_HOST_URL, 3, 'rfc2307', TEST_ENROL_LDAP_BIND_DN, TEST_ENROL_LDAP_BIND_PW, LDAP_DEREF_NEVER, $debuginfo, false)) {
61             $this->markTestSkipped('Can not connect to LDAP test server: '.$debuginfo);
62         }
64         $this->enable_plugin();
66         // Create new empty test container.
67         $topdn = 'dc=moodletest,'.TEST_ENROL_LDAP_DOMAIN;
69         $this->recursive_delete($connection, TEST_ENROL_LDAP_DOMAIN, 'dc=moodletest');
71         $o = array();
72         $o['objectClass'] = array('dcObject', 'organizationalUnit');
73         $o['dc']         = 'moodletest';
74         $o['ou']         = 'MOODLETEST';
75         if (!ldap_add($connection, 'dc=moodletest,'.TEST_ENROL_LDAP_DOMAIN, $o)) {
76             $this->markTestSkipped('Can not create test LDAP container.');
77         }
79         // Configure enrol plugin.
80         /** @var enrol_ldap_plugin $enrol */
81         $enrol = enrol_get_plugin('ldap');
82         $enrol->set_config('host_url', TEST_ENROL_LDAP_HOST_URL);
83         $enrol->set_config('start_tls', 0);
84         $enrol->set_config('ldap_version', 3);
85         $enrol->set_config('ldapencoding', 'utf-8');
86         $enrol->set_config('pagesize', '2');
87         $enrol->set_config('bind_dn', TEST_ENROL_LDAP_BIND_DN);
88         $enrol->set_config('bind_pw', TEST_ENROL_LDAP_BIND_PW);
89         $enrol->set_config('course_search_sub', 0);
90         $enrol->set_config('memberattribute_isdn', 0);
91         $enrol->set_config('user_contexts', '');
92         $enrol->set_config('user_search_sub', 0);
93         $enrol->set_config('user_type', 'rfc2307');
94         $enrol->set_config('opt_deref', LDAP_DEREF_NEVER);
95         $enrol->set_config('objectclass', '(objectClass=posixGroup)');
96         $enrol->set_config('course_idnumber', 'cn');
97         $enrol->set_config('course_shortname', 'cn');
98         $enrol->set_config('course_fullname', 'cn');
99         $enrol->set_config('course_summary', '');
100         $enrol->set_config('ignorehiddencourses', 0);
101         $enrol->set_config('nested_groups', 0);
102         $enrol->set_config('autocreate', 0);
103         $enrol->set_config('unenrolaction', ENROL_EXT_REMOVED_KEEP);
105         $roles = get_all_roles();
106         foreach ($roles as $role) {
107             $enrol->set_config('contexts_role'.$role->id, '');
108             $enrol->set_config('memberattribute_role'.$role->id, '');
109         }
111         // Create group for teacher enrolments.
112         $teacherrole = $DB->get_record('role', array('shortname'=>'teacher'));
113         $this->assertNotEmpty($teacherrole);
114         $o = array();
115         $o['objectClass'] = array('organizationalUnit');
116         $o['ou']          = 'teachers';
117         ldap_add($connection, 'ou=teachers,'.$topdn, $o);
118         $enrol->set_config('contexts_role'.$teacherrole->id, 'ou=teachers,'.$topdn);
119         $enrol->set_config('memberattribute_role'.$teacherrole->id, 'memberuid');
121         // Create group for student enrolments.
122         $studentrole = $DB->get_record('role', array('shortname'=>'student'));
123         $this->assertNotEmpty($studentrole);
124         $o = array();
125         $o['objectClass'] = array('organizationalUnit');
126         $o['ou']          = 'students';
127         ldap_add($connection, 'ou=students,'.$topdn, $o);
128         $enrol->set_config('contexts_role'.$studentrole->id, 'ou=students,'.$topdn);
129         $enrol->set_config('memberattribute_role'.$studentrole->id, 'memberuid');
131         // Create some users and courses.
132         $user1 = $this->getDataGenerator()->create_user(array('idnumber'=>'user1', 'username'=>'user1'));
133         $user2 = $this->getDataGenerator()->create_user(array('idnumber'=>'user2', 'username'=>'user2'));
134         $user3 = $this->getDataGenerator()->create_user(array('idnumber'=>'user3', 'username'=>'user3'));
135         $user4 = $this->getDataGenerator()->create_user(array('idnumber'=>'user4', 'username'=>'user4'));
136         $user5 = $this->getDataGenerator()->create_user(array('idnumber'=>'user5', 'username'=>'user5'));
137         $user6 = $this->getDataGenerator()->create_user(array('idnumber'=>'user6', 'username'=>'user6'));
139         $course1 = $this->getDataGenerator()->create_course(array('idnumber'=>'course1', 'shortname'=>'course1'));
140         $course2 = $this->getDataGenerator()->create_course(array('idnumber'=>'course2', 'shortname'=>'course2'));
141         $course3 = $this->getDataGenerator()->create_course(array('idnumber'=>'course3', 'shortname'=>'course3'));
143         // Set up some ldap data.
144         $o = array();
145         $o['objectClass'] = array('posixGroup');
146         $o['cn']          = 'course1';
147         $o['gidNumber']   = '1';
148         $o['memberUid']   = array('user1', 'user2', 'user3', 'userx');
149         ldap_add($connection, 'cn='.$o['cn'].',ou=students,'.$topdn, $o);
150         $o = array();
151         $o['objectClass'] = array('posixGroup');
152         $o['cn']          = 'course1';
153         $o['gidNumber']   = '2';
154         $o['memberUid']   = array('user5');
155         ldap_add($connection, 'cn='.$o['cn'].',ou=teachers,'.$topdn, $o);
157         $o = array();
158         $o['objectClass'] = array('posixGroup');
159         $o['cn']          = 'course2';
160         $o['gidNumber']   = '3';
161         $o['memberUid']   = array('user1', 'user2', 'user3', 'user4');
162         ldap_add($connection, 'cn='.$o['cn'].',ou=students,'.$topdn, $o);
164         $o = array();
165         $o['objectClass'] = array('posixGroup');
166         $o['cn']          = 'course4';
167         $o['gidNumber']   = '4';
168         $o['memberUid']   = array('user1', 'user2');
169         ldap_add($connection, 'cn='.$o['cn'].',ou=students,'.$topdn, $o);
170         $o = array();
171         $o['objectClass'] = array('posixGroup');
172         $o['cn']          = 'course4';
173         $o['gidNumber']   = '5';
174         $o['memberUid']   = array('user5', 'user6');
175         ldap_add($connection, 'cn='.$o['cn'].',ou=teachers,'.$topdn, $o);
178         // Test simple test without creation.
180         $this->assertEquals(0, $DB->count_records('user_enrolments'));
181         $this->assertEquals(0, $DB->count_records('role_assignments'));
182         $this->assertEquals(4, $DB->count_records('course'));
184         $enrol->sync_enrolments(new null_progress_trace());
186         $this->assertEquals(8, $DB->count_records('user_enrolments'));
187         $this->assertEquals(8, $DB->count_records('role_assignments'));
188         $this->assertEquals(4, $DB->count_records('course'));
190         $this->assertIsEnrolled($course1->id, $user1->id, $studentrole->id);
191         $this->assertIsEnrolled($course1->id, $user2->id, $studentrole->id);
192         $this->assertIsEnrolled($course1->id, $user3->id, $studentrole->id);
193         $this->assertIsEnrolled($course1->id, $user5->id, $teacherrole->id);
195         $this->assertIsEnrolled($course2->id, $user1->id, $studentrole->id);
196         $this->assertIsEnrolled($course2->id, $user2->id, $studentrole->id);
197         $this->assertIsEnrolled($course2->id, $user3->id, $studentrole->id);
198         $this->assertIsEnrolled($course2->id, $user4->id, $studentrole->id);
201         // Test course creation.
202         $enrol->set_config('autocreate', 1);
204         $enrol->sync_enrolments(new null_progress_trace());
206         $this->assertEquals(12, $DB->count_records('user_enrolments'));
207         $this->assertEquals(12, $DB->count_records('role_assignments'));
208         $this->assertEquals(5, $DB->count_records('course'));
210         $course4 = $DB->get_record('course', array('idnumber'=>'course4'), '*', MUST_EXIST);
212         $this->assertIsEnrolled($course4->id, $user1->id, $studentrole->id);
213         $this->assertIsEnrolled($course4->id, $user2->id, $studentrole->id);
214         $this->assertIsEnrolled($course4->id, $user5->id, $teacherrole->id);
215         $this->assertIsEnrolled($course4->id, $user6->id, $teacherrole->id);
218         // Test unenrolment.
219         ldap_delete($connection, 'cn=course1,ou=students,'.$topdn);
220         $o = array();
221         $o['objectClass'] = array('posixGroup');
222         $o['cn']          = 'course1';
223         $o['gidNumber']   = '1';
224         ldap_add($connection, 'cn='.$o['cn'].',ou=students,'.$topdn, $o);
226         $enrol->set_config('unenrolaction', ENROL_EXT_REMOVED_KEEP);
227         $enrol->sync_enrolments(new null_progress_trace());
228         $this->assertEquals(12, $DB->count_records('user_enrolments'));
229         $this->assertEquals(12, $DB->count_records('role_assignments'));
230         $this->assertEquals(5, $DB->count_records('course'));
232         $enrol->set_config('unenrolaction', ENROL_EXT_REMOVED_SUSPEND);
233         $enrol->sync_enrolments(new null_progress_trace());
234         $this->assertEquals(12, $DB->count_records('user_enrolments'));
235         $this->assertEquals(12, $DB->count_records('role_assignments'));
236         $this->assertEquals(5, $DB->count_records('course'));
237         $this->assertIsEnrolled($course1->id, $user1->id, $studentrole->id, ENROL_USER_SUSPENDED);
238         $this->assertIsEnrolled($course1->id, $user2->id, $studentrole->id, ENROL_USER_SUSPENDED);
239         $this->assertIsEnrolled($course1->id, $user3->id, $studentrole->id, ENROL_USER_SUSPENDED);
241         ldap_delete($connection, 'cn=course1,ou=students,'.$topdn);
242         $o = array();
243         $o['objectClass'] = array('posixGroup');
244         $o['cn']          = 'course1';
245         $o['gidNumber']   = '1';
246         $o['memberUid']   = array('user1', 'user2', 'user3');
247         ldap_add($connection, 'cn='.$o['cn'].',ou=students,'.$topdn, $o);
249         $enrol->sync_enrolments(new null_progress_trace());
250         $this->assertEquals(12, $DB->count_records('user_enrolments'));
251         $this->assertEquals(12, $DB->count_records('role_assignments'));
252         $this->assertEquals(5, $DB->count_records('course'));
253         $this->assertIsEnrolled($course1->id, $user1->id, $studentrole->id, ENROL_USER_ACTIVE);
254         $this->assertIsEnrolled($course1->id, $user2->id, $studentrole->id, ENROL_USER_ACTIVE);
255         $this->assertIsEnrolled($course1->id, $user3->id, $studentrole->id, ENROL_USER_ACTIVE);
257         ldap_delete($connection, 'cn=course1,ou=students,'.$topdn);
258         $o = array();
259         $o['objectClass'] = array('posixGroup');
260         $o['cn']          = 'course1';
261         $o['gidNumber']   = '1';
262         ldap_add($connection, 'cn='.$o['cn'].',ou=students,'.$topdn, $o);
264         $enrol->set_config('unenrolaction', ENROL_EXT_REMOVED_SUSPENDNOROLES);
265         $enrol->sync_enrolments(new null_progress_trace());
266         $this->assertEquals(12, $DB->count_records('user_enrolments'));
267         $this->assertEquals(9, $DB->count_records('role_assignments'));
268         $this->assertEquals(5, $DB->count_records('course'));
269         $this->assertIsEnrolled($course1->id, $user1->id, 0, ENROL_USER_SUSPENDED);
270         $this->assertIsEnrolled($course1->id, $user2->id, 0, ENROL_USER_SUSPENDED);
271         $this->assertIsEnrolled($course1->id, $user3->id, 0, ENROL_USER_SUSPENDED);
273         ldap_delete($connection, 'cn=course1,ou=students,'.$topdn);
274         $o = array();
275         $o['objectClass'] = array('posixGroup');
276         $o['cn']          = 'course1';
277         $o['gidNumber']   = '1';
278         $o['memberUid']   = array('user1', 'user2', 'user3');
279         ldap_add($connection, 'cn='.$o['cn'].',ou=students,'.$topdn, $o);
281         $enrol->sync_enrolments(new null_progress_trace());
282         $this->assertEquals(12, $DB->count_records('user_enrolments'));
283         $this->assertEquals(12, $DB->count_records('role_assignments'));
284         $this->assertEquals(5, $DB->count_records('course'));
285         $this->assertIsEnrolled($course1->id, $user1->id, $studentrole->id, ENROL_USER_ACTIVE);
286         $this->assertIsEnrolled($course1->id, $user2->id, $studentrole->id, ENROL_USER_ACTIVE);
287         $this->assertIsEnrolled($course1->id, $user3->id, $studentrole->id, ENROL_USER_ACTIVE);
289         ldap_delete($connection, 'cn=course1,ou=students,'.$topdn);
290         $o = array();
291         $o['objectClass'] = array('posixGroup');
292         $o['cn']          = 'course1';
293         $o['gidNumber']   = '1';
294         ldap_add($connection, 'cn='.$o['cn'].',ou=students,'.$topdn, $o);
296         $enrol->set_config('unenrolaction', ENROL_EXT_REMOVED_UNENROL);
297         $enrol->sync_enrolments(new null_progress_trace());
298         $this->assertEquals(9, $DB->count_records('user_enrolments'));
299         $this->assertEquals(9, $DB->count_records('role_assignments'));
300         $this->assertEquals(5, $DB->count_records('course'));
301         $this->assertIsNotEnrolled($course1->id, $user1->id);
302         $this->assertIsNotEnrolled($course1->id, $user2->id);
303         $this->assertIsNotEnrolled($course1->id, $user3->id);
306         // Individual user enrolments-
308         ldap_delete($connection, 'cn=course1,ou=students,'.$topdn);
309         $o = array();
310         $o['objectClass'] = array('posixGroup');
311         $o['cn']          = 'course1';
312         $o['gidNumber']   = '1';
313         $o['memberUid']   = array('user1', 'user2', 'user3');
314         ldap_add($connection, 'cn='.$o['cn'].',ou=students,'.$topdn, $o);
316         $enrol->sync_user_enrolments($user1);
317         $this->assertEquals(10, $DB->count_records('user_enrolments'));
318         $this->assertEquals(10, $DB->count_records('role_assignments'));
319         $this->assertEquals(5, $DB->count_records('course'));
320         $this->assertIsEnrolled($course1->id, $user1->id, $studentrole->id, ENROL_USER_ACTIVE);
322         ldap_delete($connection, 'cn=course1,ou=students,'.$topdn);
323         $o = array();
324         $o['objectClass'] = array('posixGroup');
325         $o['cn']          = 'course1';
326         $o['gidNumber']   = '1';
327         $o['memberUid']   = array('user2', 'user3');
328         ldap_add($connection, 'cn='.$o['cn'].',ou=students,'.$topdn, $o);
330         $enrol->set_config('unenrolaction', ENROL_EXT_REMOVED_KEEP);
331         $enrol->sync_user_enrolments($user1);
332         $this->assertEquals(10, $DB->count_records('user_enrolments'));
333         $this->assertEquals(10, $DB->count_records('role_assignments'));
334         $this->assertEquals(5, $DB->count_records('course'));
335         $this->assertIsEnrolled($course1->id, $user1->id, $studentrole->id, ENROL_USER_ACTIVE);
337         $enrol->set_config('unenrolaction', ENROL_EXT_REMOVED_SUSPEND);
338         $enrol->sync_user_enrolments($user1);
339         $this->assertEquals(10, $DB->count_records('user_enrolments'));
340         $this->assertEquals(10, $DB->count_records('role_assignments'));
341         $this->assertEquals(5, $DB->count_records('course'));
342         $this->assertIsEnrolled($course1->id, $user1->id, $studentrole->id, ENROL_USER_SUSPENDED);
344         ldap_delete($connection, 'cn=course1,ou=students,'.$topdn);
345         $o = array();
346         $o['objectClass'] = array('posixGroup');
347         $o['cn']          = 'course1';
348         $o['gidNumber']   = '1';
349         $o['memberUid']   = array('user1', 'user2', 'user3');
350         ldap_add($connection, 'cn='.$o['cn'].',ou=students,'.$topdn, $o);
352         $enrol->sync_user_enrolments($user1);
353         $this->assertEquals(10, $DB->count_records('user_enrolments'));
354         $this->assertEquals(10, $DB->count_records('role_assignments'));
355         $this->assertEquals(5, $DB->count_records('course'));
356         $this->assertIsEnrolled($course1->id, $user1->id, $studentrole->id, ENROL_USER_ACTIVE);
358         ldap_delete($connection, 'cn=course1,ou=students,'.$topdn);
359         $o = array();
360         $o['objectClass'] = array('posixGroup');
361         $o['cn']          = 'course1';
362         $o['gidNumber']   = '1';
363         $o['memberUid']   = array('user2', 'user3');
364         ldap_add($connection, 'cn='.$o['cn'].',ou=students,'.$topdn, $o);
366         $enrol->set_config('unenrolaction', ENROL_EXT_REMOVED_SUSPENDNOROLES);
367         $enrol->sync_user_enrolments($user1);
368         $this->assertEquals(10, $DB->count_records('user_enrolments'));
369         $this->assertEquals(9, $DB->count_records('role_assignments'));
370         $this->assertEquals(5, $DB->count_records('course'));
371         $this->assertIsEnrolled($course1->id, $user1->id, 0, ENROL_USER_SUSPENDED);
373         ldap_delete($connection, 'cn=course1,ou=students,'.$topdn);
374         $o = array();
375         $o['objectClass'] = array('posixGroup');
376         $o['cn']          = 'course1';
377         $o['gidNumber']   = '1';
378         $o['memberUid']   = array('user1', 'user2', 'user3');
379         ldap_add($connection, 'cn='.$o['cn'].',ou=students,'.$topdn, $o);
381         $enrol->sync_user_enrolments($user1);
382         $this->assertEquals(10, $DB->count_records('user_enrolments'));
383         $this->assertEquals(10, $DB->count_records('role_assignments'));
384         $this->assertEquals(5, $DB->count_records('course'));
385         $this->assertIsEnrolled($course1->id, $user1->id, $studentrole->id, ENROL_USER_ACTIVE);
387         ldap_delete($connection, 'cn=course1,ou=students,'.$topdn);
388         $o = array();
389         $o['objectClass'] = array('posixGroup');
390         $o['cn']          = 'course1';
391         $o['gidNumber']   = '1';
392         $o['memberUid']   = array('user2', 'user3');
393         ldap_add($connection, 'cn='.$o['cn'].',ou=students,'.$topdn, $o);
395         $enrol->set_config('unenrolaction', ENROL_EXT_REMOVED_UNENROL);
396         $enrol->sync_user_enrolments($user1);
397         $this->assertEquals(9, $DB->count_records('user_enrolments'));
398         $this->assertEquals(9, $DB->count_records('role_assignments'));
399         $this->assertEquals(5, $DB->count_records('course'));
400         $this->assertIsNotEnrolled($course1->id, $user1->id);
402         $this->recursive_delete($connection, TEST_ENROL_LDAP_DOMAIN, 'dc=moodletest');
403         ldap_close($connection);
405         // NOTE: multiple roles in one course is not supported, sorry
406     }
408     public function assertIsEnrolled($courseid, $userid, $roleid, $status=null) {
409         global $DB;
411         $context = context_course::instance($courseid);
412         $instance = $DB->get_record('enrol', array('courseid'=>$courseid, 'enrol'=>'ldap'));
413         $this->assertNotEmpty($instance);
414         $ue = $DB->get_record('user_enrolments', array('enrolid'=>$instance->id, 'userid'=>$userid));
415         $this->assertNotEmpty($ue);
416         if (isset($status)) {
417             $this->assertEquals($status, $ue->status);
418         }
419         if ($roleid) {
420             $this->assertTrue($DB->record_exists('role_assignments', array('contextid'=>$context->id, 'userid'=>$userid, 'roleid'=>$roleid, 'component'=>'enrol_ldap')));
421         } else {
422             $this->assertFalse($DB->record_exists('role_assignments', array('contextid'=>$context->id, 'userid'=>$userid, 'component'=>'enrol_ldap')));
423         }
424     }
426     public function assertIsNotEnrolled($courseid, $userid) {
427         $context = context_course::instance($courseid);
428         $this->assertFalse(is_enrolled($context, $userid));
429     }
431     protected function enable_plugin() {
432         $enabled = enrol_get_plugins(true);
433         $enabled['ldap'] = true;
434         $enabled = array_keys($enabled);
435         set_config('enrol_plugins_enabled', implode(',', $enabled));
436     }
438     protected function disable_plugin() {
439         $enabled = enrol_get_plugins(true);
440         unset($enabled['ldap']);
441         $enabled = array_keys($enabled);
442         set_config('enrol_plugins_enabled', implode(',', $enabled));
443     }
445     protected function recursive_delete($connection, $dn, $filter) {
446         if ($res = ldap_list($connection, $dn, $filter, array('dn'))) {
447             $info = ldap_get_entries($connection, $res);
448             ldap_free_result($res);
449             if ($info['count'] > 0) {
450                 if ($res = ldap_search($connection, "$filter,$dn", 'cn=*', array('dn'))) {
451                     $info = ldap_get_entries($connection, $res);
452                     ldap_free_result($res);
453                     foreach ($info as $i) {
454                         if (isset($i['dn'])) {
455                             ldap_delete($connection, $i['dn']);
456                         }
457                     }
458                 }
459                 if ($res = ldap_search($connection, "$filter,$dn", 'ou=*', array('dn'))) {
460                     $info = ldap_get_entries($connection, $res);
461                     ldap_free_result($res);
462                     foreach ($info as $i) {
463                         if (isset($i['dn']) and $info[0]['dn'] != $i['dn']) {
464                             ldap_delete($connection, $i['dn']);
465                         }
466                     }
467                 }
468                 ldap_delete($connection, "$filter,$dn");
469             }
470         }
471     }
473     /**
474      * Test that normalisation of the use objectclass is completed successfully.
475      *
476      * @dataProvider objectclass_fetch_provider
477      * @param string $usertype The supported user type
478      * @param string $expected The expected filter value
479      */
480     public function test_objectclass_fetch($usertype, $expected) {
481         $this->resetAfterTest();
482         // Set the user type - this must be performed before the plugin is instantiated.
483         set_config('user_type', $usertype, 'enrol_ldap');
485         // Fetch the plugin.
486         $instance = enrol_get_plugin('ldap');
488         // Use reflection to sneak a look at the plugin.
489         $rc = new ReflectionClass('enrol_ldap_plugin');
490         $rcp = $rc->getProperty('userobjectclass');
491         $rcp->setAccessible(true);
493         // Fetch the current userobjectclass value.
494         $value = $rcp->getValue($instance);
495         $this->assertEquals($expected, $value);
496     }
498     /**
499      * Data provider for the test_objectclass_fetch testcase.
500      *
501      * @return array of testcases.
502      */
503     public function objectclass_fetch_provider() {
504         return array(
505             // This is the list of values from ldap_getdefaults() normalised.
506             'edir' => array(
507                 'edir',
508                 '(objectClass=user)'
509             ),
510             'rfc2307' => array(
511                 'rfc2307',
512                 '(objectClass=posixaccount)'
513             ),
514             'rfc2307bis' => array(
515                 'rfc2307bis',
516                 '(objectClass=posixaccount)'
517             ),
518             'samba' => array(
519                 'samba',
520                 '(objectClass=sambasamaccount)'
521             ),
522             'ad' => array(
523                 'ad',
524                 '(samaccounttype=805306368)'
525             ),
526             'default' => array(
527                 'default',
528                 '(objectClass=*)'
529             ),
530         );
531     }