ZoneTest::testFillOut()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 13

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 13
rs 9.8333
c 0
b 0
f 0
cc 1
nc 1
nop 0
1
<?php
2
3
declare(strict_types=1);
4
5
/*
6
 * This file is part of Badcow DNS Library.
7
 *
8
 * (c) Samuel Williams <[email protected]>
9
 *
10
 * For the full copyright and license information, please view the LICENSE
11
 * file that was distributed with this source code.
12
 */
13
14
namespace Badcow\DNS\Tests;
15
16
use Badcow\DNS\AlignedBuilder;
17
use Badcow\DNS\Classes;
18
use Badcow\DNS\Rdata\APL;
19
use Badcow\DNS\Rdata\Factory;
20
use Badcow\DNS\ResourceRecord;
21
use Badcow\DNS\Zone;
22
use Badcow\DNS\ZoneBuilder;
23
use PhpIP\IPBlock;
24
use PHPUnit\Framework\TestCase;
25
26
class ZoneTest extends TestCase
27
{
28
    private static function buildTestZone(): Zone
29
    {
30
        $zone = new Zone('example.com.');
31
        $zone->setDefaultTtl(3600);
32
33
        $soa = new ResourceRecord();
34
        $soa->setName('@');
35
        $soa->setRdata(Factory::SOA(
36
            '@',
37
            'post',
38
            2014110501,
39
            3600,
40
            14400,
41
            604800,
42
            3600
43
        ));
44
45
        $soa->setClass(Classes::INTERNET);
46
47
        $ns1 = new ResourceRecord();
48
        $ns1->setName('@');
49
        $ns1->setRdata(Factory::NS('ns1.nameserver.com.'));
50
51
        $ns2 = new ResourceRecord();
52
        $ns2->setName('@');
53
        $ns2->setRdata(Factory::NS('ns2.nameserver.com.'));
54
55
        $a = new ResourceRecord();
56
        $a->setName('sub.domain');
57
        $a->setRdata(Factory::A('192.168.1.42'));
58
        $a->setComment('This is a local ip.');
59
60
        $a6 = new ResourceRecord();
61
        $a6->setName('ipv6.domain');
62
        $a6->setRdata(Factory::AAAA('::1'));
63
        $a6->setComment('This is an IPv6 domain.');
64
65
        $mx1 = new ResourceRecord();
66
        $mx1->setName('@');
67
        $mx1->setRdata(Factory::MX(10, 'mail-gw1.example.net.'));
68
69
        $mx2 = new ResourceRecord();
70
        $mx2->setName('@');
71
        $mx2->setRdata(Factory::MX(20, 'mail-gw2.example.net.'));
72
73
        $mx3 = new ResourceRecord();
74
        $mx3->setName('@');
75
        $mx3->setRdata(Factory::MX(30, 'mail-gw3.example.net.'));
76
77
        $loc = new ResourceRecord();
78
        $loc->setName('canberra');
79
        $loc->setRdata(Factory::LOC(
80
            -35.3075,   //Lat
81
            149.1244,   //Lon
82
            500,        //Alt
83
            20.12,      //Size
84
            200.3,      //HP
85
            300.1       //VP
86
        ));
87
        $loc->setComment('This is Canberra');
88
89
        $srv = new ResourceRecord();
90
        $srv->setName('_ftp._tcp');
91
        $srv->setClass('IN');
92
        $srv->setRdata(Factory::SRV(10, 10, 21, 'files'));
93
94
        $zone->fromList($loc, $mx2, $srv);
95
        $zone->addResourceRecord($soa);
96
        $zone->addResourceRecord($ns1);
97
        $zone->addResourceRecord($mx3);
98
        $zone->addResourceRecord($a);
99
        $zone->addResourceRecord($a6);
100
        $zone->addResourceRecord($ns2);
101
        $zone->addResourceRecord($mx1);
102
103
        $apl = new APL();
104
        $apl->addAddressRange(IPBlock::create('192.168.0.0/23'));
105
        $apl->addAddressRange(IPBlock::create('192.168.1.64/28'), false);
106
        $apl->addAddressRange(IPBlock::create('2001:acad:1::/112'), true);
107
        $apl->addAddressRange(IPBlock::create('2001:acad:1::8/128'), false);
108
109
        $multicast = ResourceRecord::create('multicast', $apl);
110
111
        $zone->addResourceRecord($multicast);
112
113
        return $zone;
114
    }
115
116
    public function testSetName(): void
117
    {
118
        $zone = new Zone();
119
        $zone->setName('example.com.');
120
        $this->assertEquals('example.com.', $zone->getName());
121
122
        $this->expectException(\InvalidArgumentException::class);
123
        $this->expectExceptionMessage('Zone "example.com" is not a fully qualified domain name.');
124
        $zone->setName('example.com');
125
    }
126
127
    public function testFillOut(): void
128
    {
129
        $zone = self::buildTestZone();
130
        $alignedBuilder = new AlignedBuilder();
131
132
        ZoneBuilder::fillOutZone($zone);
133
        $expectation = file_get_contents(__DIR__.'/Resources/example.com_filled-out.txt');
134
135
        //This is a fix for Windows systems that may expect a carriage return char.
136
        $expectation = str_replace("\r", '', $expectation);
137
138
        $this->assertEquals($expectation, $alignedBuilder->build($zone));
139
    }
140
141
    public function testOtherFunctions(): void
142
    {
143
        $zone = TestZone::buildTestZone();
144
        $this->assertCount(15, $zone);
145
        $this->assertFalse($zone->isEmpty());
146
147
        $rr = $zone->getResourceRecords()[0];
148
        $this->assertTrue($zone->contains($rr));
149
        $this->assertTrue($zone->remove($rr));
150
        $this->assertFalse($zone->remove($rr));
151
        $this->assertFalse($zone->contains($rr));
152
153
        //Test Zone:offsetSet()
154
        $this->assertArrayNotHasKey(0, $zone);
155
        $zone[0] = $rr;
156
        $this->assertArrayHasKey(0, $zone);
157
    }
158
159
    public function testGetClassReturnsDefaultClass(): void
160
    {
161
        $a = Factory::A('192.168.1.1');
162
        $h1 = ResourceRecord::create('host1', $a, 3600);
163
        $h1->setClass(null);
164
165
        $h2 = ResourceRecord::create('host2', $a, 3600);
166
        $h2->setClass(null);
167
168
        $h3 = ResourceRecord::create('host3', $a, 3600);
169
        $h3->setClass(null);
170
171
        $zone = new Zone('example.com.');
172
        $zone->fromList($h1, $h2, $h3);
173
174
        $this->assertNull($h1->getClass());
175
        $this->assertNull($h2->getClass());
176
        $this->assertNull($h3->getClass());
177
178
        $this->assertEquals(Classes::INTERNET, $zone->getClass());
179
    }
180
181
    public function testArrayAccess(): void
182
    {
183
        $zone = TestZone::buildTestZone();
184
        $this->assertInstanceOf(ResourceRecord::class, $zone[3]);
185
        $this->assertEquals('SOA', $zone[0]->getType());
186
        unset($zone[0]);
187
        $this->assertArrayNotHasKey(0, $zone);
188
        $this->assertTrue(isset($zone[1]));
189
    }
190
}
191