github.com/muhammadn/cortex@v1.9.1-0.20220510110439-46bb7000d03d/pkg/chunk/cassandra/storage_client_test.go (about)

     1  package cassandra
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/gocql/gocql"
     7  	"github.com/grafana/dskit/flagext"
     8  	"github.com/stretchr/testify/assert"
     9  	"github.com/stretchr/testify/require"
    10  )
    11  
    12  func TestConfig_setClusterConfig_noAuth(t *testing.T) {
    13  	cfg := defaultConfig()
    14  	cfg.Auth = false
    15  	require.NoError(t, cfg.Validate())
    16  
    17  	cqlCfg := gocql.NewCluster()
    18  	err := cfg.setClusterConfig(cqlCfg)
    19  	require.NoError(t, err)
    20  	assert.Nil(t, cqlCfg.Authenticator)
    21  }
    22  
    23  func TestConfig_setClusterConfig_authWithPassword(t *testing.T) {
    24  	cfg := defaultConfig()
    25  	cfg.Auth = true
    26  	cfg.Username = "user"
    27  	cfg.Password = flagext.Secret{Value: "pass"}
    28  	require.NoError(t, cfg.Validate())
    29  
    30  	cqlCfg := gocql.NewCluster()
    31  	err := cfg.setClusterConfig(cqlCfg)
    32  	require.NoError(t, err)
    33  	assert.NotNil(t, cqlCfg.Authenticator)
    34  	assert.Equal(t, "user", cqlCfg.Authenticator.(gocql.PasswordAuthenticator).Username)
    35  	assert.Equal(t, "pass", cqlCfg.Authenticator.(gocql.PasswordAuthenticator).Password)
    36  }
    37  
    38  func TestConfig_setClusterConfig_authWithPasswordFile_withoutTrailingNewline(t *testing.T) {
    39  	cfg := defaultConfig()
    40  	cfg.Auth = true
    41  	cfg.Username = "user"
    42  	cfg.PasswordFile = "testdata/password-without-trailing-newline.txt"
    43  	require.NoError(t, cfg.Validate())
    44  
    45  	cqlCfg := gocql.NewCluster()
    46  	err := cfg.setClusterConfig(cqlCfg)
    47  	require.NoError(t, err)
    48  	assert.NotNil(t, cqlCfg.Authenticator)
    49  	assert.Equal(t, "user", cqlCfg.Authenticator.(gocql.PasswordAuthenticator).Username)
    50  	assert.Equal(t, "pass", cqlCfg.Authenticator.(gocql.PasswordAuthenticator).Password)
    51  }
    52  
    53  func TestConfig_setClusterConfig_authWithPasswordFile_withTrailingNewline(t *testing.T) {
    54  	cfg := defaultConfig()
    55  	cfg.Auth = true
    56  	cfg.Username = "user"
    57  	cfg.PasswordFile = "testdata/password-with-trailing-newline.txt"
    58  	require.NoError(t, cfg.Validate())
    59  
    60  	cqlCfg := gocql.NewCluster()
    61  	err := cfg.setClusterConfig(cqlCfg)
    62  	require.NoError(t, err)
    63  	assert.NotNil(t, cqlCfg.Authenticator)
    64  	assert.Equal(t, "user", cqlCfg.Authenticator.(gocql.PasswordAuthenticator).Username)
    65  	assert.Equal(t, "pass", cqlCfg.Authenticator.(gocql.PasswordAuthenticator).Password)
    66  }
    67  
    68  func TestConfig_setClusterConfig_authWithPasswordAndPasswordFile(t *testing.T) {
    69  	cfg := defaultConfig()
    70  	cfg.Auth = true
    71  	cfg.Username = "user"
    72  	cfg.Password = flagext.Secret{Value: "pass"}
    73  	cfg.PasswordFile = "testdata/password-with-trailing-newline.txt"
    74  	assert.Error(t, cfg.Validate())
    75  }
    76  
    77  func TestConfig_setClusterConfig_clientSSL(t *testing.T) {
    78  	cfg := defaultConfig()
    79  	cfg.SSL = true
    80  	cfg.CAPath = "testdata/example.com.ca.pem"
    81  	cfg.CertPath = "testdata/example.com.pem"
    82  	cfg.KeyPath = "testdata/example.com-key.pem"
    83  	require.NoError(t, cfg.Validate())
    84  
    85  	cqlCfg := gocql.NewCluster()
    86  	err := cfg.setClusterConfig(cqlCfg)
    87  	require.NoError(t, err)
    88  	assert.NotNil(t, cqlCfg.SslOpts)
    89  	assert.Len(t, cqlCfg.SslOpts.Certificates, 1)
    90  }
    91  
    92  func TestConfig_setClusterConfig_clientSSLWithOnlyCertificatePath(t *testing.T) {
    93  	cfg := defaultConfig()
    94  	cfg.SSL = true
    95  	cfg.CAPath = "testdata/example.com.ca.pem"
    96  	cfg.CertPath = "testdata/example.com.pem"
    97  	assert.Error(t, cfg.Validate(), "TLS certificate specified, but private key configuration is missing.")
    98  }
    99  
   100  func TestConfig_setClusterConfig_clientSSLWithOnlyKeyPath(t *testing.T) {
   101  	cfg := defaultConfig()
   102  	cfg.SSL = true
   103  	cfg.CAPath = "testdata/example.com.ca.pem"
   104  	cfg.KeyPath = "testdata/example.com-key.pem"
   105  	assert.Error(t, cfg.Validate(), "TLS private key specified, but certificate configuration is missing.")
   106  }
   107  
   108  func TestConfig_setClusterConfig_clientSSLWithInvalidParameters(t *testing.T) {
   109  	cfg := defaultConfig()
   110  	cfg.SSL = true
   111  	cfg.CAPath = "testdata/example.com.ca.pem"
   112  	cfg.CertPath = "testdata/example.com-key.pem"
   113  	cfg.KeyPath = "testdata/example.com.pem"
   114  
   115  	cluster := gocql.NewCluster()
   116  	assert.Error(t, cfg.setClusterConfig(cluster), "Unable to load TLS certificate and private key.")
   117  }
   118  
   119  func TestConfig_setClusterConfig_consistency(t *testing.T) {
   120  	tests := map[string]struct {
   121  		cfg                 Config
   122  		expectedConsistency string
   123  	}{
   124  		"default config should set default consistency": {
   125  			cfg:                 defaultConfig(),
   126  			expectedConsistency: "QUORUM",
   127  		},
   128  		"should honor configured consistency": {
   129  			cfg: func() Config {
   130  				cfg := defaultConfig()
   131  				cfg.Consistency = "LOCAL_QUORUM"
   132  				return cfg
   133  			}(),
   134  			expectedConsistency: "LOCAL_QUORUM",
   135  		},
   136  	}
   137  
   138  	for testName, testData := range tests {
   139  		t.Run(testName, func(t *testing.T) {
   140  			require.NoError(t, testData.cfg.Validate())
   141  
   142  			cqlCfg := gocql.NewCluster()
   143  			err := testData.cfg.setClusterConfig(cqlCfg)
   144  			require.NoError(t, err)
   145  			assert.Equal(t, testData.expectedConsistency, cqlCfg.Consistency.String())
   146  		})
   147  	}
   148  }
   149  
   150  func defaultConfig() Config {
   151  	cfg := Config{}
   152  	flagext.DefaultValues(&cfg)
   153  	return cfg
   154  }