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  }