Skip to content

Commit b27ab45

Browse files
authored
Merge pull request #18 from jjok/add-quick-test
Add some quick end-to-end tests
2 parents 1ecd825 + fd87d09 commit b27ab45

File tree

3 files changed

+150
-0
lines changed

3 files changed

+150
-0
lines changed

composer.json

+3
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,8 @@
1818
},
1919
"suggest": {
2020
"ext-intl": "Required for IDN support"
21+
},
22+
"require-dev": {
23+
"phpunit/phpunit": "^6.5"
2124
}
2225
}

phpunit.xml

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<phpunit
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:noNamespaceSchemaLocation="http://schema.phpunit.de/6.0/phpunit.xsd"
5+
colors="true"
6+
bootstrap="vendor/autoload.php"
7+
>
8+
<testsuites>
9+
<testsuite name="LibDNS Test Suite">
10+
<directory>./tests</directory>
11+
</testsuite>
12+
</testsuites>
13+
<filter>
14+
<whitelist>
15+
<directory>./src</directory>
16+
</whitelist>
17+
</filter>
18+
</phpunit>

tests/BigEndToEndTest.php

+129
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
<?php
2+
3+
namespace LibDNS\Tests;
4+
5+
use LibDNS\Decoder\DecoderFactory;
6+
use LibDNS\Encoder\EncoderFactory;
7+
use LibDNS\Messages\Message;
8+
use LibDNS\Messages\MessageFactory;
9+
use LibDNS\Messages\MessageTypes;
10+
use LibDNS\Records\QuestionFactory;
11+
use LibDNS\Records\ResourceQTypes;
12+
use LibDNS\Records\ResourceTypes;
13+
use LibDNS\Records\TypeDefinitions\TypeDefinitionManagerFactory;
14+
use PHPUnit\Framework\TestCase;
15+
16+
final class BigEndToEndTest extends TestCase
17+
{
18+
public function testARecordQuestionCanBeEncodedIntoAPacket()
19+
{
20+
$queryName = 'google.com';
21+
22+
$question = (new QuestionFactory)->create(ResourceQTypes::A);
23+
$question->setName($queryName);
24+
25+
$request = (new MessageFactory)->create(MessageTypes::QUERY);
26+
$request->getQuestionRecords()->add($question);
27+
$request->isRecursionDesired(true);
28+
29+
$encoder = (new EncoderFactory)->create();
30+
$requestPacket = $encoder->encode($request);
31+
32+
$this->assertPacketEquals(
33+
'00000100000100000000000006676f6f676c6503636f6d0000010001',
34+
$requestPacket
35+
);
36+
}
37+
38+
public function testARecordResponseCanBeDecoded()
39+
{
40+
$responsePacket = hex2bin('00008180000100010000000006676f6f676c6503636f6d0000010001c00c000100010000012b0004d83ace6e');
41+
42+
$decoder = (new DecoderFactory)->create();
43+
$response = $decoder->decode($responsePacket);
44+
45+
$this->assertResponseCodeEquals(0, $response);
46+
$this->assertAnswersEqual(['216.58.206.110'], $response);
47+
}
48+
49+
public function testSoaRecordQuestionCanBeEncodedIntoAPacket()
50+
{
51+
$queryName = 'google.com';
52+
53+
$question = (new QuestionFactory)->create(ResourceQTypes::SOA);
54+
$question->setName($queryName);
55+
56+
$request = (new MessageFactory)->create(MessageTypes::QUERY);
57+
$request->getQuestionRecords()->add($question);
58+
$request->isRecursionDesired(true);
59+
60+
$encoder = (new EncoderFactory)->create();
61+
$requestPacket = $encoder->encode($request);
62+
63+
$this->assertPacketEquals(
64+
'00000100000100000000000006676f6f676c6503636f6d0000060001',
65+
$requestPacket
66+
);
67+
}
68+
69+
public function testSoaRecordResponseCanBeDecoded()
70+
{
71+
$responsePacket = hex2bin('00008180000100010000000006676f6f676c6503636f6d0000060001c00c000600010000003b0026036e7331c00c09646e732d61646d696ec00c0accab9e0000038400000384000007080000003c');
72+
73+
$typeDefs = (new TypeDefinitionManagerFactory)->create();
74+
$typeDefs->getTypeDefinition(ResourceTypes::SOA)->setToStringFunction(function($mname, $rname, $serial, $refresh, $retry, $expire, $minimum) {
75+
return <<<DATA
76+
{
77+
Primary Name Server : $mname
78+
Responsible Mail : $rname
79+
Serial : $serial
80+
Refresh : $refresh
81+
Retry : $retry
82+
Expire : $expire
83+
Default TTL : $minimum
84+
}
85+
DATA;
86+
});
87+
88+
$decoder = (new DecoderFactory)->create($typeDefs);
89+
$response = $decoder->decode($responsePacket);
90+
91+
$this->assertResponseCodeEquals(0, $response);
92+
93+
$answers = $response->getAnswerRecords();
94+
$this->assertCount(1, $answers);
95+
96+
$expectedFirstAnswer =
97+
'{
98+
Primary Name Server : ns1.google.com
99+
Responsible Mail : dns-admin.google.com
100+
Serial : 181185438
101+
Refresh : 900
102+
Retry : 900
103+
Expire : 1800
104+
Default TTL : 60
105+
}';
106+
$this->assertAnswersEqual([$expectedFirstAnswer], $response);
107+
}
108+
109+
private function assertPacketEquals(string $expected, string $actual)
110+
{
111+
$this->assertEquals($expected, bin2hex($actual));
112+
}
113+
114+
private function assertResponseCodeEquals(int $expected, Message $response)
115+
{
116+
$this->assertEquals($expected, $response->getResponseCode());
117+
}
118+
119+
private function assertAnswersEqual(array $expected, Message $response)
120+
{
121+
$answers = $response->getAnswerRecords();
122+
123+
$this->assertCount(count($expected), $answers);
124+
125+
foreach ($answers as $i => $answer) {
126+
$this->assertEquals($expected[$i], (string) $answer->getData());
127+
}
128+
}
129+
}

0 commit comments

Comments
 (0)