github.com/tommi2day/tnscli@v0.0.0-20240401211958-338fc0647b73/cmd/service_test.go (about) 1 package cmd 2 3 import ( 4 "database/sql" 5 "fmt" 6 "os" 7 "strings" 8 "testing" 9 10 "github.com/stretchr/testify/assert" 11 "github.com/stretchr/testify/require" 12 "github.com/tommi2day/gomodules/common" 13 "github.com/tommi2day/gomodules/dblib" 14 ) 15 16 const DBUSER = "system" 17 const DBPASSWORD = "FREE-manager21" 18 const TIMEOUT = 5 19 20 var dbhost = common.GetEnv("DB_HOST", "127.0.0.1") 21 var xetest = fmt.Sprintf("(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=%s)(PORT=%s)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=FREEPDB1)))", dbhost, DBPort) 22 var target string 23 24 const xealias = "FREE.local" 25 26 func TestOracleConnect(t *testing.T) { 27 if os.Getenv("SKIP_ORACLE") != "" { 28 t.Skip("Skipping ORACLE testing in CI environment") 29 } 30 31 const toalias = "TOTEST.local" 32 const totest = "(DESCRIPTION=((TRANSPORT_CONNECT_TIMEOUT=3)(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=totest)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=totest.local)))" 33 tnsFilename := tnsAdminDir + "/connect.ora" 34 35 //nolint gosec 36 _ = os.WriteFile(tnsFilename, []byte(xealias+"="+xetest+"\n\n"+toalias+"="+totest), 0644) 37 38 t.Logf("load from %s", tnsFilename) 39 tnsEntries, domain, err := dblib.GetTnsnames(tnsFilename, true) 40 t.Logf("Default Domain: '%s'", domain) 41 t.Run("Parse TNSNames.ora", func(t *testing.T) { 42 require.NoErrorf(t, err, "Parsing %s failed: %s", tnsFilename, err) 43 }) 44 if err != nil { 45 t.Logf("load returned error: %s ", err) 46 return 47 } 48 49 e, found := dblib.GetEntry(xealias, tnsEntries, domain) 50 require.True(t, found, "Alias not found") 51 desc := common.RemoveSpace(e.Desc) 52 t.Logf("Desc:%s", desc) 53 dbContainer, err := prepareContainer() 54 require.NoErrorf(t, err, "prepare Oracle Container failed") 55 require.NotNil(t, dbContainer, "Prepare failed") 56 defer common.DestroyDockerContainer(dbContainer) 57 58 t.Run("Direct connect", func(t *testing.T) { 59 var db *sql.DB 60 t.Logf("connect to %s\n", target) 61 db, err = sql.Open("oracle", target) 62 assert.NoErrorf(t, err, "Open failed: %s", err) 63 assert.IsType(t, &sql.DB{}, db, "Returned wrong type") 64 err = db.Ping() 65 assert.NoErrorf(t, err, "Connect failed: %s", err) 66 }) 67 t.Run("CMD Check with dummy", func(t *testing.T) { 68 out := "" 69 args := []string{ 70 "service", 71 "check", 72 "--filename", tnsFilename, 73 "--service", xealias, 74 "--info", 75 "--unit-test", 76 } 77 out, err = common.CmdRun(RootCmd, args) 78 t.Logf(out) 79 assert.NoErrorf(t, err, "Check should succeed") 80 expect := fmt.Sprintf("service %s connected", xealias) 81 assert.Contains(t, out, expect, "Expected Message not found") 82 assert.Contains(t, out, "Connect OK, but Login error", "Expected Login Error not found") 83 }) 84 t.Run("CMD all Check with dummy", func(t *testing.T) { 85 out := "" 86 args := []string{ 87 "service", 88 "check", 89 "--filename", tnsFilename, 90 "--all", 91 "--info", 92 "--unit-test", 93 } 94 out, err = common.CmdRun(RootCmd, args) 95 t.Logf(out) 96 assert.Errorf(t, err, "Check should fail") 97 expect := "2 entries checked, 1 ok, 1 failed" 98 assert.Contains(t, out, expect, "Expected Message not found") 99 all = false 100 }) 101 t.Run("CMD Check with real user", func(t *testing.T) { 102 out := "" 103 args := []string{ 104 "service", 105 "check", 106 "--filename", tnsFilename, 107 "--service", xealias, 108 "--user", DBUSER, 109 "--password", DBPASSWORD, 110 "--timeout", fmt.Sprintf("%d", TIMEOUT), 111 "--info", 112 "--unit-test", 113 } 114 out, err = common.CmdRun(RootCmd, args) 115 t.Logf(out) 116 assert.NoErrorf(t, err, "Check should succeed") 117 expect := fmt.Sprintf("service %s connected", xealias) 118 assert.Contains(t, out, expect, "Expected Message not found") 119 }) 120 t.Run("CMD false Check", func(t *testing.T) { 121 out := "" 122 args := []string{ 123 "service", 124 "check", 125 "--filename", tnsFilename, 126 "--service", "dummy", 127 "--unit-test", 128 } 129 out, err = common.CmdRun(RootCmd, args) 130 t.Logf(out) 131 assert.Errorf(t, err, "Check should fail") 132 assert.Contains(t, out, "Error: alias dummy not found", "Expected Message not found") 133 }) 134 t.Run("CMD DBHOST Query", func(t *testing.T) { 135 out := "" 136 args := []string{ 137 "service", 138 "check", 139 "--filename", tnsFilename, 140 "--service", xealias, 141 "--dbhost", 142 "--user", DBUSER, 143 "--password", DBPASSWORD, 144 "--timeout", fmt.Sprintf("%d", TIMEOUT), 145 "--info", 146 "--unit-test", 147 } 148 out, err = common.CmdRun(RootCmd, args) 149 t.Logf(out) 150 assert.NoErrorf(t, err, "Check should succeed") 151 expect := fmt.Sprintf("service %s connected", xealias) 152 assert.Contains(t, out, expect, "Expected connect Message not found") 153 expect = "Query returned" 154 assert.Contains(t, out, expect, "Expected Query Message not found") 155 }) 156 t.Run("CMD FREE Port Info", func(t *testing.T) { 157 out := "" 158 args := []string{ 159 "service", 160 "info", 161 "ports", 162 "--filename", tnsFilename, 163 "--service", xealias, 164 "--info", 165 "--nodns", 166 "--unit-test", 167 } 168 out, err = common.CmdRun(RootCmd, args) 169 t.Logf(out) 170 assert.NoErrorf(t, err, "Check should succeed") 171 expect := fmt.Sprintf("Alias %s uses", xealias) 172 assert.Contains(t, out, expect, "Expected Message not found") 173 }) 174 t.Run("CMD JDBC info", func(t *testing.T) { 175 const jdbcprefix = "jdbc:oracle:thin:@" 176 t.Run("CMD JDBC info normal", func(t *testing.T) { 177 out := "" 178 args := []string{ 179 "service", 180 "info", 181 "jdbc", 182 "--filename", tnsFilename, 183 "--service", xealias, 184 "--info", 185 "--unit-test", 186 } 187 out, err = common.CmdRun(RootCmd, args) 188 t.Logf(out) 189 assert.NoErrorf(t, err, "Check should succeed") 190 expect := jdbcprefix + xetest 191 assert.Contains(t, out, expect, "Expected Message not found") 192 }) 193 194 t.Run("CMD JDBC Timeout replaced", func(t *testing.T) { 195 out := "" 196 args := []string{ 197 "service", 198 "info", 199 "jdbc", 200 "--filename", tnsFilename, 201 "--service", toalias, 202 "--info", 203 "--unit-test", 204 } 205 out, err = common.CmdRun(RootCmd, args) 206 t.Logf(out) 207 assert.NoErrorf(t, err, "Check should succeed") 208 expect := jdbcprefix + totest 209 expect = strings.ReplaceAll(expect, "TIMEOUT=3)", "TIMEOUT=3000)") 210 assert.Contains(t, out, expect, "Expected Message not found") 211 }) 212 t.Run("CMD JDBC Timeout not replaced", func(t *testing.T) { 213 out := "" 214 args := []string{ 215 "service", 216 "info", 217 "jdbc", 218 "--filename", tnsFilename, 219 "--service", toalias, 220 "--noModifyTransportConnectTimeout", 221 "--info", 222 "--unit-test", 223 } 224 out, err = common.CmdRun(RootCmd, args) 225 t.Logf(out) 226 assert.NoErrorf(t, err, "Check should succeed") 227 expect := jdbcprefix + totest 228 assert.Contains(t, out, expect, "Expected Message not found") 229 }) 230 }) 231 t.Run("CMD TNS info", func(t *testing.T) { 232 out := "" 233 args := []string{ 234 "service", 235 "info", 236 "tns", 237 "--filename", tnsFilename, 238 "--service", xealias, 239 "--info", 240 "--unit-test", 241 } 242 out, err = common.CmdRun(RootCmd, args) 243 t.Logf(out) 244 assert.NoErrorf(t, err, "Check should succeed") 245 expect := strings.ToUpper(xealias) 246 assert.Contains(t, strings.ToUpper(out), expect, "Expected Message '%s' not found", expect) 247 }) 248 249 t.Run("CMD Portcheck", func(t *testing.T) { 250 out := "" 251 args := []string{ 252 "service", 253 "portcheck", 254 "--filename", tnsFilename, 255 "--service", xealias, 256 "--info", 257 "--nodns", 258 "--unit-test", 259 } 260 out, err = common.CmdRun(RootCmd, args) 261 t.Logf(out) 262 assert.NoErrorf(t, err, "Check should succeed") 263 expect := dbhost 264 assert.Contains(t, out, expect, "Expected Message not found") 265 assert.Contains(t, out, "OPEN", "Port should be open") 266 }) 267 t.Run("CMD Portcheck Error", func(t *testing.T) { 268 out := "" 269 args := []string{ 270 "service", 271 "portcheck", 272 "--filename", tnsFilename, 273 "--service", toalias, 274 "--info", 275 "--nodns", 276 "--unit-test", 277 } 278 out, err = common.CmdRun(RootCmd, args) 279 t.Logf(out) 280 assert.NoErrorf(t, err, "Check should succeed") 281 assert.Contains(t, out, "PROBLEM", "Port result should be PROBLEM") 282 }) 283 }