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 }