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