Proyectos de Subversion Moodle

Rev

Rev 11 | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 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/>.
16
 
17
/**
18
 * Tests for core_message_inbound to test Variable Envelope Return Path functionality.
19
 *
20
 * @package    core_message
21
 * @copyright  2014 Andrew Nicols <andrew@nicols.co.uk>
22
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23
 */
24
 
25
namespace core_message;
26
 
27
defined('MOODLE_INTERNAL') || die();
28
require_once(__DIR__ . '/fixtures/inbound_fixtures.php');
29
 
30
/**
31
 * Tests for core_message_inbound to test Variable Envelope Return Path functionality.
32
 *
33
 * @package    core_message
34
 * @copyright  2014 Andrew Nicols <andrew@nicols.co.uk>
35
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
36
 */
1441 ariadna 37
final class inbound_test extends \advanced_testcase {
1 efrain 38
 
39
    /**
40
     * Perform setup tasks generic to each test.
41
     * This includes:
42
     * * configuring the messageinbound_mailbox.
43
     */
44
    public function setUp(): void {
45
        global $CFG;
1441 ariadna 46
        parent::setUp();
1 efrain 47
 
48
        $this->resetAfterTest(true);
49
 
50
        // Setup the default Inbound Message mailbox settings.
51
        $CFG->messageinbound_domain = 'example.com';
52
        $CFG->messageinbound_enabled = true;
53
 
54
        // Must be no longer than 15 characters.
55
        $CFG->messageinbound_mailbox = 'moodlemoodle123';
56
    }
57
 
58
    /**
59
     * Helper to create a new Inbound Message handler.
60
     *
61
     * @param $handlerclass The class of the handler to create
62
     * @param $enabled Whether the handler should be enabled
63
     * @param $component The component
64
     * @param $namepace The namepace
65
     */
66
    public function helper_create_handler($handlerclass, $enabled = true, $component = 'core_test', $namespace = '\\core\\test\\') {
67
        global $DB;
68
 
69
        $classname = $namespace . $handlerclass;
70
        $record = \core\message\inbound\manager::record_from_handler(new $classname());
71
        $record->component = $component;
72
        $record->enabled = $enabled;
73
        $record->id = $DB->insert_record('messageinbound_handlers', $record);
74
        $handler = core_message_inbound_test_manager::handler_from_record($record);
75
 
76
        return $handler;
77
    }
78
 
79
    /**
80
     * Test that the enabled check perform as expected.
81
     */
11 efrain 82
    public function test_is_enabled(): void {
1 efrain 83
        global $CFG;
84
 
85
        // First clear all of the settings set in the setUp.
86
        $CFG->messageinbound_domain = null;
87
        $CFG->messageinbound_enabled = null;
88
        $CFG->messageinbound_mailbox = null;
89
 
90
        $this->assertFalse(\core\message\inbound\manager::is_enabled());
91
 
92
        // Check whether only setting the enabled flag keeps it disabled.
93
        $CFG->messageinbound_enabled = true;
94
        $this->assertFalse(\core\message\inbound\manager::is_enabled());
95
 
96
        // Check that the mailbox entry on it's own does not enable Inbound Message handling.
97
        $CFG->messageinbound_mailbox = 'moodlemoodle123';
98
        $CFG->messageinbound_domain = null;
99
        $this->assertFalse(\core\message\inbound\manager::is_enabled());
100
 
101
        // And that the domain on it's own does not.
102
        $CFG->messageinbound_domain = 'example.com';
103
        $CFG->messageinbound_mailbox = null;
104
        $this->assertFalse(\core\message\inbound\manager::is_enabled());
105
 
106
        // And that an invalid mailbox does not.
107
        $CFG->messageinbound_mailbox = '';
108
        $CFG->messageinbound_domain = 'example.com';
109
        $this->assertFalse(\core\message\inbound\manager::is_enabled());
110
 
111
        // And that an invalid domain does not.
112
        $CFG->messageinbound_domain = '';
113
        $CFG->messageinbound_mailbox = 'moodlemoodle123';
114
        $this->assertFalse(\core\message\inbound\manager::is_enabled());
115
 
116
        // Finally a test that ensures that all settings correct enables the system.
117
        $CFG->messageinbound_mailbox = 'moodlemoodle123';
118
        $CFG->messageinbound_domain = 'example.com';
119
        $CFG->messageinbound_enabled = true;
120
 
121
        $this->assertTrue(\core\message\inbound\manager::is_enabled());
122
    }
123
 
124
    /**
125
     * Test that data items conform to RFCs 5231, and 5322 standards for
126
     * addressing, and to RFC 5233 for sub-addressing.
127
     */
11 efrain 128
    public function test_address_constraints(): void {
1 efrain 129
        $handler = $this->helper_create_handler('handler_one');
130
 
131
        // Using the handler created, generate an address for our data entry.
132
        $processor = new core_message_inbound_test_helper();
133
        $processor->set_handler($handler->classname);
134
 
135
        // Generate some IDs for the data and generate addresses for them.
136
        $dataids = array(
137
            -1,
138
            0,
139
            42,
140
            1073741823,
141
            2147483647,
142
        );
143
 
144
        $user = $this->getDataGenerator()->create_user();
145
        foreach ($dataids as $dataid) {
146
            $processor->set_data($dataid);
147
            $address = $processor->generate($user->id);
148
            $this->assertNotNull($address);
149
            $this->assertTrue(strlen($address) > 0, 'No address generated.');
150
            $this->assertTrue(strpos($address, '@') !== false, 'No domain found.');
151
            $this->assertTrue(strpos($address, '+') !== false, 'No subaddress found.');
152
 
153
            // The localpart must be less than 64 characters.
154
            list($localpart) = explode('@', $address);
155
            $this->assertTrue(strlen($localpart) <= 64, 'Localpart section of address too long');
156
 
157
            // And the data section should be no more than 48 characters.
158
            list(, $datasection) = explode('+', $localpart);
159
            $this->assertTrue(strlen($datasection) <= 48, 'Data section of address too long');
160
        }
161
    }
162
 
163
    /**
164
     * Test that the generated e-mail addresses are sufficiently random by
165
     * testing the multiple handlers, multiple users, and multiple data
166
     * items.
167
     */
11 efrain 168
    public function test_address_uniqueness(): void {
1 efrain 169
        // Generate a set of handlers. These are in two components, and each
170
        // component has two different generators.
171
        $handlers = array();
172
        $handlers[] = $this->helper_create_handler('handler_one', true, 'core_test');
173
        $handlers[] = $this->helper_create_handler('handler_two', true, 'core_test');
174
        $handlers[] = $this->helper_create_handler('handler_three', true, 'core_test_example');
175
        $handlers[] = $this->helper_create_handler('handler_four', true, 'core_test_example');
176
 
177
        // Generate some IDs for the data and generate addresses for them.
178
        $dataids = array(
179
            0,
180
            42,
181
            1073741823,
182
            2147483647,
183
        );
184
 
185
        $users = array();
186
        for ($i = 0; $i < 5; $i++) {
187
            $users[] = $this->getDataGenerator()->create_user();
188
        }
189
 
190
        // Store the addresses for later comparison.
191
        $addresses = array();
192
 
193
        foreach ($handlers as $handler) {
194
            $processor = new core_message_inbound_test_helper();
195
            $processor->set_handler($handler->classname);
196
 
197
            // Check each dataid.
198
            foreach ($dataids as $dataid) {
199
                $processor->set_data($dataid);
200
 
201
                // Check each user.
202
                foreach ($users as $user) {
203
                    $address = $processor->generate($user->id);
204
                    $this->assertFalse(isset($addresses[$address]));
205
                    $addresses[$address] = true;
206
                }
207
            }
208
        }
209
    }
210
 
211
    /**
212
     * Test address parsing of a generated address.
213
     */
11 efrain 214
    public function test_address_parsing(): void {
1 efrain 215
        $dataid = 42;
216
 
217
        // Generate a handler to use for this set of tests.
218
        $handler = $this->helper_create_handler('handler_one');
219
 
220
        // And a user.
221
        $user = $this->getDataGenerator()->create_user();
222
 
223
        // Using the handler created, generate an address for our data entry.
224
        $processor = new core_message_inbound_test_helper();
225
        $processor->set_handler($handler->classname);
226
        $processor->set_data($dataid);
227
        $address = $processor->generate($user->id);
228
 
229
        // We should be able to parse the address.
230
        $parser = new core_message_inbound_test_helper();
231
        $parser->process($address);
232
        $parsedresult = $parser->get_data();
233
        $this->assertEquals($user->id, $parsedresult->userid);
234
        $this->assertEquals($dataid, $parsedresult->datavalue);
235
        $this->assertEquals($dataid, $parsedresult->data->datavalue);
236
        $this->assertEquals($handler->id, $parsedresult->handlerid);
237
        $this->assertEquals($handler->id, $parsedresult->data->handler);
238
    }
239
 
240
    /**
241
     * Test address parsing of an address with an unrecognised format.
242
     */
11 efrain 243
    public function test_address_validation_invalid_format_failure(): void {
1 efrain 244
        // Create test data.
245
        $user = $this->getDataGenerator()->create_user();
246
        $handler = $this->helper_create_handler('handler_one');
247
        $dataid = 42;
248
 
249
        $parser = new core_message_inbound_test_helper();
250
 
251
        $generator = new core_message_inbound_test_helper();
252
        $generator->set_handler($handler->classname);
253
 
254
        // Check that validation fails when no address has been processed.
255
        $result = $parser->validate($user->email);
256
        $this->assertEquals(\core\message\inbound\address_manager::VALIDATION_INVALID_ADDRESS_FORMAT, $result);
257
 
258
        // Test that an address without data fails validation.
259
        $parser->process('bob@example.com');
260
        $result = $parser->validate($user->email);
261
        $this->assertEquals(\core\message\inbound\address_manager::VALIDATION_INVALID_ADDRESS_FORMAT, $result);
262
 
263
        // Test than address with a subaddress but invalid data fails with VALIDATION_UNKNOWN_DATAKEY.
264
        $parser->process('bob+nodata@example.com');
265
        $result = $parser->validate($user->email);
266
        $this->assertEquals(\core\message\inbound\address_manager::VALIDATION_INVALID_ADDRESS_FORMAT, $result);
267
    }
268
 
269
    /**
270
     * Test address parsing of an address with an unknown handler.
271
     */
11 efrain 272
    public function test_address_validation_unknown_handler(): void {
1 efrain 273
        global $DB;
274
 
275
        // Create test data.
276
        $user = $this->getDataGenerator()->create_user();
277
        $handler = $this->helper_create_handler('handler_one');
278
        $dataid = 42;
279
 
280
        $parser = new core_message_inbound_test_helper();
281
 
282
        $generator = new core_message_inbound_test_helper();
283
        $generator->set_handler($handler->classname);
284
        $generator->set_data($dataid);
285
        $address = $generator->generate($user->id);
286
 
287
        // Remove the handler record to invalidate it.
288
        $DB->delete_records('messageinbound_handlers', array(
289
            'id' => $handler->id,
290
        ));
291
 
292
        $parser->process($address);
293
        $result = $parser->validate($user->email);
294
        $expectedfail = \core\message\inbound\address_manager::VALIDATION_UNKNOWN_HANDLER;
295
        $this->assertEquals($expectedfail, $result & $expectedfail);
296
    }
297
 
298
    /**
299
     * Test address parsing of an address with a disabled handler.
300
     */
11 efrain 301
    public function test_address_validation_disabled_handler(): void {
1 efrain 302
        global $DB;
303
 
304
        // Create test data.
305
        $user = $this->getDataGenerator()->create_user();
306
        $handler = $this->helper_create_handler('handler_one');
307
        $dataid = 42;
308
 
309
        $parser = new core_message_inbound_test_helper();
310
 
311
        $generator = new core_message_inbound_test_helper();
312
        $generator->set_handler($handler->classname);
313
        $generator->set_data($dataid);
314
        $address = $generator->generate($user->id);
315
 
316
        // Disable the handler.
317
        $record = \core\message\inbound\manager::record_from_handler($handler);
318
        $record->enabled = false;
319
        $DB->update_record('messageinbound_handlers', $record);
320
 
321
        $parser->process($address);
322
        $result = $parser->validate($user->email);
323
        $expectedfail = \core\message\inbound\address_manager::VALIDATION_DISABLED_HANDLER;
324
        $this->assertEquals($expectedfail, $result & $expectedfail);
325
    }
326
 
327
    /**
328
     * Test address parsing of an address for an invalid user.
329
     */
11 efrain 330
    public function test_address_validation_invalid_user(): void {
1 efrain 331
        global $DB;
332
 
333
        // Create test data.
334
        $user = $this->getDataGenerator()->create_user();
335
        $handler = $this->helper_create_handler('handler_one');
336
        $dataid = 42;
337
 
338
        $parser = new core_message_inbound_test_helper();
339
 
340
        $generator = new core_message_inbound_test_helper();
341
        $generator->set_handler($handler->classname);
342
        $generator->set_data($dataid);
343
        $address = $generator->generate(-1);
344
 
345
        $parser->process($address);
346
        $result = $parser->validate($user->email);
347
        $expectedfail = \core\message\inbound\address_manager::VALIDATION_UNKNOWN_USER;
348
        $this->assertEquals($expectedfail, $result & $expectedfail);
349
    }
350
 
351
    /**
352
     * Test address parsing of an address for a disabled user.
353
     */
11 efrain 354
    public function test_address_validation_disabled_user(): void {
1 efrain 355
        global $DB;
356
 
357
        // Create test data.
358
        $user = $this->getDataGenerator()->create_user();
359
        $handler = $this->helper_create_handler('handler_one');
360
        $dataid = 42;
361
 
362
        $parser = new core_message_inbound_test_helper();
363
 
364
        $generator = new core_message_inbound_test_helper();
365
        $generator->set_handler($handler->classname);
366
        $generator->set_data($dataid);
367
        $address = $generator->generate($user->id);
368
 
369
        // Unconfirm the user.
370
        $user->confirmed = 0;
371
        $DB->update_record('user', $user);
372
 
373
        $parser->process($address);
374
        $result = $parser->validate($user->email);
375
        $expectedfail = \core\message\inbound\address_manager::VALIDATION_DISABLED_USER;
376
        $this->assertEquals($expectedfail, $result & $expectedfail);
377
    }
378
 
379
    /**
380
     * Test address parsing of an address for an invalid key.
381
     */
11 efrain 382
    public function test_address_validation_invalid_key(): void {
1 efrain 383
        global $DB;
384
 
385
        // Create test data.
386
        $user = $this->getDataGenerator()->create_user();
387
        $handler = $this->helper_create_handler('handler_one');
388
        $dataid = 42;
389
 
390
        $parser = new core_message_inbound_test_helper();
391
 
392
        $generator = new core_message_inbound_test_helper();
393
        $generator->set_handler($handler->classname);
394
        $generator->set_data($dataid);
395
        $address = $generator->generate($user->id);
396
 
397
        // Remove the data record to invalidate it.
398
        $DB->delete_records('messageinbound_datakeys', array(
399
            'handler' => $handler->id,
400
            'datavalue' => $dataid,
401
        ));
402
 
403
        $parser->process($address);
404
        $result = $parser->validate($user->email);
405
        $expectedfail = \core\message\inbound\address_manager::VALIDATION_UNKNOWN_DATAKEY;
406
        $this->assertEquals($expectedfail, $result & $expectedfail);
407
    }
408
 
409
    /**
410
     * Test address parsing of an address for an expired key.
411
     */
11 efrain 412
    public function test_address_validation_expired_key(): void {
1 efrain 413
        global $DB;
414
 
415
        // Create test data.
416
        $user = $this->getDataGenerator()->create_user();
417
        $handler = $this->helper_create_handler('handler_one');
418
        $dataid = 42;
419
 
420
        $parser = new core_message_inbound_test_helper();
421
 
422
        $generator = new core_message_inbound_test_helper();
423
        $generator->set_handler($handler->classname);
424
        $generator->set_data($dataid);
425
        $address = $generator->generate($user->id);
426
 
427
        // Expire the key by setting it's expiry time in the past.
428
        $key = $DB->get_record('messageinbound_datakeys', array(
429
            'handler' => $handler->id,
430
            'datavalue' => $dataid,
431
        ));
432
 
433
        $key->expires = time() - 3600;
434
        $DB->update_record('messageinbound_datakeys', $key);
435
 
436
        $parser->process($address);
437
        $result = $parser->validate($user->email);
438
        $expectedfail = \core\message\inbound\address_manager::VALIDATION_EXPIRED_DATAKEY;
439
        $this->assertEquals($expectedfail, $result & $expectedfail);
440
    }
441
 
442
    /**
443
     * Test address parsing of an address for an invalid hash.
444
     */
11 efrain 445
    public function test_address_validation_invalid_hash(): void {
1 efrain 446
        global $DB;
447
 
448
        // Create test data.
449
        $user = $this->getDataGenerator()->create_user();
450
        $handler = $this->helper_create_handler('handler_one');
451
        $dataid = 42;
452
 
453
        $parser = new core_message_inbound_test_helper();
454
 
455
        $generator = new core_message_inbound_test_helper();
456
        $generator->set_handler($handler->classname);
457
        $generator->set_data($dataid);
458
        $address = $generator->generate($user->id);
459
 
460
        // Expire the key by setting it's expiry time in the past.
461
        $key = $DB->get_record('messageinbound_datakeys', array(
462
            'handler' => $handler->id,
463
            'datavalue' => $dataid,
464
        ));
465
 
466
        $key->datakey = 'invalid value';
467
        $DB->update_record('messageinbound_datakeys', $key);
468
 
469
        $parser->process($address);
470
        $result = $parser->validate($user->email);
471
        $expectedfail = \core\message\inbound\address_manager::VALIDATION_INVALID_HASH;
472
        $this->assertEquals($expectedfail, $result & $expectedfail);
473
    }
474
 
475
    /**
476
     * Test address parsing of an address for an invalid sender.
477
     */
11 efrain 478
    public function test_address_validation_invalid_sender(): void {
1 efrain 479
        global $DB;
480
 
481
        // Create test data.
482
        $user = $this->getDataGenerator()->create_user();
483
        $handler = $this->helper_create_handler('handler_one');
484
        $dataid = 42;
485
 
486
        $parser = new core_message_inbound_test_helper();
487
 
488
        $generator = new core_message_inbound_test_helper();
489
        $generator->set_handler($handler->classname);
490
        $generator->set_data($dataid);
491
        $address = $generator->generate($user->id);
492
 
493
        $parser->process($address);
494
        $result = $parser->validate('incorrectuser@example.com');
495
        $expectedfail = \core\message\inbound\address_manager::VALIDATION_ADDRESS_MISMATCH;
496
        $this->assertEquals($expectedfail, $result & $expectedfail);
497
    }
498
 
499
    /**
500
     * Test address parsing of an address for an address which is correct.
501
     */
11 efrain 502
    public function test_address_validation_success(): void {
1 efrain 503
        global $DB;
504
 
505
        // Create test data.
506
        $user = $this->getDataGenerator()->create_user();
507
        $handler = $this->helper_create_handler('handler_one');
508
        $dataid = 42;
509
 
510
        $parser = new core_message_inbound_test_helper();
511
 
512
        $generator = new core_message_inbound_test_helper();
513
        $generator->set_handler($handler->classname);
514
        $generator->set_data($dataid);
515
        $address = $generator->generate($user->id);
516
 
517
        $parser->process($address);
518
        $result = $parser->validate($user->email);
519
        $this->assertEquals(\core\message\inbound\address_manager::VALIDATION_SUCCESS, $result);
520
 
521
    }
522
 
523
    /**
524
     * Test that a handler with no default expiration does not have an
525
     * expiration time applied.
526
     */
11 efrain 527
    public function test_default_hander_expiry_unlimited(): void {
1 efrain 528
        global $DB;
529
 
530
        // Set the default expiry of the handler to 0 - no expiration.
531
        $expiration = 0;
532
 
533
        // Create test data.
534
        $user = $this->getDataGenerator()->create_user();
535
        $handler = $this->helper_create_handler('handler_one');
536
 
537
        $record = \core\message\inbound\manager::record_from_handler($handler);
538
        $record->defaultexpiration = $expiration;
539
        $DB->update_record('messageinbound_handlers', $record);
540
 
541
        // Generate an address for the handler.
542
        $dataid = 42;
543
 
544
        $generator = new core_message_inbound_test_helper();
545
        $generator->set_handler($handler->classname);
546
        $generator->set_data($dataid);
547
        $address = $generator->generate($user->id);
548
 
549
        // Check that the datakey created matches the expirytime.
550
        $key = $DB->get_record('messageinbound_datakeys', array('handler' => $record->id, 'datavalue' => $dataid));
551
 
552
        $this->assertNull($key->expires);
553
    }
554
 
555
    /**
556
     * Test application of the default expiry on a handler.
557
     */
11 efrain 558
    public function test_default_hander_expiry_low(): void {
1 efrain 559
        global $DB;
560
 
561
        // Set the default expiry of the handler to 60 seconds.
562
        $expiration = 60;
563
 
564
        // Create test data.
565
        $user = $this->getDataGenerator()->create_user();
566
        $handler = $this->helper_create_handler('handler_one');
567
 
568
        $record = \core\message\inbound\manager::record_from_handler($handler);
569
        $record->defaultexpiration = $expiration;
570
        $DB->update_record('messageinbound_handlers', $record);
571
 
572
        // Generate an address for the handler.
573
        $dataid = 42;
574
 
575
        $generator = new core_message_inbound_test_helper();
576
        $generator->set_handler($handler->classname);
577
        $generator->set_data($dataid);
578
        $address = $generator->generate($user->id);
579
 
580
        // Check that the datakey created matches the expirytime.
581
        $key = $DB->get_record('messageinbound_datakeys', array('handler' => $record->id, 'datavalue' => $dataid));
582
 
583
        $this->assertEquals($key->timecreated + $expiration, $key->expires);
584
    }
585
 
586
    /**
587
     * Test application of the default expiry on a handler.
588
     */
11 efrain 589
    public function test_default_hander_expiry_medium(): void {
1 efrain 590
        global $DB;
591
 
592
        // Set the default expiry of the handler to 3600 seconds.
593
        $expiration = 3600;
594
 
595
        // Create test data.
596
        $user = $this->getDataGenerator()->create_user();
597
        $handler = $this->helper_create_handler('handler_one');
598
 
599
        $record = \core\message\inbound\manager::record_from_handler($handler);
600
        $record->defaultexpiration = $expiration;
601
        $DB->update_record('messageinbound_handlers', $record);
602
 
603
        // Generate an address for the handler.
604
        $dataid = 42;
605
 
606
        $generator = new core_message_inbound_test_helper();
607
        $generator->set_handler($handler->classname);
608
        $generator->set_data($dataid);
609
        $address = $generator->generate($user->id);
610
 
611
        // Check that the datakey created matches the expirytime.
612
        $key = $DB->get_record('messageinbound_datakeys', array('handler' => $record->id, 'datavalue' => $dataid));
613
 
614
        $this->assertEquals($key->timecreated + $expiration, $key->expires);
615
    }
616
 
617
}
618
 
