gopkg.in/rethinkdb/rethinkdb-go.v6@v6.2.2/internal/integration/tests/rethinkdb_test.go (about) 1 package tests 2 3 import ( 4 "encoding/json" 5 "flag" 6 "fmt" 7 "math/rand" 8 "os" 9 "runtime" 10 "testing" 11 "time" 12 13 test "gopkg.in/check.v1" 14 r "gopkg.in/rethinkdb/rethinkdb-go.v6" 15 ) 16 17 var session *r.Session 18 var testdata = flag.Bool("rethinkdb.testdata", true, "create test data") 19 var url, url1, url2, url3, db, authKey string 20 21 func init() { 22 // Fixing test.testlogfile parsing error on Go 1.13+. 23 if runtime.Version() < "go1.13" { 24 flag.Parse() 25 } 26 27 r.SetVerbose(true) 28 29 // If the test is being run by wercker look for the rethink url 30 url = os.Getenv("RETHINKDB_URL") 31 if url == "" { 32 url = "localhost:28015" 33 } 34 35 url1 = os.Getenv("RETHINKDB_URL_1") 36 if url1 == "" { 37 url1 = "localhost:28016" 38 } 39 40 url2 = os.Getenv("RETHINKDB_URL_2") 41 if url2 == "" { 42 url2 = "localhost:28017" 43 } 44 45 url3 = os.Getenv("RETHINKDB_URL_3") 46 if url3 == "" { 47 url3 = "localhost:28018" 48 } 49 50 db = os.Getenv("RETHINKDB_DB") 51 if db == "" { 52 db = "test" 53 } 54 } 55 56 // 57 // Begin TestMain(), Setup, Teardown 58 // 59 func testSetup(m *testing.M) { 60 var err error 61 session, err = r.Connect(r.ConnectOpts{ 62 Address: url, 63 }) 64 if err != nil { 65 r.Log.Fatalln(err.Error()) 66 } 67 68 setupTestData() 69 } 70 func testTeardown(m *testing.M) { 71 session.Close() 72 } 73 74 func testBenchmarkSetup() { 75 r.DBDrop("benchmarks").Exec(session) 76 r.DBCreate("benchmarks").Exec(session) 77 78 r.DB("benchmarks").TableDrop("benchmarks").Run(session) 79 r.DB("benchmarks").TableCreate("benchmarks").Run(session) 80 } 81 82 func testBenchmarkTeardown() { 83 r.DBDrop("benchmarks").Run(session) 84 } 85 86 func TestMain(m *testing.M) { 87 // seed randomness for use with tests 88 rand.Seed(time.Now().UTC().UnixNano()) 89 90 testSetup(m) 91 testBenchmarkSetup() 92 res := m.Run() 93 testBenchmarkTeardown() 94 testTeardown(m) 95 96 os.Exit(res) 97 } 98 99 // 100 // End TestMain(), Setup, Teardown 101 // 102 103 // Hook up gocheck into the gotest runner. 104 func Test(t *testing.T) { test.TestingT(t) } 105 106 type RethinkSuite struct{} 107 108 var _ = test.Suite(&RethinkSuite{}) 109 110 // Expressions used in tests 111 var now = time.Now() 112 var arr = []interface{}{1, 2, 3, 4, 5, 6, 7, 8, 9} 113 var darr = []interface{}{1, 1, 2, 2, 3, 3, 5, 5, 6} 114 var narr = []interface{}{ 115 1, 2, 3, 4, 5, 6, []interface{}{ 116 7.1, 7.2, 7.3, 117 }, 118 } 119 var obj = map[string]interface{}{"a": 1, "b": 2, "c": 3} 120 var nobj = map[string]interface{}{ 121 "A": 1, 122 "B": 2, 123 "C": map[string]interface{}{ 124 "1": 3, 125 "2": 4, 126 }, 127 } 128 129 var noDupNumObjList = []interface{}{ 130 map[string]interface{}{"id": 1, "g1": 1, "g2": 1, "num": 0}, 131 map[string]interface{}{"id": 2, "g1": 2, "g2": 2, "num": 5}, 132 map[string]interface{}{"id": 3, "g1": 3, "g2": 2, "num": 10}, 133 map[string]interface{}{"id": 5, "g1": 2, "g2": 3, "num": 100}, 134 map[string]interface{}{"id": 6, "g1": 1, "g2": 1, "num": 15}, 135 map[string]interface{}{"id": 8, "g1": 4, "g2": 2, "num": 50}, 136 map[string]interface{}{"id": 9, "g1": 2, "g2": 3, "num": 25}, 137 } 138 var objList = []interface{}{ 139 map[string]interface{}{"id": 1, "g1": 1, "g2": 1, "num": 0}, 140 map[string]interface{}{"id": 2, "g1": 2, "g2": 2, "num": 5}, 141 map[string]interface{}{"id": 3, "g1": 3, "g2": 2, "num": 10}, 142 map[string]interface{}{"id": 4, "g1": 2, "g2": 3, "num": 0}, 143 map[string]interface{}{"id": 5, "g1": 2, "g2": 3, "num": 100}, 144 map[string]interface{}{"id": 6, "g1": 1, "g2": 1, "num": 15}, 145 map[string]interface{}{"id": 7, "g1": 1, "g2": 2, "num": 0}, 146 map[string]interface{}{"id": 8, "g1": 4, "g2": 2, "num": 50}, 147 map[string]interface{}{"id": 9, "g1": 2, "g2": 3, "num": 25}, 148 } 149 var nameList = []interface{}{ 150 map[string]interface{}{"id": 1, "first_name": "John", "last_name": "Smith", "gender": "M"}, 151 map[string]interface{}{"id": 2, "first_name": "Jane", "last_name": "Smith", "gender": "F"}, 152 } 153 154 type TStr string 155 type TMap map[string]interface{} 156 157 type T struct { 158 A string `rethinkdb:"id, omitempty"` 159 B int 160 C int `rethinkdb:"-"` 161 D map[string]interface{} 162 E []interface{} 163 F X 164 } 165 166 type SimpleT struct { 167 A string 168 B int 169 } 170 171 type X struct { 172 XA int 173 XB string 174 XC []string 175 XD Y 176 XE TStr 177 XF []TStr 178 } 179 180 type Y struct { 181 YA int 182 YB map[string]interface{} 183 YC map[string]string 184 YD TMap 185 } 186 187 type PseudoTypes struct { 188 T time.Time 189 Z time.Time 190 B []byte 191 } 192 193 var str = T{ 194 A: "A", 195 B: 1, 196 C: 1, 197 D: map[string]interface{}{ 198 "D1": 1, 199 "D2": "2", 200 }, 201 E: []interface{}{ 202 "E1", "E2", "E3", 4, 203 }, 204 F: X{ 205 XA: 2, 206 XB: "B", 207 XC: []string{"XC1", "XC2"}, 208 XD: Y{ 209 YA: 3, 210 YB: map[string]interface{}{ 211 "1": "1", 212 "2": "2", 213 "3": 3, 214 }, 215 YC: map[string]string{ 216 "YC1": "YC1", 217 }, 218 YD: TMap{ 219 "YD1": "YD1", 220 }, 221 }, 222 XE: "XE", 223 XF: []TStr{ 224 "XE1", "XE2", 225 }, 226 }, 227 } 228 229 type Author struct { 230 ID string `rethinkdb:"id,omitempty"` 231 Name string `rethinkdb:"name"` 232 } 233 234 type Book struct { 235 ID string `rethinkdb:"id,omitempty"` 236 Title string `rethinkdb:"title"` 237 Author Author `rethinkdb:"author_id,reference" rethinkdb_ref:"id"` 238 } 239 240 type TagsTest struct { 241 A string `rethinkdb:"a"` 242 B string `json:"b"` 243 C string `rethinkdb:"c1" json:"c2"` 244 } 245 246 func (s *RethinkSuite) BenchmarkExpr(c *test.C) { 247 for i := 0; i < c.N; i++ { 248 // Test query 249 query := r.Expr(true) 250 err := query.Exec(session) 251 c.Assert(err, test.IsNil) 252 } 253 } 254 255 func (s *RethinkSuite) BenchmarkNoReplyExpr(c *test.C) { 256 for i := 0; i < c.N; i++ { 257 // Test query 258 query := r.Expr(true) 259 err := query.Exec(session, r.ExecOpts{NoReply: true}) 260 c.Assert(err, test.IsNil) 261 } 262 } 263 264 func (s *RethinkSuite) BenchmarkGet(c *test.C) { 265 // Ensure table + database exist 266 r.DBCreate("testb1").RunWrite(session) 267 r.DB("testb1").TableCreate("TestManyBench1").RunWrite(session) 268 r.DB("testb1").Table("TestManyBench1").Delete().RunWrite(session) 269 270 // Insert rows 271 data := []interface{}{} 272 for i := 0; i < 100; i++ { 273 data = append(data, map[string]interface{}{ 274 "id": i, 275 }) 276 } 277 r.DB("testb1").Table("TestManyBench1").Insert(data).Run(session) 278 279 for i := 0; i < c.N; i++ { 280 n := rand.Intn(100) 281 282 // Test query 283 var response interface{} 284 query := r.DB("testb1").Table("TestManyBench1").Get(n) 285 res, err := query.Run(session) 286 c.Assert(err, test.IsNil) 287 288 err = res.One(&response) 289 290 c.Assert(err, test.IsNil) 291 c.Assert(response, JsonEquals, map[string]interface{}{"id": n}) 292 } 293 } 294 295 func (s *RethinkSuite) BenchmarkGetStruct(c *test.C) { 296 // Ensure table + database exist 297 r.DBCreate("testb2").RunWrite(session) 298 r.DB("testb2").TableCreate("TestManyBench2").RunWrite(session) 299 r.DB("testb2").Table("TestManyBench2").Delete().RunWrite(session) 300 301 // Insert rows 302 data := []interface{}{} 303 for i := 0; i < 100; i++ { 304 data = append(data, map[string]interface{}{ 305 "id": i, 306 "name": "Object 1", 307 "Attrs": []interface{}{map[string]interface{}{ 308 "Name": "attr 1", 309 "Value": "value 1", 310 }}, 311 }) 312 } 313 r.DB("testb2").Table("TestManyBench2").Insert(data).Run(session) 314 315 for i := 0; i < c.N; i++ { 316 n := rand.Intn(100) 317 318 // Test query 319 var resObj object 320 query := r.DB("testb2").Table("TestManyBench2").Get(n) 321 res, err := query.Run(session) 322 c.Assert(err, test.IsNil) 323 324 err = res.One(&resObj) 325 326 c.Assert(err, test.IsNil) 327 } 328 } 329 330 func (s *RethinkSuite) BenchmarkSelectMany(c *test.C) { 331 // Ensure table + database exist 332 r.DBCreate("testb3").RunWrite(session) 333 r.DB("testb3").TableCreate("TestManyBench3").RunWrite(session) 334 r.DB("testb3").Table("TestManyBench3").Delete().RunWrite(session) 335 336 // Insert rows 337 data := []interface{}{} 338 for i := 0; i < 100; i++ { 339 data = append(data, map[string]interface{}{ 340 "id": i, 341 }) 342 } 343 r.DB("testb3").Table("TestManyBench3").Insert(data).Run(session) 344 345 for i := 0; i < c.N; i++ { 346 // Test query 347 res, err := r.DB("testb3").Table("TestManyBench3").Run(session) 348 c.Assert(err, test.IsNil) 349 350 var response []map[string]interface{} 351 err = res.All(&response) 352 353 c.Assert(err, test.IsNil) 354 c.Assert(response, test.HasLen, 100) 355 } 356 } 357 358 func (s *RethinkSuite) BenchmarkSelectManyStruct(c *test.C) { 359 // Ensure table + database exist 360 r.DBCreate("testb4").RunWrite(session) 361 r.DB("testb4").TableCreate("TestManyBench4").RunWrite(session) 362 r.DB("testb4").Table("TestManyBench4").Delete().RunWrite(session) 363 364 // Insert rows 365 data := []interface{}{} 366 for i := 0; i < 100; i++ { 367 data = append(data, map[string]interface{}{ 368 "id": i, 369 "name": "Object 1", 370 "Attrs": []interface{}{map[string]interface{}{ 371 "Name": "attr 1", 372 "Value": "value 1", 373 }}, 374 }) 375 } 376 r.DB("testb4").Table("TestManyBench4").Insert(data).Run(session) 377 378 for i := 0; i < c.N; i++ { 379 // Test query 380 res, err := r.DB("testb4").Table("TestManyBench4").Run(session) 381 c.Assert(err, test.IsNil) 382 383 var response []object 384 err = res.All(&response) 385 386 c.Assert(err, test.IsNil) 387 c.Assert(response, test.HasLen, 100) 388 } 389 } 390 391 // Test utils 392 393 // Print variable as JSON 394 func jsonPrint(v interface{}) { 395 b, err := json.MarshalIndent(v, "", " ") 396 if err != nil { 397 fmt.Println(err) 398 return 399 } 400 401 fmt.Println(string(b)) 402 }