github.com/hooklift/terraform@v0.11.0-beta1.0.20171117000744-6786c1361ffe/registry/regsrc/friendly_host_test.go (about) 1 package regsrc 2 3 import ( 4 "strings" 5 "testing" 6 ) 7 8 func TestFriendlyHost(t *testing.T) { 9 tests := []struct { 10 name string 11 source string 12 wantHost string 13 wantDisplay string 14 wantNorm string 15 wantValid bool 16 }{ 17 { 18 name: "simple ascii", 19 source: "registry.terraform.io", 20 wantHost: "registry.terraform.io", 21 wantDisplay: "registry.terraform.io", 22 wantNorm: "registry.terraform.io", 23 wantValid: true, 24 }, 25 { 26 name: "mixed-case ascii", 27 source: "Registry.TerraForm.io", 28 wantHost: "Registry.TerraForm.io", 29 wantDisplay: "registry.terraform.io", // Display case folded 30 wantNorm: "registry.terraform.io", 31 wantValid: true, 32 }, 33 { 34 name: "IDN", 35 source: "ʎɹʇsıƃǝɹ.ɯɹoɟɐɹɹǝʇ.io", 36 wantHost: "ʎɹʇsıƃǝɹ.ɯɹoɟɐɹɹǝʇ.io", 37 wantDisplay: "ʎɹʇsıƃǝɹ.ɯɹoɟɐɹɹǝʇ.io", 38 wantNorm: "xn--s-fka0wmm0zea7g8b.xn--o-8ta85a3b1dwcda1k.io", 39 wantValid: true, 40 }, 41 { 42 name: "IDN TLD", 43 source: "zhongwen.中国", 44 wantHost: "zhongwen.中国", 45 wantDisplay: "zhongwen.中国", 46 wantNorm: "zhongwen.xn--fiqs8s", 47 wantValid: true, 48 }, 49 { 50 name: "IDN Case Folding", 51 source: "Испытание.com", 52 wantHost: "Испытание.com", // Raw input retains case 53 wantDisplay: "испытание.com", // Display form is unicode but case-folded 54 wantNorm: "xn--80akhbyknj4f.com", 55 wantValid: true, 56 }, 57 { 58 name: "Punycode is invalid as an input format", 59 source: "xn--s-fka0wmm0zea7g8b.xn--o-8ta85a3b1dwcda1k.io", 60 wantHost: "xn--s-fka0wmm0zea7g8b.xn--o-8ta85a3b1dwcda1k.io", 61 wantDisplay: "ʎɹʇsıƃǝɹ.ɯɹoɟɐɹɹǝʇ.io", 62 wantNorm: "xn--s-fka0wmm0zea7g8b.xn--o-8ta85a3b1dwcda1k.io", 63 wantValid: false, 64 }, 65 { 66 name: "non-host prefix is left alone", 67 source: "foo/bar/baz", 68 wantHost: "", 69 wantDisplay: "", 70 wantNorm: "", 71 wantValid: false, 72 }, 73 } 74 for _, tt := range tests { 75 // Matrix each test with prefix and total match variants 76 for _, sfx := range []string{"", "/", "/foo/bar/baz"} { 77 t.Run(tt.name+" suffix:"+sfx, func(t *testing.T) { 78 gotHost, gotRest := ParseFriendlyHost(tt.source + sfx) 79 80 if gotHost == nil { 81 if tt.wantHost != "" { 82 t.Fatalf("ParseFriendlyHost() gotHost = nil, want %v", tt.wantHost) 83 } 84 // If we return nil host, the whole input string should be in rest 85 if gotRest != (tt.source + sfx) { 86 t.Fatalf("ParseFriendlyHost() was nil rest = %s, want %v", gotRest, tt.source+sfx) 87 } 88 return 89 } 90 91 if tt.wantHost == "" { 92 t.Fatalf("ParseFriendlyHost() gotHost.Raw = %v, want nil", gotHost.Raw) 93 } 94 95 if v := gotHost.String(); v != tt.wantHost { 96 t.Fatalf("String() = %v, want %v", v, tt.wantHost) 97 } 98 if v := gotHost.Valid(); v != tt.wantValid { 99 t.Fatalf("Valid() = %v, want %v", v, tt.wantValid) 100 } 101 102 // FIXME: should we allow punycode as input 103 if !tt.wantValid { 104 return 105 } 106 107 if v := gotHost.Display(); v != tt.wantDisplay { 108 t.Fatalf("Display() = %v, want %v", v, tt.wantDisplay) 109 } 110 if v := gotHost.Normalized(); v != tt.wantNorm { 111 t.Fatalf("Normalized() = %v, want %v", v, tt.wantNorm) 112 } 113 if gotRest != strings.TrimLeft(sfx, "/") { 114 t.Fatalf("ParseFriendlyHost() rest = %v, want %v", gotRest, strings.TrimLeft(sfx, "/")) 115 } 116 117 // Also verify that host compares equal with all the variants. 118 if !gotHost.Equal(&FriendlyHost{Raw: tt.wantDisplay}) { 119 t.Fatalf("Equal() should be true for %s and %t", tt.wantHost, tt.wantValid) 120 } 121 122 // FIXME: Do we need to accept normalized input? 123 //if !gotHost.Equal(&FriendlyHost{Raw: tt.wantNorm}) { 124 // fmt.Println(gotHost.Normalized(), tt.wantNorm) 125 // fmt.Println(" ", (&FriendlyHost{Raw: tt.wantNorm}).Normalized()) 126 // t.Fatalf("Equal() should be true for %s and %s", tt.wantHost, tt.wantNorm) 127 //} 128 129 }) 130 } 131 } 132 }