Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
10.25% covered (danger)
10.25%
103 / 1005
54.55% covered (warning)
54.55%
6 / 11
CRAP
0.00% covered (danger)
0.00%
0 / 1
phpbb_version_helper_test
10.25% covered (danger)
10.25%
103 / 1005
54.55% covered (warning)
54.55%
6 / 11
98.48
0.00% covered (danger)
0.00%
0 / 1
 setUp
100.00% covered (success)
100.00%
13 / 13
100.00% covered (success)
100.00%
1 / 1
1
 is_stable_data
0.00% covered (danger)
0.00%
0 / 38
0.00% covered (danger)
0.00%
0 / 1
2
 test_is_stable
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 get_suggested_updates_data
0.00% covered (danger)
0.00%
0 / 105
0.00% covered (danger)
0.00%
0 / 1
2
 test_get_suggested_updates
100.00% covered (success)
100.00%
22 / 22
100.00% covered (success)
100.00%
1 / 1
1
 get_latest_on_current_branch_data
0.00% covered (danger)
0.00%
0 / 132
0.00% covered (danger)
0.00%
0 / 1
2
 test_get_latest_on_current_branch
100.00% covered (success)
100.00%
22 / 22
100.00% covered (success)
100.00%
1 / 1
1
 get_update_on_branch_data
0.00% covered (danger)
0.00%
0 / 291
0.00% covered (danger)
0.00%
0 / 1
2
 test_get_update_on_branch
100.00% covered (success)
100.00%
22 / 22
100.00% covered (success)
100.00%
1 / 1
1
 get_ext_update_on_branch_data
0.00% covered (danger)
0.00%
0 / 336
0.00% covered (danger)
0.00%
0 / 1
2
 test_get_ext_update_on_branch
