common_test.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. package gocql
  2. import (
  3. "flag"
  4. "fmt"
  5. "log"
  6. "strings"
  7. "sync"
  8. "testing"
  9. "time"
  10. )
  11. var (
  12. flagCluster = flag.String("cluster", "127.0.0.1", "a comma-separated list of host:port tuples")
  13. flagProto = flag.Int("proto", 2, "protcol version")
  14. flagCQL = flag.String("cql", "3.0.0", "CQL version")
  15. flagRF = flag.Int("rf", 1, "replication factor for test keyspace")
  16. clusterSize = flag.Int("clusterSize", 1, "the expected size of the cluster")
  17. flagRetry = flag.Int("retries", 5, "number of times to retry queries")
  18. flagAutoWait = flag.Duration("autowait", 1000*time.Millisecond, "time to wait for autodiscovery to fill the hosts poll")
  19. flagRunSslTest = flag.Bool("runssl", false, "Set to true to run ssl test")
  20. flagRunAuthTest = flag.Bool("runauth", false, "Set to true to run authentication test")
  21. flagCompressTest = flag.String("compressor", "", "compressor to use")
  22. flagTimeout = flag.Duration("gocql.timeout", 5*time.Second, "sets the connection `timeout` for all operations")
  23. clusterHosts []string
  24. )
  25. func init() {
  26. flag.Parse()
  27. clusterHosts = strings.Split(*flagCluster, ",")
  28. log.SetFlags(log.Lshortfile | log.LstdFlags)
  29. }
  30. func addSslOptions(cluster *ClusterConfig) *ClusterConfig {
  31. if *flagRunSslTest {
  32. cluster.SslOpts = &SslOptions{
  33. CertPath: "testdata/pki/gocql.crt",
  34. KeyPath: "testdata/pki/gocql.key",
  35. CaPath: "testdata/pki/ca.crt",
  36. EnableHostVerification: false,
  37. }
  38. }
  39. return cluster
  40. }
  41. var initOnce sync.Once
  42. func createTable(s *Session, table string) error {
  43. // lets just be really sure
  44. if err := s.control.awaitSchemaAgreement(); err != nil {
  45. log.Printf("error waiting for schema agreement pre create table=%q err=%v\n", table, err)
  46. return err
  47. }
  48. if err := s.Query(table).RetryPolicy(nil).Exec(); err != nil {
  49. log.Printf("error creating table table=%q err=%v\n", table, err)
  50. return err
  51. }
  52. if err := s.control.awaitSchemaAgreement(); err != nil {
  53. log.Printf("error waiting for schema agreement post create table=%q err=%v\n", table, err)
  54. return err
  55. }
  56. return nil
  57. }
  58. func createCluster() *ClusterConfig {
  59. cluster := NewCluster(clusterHosts...)
  60. cluster.ProtoVersion = *flagProto
  61. cluster.CQLVersion = *flagCQL
  62. cluster.Timeout = *flagTimeout
  63. cluster.Consistency = Quorum
  64. cluster.MaxWaitSchemaAgreement = 2 * time.Minute // travis might be slow
  65. if *flagRetry > 0 {
  66. cluster.RetryPolicy = &SimpleRetryPolicy{NumRetries: *flagRetry}
  67. }
  68. switch *flagCompressTest {
  69. case "snappy":
  70. cluster.Compressor = &SnappyCompressor{}
  71. case "":
  72. default:
  73. panic("invalid compressor: " + *flagCompressTest)
  74. }
  75. cluster = addSslOptions(cluster)
  76. return cluster
  77. }
  78. func createKeyspace(tb testing.TB, cluster *ClusterConfig, keyspace string) {
  79. c := *cluster
  80. c.Keyspace = "system"
  81. c.Timeout = 30 * time.Second
  82. session, err := c.CreateSession()
  83. if err != nil {
  84. panic(err)
  85. }
  86. defer session.Close()
  87. defer log.Println("closing keyspace session")
  88. err = createTable(session, `DROP KEYSPACE IF EXISTS `+keyspace)
  89. if err != nil {
  90. panic(fmt.Sprintf("unable to drop keyspace: %v", err))
  91. }
  92. err = createTable(session, fmt.Sprintf(`CREATE KEYSPACE %s
  93. WITH replication = {
  94. 'class' : 'SimpleStrategy',
  95. 'replication_factor' : %d
  96. }`, keyspace, *flagRF))
  97. if err != nil {
  98. panic(fmt.Sprintf("unable to create keyspace: %v", err))
  99. }
  100. }
  101. func createSessionFromCluster(cluster *ClusterConfig, tb testing.TB) *Session {
  102. // Drop and re-create the keyspace once. Different tests should use their own
  103. // individual tables, but can assume that the table does not exist before.
  104. initOnce.Do(func() {
  105. createKeyspace(tb, cluster, "gocql_test")
  106. })
  107. cluster.Keyspace = "gocql_test"
  108. session, err := cluster.CreateSession()
  109. if err != nil {
  110. tb.Fatal("createSession:", err)
  111. }
  112. if err := session.control.awaitSchemaAgreement(); err != nil {
  113. tb.Fatal(err)
  114. }
  115. return session
  116. }
  117. func createSession(tb testing.TB) *Session {
  118. cluster := createCluster()
  119. return createSessionFromCluster(cluster, tb)
  120. }