Chris Jones | 25b1e83 | 2010-11-04 10:30:39 -0400 | [diff] [blame] | 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 | package net |
| 6 | |
| 7 | import ( |
Volker Dobler | 654f358 | 2013-08-08 16:33:57 -0700 | [diff] [blame] | 8 | "strings" |
Chris Jones | 25b1e83 | 2010-11-04 10:30:39 -0400 | [diff] [blame] | 9 | "testing" |
| 10 | ) |
| 11 | |
| 12 | type testCase struct { |
| 13 | name string |
| 14 | result bool |
| 15 | } |
| 16 | |
| 17 | var tests = []testCase{ |
| 18 | // RFC2181, section 11. |
Mikio Hara | 7ec69c1 | 2010-12-11 13:49:45 -0800 | [diff] [blame] | 19 | {"_xmpp-server._tcp.google.com", true}, |
Mikio Hara | 7ec69c1 | 2010-12-11 13:49:45 -0800 | [diff] [blame] | 20 | {"foo.com", true}, |
| 21 | {"1foo.com", true}, |
| 22 | {"26.0.0.73.com", true}, |
| 23 | {"fo-o.com", true}, |
| 24 | {"fo1o.com", true}, |
| 25 | {"foo1.com", true}, |
| 26 | {"a.b..com", false}, |
Volker Dobler | 654f358 | 2013-08-08 16:33:57 -0700 | [diff] [blame] | 27 | {"a.b-.com", false}, |
| 28 | {"a.b.com-", false}, |
| 29 | {"a.b..", false}, |
| 30 | {"b.com.", true}, |
Chris Jones | 25b1e83 | 2010-11-04 10:30:39 -0400 | [diff] [blame] | 31 | } |
| 32 | |
Ian Lance Taylor | 9e441e5 | 2011-01-21 13:57:52 -0800 | [diff] [blame] | 33 | func getTestCases(ch chan<- testCase) { |
Chris Jones | 25b1e83 | 2010-11-04 10:30:39 -0400 | [diff] [blame] | 34 | defer close(ch) |
| 35 | var char59 = "" |
| 36 | var char63 = "" |
| 37 | var char64 = "" |
| 38 | for i := 0; i < 59; i++ { |
| 39 | char59 += "a" |
| 40 | } |
| 41 | char63 = char59 + "aaaa" |
| 42 | char64 = char63 + "a" |
| 43 | |
| 44 | for _, tc := range tests { |
Ian Lance Taylor | 9e441e5 | 2011-01-21 13:57:52 -0800 | [diff] [blame] | 45 | ch <- tc |
Chris Jones | 25b1e83 | 2010-11-04 10:30:39 -0400 | [diff] [blame] | 46 | } |
| 47 | |
Ian Lance Taylor | 9e441e5 | 2011-01-21 13:57:52 -0800 | [diff] [blame] | 48 | ch <- testCase{char63 + ".com", true} |
| 49 | ch <- testCase{char64 + ".com", false} |
Chris Jones | 25b1e83 | 2010-11-04 10:30:39 -0400 | [diff] [blame] | 50 | // 255 char name is fine: |
Ian Lance Taylor | 9e441e5 | 2011-01-21 13:57:52 -0800 | [diff] [blame] | 51 | ch <- testCase{char59 + "." + char63 + "." + char63 + "." + |
Chris Jones | 25b1e83 | 2010-11-04 10:30:39 -0400 | [diff] [blame] | 52 | char63 + ".com", |
| 53 | true} |
| 54 | // 256 char name is bad: |
Ian Lance Taylor | 9e441e5 | 2011-01-21 13:57:52 -0800 | [diff] [blame] | 55 | ch <- testCase{char59 + "a." + char63 + "." + char63 + "." + |
Chris Jones | 25b1e83 | 2010-11-04 10:30:39 -0400 | [diff] [blame] | 56 | char63 + ".com", |
| 57 | false} |
| 58 | } |
| 59 | |
| 60 | func TestDNSNames(t *testing.T) { |
Ian Lance Taylor | 9e441e5 | 2011-01-21 13:57:52 -0800 | [diff] [blame] | 61 | ch := make(chan testCase) |
Chris Jones | 25b1e83 | 2010-11-04 10:30:39 -0400 | [diff] [blame] | 62 | go getTestCases(ch) |
| 63 | for tc := range ch { |
| 64 | if isDomainName(tc.name) != tc.result { |
| 65 | t.Errorf("isDomainName(%v) failed: Should be %v", |
| 66 | tc.name, tc.result) |
| 67 | } |
| 68 | } |
| 69 | } |
Volker Dobler | 654f358 | 2013-08-08 16:33:57 -0700 | [diff] [blame] | 70 | |
| 71 | func BenchmarkDNSNames(b *testing.B) { |
| 72 | benchmarks := append(tests, []testCase{ |
| 73 | {strings.Repeat("a", 63), true}, |
| 74 | {strings.Repeat("a", 64), false}, |
| 75 | }...) |
| 76 | for n := 0; n < b.N; n++ { |
| 77 | for _, tc := range benchmarks { |
| 78 | if isDomainName(tc.name) != tc.result { |
| 79 | b.Errorf("isDomainName(%q) = %v; want %v", tc.name, !tc.result, tc.result) |
| 80 | } |
| 81 | } |
| 82 | } |
| 83 | } |