1// Copyright 2009 The Go Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style 3// license that can be found in the LICENSE file. 4 5// +build !js 6 7package net 8 9import ( 10 "strings" 11 "testing" 12) 13 14type dnsNameTest struct { 15 name string 16 result bool 17} 18 19var dnsNameTests = []dnsNameTest{ 20 // RFC 2181, section 11. 21 {"_xmpp-server._tcp.google.com", true}, 22 {"foo.com", true}, 23 {"1foo.com", true}, 24 {"26.0.0.73.com", true}, 25 {"10-0-0-1", true}, 26 {"fo-o.com", true}, 27 {"fo1o.com", true}, 28 {"foo1.com", true}, 29 {"a.b..com", false}, 30 {"a.b-.com", false}, 31 {"a.b.com-", false}, 32 {"a.b..", false}, 33 {"b.com.", true}, 34} 35 36func emitDNSNameTest(ch chan<- dnsNameTest) { 37 defer close(ch) 38 var char63 = "" 39 for i := 0; i < 63; i++ { 40 char63 += "a" 41 } 42 char64 := char63 + "a" 43 longDomain := strings.Repeat(char63+".", 5) + "example" 44 45 for _, tc := range dnsNameTests { 46 ch <- tc 47 } 48 49 ch <- dnsNameTest{char63 + ".com", true} 50 ch <- dnsNameTest{char64 + ".com", false} 51 52 // Remember: wire format is two octets longer than presentation 53 // (length octets for the first and [root] last labels). 54 // 253 is fine: 55 ch <- dnsNameTest{longDomain[len(longDomain)-253:], true} 56 // A terminal dot doesn't contribute to length: 57 ch <- dnsNameTest{longDomain[len(longDomain)-253:] + ".", true} 58 // 254 is bad: 59 ch <- dnsNameTest{longDomain[len(longDomain)-254:], false} 60} 61 62func TestDNSName(t *testing.T) { 63 ch := make(chan dnsNameTest) 64 go emitDNSNameTest(ch) 65 for tc := range ch { 66 if isDomainName(tc.name) != tc.result { 67 t.Errorf("isDomainName(%q) = %v; want %v", tc.name, !tc.result, tc.result) 68 } 69 } 70} 71 72func BenchmarkDNSName(b *testing.B) { 73 testHookUninstaller.Do(uninstallTestHooks) 74 75 benchmarks := append(dnsNameTests, []dnsNameTest{ 76 {strings.Repeat("a", 63), true}, 77 {strings.Repeat("a", 64), false}, 78 }...) 79 for n := 0; n < b.N; n++ { 80 for _, tc := range benchmarks { 81 if isDomainName(tc.name) != tc.result { 82 b.Errorf("isDomainName(%q) = %v; want %v", tc.name, !tc.result, tc.result) 83 } 84 } 85 } 86} 87