@@ -281,3 +281,134 @@ func TestValidatePort(t *testing.T) {
281281 t .Fatalf ("expected out of range error" )
282282 }
283283}
284+
285+ func TestParseGroupSpecsMapInterfaceInterface (t * testing.T ) {
286+ raw := map [interface {}]interface {}{
287+ "hosts" : []interface {}{"host1" },
288+ }
289+ specs , err := parseGroupSpecs (raw , "alt" )
290+ if err != nil {
291+ t .Fatalf ("unexpected error: %v" , err )
292+ }
293+ want := []HostSpec {
294+ {Host : "host1" , Port : defaultPort },
295+ }
296+ if ! reflect .DeepEqual (specs , want ) {
297+ t .Fatalf ("unexpected specs: %+v" , specs )
298+ }
299+ }
300+
301+ func TestParseGroupSpecsInvalidKeyType (t * testing.T ) {
302+ raw := map [interface {}]interface {}{
303+ 42 : "val" ,
304+ }
305+ _ , err := parseGroupSpecs (raw , "badkey" )
306+ if err == nil {
307+ t .Fatalf ("expected error" )
308+ }
309+ if ! strings .Contains (err .Error (), "invalid key type" ) {
310+ t .Fatalf ("expected invalid key type error, got %v" , err )
311+ }
312+ }
313+
314+ func TestParseGroupSpecsEmptyHostsList (t * testing.T ) {
315+ raw := map [string ]interface {}{
316+ "hosts" : []interface {}{},
317+ }
318+ specs , err := parseGroupSpecs (raw , "empty" )
319+ if err != nil {
320+ t .Fatalf ("unexpected error: %v" , err )
321+ }
322+ if specs != nil {
323+ t .Fatalf ("expected nil, got %+v" , specs )
324+ }
325+ }
326+
327+ func TestParseGroupSpecsNonStringHostEntry (t * testing.T ) {
328+ raw := map [string ]interface {}{
329+ "hosts" : []interface {}{42 },
330+ }
331+ _ , err := parseGroupSpecs (raw , "numhost" )
332+ if err == nil {
333+ t .Fatalf ("expected error" )
334+ }
335+ if ! strings .Contains (err .Error (), "must be a string" ) {
336+ t .Fatalf ("expected 'must be a string' error, got %v" , err )
337+ }
338+ }
339+
340+ func TestParseGroupSpecsHostsNotAList (t * testing.T ) {
341+ raw := map [string ]interface {}{
342+ "hosts" : "not-a-list" ,
343+ }
344+ _ , err := parseGroupSpecs (raw , "badlist" )
345+ if err == nil {
346+ t .Fatalf ("expected error" )
347+ }
348+ if ! strings .Contains (err .Error (), "hosts must be a list" ) {
349+ t .Fatalf ("expected 'hosts must be a list' error, got %v" , err )
350+ }
351+ }
352+
353+ func TestParseGroupSpecsNilReturnsNil (t * testing.T ) {
354+ specs , err := parseGroupSpecs (nil , "nothing" )
355+ if err != nil {
356+ t .Fatalf ("unexpected error: %v" , err )
357+ }
358+ if specs != nil {
359+ t .Fatalf ("expected nil, got %+v" , specs )
360+ }
361+ }
362+
363+ func TestParseHostSpecUserAtEmptyHost (t * testing.T ) {
364+ _ , err := parseHostSpec ("user@" )
365+ if err == nil {
366+ t .Fatalf ("expected error" )
367+ }
368+ if ! strings .Contains (err .Error (), "invalid user@host" ) {
369+ t .Fatalf ("expected 'invalid user@host' error, got %v" , err )
370+ }
371+ }
372+
373+ func TestParseHostSpecIPv6WithPort (t * testing.T ) {
374+ got , err := parseHostSpec ("[::1]:22" )
375+ if err != nil {
376+ t .Fatalf ("unexpected error: %v" , err )
377+ }
378+ want := HostSpec {Host : "::1" , Port : 22 , PortSet : true }
379+ if got != want {
380+ t .Fatalf ("expected %+v, got %+v" , want , got )
381+ }
382+ }
383+
384+ func TestParseHostSpecIPv6NoBrackets (t * testing.T ) {
385+ got , err := parseHostSpec ("2001:db8::1" )
386+ if err != nil {
387+ t .Fatalf ("unexpected error: %v" , err )
388+ }
389+ want := HostSpec {Host : "2001:db8::1" , Port : defaultPort }
390+ if got != want {
391+ t .Fatalf ("expected %+v, got %+v" , want , got )
392+ }
393+ }
394+
395+ func TestParseHostSpecIPv6BracketBadPort (t * testing.T ) {
396+ _ , err := parseHostSpec ("[::1]:bad" )
397+ if err == nil {
398+ t .Fatal ("expected error for bad port in bracketed IPv6" )
399+ }
400+ }
401+
402+ func TestParseHostSpecIPv6BracketBadFormat (t * testing.T ) {
403+ _ , err := parseHostSpec ("[::1" )
404+ if err == nil {
405+ t .Fatal ("expected error for malformed bracketed IPv6" )
406+ }
407+ }
408+
409+ func TestParseHostSpecColonEmptyHost (t * testing.T ) {
410+ _ , err := parseHostSpec (":22" )
411+ if err == nil {
412+ t .Fatal ("expected error for empty host with port" )
413+ }
414+ }
0 commit comments