619
/**
620
 * A helper function for unit testing to expose protected functions in the core_message_inbound API for testing.
621
 *
622
 * @copyright  2014 Andrew Nicols <andrew@nicols.co.uk>
623
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
624
 */
625
class core_message_inbound_test_helper extends \core\message\inbound\address_manager {
626
    /**
627
     * The validate function.
628
     *
629
     * @param string $address
630
     * @return int
631
     */
632
    public function validate($address) {
633
        return parent::validate($address);
634
    }
635
 
636
    /**
637
     * The get_data function.
638
     *
639
     * @return stdClass
640
     */
641
    public function get_data() {
642
        return parent::get_data();
643
    }
644
 
645
    /**
646
     * The address processor function.
647
     *
648
     * @param string $address
649
     * @return void
650
     */
651
    public function process($address) {
652
        return parent::process($address);
653
    }
654
}
655
 
656
/**
657
 * A helper function for unit testing to expose protected functions in the core_message_inbound API for testing.
658
 *
659
 * @copyright  2014 Andrew Nicols <andrew@nicols.co.uk>
660
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
661
 */
662
class core_message_inbound_test_manager extends \core\message\inbound\manager {
663
    /**
664
     * Helper to fetch make the handler_from_record public for unit testing.
665
     *
666
     * @param $record The handler record to fetch
667
     */
668
    public static function handler_from_record($record) {
669
        return parent::handler_from_record($record);
670
    }
671
}