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  }