100.00% covered (success)
100.00%
23 / 23
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2/**
3*
4* This file is part of the phpBB Forum Software package.
5*
6* @copyright (c) phpBB Limited <https://www.phpbb.com>
7* @license GNU General Public License, version 2 (GPL-2.0)
8*
9* For full copyright and license information, please see
10* the docs/CREDITS.txt file.
11*
12*/
13
14class phpbb_version_helper_test extends phpbb_test_case
15{
16    protected $cache;
17    protected $version_helper;
18
19    protected function setUp(): void
20    {
21        parent::setUp();
22
23        global $phpbb_root_path, $phpEx;
24
25        include_once($phpbb_root_path . 'includes/functions.' . $phpEx);
26
27        $this->cache = $this->getMockBuilder('\phpbb\cache\service')
28            ->disableOriginalConstructor()
29            ->getMock();
30
31        $this->version_helper = new \phpbb\version_helper(
32            $this->cache,
33            new \phpbb\config\config(array(
34                'version'    => '3.1.0',
35            )),
36            new \phpbb\file_downloader()
37        );
38    }
39
40    public static function is_stable_data()
41    {
42        return array(
43            array(
44                '3.0.0-a1',
45                false,
46            ),
47            array(
48                '3.0.0-b1',
49                false,
50            ),
51            array(
52                '3.0.0-rc1',
53                false,
54            ),
55            array(
56                '3.0.0-RC1',
57                false,
58            ),
59            array(
60                '3.0.0',
61                true,
62            ),
63            array(
64                '3.0.0-pl1',
65                true,
66            ),
67            array(
68                '3.0.0.1-pl1',
69                true,
70            ),
71            array(
72                '3.1-dev',
73                false,
74            ),
75            array(
76                'foobar',
77                false,
78            ),
79        );
80    }
81
82    /**
83    * @dataProvider is_stable_data
84    */
85    public function test_is_stable($version, $expected)
86    {
87        $this->assertSame($expected, $this->version_helper->is_stable($version));
88    }
89
90    public static function get_suggested_updates_data()
91    {
92        return [
93            [
94                '1.0.0',
95                [
96                    '1.0'    => [
97                        'current'        => '1.0.1',
98                    ],
99                    '1.1'    => [
100                        'current'        => '1.1.1',
101                    ],
102                ],
103                [
104                    '1.0'    => [
105                        'current'        => '1.0.1',
106                    ],
107                    '1.1'    => [
108                        'current'        => '1.1.1',
109                    ],
110                ],
111            ],
112            [
113                '1.0.1',
114                [
115                    '1.0'    => [
116                        'current'        => '1.0.1',
117                    ],
118                    '1.1'    => [
119                        'current'        => '1.1.1',
120                    ],
121                ],
122                [
123                    '1.1'    => [
124                        'current'        => '1.1.1',
125                    ],
126                ],
127            ],
128            [
129                '1.0.1-a1',
130                [
131                    '1.0'    => [
132                        'current'        => '1.0.1-a2',
133                    ],
134                    '1.1'    => [
135                        'current'        => '1.1.0',
136                    ],
137                ],
138                [
139                    '1.0'    => [
140                        'current'        => '1.0.1-a2',
141                    ],
142                    '1.1'    => [
143                        'current'        => '1.1.0',
144                    ],
145                ],
146            ],
147            [
148                '1.1.0',
149                [
150                    '1.0'    => [
151                        'current'        => '1.0.1',
152                    ],
153                    '1.1'    => [
154                        'current'        => '1.1.1',
155                    ],
156                ],
157                [
158                    '1.1'    => [
159                        'current'        => '1.1.1',
160                    ],
161                ],
162            ],
163            [
164                '1.1.1',
165                [
166                    '1.0'    => [
167                        'current'        => '1.0.1',
168                    ],
169                    '1.1'    => [
170                        'current'        => '1.1.1',
171                    ],
172                ],
173                [],
174            ],
175            [
176                '1.1.0-a1',
177                [
178                    '1.0'    => [
179                        'current'        => '1.0.1',
180                    ],
181                    '1.1'    => [
182                        'current'        => '1.1.0-a2',
183                    ],
184                ],
185                [
186                    '1.1'    => [
187                        'current'        => '1.1.0-a2',
188                    ],
189                ],
190            ],
191            [
192                '1.1.0',
193                [],
194                [],
195            ],
196        ];
197    }
198
199    /**
200    * @dataProvider get_suggested_updates_data
201    */
202    public function test_get_suggested_updates($current_version, $versions, $expected)
203    {
204        global $phpbb_root_path, $phpEx;
205
206        $lang_loader = new \phpbb\language\language_file_loader($phpbb_root_path, $phpEx);
207        $lang = new \phpbb\language\language($lang_loader);
208
209        $version_helper = $this
210            ->getMockBuilder('\phpbb\version_helper')
211            ->onlyMethods(array(
212                'get_versions_matching_stability',
213            ))
214            ->setConstructorArgs(array(
215                $this->cache,
216                new \phpbb\config\config(array(
217                    'version'    => $current_version,
218                )),
219                new \phpbb\file_downloader(),
220                new \phpbb\user($lang, '\phpbb\datetime'),
221            ))
222            ->getMock()
223        ;
224
225        $version_helper->expects($this->any())
226            ->method('get_versions_matching_stability')
227            ->will($this->returnValue($versions));
228
229        $this->assertSame($expected, $version_helper->get_suggested_updates());
230    }
231
232    public static function get_latest_on_current_branch_data(): array
233    {
234        return [
235            'stable1.0_update_same_branch' => [
236                '1.0.0',
237                [
238                    '1.0'    => [
239                        'current'        => '1.0.1',
240                    ],
241                    '1.1'    => [
242                        'current'        => '1.1.1',
243                    ],
244                ],
245                '1.0.1',
246            ],
247            'stable1.0_no_update_same_branch' => [
248                '1.0.1',
249                [
250                    '1.0'    => [
251                        'current'        => '1.0.1',
252                    ],
253                    '1.1'    => [
254                        'current'        => '1.1.1',
255                    ],
256                ],
257                '1.0.1',
258            ],
259            'stable1.0_eol_branch' => [
260                '1.0.1',
261                [
262                    '1.0'    => [
263                        'current'        => '1.0.1',
264                        'eol'            => true,
265                    ],
266                    '1.1'    => [
267                        'current'        => '1.1.1',
268                    ],
269                ],
270                '1.1.1',
271            ],
272            'stable1.0_security_update' => [
273                '1.0.1',
274                [
275                    '1.0'    => [
276                        'current'        => '1.0.2',
277                        'eol'            => false,
278                        'security'        => '1.0.2'
279                    ],
280                    '1.1'    => [
281                        'current'        => '1.1.1',
282                    ],
283                ],
284                '1.0.2',
285            ],
286            'stable1.0_security_update_newer_branch' => [
287                '1.0.1',
288                [
289                    '1.0'    => [
290                        'current'        => '1.0.2',
291                        'eol'            => false,
292                        'security'        => '1.1.1'
293                    ],
294                    '1.1'    => [
295                        'current'        => '1.1.1',
296                    ],
297                ],
298                // Special case: Latest on current branch is still 1.0.2, the update will be recommended
299                // as update either way by get_update_on_branch
300                '1.0.2',
301            ],
302            'unstable1.0_update_same_branch' => [
303                '1.0.1-a1',
304                [
305                    '1.0'    => [
306                        'current'        => '1.0.1-a2',
307                    ],
308                    '1.1'    => [
309                        'current'        => '1.1.0',
310                    ],
311                ],
312                '1.0.1-a2',
313            ],
314            'stable1.1_update_same_branch' => [
315                '1.1.0',
316                [
317                    '1.0'    => [
318                        'current'        => '1.0.1',
319                    ],
320                    '1.1'    => [
321                        'current'        => '1.1.1',
322                    ],
323                ],
324                '1.1.1',
325            ],
326            'stable1.1_no_update_same_branch' => [
327                '1.1.1',
328                [
329                    '1.0'    => [
330                        'current'        => '1.0.1',
331                    ],
332                    '1.1'    => [
333                        'current'        => '1.1.1',
334                    ],
335                ],
336                '1.1.1',
337            ],
338            'unstable1.1_update_same_branch' => [
339                '1.1.0-a1',
340                [
341                    '1.0'    => [
342                        'current'        => '1.0.1',
343                    ],
344                    '1.1'    => [
345                        'current'        => '1.1.0-a2',
346                    ],
347                ],
348                '1.1.0-a2',
349            ],
350            'unstable1.0_update_newer_branch' => [
351                '1.0.2-a1',
352                [
353                    '1.0'    => [
354                        'current'        => '1.0.1',
355                    ],
356                    '1.1'    => [
357                        'current'        => '1.1.0-a2',
358                    ],
359                ],
360                '1.0.1',
361            ],
362            'no_update_data' => [
363                '1.1.0',
364                [],
365                '',
366            ],
367        ];
368    }
369
370    /**
371    * @dataProvider get_latest_on_current_branch_data
372    */
373    public function test_get_latest_on_current_branch($current_version, $versions, $expected)
374    {
375        global $phpbb_root_path, $phpEx;
376
377        $lang_loader = new \phpbb\language\language_file_loader($phpbb_root_path, $phpEx);
378        $lang = new \phpbb\language\language($lang_loader);
379
380        $version_helper = $this
381            ->getMockBuilder('\phpbb\version_helper')
382            ->onlyMethods(array(
383                'get_versions_matching_stability',
384            ))
385            ->setConstructorArgs(array(
386                $this->cache,
387                new \phpbb\config\config(array(
388                    'version'    => $current_version,
389                )),
390                new \phpbb\file_downloader(),
391                new \phpbb\user($lang, '\phpbb\datetime'),
392            ))
393            ->getMock()
394        ;
395
396        $version_helper->expects($this->any())
397            ->method('get_versions_matching_stability')
398            ->will($this->returnValue($versions));
399
400        $this->assertSame($expected, $version_helper->get_latest_on_current_branch());
401    }
402
403    public static function get_update_on_branch_data(): array
404    {
405        return [
406            '1.0_with_in_branch_update' => [
407                '1.0.0',
408                [
409                    '1.0'    => [
410                        'current'        => '1.0.1',
411                        'eol'        => false,
412                        'security'    => false,
413                    ],
414                    '1.1'    => [
415                        'current'        => '1.1.1',
416                        'eol'        => false,
417                        'security'    => false,
418                    ],
419                ],
420                [
421                    'current'        => '1.0.1',
422                    'eol'        => false,
423                    'security'    => false,
424                ],
425            ],
426            '1.0_without_update' => [
427                '1.0.1',
428                [
429                    '1.0'    => [
430                        'current'        => '1.0.1',
431                        'eol'        => false,
432                        'security'    => false,
433                    ],
434                    '1.1'    => [
435                        'current'        => '1.1.1',
436                        'eol'        => false,
437                        'security'    => false,
438                    ],
439                ],
440                [],
441            ],
442            '1.0_eol' => [
443                '1.0.1',
444                [
445                    '1.0'    => [
446                        'current'        => '1.0.1',
447                        'eol'        => true,
448                        'security'    => false,
449                    ],
450                    '1.1'    => [
451                        'current'        => '1.1.1',
452                        'eol'        => false,
453                        'security'    => false,
454                    ],
455                ],
456                [
457                    'current' => '1.1.1',
458                    'eol' => false,
459                    'security' => false,
460                ],
461            ],
462            '1.0_security_update' => [
463                '1.0.1',
464                [
465                    '1.0'    => [
466                        'current'        => '1.0.3',
467                        'eol'        => false,
468                        'security'    => '1.0.3',
469                    ],
470                    '1.1'    => [
471                        'current'        => '1.1.1',
472                        'eol'        => false,
473                        'security'    => false,
474                    ],
475                ],
476                [
477                    'current' => '1.0.3',
478                    'eol' => false,
479                    'security' => '1.0.3',
480                ],
481            ],
482            '1.0_security_update_with_1.1' => [
483                '1.0.1',
484                [
485                    '1.0'    => [
486                        'current'        => '1.0.1',
487                        'eol'        => false,
488                        'security'    => '1.1.0',
489                    ],
490                    '1.1'    => [
491                        'current'        => '1.1.1',
492                        'eol'        => false,
493                        'security'    => false,
494                    ],
495                ],
496                [
497                    'current' => '1.1.1',
498                    'eol' => false,
499                    'security' => false,
500                ],
501            ],
502            '1.0_with_alpha_update' => [
503                '1.0.1-a1',
504                [
505                    '1.0'    => [
506                        'current'        => '1.0.1-a2',
507                        'eol'        => false,
508                        'security'    => false,
509                    ],
510                    '1.1'    => [
511                        'current'        => '1.1.0',
512                        'eol'        => false,
513                        'security'    => false,
514                    ],
515                ],
516                [
517                    'current'        => '1.0.1-a2',
518                    'eol'        => false,
519                    'security'    => false,
520                ],
521            ],
522            '1.0rc1_update_on_newer_branch' => [
523                '1.0.2-RC1',
524                [
525                    '1.0'    => [
526                        'current'        => '1.0.1',
527                        'eol'        => false,
528                        'security'    => false,
529                    ],
530                    '1.1'    => [
531                        'current'        => '1.1.0',
532                        'eol'        => false,
533                        'security'    => false,
534                    ],
535                ],
536                [],
537            ],
538            '1.1_with_in_branch_update' => [
539                '1.1.0',
540                [
541                    '1.0'    => [
542                        'current'        => '1.0.1',
543                        'eol'        => false,
544                        'security'    => false,
545                    ],
546                    '1.1'    => [
547                        'current'        => '1.1.1',
548                        'eol'        => false,
549                        'security'    => false,
550                    ],
551                ],
552                [
553                    'current'        => '1.1.1',
554                    'eol'        => false,
555                    'security'    => false,
556                ],
557            ],
558            '1.1_without_update' => [
559                '1.1.1',
560                [
561                    '1.0'    => [
562                        'current'        => '1.0.1',
563                        'eol'        => false,
564                        'security'    => false,
565                    ],
566                    '1.1'    => [
567                        'current'        => '1.1.1',
568                        'eol'        => false,
569                        'security'    => false,
570                    ],
571                ],
572                [],
573            ],
574            '1.1_with_alpha_update' => [
575                '1.1.0-a1',
576                [
577                    '1.0'    => [
578                        'current'        => '1.0.1',
579                        'eol'        => false,
580                        'security'    => false,
581                    ],
582                    '1.1'    => [
583                        'current'        => '1.1.0-a2',
584                        'eol'        => false,
585                        'security'    => false,
586                    ],
587                ],
588                [
589                    'current'        => '1.1.0-a2',
590                    'eol'        => false,
591                    'security'    => false,
592                ],
593            ],
594            [
595                '1.1.0',
596                [],
597                [],
598            ],
599            // Latest safe release is 1.0.1
600            [
601                '1.0.0',
602                [
603                    '1.0'    => [
604                        'current'        => '1.0.1',
605                        'eol'            => false,
606                        'security'        => '1.0.1',
607                    ],
608                    '1.1'    => [
609                        'current'        => '1.1.1',
610                        'eol'        => false,
611                        'security'    => false,
612                    ],
613                ],
614                [
615                    'current'        => '1.0.1',
616                    'eol'            => false,
617                    'security'        => '1.0.1',
618                ],
619            ],
620            // Latest safe release is 1.0.0
621            [
622                '1.0.0',
623                [
624                    '1.0'    => [
625                        'current'        => '1.0.1',
626                        'eol'            => false,
627                        'security'        => '1.0.0',
628                    ],
629                    '1.1'    => [
630                        'current'        => '1.1.1',
631                        'eol'        => false,
632                        'security'    => false,
633                    ],
634                ],
635                [
636                    'current'        => '1.0.1',
637                    'eol'            => false,
638                    'security'        => '1.0.0',
639                ],
640            ],
641            // Latest safe release is 1.1.0
642            [
643                '1.0.0',
644                [
645                    '1.0'    => [
646                        'current'        => '1.0.1',
647                        'eol'            => false,
648                        'security'        => '1.1.0',
649                    ],
650                    '1.1'    => [
651                        'current'        => '1.1.1',
652                        'eol'        => false,
653                        'security'    => false,
654                    ],
655                ],
656                [
657                    'current'        => '1.1.1',
658                    'eol'        => false,
659                    'security'    => false,
660                ],
661            ],
662            // Latest 1.0 release is EOL
663            [
664                '1.0.0',
665                [
666                    '1.0'    => [
667                        'current'        => '1.0.1',
668                        'eol'            => true,
669                        'security'    => false,
670                    ],
671                    '1.1'    => [
672                        'current'        => '1.1.1',
673                        'eol'        => false,
674                        'security'    => false,
675                    ],
676                ],
677                [
678                    'current'        => '1.1.1',
679                    'eol'        => false,
680                    'security'    => false,
681                ],
682            ],
683            // All are EOL -- somewhat undefined behavior
684            [
685                '1.0.0',
686                [
687                    '1.0'    => [
688                        'current'        => '1.0.1',
689                        'eol'            => true,
690                        'security'        => false,
691                    ],
692                    '1.1'    => [
693                        'current'        => '1.1.1',
694                        'eol'            => true,
695                        'security'        => false,
696                    ],
697                ],
698                [],
699            ],
700        ];
701    }
702
703    /**
704     * @dataProvider get_update_on_branch_data
705     */
706    public function test_get_update_on_branch($current_version, $versions, $expected)
707    {
708        global $phpbb_root_path, $phpEx;
709
710        $lang_loader = new \phpbb\language\language_file_loader($phpbb_root_path, $phpEx);
711        $lang = new \phpbb\language\language($lang_loader);
712
713        $version_helper = $this
714            ->getMockBuilder('\phpbb\version_helper')
715            ->onlyMethods(array(
716                'get_versions_matching_stability',
717            ))
718            ->setConstructorArgs(array(
719                $this->cache,
720                new \phpbb\config\config(array(
721                    'version'    => $current_version,
722                )),
723                new \phpbb\file_downloader(),
724                new \phpbb\user($lang, '\phpbb\datetime'),
725            ))
726            ->getMock()
727        ;
728
729        $version_helper->expects($this->any())
730            ->method('get_versions_matching_stability')
731            ->will($this->returnValue($versions));
732
733        $this->assertSame($expected, $version_helper->get_update_on_branch());
734    }
735
736    public static function get_ext_update_on_branch_data()
737    {
738        return array(
739            // Single branch, check version for current branch
740            array(
741                '3.1.0',
742                '1.0.0',
743                array(
744                    '3.1'    => array(
745                        'current'        => '1.0.1',
746                        'eol'        => false,
747                        'security'    => false,
748                    ),
749                ),
750                array(
751                    'current'        => '1.0.1',
752                    'eol'        => false,
753                    'security'    => false,
754                ),
755            ),
756            array(
757                '3.1.0',
758                '1.0.1',
759                array(
760                    '3.1'    => array(
761                        'current'        => '1.0.1',
762                        'eol'        => false,
763                        'security'    => false,
764                    ),
765                ),
766                array(),
767            ),
768            array(
769                '3.2.0',
770                '1.0.0',
771                array(
772                    '3.2'    => array(
773                        'current'        => '1.1.1',
774                        'eol'        => false,
775                        'security'    => false,
776                    ),
777                ),
778                array(
779                    'current'        => '1.1.1',
780                    'eol'        => false,
781                    'security'    => false,
782                ),
783            ),
784            array(
785                '3.2.0',
786                '1.1.1',
787                array(
788                    '3.2'    => array(
789                        'current'        => '1.1.1',
790                        'eol'        => false,
791                        'security'    => false,
792                    ),
793                ),
794                array(),
795            ),
796            // Single branch, check for newest version when branches don't match up
797            array(
798                '3.1.0',
799                '1.0.0',
800                array(
801                    '3.2'    => array(
802                        'current'        => '1.1.1',
803                        'eol'        => false,
804                        'security'    => false,
805                    ),
806                ),
807                array(
808                    'current'        => '1.1.1',
809                    'eol'        => false,
810                    'security'    => false,
811                ),
812            ),
813            array(
814                '3.1.0',
815                '1.1.1',
816                array(
817                    '3.2'    => array(
818                        'current'        => '1.1.1',
819                        'eol'        => false,
820                        'security'    => false,
821                    ),
822                ),
823                array(),
824            ),
825            array(
826                '3.2.0',
827                '1.0.0',
828                array(
829                    '3.1'    => array(
830                        'current'        => '1.0.1',
831                        'eol'        => false,
832                        'security'    => false,
833                    ),
834                ),
835                array(
836                    'current'        => '1.0.1',
837                    'eol'        => false,
838                    'security'    => false,
839                ),
840            ),
841            array(
842                '3.2.0',
843                '1.0.1',
844                array(
845                    '3.1'    => array(
846                        'current'        => '1.0.1',
847                        'eol'        => false,
848                        'security'    => false,
849                    ),
850                ),
851                array(),
852            ),
853            array(
854                '3.3.0',
855                '1.0.0',
856                array(
857                    '3.2'    => array(
858                        'current'        => '1.1.1',
859                        'eol'        => false,
860                        'security'    => false,
861                    ),
862                ),
863                array(
864                    'current'        => '1.1.1',
865                    'eol'        => false,
866                    'security'    => false,
867                ),
868            ),
869            array(
870                '3.3.0',
871                '1.1.1',
872                array(
873                    '3.2'    => array(
874                        'current'        => '1.1.1',
875                        'eol'        => false,
876                        'security'    => false,
877                    ),
878                ),
879                array(),
880            ),
881            // Multiple branches, check version for current branch
882            array(
883                '3.1.0',
884                '1.0.0',
885                array(
886                    '3.1'    => array(
887                        'current'        => '1.0.1',
888                        'eol'        => false,
889                        'security'    => false,
890                    ),
891                    '3.2'    => array(
892                        'current'        => '1.1.1',
893                        'eol'        => false,
894                        'security'    => false,
895                    ),
896                ),
897                array(
898                    'current'        => '1.0.1',
899                    'eol'        => false,
900                    'security'    => false,
901                ),
902            ),
903            array(
904                '3.1.0',
905                '1.0.1',
906                array(
907                    '3.1'    => array(
908                        'current'        => '1.0.1',
909                        'eol'        => false,
910                        'security'    => false,
911                    ),
912                    '3.2'    => array(
913                        'current'        => '1.1.1',
914                        'eol'        => false,
915                        'security'    => false,
916                    ),
917                ),
918                array(),
919            ),
920            array(
921                '3.1.0',
922                '1.1.1',
923                array(
924                    '3.1'    => array(
925                        'current'        => '1.0.1',
926                        'eol'        => false,
927                        'security'    => false,
928                    ),
929                    '3.2'    => array(
930                        'current'        => '1.1.1',
931                        'eol'        => false,
932                        'security'    => false,
933                    ),
934                ),
935                array(),
936            ),
937            array(
938                '3.2.0',
939                '1.0.0',
940                array(
941                    '3.1'    => array(
942                        'current'        => '1.0.1',
943                        'eol'        => false,
944                        'security'    => false,
945                    ),
946                    '3.2'    => array(
947                        'current'        => '1.1.1',
948                        'eol'        => false,
949                        'security'    => false,
950                    ),
951                ),
952                array(
953                    'current'        => '1.1.1',
954                    'eol'        => false,
955                    'security'    => false,
956                ),
957            ),
958            array(
959                '3.2.0',
960                '1.0.1',
961                array(
962                    '3.1'    => array(
963                        'current'        => '1.0.1',
964                        'eol'        => false,
965                        'security'    => false,
966                    ),
967                    '3.2'    => array(
968                        'current'        => '1.1.1',
969                        'eol'        => false,
970                        'security'    => false,
971                    ),
972                ),
973                array(
974                    'current'        => '1.1.1',
975                    'eol'        => false,
976                    'security'    => false,
977                ),
978            ),
979            array(
980                '3.2.0',
981                '1.1.1',
982                array(
983                    '3.1'    => array(
984                        'current'        => '1.0.1',
985                        'eol'        => false,
986                        'security'    => false,
987                    ),
988                    '3.2'    => array(
989                        'current'        => '1.1.1',
990                        'eol'        => false,
991                        'security'    => false,
992                    ),
993                ),
994                array(),
995            ),
996            // Multiple branches, check for newest version when branches don't match up
997            array(
998                '3.3.0',
999                '1.0.0',
1000                array(
1001                    '3.1'    => array(
1002                        'current'        => '1.0.1',
1003                        'eol'        => false,
1004                        'security'    => false,
1005                    ),
1006                    '3.2'    => array(
1007                        'current'        => '1.1.1',
1008                        'eol'        => false,
1009                        'security'    => false,
1010                    ),
1011                ),
1012                array(
1013                    'current'        => '1.1.1',
1014                    'eol'        => false,
1015                    'security'    => false,
1016                ),
1017            ),
1018            array(
1019                '3.3.0',
1020                '1.0.1',
1021                array(
1022                    '3.1'    => array(
1023                        'current'        => '1.0.1',
1024                        'eol'        => false,
1025                        'security'    => false,
1026                    ),
1027                    '3.2'    => array(
1028                        'current'        => '1.1.1',
1029                        'eol'        => false,
1030                        'security'    => false,
1031                    ),
1032                ),
1033                array(
1034                    'current'        => '1.1.1',
1035                    'eol'        => false,
1036                    'security'    => false,
1037                ),
1038            ),
1039            array(
1040                '3.3.0',
1041                '1.1.0',
1042                array(
1043                    '3.1'    => array(
1044                        'current'        => '1.0.1',
1045                        'eol'        => false,
1046                        'security'    => false,
1047                    ),
1048                    '3.2'    => array(
1049                        'current'        => '1.1.1',
1050                        'eol'        => false,
1051                        'security'    => false,
1052                    ),
1053                ),
1054                array(
1055                    'current'        => '1.1.1',
1056                    'eol'        => false,
1057                    'security'    => false,
1058                ),
1059            ),
1060            array(
1061                '3.3.0',
1062                '1.1.1',
1063                array(
1064                    '3.1'    => array(
1065                        'current'        => '1.0.1',
1066                        'eol'        => false,
1067                        'security'    => false,
1068                    ),
1069                    '3.2'    => array(
1070                        'current'        => '1.1.1',
1071                        'eol'        => false,
1072                        'security'    => false,
1073                    ),
1074                ),
1075                array(),
1076            ),
1077        );
1078    }
1079
1080    /**
1081     * @dataProvider get_ext_update_on_branch_data
1082     */
1083    public function test_get_ext_update_on_branch($phpbb_version, $ext_version, $versions, $expected)
1084    {
1085        global $phpbb_root_path, $phpEx;
1086
1087        $lang_loader = new \phpbb\language\language_file_loader($phpbb_root_path, $phpEx);
1088        $lang = new \phpbb\language\language($lang_loader);
1089
1090        $version_helper = $this
1091            ->getMockBuilder('\phpbb\version_helper')
1092            ->onlyMethods(array(
1093                'get_versions_matching_stability',
1094            ))
1095            ->setConstructorArgs(array(
1096                $this->cache,
1097                new \phpbb\config\config(array(
1098                    'version'    => $phpbb_version,
1099                )),
1100                new \phpbb\file_downloader(),
1101                new \phpbb\user($lang, '\phpbb\datetime'),
1102            ))
1103            ->getMock()
1104        ;
1105
1106        $version_helper->expects($this->any())
1107            ->method('get_versions_matching_stability')
1108            ->will($this->returnValue($versions));
1109
1110        $version_helper->set_current_version($ext_version);
1111
1112        $this->assertSame($expected, $version_helper->get_ext_update_on_branch());
1113    }
1114}