github.com/aavshr/aws-sdk-go@v1.41.3/internal/ini/walker_test.go (about) 1 //go:build go1.7 2 // +build go1.7 3 4 package ini 5 6 import ( 7 "encoding/json" 8 "io/ioutil" 9 "os" 10 "path/filepath" 11 "strings" 12 "testing" 13 ) 14 15 func TestValidDataFiles(t *testing.T) { 16 const expectedFileSuffix = "_expected" 17 filepath.Walk("./testdata/valid", func(path string, info os.FileInfo, err error) error { 18 if strings.HasSuffix(path, expectedFileSuffix) { 19 return nil 20 } 21 22 if info.IsDir() { 23 return nil 24 } 25 26 f, err := os.Open(path) 27 if err != nil { 28 t.Errorf("%s: unexpected error, %v", path, err) 29 } 30 defer f.Close() 31 32 tree, err := ParseAST(f) 33 if err != nil { 34 t.Errorf("%s: unexpected parse error, %v", path, err) 35 } 36 37 v := NewDefaultVisitor() 38 err = Walk(tree, v) 39 if err != nil { 40 t.Errorf("%s: unexpected walk error, %v", path, err) 41 } 42 43 expectedPath := path + "_expected" 44 e := map[string]interface{}{} 45 46 b, err := ioutil.ReadFile(expectedPath) 47 if err != nil { 48 // ignore files that do not have an expected file 49 return nil 50 } 51 52 err = json.Unmarshal(b, &e) 53 if err != nil { 54 t.Errorf("unexpected error during deserialization, %v", err) 55 } 56 57 for profile, tableIface := range e { 58 p, ok := v.Sections.GetSection(profile) 59 if !ok { 60 t.Fatal("could not find profile " + profile) 61 } 62 63 table := tableIface.(map[string]interface{}) 64 for k, v := range table { 65 switch e := v.(type) { 66 case string: 67 a := p.String(k) 68 if e != a { 69 t.Errorf("%s: expected %v, but received %v for profile %v", path, e, a, profile) 70 } 71 case int: 72 a := p.Int(k) 73 if int64(e) != a { 74 t.Errorf("%s: expected %v, but received %v", path, e, a) 75 } 76 case float64: 77 v := p.values[k] 78 if v.Type == IntegerType { 79 a := p.Int(k) 80 if int64(e) != a { 81 t.Errorf("%s: expected %v, but received %v", path, e, a) 82 } 83 } else { 84 a := p.Float64(k) 85 if e != a { 86 t.Errorf("%s: expected %v, but received %v", path, e, a) 87 } 88 } 89 default: 90 t.Errorf("unexpected type: %T", e) 91 } 92 } 93 } 94 95 return nil 96 }) 97 } 98 99 func TestInvalidDataFiles(t *testing.T) { 100 cases := []struct { 101 path string 102 expectedParseError bool 103 expectedWalkError bool 104 }{ 105 { 106 path: "./testdata/invalid/bad_syntax_1", 107 expectedParseError: true, 108 }, 109 { 110 path: "./testdata/invalid/bad_syntax_2", 111 expectedParseError: true, 112 }, 113 { 114 path: "./testdata/invalid/incomplete_section_profile", 115 expectedParseError: true, 116 }, 117 { 118 path: "./testdata/invalid/syntax_error_comment", 119 expectedParseError: true, 120 }, 121 { 122 path: "./testdata/invalid/invalid_keys", 123 expectedParseError: true, 124 }, 125 { 126 path: "./testdata/invalid/bad_section_name", 127 expectedParseError: true, 128 }, 129 } 130 131 for i, c := range cases { 132 t.Run(c.path, func(t *testing.T) { 133 f, err := os.Open(c.path) 134 if err != nil { 135 t.Errorf("unexpected error, %v", err) 136 } 137 defer f.Close() 138 139 tree, err := ParseAST(f) 140 if err != nil && !c.expectedParseError { 141 t.Errorf("%d: unexpected error, %v", i+1, err) 142 } else if err == nil && c.expectedParseError { 143 t.Errorf("%d: expected error, but received none", i+1) 144 } 145 146 if c.expectedParseError { 147 return 148 } 149 150 v := NewDefaultVisitor() 151 err = Walk(tree, v) 152 if err == nil && c.expectedWalkError { 153 t.Errorf("%d: expected error, but received none", i+1) 154 } 155 }) 156 } 157 }