| 
									
										
										
										
											2019-01-26 05:56:19 +08:00
										 |  |  | package sqlstore | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2021-05-10 23:03:10 +08:00
										 |  |  | 	"errors" | 
					
						
							|  |  |  | 	"net/url" | 
					
						
							| 
									
										
										
										
											2019-01-26 05:56:19 +08:00
										 |  |  | 	"testing" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	"github.com/grafana/grafana/pkg/setting" | 
					
						
							| 
									
										
										
										
											2021-05-10 23:03:10 +08:00
										 |  |  | 	"github.com/stretchr/testify/require" | 
					
						
							| 
									
										
										
										
											2019-01-26 05:56:19 +08:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type sqlStoreTest struct { | 
					
						
							| 
									
										
										
										
											2019-01-28 00:28:02 +08:00
										 |  |  | 	name          string | 
					
						
							|  |  |  | 	dbType        string | 
					
						
							|  |  |  | 	dbHost        string | 
					
						
							| 
									
										
										
										
											2021-05-10 23:03:10 +08:00
										 |  |  | 	dbURL         string | 
					
						
							| 
									
										
										
										
											2019-01-26 05:56:19 +08:00
										 |  |  | 	connStrValues []string | 
					
						
							| 
									
										
										
										
											2021-05-10 23:03:10 +08:00
										 |  |  | 	err           error | 
					
						
							| 
									
										
										
										
											2019-01-26 05:56:19 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-28 00:28:02 +08:00
										 |  |  | var sqlStoreTestCases = []sqlStoreTest{ | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		name:          "MySQL IPv4", | 
					
						
							|  |  |  | 		dbType:        "mysql", | 
					
						
							|  |  |  | 		dbHost:        "1.2.3.4:5678", | 
					
						
							|  |  |  | 		connStrValues: []string{"tcp(1.2.3.4:5678)"}, | 
					
						
							| 
									
										
										
										
											2019-01-26 05:56:19 +08:00
										 |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2019-01-28 00:28:02 +08:00
										 |  |  | 	{ | 
					
						
							|  |  |  | 		name:          "Postgres IPv4", | 
					
						
							|  |  |  | 		dbType:        "postgres", | 
					
						
							|  |  |  | 		dbHost:        "1.2.3.4:5678", | 
					
						
							|  |  |  | 		connStrValues: []string{"host=1.2.3.4", "port=5678"}, | 
					
						
							| 
									
										
										
										
											2019-01-26 05:56:19 +08:00
										 |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2019-01-28 00:28:02 +08:00
										 |  |  | 	{ | 
					
						
							|  |  |  | 		name:          "Postgres IPv4 (Default Port)", | 
					
						
							|  |  |  | 		dbType:        "postgres", | 
					
						
							|  |  |  | 		dbHost:        "1.2.3.4", | 
					
						
							|  |  |  | 		connStrValues: []string{"host=1.2.3.4", "port=5432"}, | 
					
						
							| 
									
										
										
										
											2019-01-26 05:56:19 +08:00
										 |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2019-01-28 00:28:02 +08:00
										 |  |  | 	{ | 
					
						
							|  |  |  | 		name:          "MySQL IPv4 (Default Port)", | 
					
						
							|  |  |  | 		dbType:        "mysql", | 
					
						
							|  |  |  | 		dbHost:        "1.2.3.4", | 
					
						
							|  |  |  | 		connStrValues: []string{"tcp(1.2.3.4)"}, | 
					
						
							| 
									
										
										
										
											2019-01-26 05:56:19 +08:00
										 |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2019-01-28 00:28:02 +08:00
										 |  |  | 	{ | 
					
						
							|  |  |  | 		name:          "MySQL IPv6", | 
					
						
							|  |  |  | 		dbType:        "mysql", | 
					
						
							|  |  |  | 		dbHost:        "[fe80::24e8:31b2:91df:b177]:1234", | 
					
						
							|  |  |  | 		connStrValues: []string{"tcp([fe80::24e8:31b2:91df:b177]:1234)"}, | 
					
						
							| 
									
										
										
										
											2019-01-26 05:56:19 +08:00
										 |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2019-01-28 00:28:02 +08:00
										 |  |  | 	{ | 
					
						
							|  |  |  | 		name:          "Postgres IPv6", | 
					
						
							|  |  |  | 		dbType:        "postgres", | 
					
						
							|  |  |  | 		dbHost:        "[fe80::24e8:31b2:91df:b177]:1234", | 
					
						
							|  |  |  | 		connStrValues: []string{"host=fe80::24e8:31b2:91df:b177", "port=1234"}, | 
					
						
							| 
									
										
										
										
											2019-01-26 05:56:19 +08:00
										 |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2019-01-28 00:28:02 +08:00
										 |  |  | 	{ | 
					
						
							|  |  |  | 		name:          "MySQL IPv6 (Default Port)", | 
					
						
							|  |  |  | 		dbType:        "mysql", | 
					
						
							| 
									
										
										
										
											2019-10-09 14:58:45 +08:00
										 |  |  | 		dbHost:        "[::1]", | 
					
						
							|  |  |  | 		connStrValues: []string{"tcp([::1])"}, | 
					
						
							| 
									
										
										
										
											2019-01-26 05:56:19 +08:00
										 |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2019-01-28 00:28:02 +08:00
										 |  |  | 	{ | 
					
						
							|  |  |  | 		name:          "Postgres IPv6 (Default Port)", | 
					
						
							|  |  |  | 		dbType:        "postgres", | 
					
						
							| 
									
										
										
										
											2019-10-09 14:58:45 +08:00
										 |  |  | 		dbHost:        "[::1]", | 
					
						
							| 
									
										
										
										
											2019-01-28 00:28:02 +08:00
										 |  |  | 		connStrValues: []string{"host=::1", "port=5432"}, | 
					
						
							| 
									
										
										
										
											2019-01-26 05:56:19 +08:00
										 |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2021-05-10 23:03:10 +08:00
										 |  |  | 	{ | 
					
						
							|  |  |  | 		name:  "Invalid database URL", | 
					
						
							|  |  |  | 		dbURL: "://invalid.com/", | 
					
						
							|  |  |  | 		err:   &url.Error{Op: "parse", URL: "://invalid.com/", Err: errors.New("missing protocol scheme")}, | 
					
						
							|  |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2019-01-26 05:56:19 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-24 17:04:03 +08:00
										 |  |  | func TestIntegrationSQLConnectionString(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2022-06-10 23:46:21 +08:00
										 |  |  | 	if testing.Short() { | 
					
						
							|  |  |  | 		t.Skip("skipping integration test") | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2021-05-10 23:03:10 +08:00
										 |  |  | 	for _, testCase := range sqlStoreTestCases { | 
					
						
							|  |  |  | 		t.Run(testCase.name, func(t *testing.T) { | 
					
						
							|  |  |  | 			sqlstore := &SQLStore{} | 
					
						
							|  |  |  | 			sqlstore.Cfg = makeSQLStoreTestConfig(t, testCase.dbType, testCase.dbHost, testCase.dbURL) | 
					
						
							|  |  |  | 			connStr, err := sqlstore.buildConnectionString() | 
					
						
							|  |  |  | 			require.Equal(t, testCase.err, err) | 
					
						
							| 
									
										
										
										
											2019-01-26 05:56:19 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-10 23:03:10 +08:00
										 |  |  | 			for _, connSubStr := range testCase.connStrValues { | 
					
						
							|  |  |  | 				require.Contains(t, connStr, connSubStr) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2019-01-26 05:56:19 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-10 23:03:10 +08:00
										 |  |  | func makeSQLStoreTestConfig(t *testing.T, dbType, host, dbURL string) *setting.Cfg { | 
					
						
							|  |  |  | 	t.Helper() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-26 05:56:19 +08:00
										 |  |  | 	cfg := setting.NewCfg() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-22 20:08:18 +08:00
										 |  |  | 	sec, err := cfg.Raw.NewSection("database") | 
					
						
							| 
									
										
										
										
											2021-05-10 23:03:10 +08:00
										 |  |  | 	require.NoError(t, err) | 
					
						
							| 
									
										
										
										
											2019-10-22 20:08:18 +08:00
										 |  |  | 	_, err = sec.NewKey("type", dbType) | 
					
						
							| 
									
										
										
										
											2021-05-10 23:03:10 +08:00
										 |  |  | 	require.NoError(t, err) | 
					
						
							| 
									
										
										
										
											2019-10-22 20:08:18 +08:00
										 |  |  | 	_, err = sec.NewKey("host", host) | 
					
						
							| 
									
										
										
										
											2021-05-10 23:03:10 +08:00
										 |  |  | 	require.NoError(t, err) | 
					
						
							|  |  |  | 	_, err = sec.NewKey("url", dbURL) | 
					
						
							|  |  |  | 	require.NoError(t, err) | 
					
						
							| 
									
										
										
										
											2019-10-22 20:08:18 +08:00
										 |  |  | 	_, err = sec.NewKey("user", "user") | 
					
						
							| 
									
										
										
										
											2021-05-10 23:03:10 +08:00
										 |  |  | 	require.NoError(t, err) | 
					
						
							| 
									
										
										
										
											2019-10-22 20:08:18 +08:00
										 |  |  | 	_, err = sec.NewKey("name", "test_db") | 
					
						
							| 
									
										
										
										
											2021-05-10 23:03:10 +08:00
										 |  |  | 	require.NoError(t, err) | 
					
						
							| 
									
										
										
										
											2019-10-22 20:08:18 +08:00
										 |  |  | 	_, err = sec.NewKey("password", "pass") | 
					
						
							| 
									
										
										
										
											2021-05-10 23:03:10 +08:00
										 |  |  | 	require.NoError(t, err) | 
					
						
							| 
									
										
										
										
											2019-01-26 05:56:19 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-28 00:28:02 +08:00
										 |  |  | 	return cfg | 
					
						
							| 
									
										
										
										
											2019-01-26 05:56:19 +08:00
										 |  |  | } |