File: DnsSrvDiscovererTest.php

package info (click to toggle)
mediawiki 1%3A1.43.3%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 417,464 kB
  • sloc: php: 1,062,949; javascript: 664,290; sql: 9,714; python: 5,458; xml: 3,489; sh: 1,131; makefile: 64
file content (119 lines) | stat: -rw-r--r-- 3,014 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
<?php

namespace Wikimedia\Tests;

use DnsSrvDiscoverer;
use MediaWikiCoversValidator;
use PHPUnit\Framework\TestCase;
use stdClass;

/**
 * @covers \DnsSrvDiscoverer
 */
class DnsSrvDiscovererTest extends TestCase {

	use MediaWikiCoversValidator;

	public function testGetSrvName() {
		$dsd = new DnsSrvDiscoverer( 'etcd', 'tcp', 'an.example' );

		$this->assertSame( '_etcd._tcp.an.example', $dsd->getSrvName() );
	}

	public function testGetSrvNameWithoutDomain() {
		$dsd = new DnsSrvDiscoverer( 'etcd', 'tcp' );

		$this->assertSame( '_etcd._tcp', $dsd->getSrvName() );
	}

	public function testGetRecords() {
		$resolver = $this->mockResolver();

		$dsd = new DnsSrvDiscoverer( 'etcd', 'tcp', 'an.example', $resolver );

		$resolver
			->expects( $this->once() )
			->method( '__invoke' )
			->with( '_etcd._tcp.an.example' )
			->willReturn( [
				[ 'target' => 'foo', 'port' => '123', 'pri' => '1', 'weight' => '1' ],
				[ 'target' => 'qux', 'port' => '322', 'pri' => '2', 'weight' => '2' ],
				[ 'target' => 'bar', 'port' => '124', 'pri' => '1', 'weight' => '2' ],
				[ 'target' => 'baz', 'port' => '321', 'pri' => '2', 'weight' => '1' ],
			] );

		$this->assertSame(
			[
				[ 'target' => 'foo', 'port' => 123, 'pri' => 1, 'weight' => 1 ],
				[ 'target' => 'qux', 'port' => 322, 'pri' => 2, 'weight' => 2 ],
				[ 'target' => 'bar', 'port' => 124, 'pri' => 1, 'weight' => 2 ],
				[ 'target' => 'baz', 'port' => 321, 'pri' => 2, 'weight' => 1 ],
			],
			$dsd->getRecords()
		);
	}

	public function testGetServers() {
		$resolver = $this->mockResolver();

		$dsd = new DnsSrvDiscoverer( 'etcd', 'tcp', 'an.example', $resolver );

		$resolver
			->expects( $this->once() )
			->method( '__invoke' )
			->with( '_etcd._tcp.an.example' )
			->willReturn( [
				[ 'target' => 'foo', 'port' => '123', 'pri' => '1', 'weight' => '1' ],
				[ 'target' => 'qux', 'port' => '322', 'pri' => '2', 'weight' => '2' ],
				[ 'target' => 'bar', 'port' => '124', 'pri' => '1', 'weight' => '2' ],
				[ 'target' => 'baz', 'port' => '321', 'pri' => '2', 'weight' => '1' ],
			] );

		$servers = $dsd->getServers();
		$prio1 = array_slice( $servers, 0, 2 );
		$prio2 = array_slice( $servers, 2, 2 );

		$this->assertContains(
			[ 'foo', 123 ],
			$prio1
		);

		$this->assertContains(
			[ 'bar', 124 ],
			$prio1
		);

		$this->assertContains(
			[ 'baz', 321 ],
			$prio2
		);

		$this->assertContains(
			[ 'qux', 322 ],
			$prio2
		);
	}

	public function testGetServersNoDiscoveryResultsRfc2782() {
		$resolver = $this->mockResolver();

		$dsd = new DnsSrvDiscoverer( 'etcd', 'tcp', 'an.example', $resolver );

		$resolver
			->expects( $this->once() )
			->method( '__invoke' )
			->with( '_etcd._tcp.an.example' )
			->willReturn( [
				[ 'target' => '.', 'port' => '1', 'pri' => '1', 'weight' => '1' ],
			] );

		$this->assertSame( [], $dsd->getServers() );
	}

	private function mockResolver() {
		return $this
			->getMockBuilder( stdClass::class )
			->addMethods( [ '__invoke' ] )
			->getMock();
	}
}