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  }