mirror of
https://git.rtems.org/rtems-libbsd/
synced 2025-06-15 22:01:42 +08:00

The sources can be obtained via: http://opensource.apple.com/tarballs/mDNSResponder/mDNSResponder-544.tar.gz
335 lines
9.7 KiB
Java
335 lines
9.7 KiB
Java
/* -*- Mode: Java; tab-width: 4 -*-
|
|
*
|
|
* Copyright (c) 2004 Apple Computer, Inc. All rights reserved.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*
|
|
* DNSSDUnitTest is a simple program that exercises parts of the DNSSD API.
|
|
*/
|
|
|
|
import com.apple.dnssd.*;
|
|
|
|
import java.net.*;
|
|
import java.util.*;
|
|
|
|
|
|
class DNSSDUnitTest
|
|
{
|
|
public static final String TEST_TYPE = "_unittest._udp";
|
|
public static final String WIRE_CHAR_SET = "ISO-8859-1";
|
|
|
|
public DNSSDUnitTest fInstance = null;
|
|
|
|
public DNSSDUnitTest() throws Exception
|
|
{
|
|
fStage = 0;
|
|
fInstance = this;
|
|
|
|
Enumeration en = NetworkInterface.getNetworkInterfaces();
|
|
while ( en.hasMoreElements())
|
|
System.out.println( ((NetworkInterface) en.nextElement()).getName());
|
|
}
|
|
|
|
public void testTxtRecord()
|
|
{
|
|
byte[] src = { 6, 'a', 't', '=', 'X', 'Y', 'Z' };
|
|
TXTRecord txtRecord = new TXTRecord( src);
|
|
String a;
|
|
|
|
txtRecord.set( "path", "~/names");
|
|
txtRecord.set( "rw", (String) null);
|
|
txtRecord.set( "empty", "");
|
|
txtRecord.set( "ttl", "4");
|
|
|
|
byte[] rawBytes = txtRecord.getRawBytes();
|
|
System.out.println( ( new String( rawBytes, 0, rawBytes.length)) + " has count " +
|
|
String.valueOf( txtRecord.size()));
|
|
|
|
System.out.println( txtRecord);
|
|
boolean ttlPresent = txtRecord.contains( "ttl");
|
|
System.out.println( "ttl is present: " + ( ttlPresent ? "true" : "false"));
|
|
boolean timeoutPresent = txtRecord.contains( "timeout");
|
|
System.out.println( "timeout is present: " + ( timeoutPresent ? "true" : "false"));
|
|
|
|
txtRecord.set( "path", "~/numbers");
|
|
System.out.println( txtRecord);
|
|
|
|
txtRecord.remove( "ttl");
|
|
System.out.println( txtRecord);
|
|
|
|
txtRecord.remove( "path");
|
|
System.out.println( txtRecord);
|
|
|
|
txtRecord.remove( "at");
|
|
System.out.println( txtRecord);
|
|
|
|
txtRecord.set( "rw", "1");
|
|
System.out.println( txtRecord);
|
|
}
|
|
|
|
public void run() throws DNSSDException
|
|
{
|
|
System.out.println( "Running DNSSD unit test for " + System.getProperty( "user.name"));
|
|
|
|
this.testTxtRecord();
|
|
|
|
fRegTest = new RegTest();
|
|
new BrowseTest();
|
|
new DomainTest();
|
|
new RegistrarTest();
|
|
|
|
this.waitForEnd();
|
|
}
|
|
|
|
protected int fStage;
|
|
protected RegTest fRegTest;
|
|
|
|
public synchronized void bumpStage()
|
|
{
|
|
fStage++;
|
|
this.notifyAll();
|
|
}
|
|
|
|
protected synchronized void waitForEnd()
|
|
{
|
|
int stage = fStage;
|
|
while ( stage == fStage)
|
|
{
|
|
try {
|
|
wait();
|
|
} catch (InterruptedException e) {}
|
|
}
|
|
}
|
|
|
|
public static void main(String s[])
|
|
{
|
|
try {
|
|
new DNSSDUnitTest().run();
|
|
}
|
|
catch ( Exception e) { terminateWithException( e); }
|
|
}
|
|
|
|
protected static void terminateWithException( Exception e)
|
|
{
|
|
e.printStackTrace();
|
|
System.exit( -1);
|
|
}
|
|
}
|
|
|
|
class TermReporter implements BaseListener
|
|
{
|
|
public void operationFailed( DNSSDService service, int errorCode)
|
|
{
|
|
System.out.println( this.getClass().getName() + " encountered error " + String.valueOf( errorCode));
|
|
}
|
|
|
|
protected void finalize() throws Throwable
|
|
{
|
|
System.out.println( "Instance of " + this.getClass().getName() + " has been destroyed");
|
|
}
|
|
}
|
|
|
|
class RegTest extends TermReporter implements RegisterListener
|
|
{
|
|
public static final int TEST_PORT = 5678;
|
|
|
|
public RegTest() throws DNSSDException
|
|
{
|
|
fReg = DNSSD.register( 0, 0, "Test service", DNSSDUnitTest.TEST_TYPE, "", "", TEST_PORT, null, this);
|
|
}
|
|
|
|
public void serviceRegistered( DNSSDRegistration registration, int flags, String serviceName,
|
|
String regType, String domain)
|
|
{
|
|
String s = "RegTest result flags:" + String.valueOf( flags) +
|
|
" serviceName:" + serviceName + " regType:" + regType + " domain:" + domain;
|
|
System.out.println( s);
|
|
|
|
try {
|
|
new DupRegTest();
|
|
|
|
byte[] kResponsiblePerson = { 'c','o','o','k','i','e',' ','m','o','n','s','t','e','r' };
|
|
fReg.addRecord( 0, 17 /*ns_t_rp*/, kResponsiblePerson, 3600);
|
|
new QueryTest( 0, 0, "Test service", 17 /*ns_t_rp*/, 1);
|
|
} catch( Exception e) { e.printStackTrace(); }
|
|
}
|
|
|
|
protected DNSSDRegistration fReg;
|
|
}
|
|
|
|
class DupRegTest extends TermReporter implements RegisterListener
|
|
{
|
|
public static final int TEST_PORT = 5678;
|
|
|
|
public DupRegTest() throws DNSSDException
|
|
{
|
|
DNSSD.register( DNSSD.NO_AUTO_RENAME | DNSSD.UNIQUE, 0, "Test service", DNSSDUnitTest.TEST_TYPE, "", "", TEST_PORT + 1, null, this);
|
|
}
|
|
|
|
public void serviceRegistered( DNSSDRegistration registration, int flags, String serviceName,
|
|
String regType, String domain)
|
|
{
|
|
System.out.println( "Oik - registered a duplicate!");
|
|
String s = "DupRegTest result flags:" + String.valueOf( flags) +
|
|
" serviceName:" + serviceName + " regType:" + regType + " domain:" + domain;
|
|
System.out.println( s);
|
|
}
|
|
}
|
|
|
|
class BrowseTest extends TermReporter implements BrowseListener
|
|
{
|
|
public BrowseTest()
|
|
{
|
|
try {
|
|
DNSSD.browse( 0, 0, DNSSDUnitTest.TEST_TYPE, "", this);
|
|
} catch( Exception e) { e.printStackTrace(); }
|
|
}
|
|
|
|
public void serviceFound( DNSSDService browser, int flags, int ifIndex,
|
|
String serviceName, String regType, String domain)
|
|
{
|
|
String s = "BrowseTest found flags:" + String.valueOf( flags) +
|
|
" ifIndex:" + String.valueOf( ifIndex) +
|
|
" serviceName:" + serviceName + " regType:" + regType + " domain:" + domain;
|
|
System.out.println( s);
|
|
|
|
System.out.println( "Resolving " + serviceName);
|
|
new ResolveTest( 0, ifIndex, serviceName, regType, domain);
|
|
}
|
|
|
|
public void serviceLost( DNSSDService browser, int flags, int ifIndex,
|
|
String serviceName, String regType, String domain)
|
|
{
|
|
String s = "BrowseTest lost flags:" + String.valueOf( flags) +
|
|
" ifIndex:" + String.valueOf( ifIndex) +
|
|
" serviceName:" + serviceName + " regType:" + regType + " domain:" + domain;
|
|
System.out.println( s);
|
|
}
|
|
|
|
public void operationFailed( DNSSDService service, int errorCode)
|
|
{
|
|
System.out.println( "Browse failed " + String.valueOf( errorCode));
|
|
}
|
|
}
|
|
|
|
class DomainTest extends TermReporter implements DomainListener
|
|
{
|
|
public DomainTest()
|
|
{
|
|
try {
|
|
DNSSD.enumerateDomains( DNSSD.BROWSE_DOMAINS, 0, this);
|
|
} catch( Exception e) { e.printStackTrace(); }
|
|
}
|
|
|
|
public void domainFound( DNSSDService enumerator, int flags, int ifIndex, String domain)
|
|
{
|
|
String s = "Domain found flags:" + String.valueOf( flags) +
|
|
" ifIndex:" + String.valueOf( ifIndex) +
|
|
" domain:" + domain;
|
|
System.out.println( s);
|
|
}
|
|
|
|
public void domainLost( DNSSDService enumerator, int flags, int ifIndex, String domain)
|
|
{
|
|
String s = "Domain lost flags:" + String.valueOf( flags) +
|
|
" ifIndex:" + String.valueOf( ifIndex) +
|
|
" domain:" + domain;
|
|
System.out.println( s);
|
|
}
|
|
|
|
public void operationFailed( DNSSDService service, int errorCode)
|
|
{
|
|
System.out.println( "Domain enum op failed " + String.valueOf( errorCode));
|
|
}
|
|
}
|
|
|
|
class ResolveTest extends TermReporter implements ResolveListener
|
|
{
|
|
public ResolveTest( int flags, int ifIndex, String serviceName, String regType,
|
|
String domain)
|
|
{
|
|
try {
|
|
DNSSD.resolve( flags, ifIndex, serviceName, regType, domain, this);
|
|
} catch( Exception e) { e.printStackTrace(); }
|
|
}
|
|
|
|
public void serviceResolved( DNSSDService resolver, int flags, int ifIndex, String fullName,
|
|
String hostName, int port, TXTRecord txtRecord)
|
|
{
|
|
String a;
|
|
String s = "ResolveTest result flags:" + String.valueOf( flags) +
|
|
" ifIndex:" + String.valueOf( ifIndex) +
|
|
" fullName:" + fullName + " hostName:" + hostName + " port:" + String.valueOf( port);
|
|
for ( int i=0; null != ( a = txtRecord.getKey( i)); i++)
|
|
s += " attr/val " + String.valueOf( i) + ": " + a + "," + txtRecord.getValueAsString( i);
|
|
|
|
System.out.println( s);
|
|
|
|
System.out.println( "Querying " + hostName);
|
|
new QueryTest( 0, ifIndex, hostName, 1 /* ns_t_a */, 1 /* ns_c_in */);
|
|
}
|
|
}
|
|
|
|
class QueryTest extends TermReporter implements QueryListener
|
|
{
|
|
public QueryTest( int flags, int ifIndex, String serviceName, int rrtype, int rrclass)
|
|
{
|
|
try {
|
|
DNSSD.queryRecord( flags, ifIndex, serviceName, rrtype, rrclass, this);
|
|
} catch( Exception e) { e.printStackTrace(); }
|
|
}
|
|
|
|
public void queryAnswered( DNSSDService query, int flags, int ifIndex, String fullName,
|
|
int rrtype, int rrclass, byte[] rdata, int ttl)
|
|
{
|
|
String s = "QueryTest result flags:" + String.valueOf( flags) +
|
|
" ifIndex:" + String.valueOf( ifIndex) +
|
|
" fullName:" + fullName + " rrtype:" + String.valueOf( rrtype) +
|
|
" rrclass:" + String.valueOf( rrclass) + " ttl:" + String.valueOf( ttl);
|
|
System.out.println( s);
|
|
|
|
try {
|
|
String dataTxt = new String( rdata, 0, rdata.length, DNSSDUnitTest.WIRE_CHAR_SET);
|
|
System.out.println( "Query data is:" + dataTxt);
|
|
} catch( Exception e) { e.printStackTrace(); }
|
|
}
|
|
}
|
|
|
|
class RegistrarTest extends TermReporter implements RegisterRecordListener
|
|
{
|
|
public RegistrarTest()
|
|
{
|
|
try {
|
|
byte[] kResponsiblePerson = { 'g','r','o','v','e','r' };
|
|
fRegistrar = DNSSD.createRecordRegistrar( this);
|
|
fRegistrar.registerRecord( DNSSD.UNIQUE, 0,
|
|
"test.registrartest.local", 17 /*ns_t_rp*/, 1, kResponsiblePerson, 3600);
|
|
} catch( Exception e) { e.printStackTrace(); }
|
|
}
|
|
|
|
public void recordRegistered( DNSRecord record, int flags)
|
|
{
|
|
String s = "RegistrarTest result flags:" + String.valueOf( flags);
|
|
System.out.println( s);
|
|
|
|
try {
|
|
byte[] kResponsiblePerson = { 'e','l','m','o' };
|
|
record.update( 0, kResponsiblePerson, 3600);
|
|
record.remove();
|
|
} catch( Exception e) { e.printStackTrace(); }
|
|
}
|
|
|
|
protected DNSSDRecordRegistrar fRegistrar;
|
|
}
|
|
|