1   /*
2    *  Licensed to the Apache Software Foundation (ASF) under one
3    *  or more contributor license agreements.  See the NOTICE file
4    *  distributed with this work for additional information
5    *  regarding copyright ownership.  The ASF licenses this file
6    *  to you under the Apache License, Version 2.0 (the
7    *  "License"); you may not use this file except in compliance
8    *  with the License.  You may obtain a copy of the License at
9    *  
10   *    http://www.apache.org/licenses/LICENSE-2.0
11   *  
12   *  Unless required by applicable law or agreed to in writing,
13   *  software distributed under the License is distributed on an
14   *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   *  KIND, either express or implied.  See the License for the
16   *  specific language governing permissions and limitations
17   *  under the License. 
18   *  
19   */
20  package org.apache.directory.server.dns;
21  
22  
23  import java.io.IOException;
24  import java.io.InputStream;
25  import java.net.InetAddress;
26  import java.net.UnknownHostException;
27  import java.util.ArrayList;
28  import java.util.Collections;
29  import java.util.List;
30  
31  import junit.framework.TestCase;
32  
33  import org.apache.directory.server.dns.messages.DnsMessage;
34  import org.apache.directory.server.dns.messages.DnsMessageModifier;
35  import org.apache.directory.server.dns.messages.MessageType;
36  import org.apache.directory.server.dns.messages.OpCode;
37  import org.apache.directory.server.dns.messages.QuestionRecord;
38  import org.apache.directory.server.dns.messages.RecordClass;
39  import org.apache.directory.server.dns.messages.RecordType;
40  import org.apache.directory.server.dns.messages.ResourceRecord;
41  import org.apache.directory.server.dns.messages.ResourceRecordModifier;
42  import org.apache.directory.server.dns.messages.ResponseCode;
43  import org.apache.directory.server.dns.store.DnsAttribute;
44  import org.apache.mina.common.ByteBuffer;
45  
46  
47  /**
48   * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
49   * @version $Rev: 547511 $, $Date: 2007-06-15 05:31:38 +0200 (Fr, 15 Jun 2007) $
50   */
51  public abstract class AbstractDnsTestCase extends TestCase
52  {
53      protected static final int MINIMUM_DNS_DATAGRAM_SIZE = 576;
54  
55  
56      protected ByteBuffer getTestQueryByteBuffer() throws IOException
57      {
58          return getByteBufferFromFile( "DNS-QUERY.pdu" );
59      }
60  
61  
62      protected ByteBuffer getTestResponseByteBuffer() throws IOException
63      {
64          return getByteBufferFromFile( "DNS-RESPONSE.pdu" );
65      }
66  
67  
68      protected ByteBuffer getTestMxQueryByteBuffer() throws IOException
69      {
70          return getByteBufferFromFile( "MX-QUERY.pdu" );
71      }
72  
73  
74      protected ByteBuffer getTestMxResponseByteBuffer() throws IOException
75      {
76          return getByteBufferFromFile( "MX-RESPONSE.pdu" );
77      }
78  
79  
80      protected ByteBuffer getByteBufferFromFile( String file ) throws IOException
81      {
82          InputStream is = getClass().getResourceAsStream( file );
83  
84          byte[] bytes = new byte[MINIMUM_DNS_DATAGRAM_SIZE];
85  
86          int offset = 0;
87          int numRead = 0;
88          while ( offset < bytes.length && ( numRead = is.read( bytes, offset, bytes.length - offset ) ) >= 0 )
89          {
90              offset += numRead;
91          }
92  
93          is.close();
94  
95          return ByteBuffer.wrap( bytes );
96      }
97  
98  
99      protected DnsMessage getTestQuery()
100     {
101         DnsMessageModifier modifier = new DnsMessageModifier();
102         modifier.setTransactionId( ( short ) 27799 );
103         modifier.setMessageType( MessageType.QUERY );
104         modifier.setOpCode( OpCode.QUERY );
105         modifier.setRecursionDesired( true );
106         modifier.setQuestionRecords( Collections.singletonList( getTestQuestionRecord() ) );
107         modifier.setResponseCode( ResponseCode.NO_ERROR );
108         modifier.setAnswerRecords( new ArrayList<ResourceRecord>() );
109         modifier.setAuthorityRecords( new ArrayList<ResourceRecord>() );
110         modifier.setAdditionalRecords( new ArrayList<ResourceRecord>() );
111         return modifier.getDnsMessage();
112     }
113 
114 
115     protected QuestionRecord getTestQuestionRecord()
116     {
117         return new QuestionRecord( "www.example.com", RecordType.A, RecordClass.IN );
118     }
119 
120 
121     protected DnsMessage getTestMxQuery()
122     {
123         DnsMessageModifier modifier = new DnsMessageModifier();
124         modifier.setTransactionId( 51511 );
125         modifier.setMessageType( MessageType.QUERY );
126         modifier.setOpCode( OpCode.QUERY );
127         modifier.setRecursionDesired( true );
128         modifier.setQuestionRecords( Collections.singletonList( getTestMxQuestionRecord() ) );
129         modifier.setResponseCode( ResponseCode.NO_ERROR );
130         modifier.setAnswerRecords( new ArrayList<ResourceRecord>() );
131         modifier.setAuthorityRecords( new ArrayList<ResourceRecord>() );
132         modifier.setAdditionalRecords( new ArrayList<ResourceRecord>() );
133         return modifier.getDnsMessage();
134     }
135 
136 
137     protected QuestionRecord getTestMxQuestionRecord()
138     {
139         return new QuestionRecord( "apache.org", RecordType.MX, RecordClass.IN );
140     }
141 
142 
143     protected DnsMessage getTestMxResponse() throws UnknownHostException
144     {
145         DnsMessageModifier modifier = new DnsMessageModifier();
146         modifier.setTransactionId( 51511 );
147         modifier.setMessageType( MessageType.RESPONSE );
148         modifier.setOpCode( OpCode.QUERY );
149         modifier.setRecursionDesired( true );
150         modifier.setRecursionAvailable( true );
151         modifier.setQuestionRecords( Collections.singletonList( getTestMxQuestionRecord() ) );
152         modifier.setResponseCode( ResponseCode.NO_ERROR );
153         modifier.setAnswerRecords( getTestMxAnswerRecords() );
154         modifier.setAuthorityRecords( getTestMxAuthorityRecords() );
155         modifier.setAdditionalRecords( getTestMxAdditionalRecords() );
156         return modifier.getDnsMessage();
157     }
158 
159 
160     protected List<ResourceRecord> getTestMxAnswerRecords()
161     {
162         List<ResourceRecord> records = new ArrayList<ResourceRecord>();
163 
164         ResourceRecordModifier modifier = new ResourceRecordModifier();
165         modifier.setDnsName( "apache.org" );
166         modifier.setDnsType( RecordType.MX );
167         modifier.setDnsClass( RecordClass.IN );
168         modifier.setDnsTtl( 267 );
169         modifier.put( DnsAttribute.MX_PREFERENCE, "10" );
170         modifier.put( DnsAttribute.DOMAIN_NAME, "herse.apache.org" );
171         records.add( modifier.getEntry() );
172 
173         modifier = new ResourceRecordModifier();
174         modifier.setDnsName( "apache.org" );
175         modifier.setDnsType( RecordType.MX );
176         modifier.setDnsClass( RecordClass.IN );
177         modifier.setDnsTtl( 267 );
178         modifier.put( DnsAttribute.MX_PREFERENCE, "20" );
179         modifier.put( DnsAttribute.DOMAIN_NAME, "mail.apache.org" );
180         records.add( modifier.getEntry() );
181 
182         return records;
183     }
184 
185 
186     protected List<ResourceRecord> getTestMxAuthorityRecords()
187     {
188         List<ResourceRecord> records = new ArrayList<ResourceRecord>();
189 
190         ResourceRecordModifier modifier = new ResourceRecordModifier();
191         modifier.setDnsClass( RecordClass.IN );
192         modifier.setDnsName( "apache.org" );
193         modifier.setDnsTtl( 1932 );
194         modifier.setDnsType( RecordType.NS );
195         modifier.put( DnsAttribute.DOMAIN_NAME, "ns.hyperreal.org" );
196         records.add( modifier.getEntry() );
197 
198         modifier = new ResourceRecordModifier();
199         modifier.setDnsClass( RecordClass.IN );
200         modifier.setDnsName( "apache.org" );
201         modifier.setDnsTtl( 1932 );
202         modifier.setDnsType( RecordType.NS );
203         modifier.put( DnsAttribute.DOMAIN_NAME, "ns1.eu.bitnames.com" );
204         records.add( modifier.getEntry() );
205 
206         modifier = new ResourceRecordModifier();
207         modifier.setDnsClass( RecordClass.IN );
208         modifier.setDnsName( "apache.org" );
209         modifier.setDnsTtl( 1932 );
210         modifier.setDnsType( RecordType.NS );
211         modifier.put( DnsAttribute.DOMAIN_NAME, "ns1.us.bitnames.com" );
212         records.add( modifier.getEntry() );
213 
214         modifier = new ResourceRecordModifier();
215         modifier.setDnsClass( RecordClass.IN );
216         modifier.setDnsName( "apache.org" );
217         modifier.setDnsTtl( 1932 );
218         modifier.setDnsType( RecordType.NS );
219         modifier.put( DnsAttribute.DOMAIN_NAME, "ns2.surfnet.nl" );
220         records.add( modifier.getEntry() );
221 
222         return records;
223     }
224 
225 
226     protected List<ResourceRecord> getTestMxAdditionalRecords() throws UnknownHostException
227     {
228         List<ResourceRecord> records = new ArrayList<ResourceRecord>();
229 
230         ResourceRecordModifier modifier = new ResourceRecordModifier();
231         modifier.setDnsClass( RecordClass.IN );
232         modifier.setDnsName( "herse.apache.org" );
233         modifier.setDnsTtl( 3313 );
234         modifier.setDnsType( RecordType.A );
235         modifier.put( DnsAttribute.IP_ADDRESS, InetAddress.getByName( "140.211.11.133" ).toString() );
236         records.add( modifier.getEntry() );
237 
238         modifier = new ResourceRecordModifier();
239         modifier.setDnsClass( RecordClass.IN );
240         modifier.setDnsName( "mail.apache.org" );
241         modifier.setDnsTtl( 3313 );
242         modifier.setDnsType( RecordType.A );
243         modifier.put( DnsAttribute.IP_ADDRESS, InetAddress.getByName( "140.211.11.2" ).toString() );
244         records.add( modifier.getEntry() );
245 
246         modifier = new ResourceRecordModifier();
247         modifier.setDnsClass( RecordClass.IN );
248         modifier.setDnsName( "ns1.eu.bitnames.com" );
249         modifier.setDnsTtl( 156234 );
250         modifier.setDnsType( RecordType.A );
251         modifier.put( DnsAttribute.IP_ADDRESS, InetAddress.getByName( "82.195.149.118" ).toString() );
252         records.add( modifier.getEntry() );
253 
254         modifier = new ResourceRecordModifier();
255         modifier.setDnsClass( RecordClass.IN );
256         modifier.setDnsName( "ns1.us.bitnames.com" );
257         modifier.setDnsTtl( 156236 );
258         modifier.setDnsType( RecordType.A );
259         modifier.put( DnsAttribute.IP_ADDRESS, InetAddress.getByName( "216.52.237.236" ).toString() );
260         records.add( modifier.getEntry() );
261 
262         modifier = new ResourceRecordModifier();
263         modifier.setDnsClass( RecordClass.IN );
264         modifier.setDnsName( "ns2.surfnet.nl" );
265         modifier.setDnsTtl( 77100 );
266         modifier.setDnsType( RecordType.A );
267         modifier.put( DnsAttribute.IP_ADDRESS, InetAddress.getByName( "192.87.36.2" ).toString() );
268         records.add( modifier.getEntry() );
269 
270         modifier = new ResourceRecordModifier();
271         modifier.setDnsClass( RecordClass.IN );
272         modifier.setDnsName( "ns2.surfnet.nl" );
273         modifier.setDnsTtl( 77100 );
274         modifier.setDnsType( RecordType.AAAA );
275         modifier.put( DnsAttribute.IP_ADDRESS, InetAddress.getByName( "2001:610:3:200a:192:87:36:2" ).toString() );
276         records.add( modifier.getEntry() );
277 
278         return records;
279     }
280 
281 }