| /* -*- 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; |
| } |
| |