github.com/tommi2day/gomodules/dblib@v0.0.0-20230217211148-82cdbcf0a79d/tns_test.go (about) 1 package dblib 2 3 import ( 4 "github.com/stretchr/testify/assert" 5 "github.com/stretchr/testify/require" 6 "os" 7 "strings" 8 "testing" 9 ) 10 11 const tnsnamesora = ` 12 # Test ifile relative 13 ifile=ifile.ora 14 DB_T.local= 15 (DESCRIPTION= 16 (CONNECT_TIMEOUT=15) 17 (TRANSPORT_CONNECT_TIMEOUT=3) 18 (ADDRESS_LIST= 19 (FAILOVER=on) 20 (LOAD_BALANCE=on) 21 (ADDRESS= 22 (PROTOCOL=TCP) 23 (HOST=tdb1.ora.local) 24 (PORT=1562) 25 ) 26 (ADDRESS= 27 (PROTOCOL=TCP) 28 (HOST=tdb2.ora.local) 29 (PORT=1562) 30 ) 31 ) 32 (CONNECT_DATA= 33 (SERVER=dedicated) 34 (SERVICE_NAME=DB_T.local) 35 ) 36 ) 37 38 39 DB_V.local =(DESCRIPTION = 40 (CONNECT_TIMEOUT=15) 41 (RETRY_COUNT=20) 42 (RETRY_DELAY=3) 43 (TRANSPORT_CONNECT_TIMEOUT=3) 44 (ADDRESS_LIST = 45 (LOAD_BALANCE=ON) 46 (FAILOVER=ON) 47 (ADDRESS=(PROTOCOL=TCP)(HOST=vdb1.ora.local)(PORT=1672)) 48 (ADDRESS=(PROTOCOL=TCP)(HOST=vdb2.ora.local)(PORT=1672)) 49 ) 50 (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME = DB_V.local)) 51 ) 52 ` 53 54 const ifileora = ` 55 XE =(DESCRIPTION = 56 (ADDRESS_LIST = (ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521))) 57 (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME = XE-ohne)) 58 ) 59 XE.local =(DESCRIPTION = 60 (ADDRESS_LIST = (ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521))) 61 (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME = XE)) 62 ) 63 XE1 =(DESCRIPTION = 64 (ADDRESS_LIST = (ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521))) 65 (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME = XE1)) 66 )` 67 const sqlnetora = ` 68 NAMES.DEFAULT_DOMAIN=local 69 NAMES.DIRECTORY_PATH=(TNSNAMES,EZCONNECT) 70 ` 71 const entryCount = 5 72 73 func TestParseTns(t *testing.T) { 74 var err error 75 76 err = os.Chdir(TestDir) 77 require.NoErrorf(t, err, "ChDir failed") 78 79 tnsAdmin := "testdata" 80 //nolint gosec 81 err = os.WriteFile(tnsAdmin+"/sqlnet.ora", []byte(sqlnetora), 0644) 82 //nolint gosec 83 err = os.WriteFile(tnsAdmin+"/sqlnet.ora", []byte(sqlnetora), 0644) 84 require.NoErrorf(t, err, "Create test sqlnet.ora failed") 85 //nolint gosec 86 err = os.WriteFile(tnsAdmin+"/tnsnames.ora", []byte(tnsnamesora), 0644) 87 require.NoErrorf(t, err, "Create test tnsnames.ora failed") 88 //nolint gosec 89 err = os.WriteFile(tnsAdmin+"/ifile.ora", []byte(ifileora), 0644) 90 require.NoErrorf(t, err, "Create test ifile.ora failed") 91 92 domain := GetDefaultDomain(tnsAdmin) 93 t.Logf("Default Domain: '%s'", domain) 94 filename := tnsAdmin + "/tnsnames.ora" 95 t.Logf("load from %s", filename) 96 tnsEntries, domain, err := GetTnsnames(filename, true) 97 t.Run("Parse TNSNames.ora", func(t *testing.T) { 98 require.NoErrorf(t, err, "Parsing %s failed: %s", filename, err) 99 }) 100 if err != nil { 101 t.Logf("load returned error: %s ", err) 102 return 103 } 104 t.Run("Count Entries", func(t *testing.T) { 105 countEntries := len(tnsEntries) 106 expected := entryCount 107 actual := countEntries 108 assert.Equal(t, expected, actual, "Count not expected") 109 }) 110 t.Run("Check entry", func(t *testing.T) { 111 type testTableType struct { 112 name string 113 alias string 114 success bool 115 service string 116 } 117 for _, testconfig := range []testTableType{ 118 { 119 name: "XE-full", 120 alias: "XE.local", 121 success: true, 122 service: "XE", 123 }, 124 { 125 name: "XE-short", 126 alias: "XE", 127 success: true, 128 service: "XE", 129 }, 130 { 131 name: "XE1-short-invalid", 132 alias: "XE1", 133 success: false, 134 service: "", 135 }, 136 { 137 name: "XE+full-invalid", 138 alias: "XE1.local", 139 success: false, 140 service: "", 141 }, 142 { 143 name: "XE+invalid domain", 144 alias: "XE" + ".xx.xx", 145 success: false, 146 service: "", 147 }, 148 { 149 name: "novalue", 150 alias: "", 151 success: false, 152 service: "", 153 }, 154 } { 155 t.Run(testconfig.name, func(t *testing.T) { 156 e, ok := GetEntry(testconfig.alias, tnsEntries, domain) 157 if testconfig.success { 158 assert.True(t, ok, "Alias %s not found", testconfig.alias) 159 name := strings.ToUpper(e.Name) 160 assert.True(t, strings.HasPrefix(name, strings.ToUpper(testconfig.alias)), "entry not related to given alias %s", testconfig.alias) 161 assert.Equalf(t, testconfig.service, e.Service, "entry returned wrong service ('%s' <>'%s)", e.Service, testconfig.service) 162 } else { 163 assert.False(t, ok, "Alias %s found, but shouldnt be", testconfig.alias) 164 } 165 }) 166 } 167 }) 168 169 alias := "XE" 170 t.Run("Check entry value", func(t *testing.T) { 171 e, ok := GetEntry(alias, tnsEntries, domain) 172 assert.True(t, ok, "Alias %s not found", alias) 173 actualDesc := e.Desc 174 expectedDesc := `(DESCRIPTION = 175 (ADDRESS_LIST = (ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521))) 176 (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME = XE)) 177 )` 178 assert.Equal(t, strings.TrimSpace(expectedDesc), strings.TrimSpace(actualDesc), "Description not expected") 179 }) 180 t.Run("Check Server Entry", func(t *testing.T) { 181 e, found := tnsEntries[alias] 182 assert.True(t, found, "Alias not found") 183 actual := len(e.Servers) 184 expected := 1 185 assert.Equal(t, expected, actual, "Server Count not expected") 186 if actual > 0 { 187 server := e.Servers[0] 188 assert.NotEmpty(t, server.Host, "Host ist empty") 189 assert.NotEmpty(t, server.Port, "Port ist empty") 190 } 191 }) 192 }