github.com/snowflakedb/gosnowflake@v1.9.0/easy_logging_test.go (about)

     1  package gosnowflake
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"os"
     7  	"path"
     8  	"path/filepath"
     9  	"strings"
    10  	"sync"
    11  	"testing"
    12  )
    13  
    14  func TestInitializeEasyLoggingOnlyOnceWhenConfigGivenAsAParameter(t *testing.T) {
    15  	defer cleanUp()
    16  	logDir := t.TempDir()
    17  	logLevel := levelError
    18  	contents := createClientConfigContent(logLevel, logDir)
    19  	configFilePath := createFile(t, "config.json", contents, logDir)
    20  	easyLoggingInitTrials.reset()
    21  
    22  	err := openWithClientConfigFile(t, configFilePath)
    23  
    24  	assertNilF(t, err, "open config error")
    25  	assertEqualE(t, toClientConfigLevel(logger.GetLogLevel()), logLevel, "error log level check")
    26  	assertEqualE(t, easyLoggingInitTrials.configureCounter, 1)
    27  
    28  	err = openWithClientConfigFile(t, "")
    29  	assertNilF(t, err, "open config error")
    30  	err = openWithClientConfigFile(t, configFilePath)
    31  	assertNilF(t, err, "open config error")
    32  	err = openWithClientConfigFile(t, "/another-config.json")
    33  	assertNilF(t, err, "open config error")
    34  
    35  	assertEqualE(t, toClientConfigLevel(logger.GetLogLevel()), logLevel, "error log level check")
    36  	assertEqualE(t, easyLoggingInitTrials.configureCounter, 1)
    37  }
    38  
    39  func TestConfigureEasyLoggingOnlyOnceWhenInitializedWithoutConfigFilePath(t *testing.T) {
    40  	appExe, err := os.Executable()
    41  	assertNilF(t, err, "application exe not accessible")
    42  	userHome, err := os.UserHomeDir()
    43  	assertNilF(t, err, "user home directory not accessible")
    44  
    45  	testcases := []struct {
    46  		name string
    47  		dir  string
    48  	}{
    49  		{
    50  			name: "user home directory",
    51  			dir:  userHome,
    52  		},
    53  		{
    54  			name: "application directory",
    55  			dir:  filepath.Dir(appExe),
    56  		},
    57  	}
    58  
    59  	for _, test := range testcases {
    60  		t.Run(test.name, func(t *testing.T) {
    61  			defer cleanUp()
    62  			logDir := t.TempDir()
    63  			assertNilF(t, err, "user home directory error")
    64  			logLevel := levelError
    65  			contents := createClientConfigContent(logLevel, logDir)
    66  			configFilePath := createFile(t, defaultConfigName, contents, test.dir)
    67  			defer os.Remove(configFilePath)
    68  			easyLoggingInitTrials.reset()
    69  
    70  			err = openWithClientConfigFile(t, "")
    71  			assertNilF(t, err, "open config error")
    72  			err = openWithClientConfigFile(t, "")
    73  			assertNilF(t, err, "open config error")
    74  
    75  			assertEqualE(t, toClientConfigLevel(logger.GetLogLevel()), logLevel, "error log level check")
    76  			assertEqualE(t, easyLoggingInitTrials.configureCounter, 1)
    77  		})
    78  	}
    79  }
    80  
    81  func TestReconfigureEasyLoggingIfConfigPathWasNotGivenForTheFirstTime(t *testing.T) {
    82  	defer cleanUp()
    83  	configDir, err := os.UserHomeDir()
    84  	logDir := t.TempDir()
    85  	assertNilF(t, err, "user home directory error")
    86  	homeConfigLogLevel := levelError
    87  	homeConfigContent := createClientConfigContent(homeConfigLogLevel, logDir)
    88  	homeConfigFilePath := createFile(t, defaultConfigName, homeConfigContent, configDir)
    89  	defer os.Remove(homeConfigFilePath)
    90  	customLogLevel := levelWarn
    91  	customFileContent := createClientConfigContent(customLogLevel, logDir)
    92  	customConfigFilePath := createFile(t, "config.json", customFileContent, configDir)
    93  	easyLoggingInitTrials.reset()
    94  
    95  	err = openWithClientConfigFile(t, "")
    96  	logger.Error("Error message")
    97  
    98  	assertNilF(t, err, "open config error")
    99  	assertEqualE(t, toClientConfigLevel(logger.GetLogLevel()), homeConfigLogLevel, "tmp dir log level check")
   100  	assertEqualE(t, easyLoggingInitTrials.configureCounter, 1)
   101  
   102  	err = openWithClientConfigFile(t, customConfigFilePath)
   103  	logger.Error("Warning message")
   104  
   105  	assertNilF(t, err, "open config error")
   106  	assertEqualE(t, toClientConfigLevel(logger.GetLogLevel()), customLogLevel, "custom dir log level check")
   107  	assertEqualE(t, easyLoggingInitTrials.configureCounter, 2)
   108  	var logContents []byte
   109  	logContents, err = os.ReadFile(path.Join(logDir, "go", "snowflake.log"))
   110  	assertNilF(t, err, "read file error")
   111  	logs := notEmptyLines(string(logContents))
   112  	assertEqualE(t, len(logs), 2, "number of logs")
   113  }
   114  
   115  func TestEasyLoggingFailOnUnknownLevel(t *testing.T) {
   116  	defer cleanUp()
   117  	dir := t.TempDir()
   118  	easyLoggingInitTrials.reset()
   119  	configContent := createClientConfigContent("something_unknown", dir)
   120  	configFilePath := createFile(t, "config.json", configContent, dir)
   121  
   122  	err := openWithClientConfigFile(t, configFilePath)
   123  
   124  	assertNotNilF(t, err, "open config error")
   125  	assertStringContainsE(t, err.Error(), fmt.Sprint(ErrCodeClientConfigFailed), "error code")
   126  	assertStringContainsE(t, err.Error(), "parsing client config failed", "error message")
   127  }
   128  
   129  func TestEasyLoggingFailOnNotExistingConfigFile(t *testing.T) {
   130  	defer cleanUp()
   131  	easyLoggingInitTrials.reset()
   132  
   133  	err := openWithClientConfigFile(t, "/not-existing-file.json")
   134  
   135  	assertNotNilF(t, err, "open config error")
   136  	assertStringContainsE(t, err.Error(), fmt.Sprint(ErrCodeClientConfigFailed), "error code")
   137  	assertStringContainsE(t, err.Error(), "parsing client config failed", "error message")
   138  }
   139  
   140  func TestLogToConfiguredFile(t *testing.T) {
   141  	defer cleanUp()
   142  	dir := t.TempDir()
   143  	easyLoggingInitTrials.reset()
   144  	configContent := createClientConfigContent(levelWarn, dir)
   145  	configFilePath := createFile(t, "config.json", configContent, dir)
   146  	logFilePath := path.Join(dir, "go", "snowflake.log")
   147  	err := openWithClientConfigFile(t, configFilePath)
   148  	assertNilF(t, err, "open config error")
   149  
   150  	logger.Error("Error message")
   151  	logger.Warn("Warning message")
   152  	logger.Warning("Warning message")
   153  	logger.Info("Info message")
   154  	logger.Trace("Trace message")
   155  
   156  	var logContents []byte
   157  	logContents, err = os.ReadFile(logFilePath)
   158  	assertNilF(t, err, "read file error")
   159  	logs := notEmptyLines(string(logContents))
   160  	assertEqualE(t, len(logs), 3, "number of logs")
   161  	errorLogs := filterStrings(logs, func(val string) bool {
   162  		return strings.Contains(val, "level=error")
   163  	})
   164  	assertEqualE(t, len(errorLogs), 1, "error logs count")
   165  	warningLogs := filterStrings(logs, func(val string) bool {
   166  		return strings.Contains(val, "level=warning")
   167  	})
   168  	assertEqualE(t, len(warningLogs), 2, "warning logs count")
   169  }
   170  
   171  func TestDataRace(t *testing.T) {
   172  	n := 10
   173  	wg := sync.WaitGroup{}
   174  	wg.Add(n)
   175  
   176  	for range make([]int, n) {
   177  		go func() {
   178  			defer wg.Done()
   179  
   180  			err := initEasyLogging("")
   181  			assertNilF(t, err, "no error from db")
   182  		}()
   183  	}
   184  
   185  	wg.Wait()
   186  }
   187  
   188  func notEmptyLines(lines string) []string {
   189  	notEmptyFunc := func(val string) bool {
   190  		return val != ""
   191  	}
   192  	return filterStrings(strings.Split(strings.ReplaceAll(lines, "\r\n", "\n"), "\n"), notEmptyFunc)
   193  }
   194  
   195  func cleanUp() {
   196  	newLogger := CreateDefaultLogger()
   197  	logger.Replace(&newLogger)
   198  	easyLoggingInitTrials.reset()
   199  }
   200  
   201  func toClientConfigLevel(logLevel string) string {
   202  	logLevelUpperCase := strings.ToUpper(logLevel)
   203  	switch strings.ToUpper(logLevel) {
   204  	case "WARNING":
   205  		return levelWarn
   206  	case levelOff, levelError, levelWarn, levelInfo, levelDebug, levelTrace:
   207  		return logLevelUpperCase
   208  	default:
   209  		return ""
   210  	}
   211  }
   212  
   213  func filterStrings(values []string, keep func(string) bool) []string {
   214  	var filteredStrings []string
   215  	for _, val := range values {
   216  		if keep(val) {
   217  			filteredStrings = append(filteredStrings, val)
   218  		}
   219  	}
   220  	return filteredStrings
   221  }
   222  
   223  func defaultConfig(t *testing.T) *Config {
   224  	config, err := ParseDSN(dsn)
   225  	assertNilF(t, err, "parse dsn error")
   226  	return config
   227  }
   228  
   229  func openWithClientConfigFile(t *testing.T, clientConfigFile string) error {
   230  	driver := SnowflakeDriver{}
   231  	config := defaultConfig(t)
   232  	config.ClientConfigFile = clientConfigFile
   233  	_, err := driver.OpenWithConfig(context.Background(), *config)
   234  	return err
   235  }