integration_test.go 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. // +build all integration
  2. package gocql
  3. // This file groups integration tests where Cassandra has to be set up with some special integration variables
  4. import (
  5. "reflect"
  6. "testing"
  7. "time"
  8. )
  9. // TestAuthentication verifies that gocql will work with a host configured to only accept authenticated connections
  10. func TestAuthentication(t *testing.T) {
  11. if *flagProto < 2 {
  12. t.Skip("Authentication is not supported with protocol < 2")
  13. }
  14. if !*flagRunAuthTest {
  15. t.Skip("Authentication is not configured in the target cluster")
  16. }
  17. cluster := createCluster()
  18. cluster.Authenticator = PasswordAuthenticator{
  19. Username: "cassandra",
  20. Password: "cassandra",
  21. }
  22. session, err := cluster.CreateSession()
  23. if err != nil {
  24. t.Fatalf("Authentication error: %s", err)
  25. }
  26. session.Close()
  27. }
  28. func TestGetHosts(t *testing.T) {
  29. cluster := createCluster()
  30. session := createSessionFromCluster(cluster, t)
  31. hosts, partitioner, err := session.hostSource.GetHosts()
  32. assertTrue(t, "err == nil", err == nil)
  33. assertEqual(t, "len(hosts)", len(clusterHosts), len(hosts))
  34. assertTrue(t, "len(partitioner) != 0", len(partitioner) != 0)
  35. }
  36. //TestRingDiscovery makes sure that you can autodiscover other cluster members when you seed a cluster config with just one node
  37. func TestRingDiscovery(t *testing.T) {
  38. cluster := createCluster()
  39. cluster.Hosts = clusterHosts[:1]
  40. session := createSessionFromCluster(cluster, t)
  41. defer session.Close()
  42. if *clusterSize > 1 {
  43. // wait for autodiscovery to update the pool with the list of known hosts
  44. time.Sleep(*flagAutoWait)
  45. }
  46. session.pool.mu.RLock()
  47. defer session.pool.mu.RUnlock()
  48. size := len(session.pool.hostConnPools)
  49. if *clusterSize != size {
  50. for p, pool := range session.pool.hostConnPools {
  51. t.Logf("p=%q host=%v ips=%s", p, pool.host, pool.host.ConnectAddress().String())
  52. }
  53. t.Errorf("Expected a cluster size of %d, but actual size was %d", *clusterSize, size)
  54. }
  55. }
  56. func TestWriteFailure(t *testing.T) {
  57. cluster := createCluster()
  58. createKeyspace(t, cluster, "test")
  59. cluster.Keyspace = "test"
  60. session, err := cluster.CreateSession()
  61. if err != nil {
  62. t.Fatal("create session:", err)
  63. }
  64. defer session.Close()
  65. if err := createTable(session, "CREATE TABLE test.test (id int,value int,PRIMARY KEY (id))"); err != nil {
  66. t.Fatalf("failed to create table with error '%v'", err)
  67. }
  68. if err := session.Query(`INSERT INTO test.test (id, value) VALUES (1, 1)`).Exec(); err != nil {
  69. errWrite, ok := err.(*RequestErrWriteFailure)
  70. if ok {
  71. if session.cfg.ProtoVersion >= 5 {
  72. // ErrorMap should be filled with some hosts that should've errored
  73. if len(errWrite.ErrorMap) == 0 {
  74. t.Fatal("errWrite.ErrorMap should have some failed hosts but it didn't have any")
  75. }
  76. } else {
  77. // Map doesn't get filled for V4
  78. if len(errWrite.ErrorMap) != 0 {
  79. t.Fatal("errWrite.ErrorMap should have length 0, it's: ", len(errWrite.ErrorMap))
  80. }
  81. }
  82. } else {
  83. t.Fatal("error should be RequestErrWriteFailure, it's: ", errWrite)
  84. }
  85. } else {
  86. t.Fatal("a write fail error should have happened when querying test keyspace")
  87. }
  88. if err = session.Query("DROP KEYSPACE test").Exec(); err != nil {
  89. t.Fatal(err)
  90. }
  91. }
  92. func TestCustomPayloadMessages(t *testing.T) {
  93. cluster := createCluster()
  94. session := createSessionFromCluster(cluster, t)
  95. defer session.Close()
  96. if err := createTable(session, "CREATE TABLE gocql_test.testCustomPayloadMessages (id int, value int, PRIMARY KEY (id))"); err != nil {
  97. t.Fatal(err)
  98. }
  99. // QueryMessage
  100. var customPayload = map[string][]byte{"a": []byte{10, 20}, "b": []byte{20, 30}}
  101. query := session.Query("SELECT id FROM testCustomPayloadMessages where id = ?", 42).Consistency(One).CustomPayload(customPayload)
  102. iter := query.Iter()
  103. rCustomPayload := iter.GetCustomPayload()
  104. if !reflect.DeepEqual(customPayload, rCustomPayload) {
  105. t.Fatal("The received custom payload should match the sent")
  106. }
  107. iter.Close()
  108. // Insert query
  109. query = session.Query("INSERT INTO testCustomPayloadMessages(id,value) VALUES(1, 1)").Consistency(One).CustomPayload(customPayload)
  110. iter = query.Iter()
  111. rCustomPayload = iter.GetCustomPayload()
  112. if !reflect.DeepEqual(customPayload, rCustomPayload) {
  113. t.Fatal("The received custom payload should match the sent")
  114. }
  115. iter.Close()
  116. // Batch Message
  117. b := session.NewBatch(LoggedBatch)
  118. b.CustomPayload = customPayload
  119. b.Query("INSERT INTO testCustomPayloadMessages(id,value) VALUES(1, 1)")
  120. if err := session.ExecuteBatch(b); err != nil {
  121. t.Fatalf("query failed. %v", err)
  122. }
  123. }
  124. func TestCustomPayloadValues(t *testing.T) {
  125. cluster := createCluster()
  126. session := createSessionFromCluster(cluster, t)
  127. defer session.Close()
  128. if err := createTable(session, "CREATE TABLE gocql_test.testCustomPayloadValues (id int, value int, PRIMARY KEY (id))"); err != nil {
  129. t.Fatal(err)
  130. }
  131. values := []map[string][]byte{map[string][]byte{"a": []byte{10, 20}, "b": []byte{20, 30}}, nil, map[string][]byte{"a": []byte{10, 20}, "b": nil}}
  132. for _, customPayload := range values {
  133. query := session.Query("SELECT id FROM testCustomPayloadValues where id = ?", 42).Consistency(One).CustomPayload(customPayload)
  134. iter := query.Iter()
  135. rCustomPayload := iter.GetCustomPayload()
  136. if !reflect.DeepEqual(customPayload, rCustomPayload) {
  137. t.Fatal("The received custom payload should match the sent")
  138. }
  139. }
  140. }
  141. func TestUDF(t *testing.T) {
  142. session := createSession(t)
  143. defer session.Close()
  144. if session.cfg.ProtoVersion < 4 {
  145. t.Skip("skipping UDF support on proto < 4")
  146. }
  147. const query = `CREATE OR REPLACE FUNCTION uniq(state set<text>, val text)
  148. CALLED ON NULL INPUT RETURNS set<text> LANGUAGE java
  149. AS 'state.add(val); return state;'`
  150. err := session.Query(query).Exec()
  151. if err != nil {
  152. t.Fatal(err)
  153. }
  154. }