1// Copyright 2013-2020 Aerospike, Inc. 2// 3// Licensed under the Apache License, Version 2.0 (the "License"); 4// you may not use this file except in compliance with the License. 5// You may obtain a copy of the License at 6// 7// http://www.apache.org/licenses/LICENSE-2.0 8// 9// Unless required by applicable law or agreed to in writing, software 10// distributed under the License is distributed on an "AS IS" BASIS, 11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12// See the License for the specific language governing permissions and 13// limitations under the License. 14 15package aerospike_test 16 17import ( 18 "math" 19 "math/rand" 20 21 as "github.com/aerospike/aerospike-client-go" 22 // . "github.com/aerospike/aerospike-client-go/logger" 23 ast "github.com/aerospike/aerospike-client-go/types" 24 25 // . "github.com/aerospike/aerospike-client-go/utils/buffer" 26 27 . "github.com/onsi/ginkgo" 28 . "github.com/onsi/gomega" 29) 30 31// ALL tests are isolated by SetName and Key, which are 50 random characters 32var _ = Describe("Index operations test", func() { 33 34 Describe("Index creation", func() { 35 var err error 36 var ns = *namespace 37 var set = randString(50) 38 var key *as.Key 39 var wpolicy = as.NewWritePolicy(0, 0) 40 41 const keyCount = 1000 42 bin1 := as.NewBin("Aerospike1", rand.Intn(math.MaxInt16)) 43 bin2 := as.NewBin("Aerospike2", randString(100)) 44 45 BeforeEach(func() { 46 for i := 0; i < keyCount; i++ { 47 key, err = as.NewKey(ns, set, randString(50)) 48 Expect(err).ToNot(HaveOccurred()) 49 50 err = client.PutBins(wpolicy, key, bin1, bin2) 51 Expect(err).ToNot(HaveOccurred()) 52 } 53 }) 54 55 Context("Create non-existing index", func() { 56 57 It("must create an Index", func() { 58 idxTask, err := client.CreateIndex(wpolicy, ns, set, set+bin1.Name, bin1.Name, as.STRING) 59 Expect(err).ToNot(HaveOccurred()) 60 defer client.DropIndex(wpolicy, ns, set, set+bin1.Name) 61 62 // wait until index is created 63 <-idxTask.OnComplete() 64 65 // no duplicate index is allowed 66 _, err = client.CreateIndex(wpolicy, ns, set, set+bin1.Name, bin1.Name, as.STRING) 67 Expect(err).To(HaveOccurred()) 68 Expect(err.(ast.AerospikeError).ResultCode()).To(Equal(ast.INDEX_FOUND)) 69 }) 70 71 It("must drop an Index", func() { 72 idxTask, err := client.CreateIndex(wpolicy, ns, set, set+bin1.Name, bin1.Name, as.STRING) 73 Expect(err).ToNot(HaveOccurred()) 74 75 // wait until index is created 76 <-idxTask.OnComplete() 77 78 err = client.DropIndex(wpolicy, ns, set, set+bin1.Name) 79 Expect(err).ToNot(HaveOccurred()) 80 81 err = client.DropIndex(wpolicy, ns, set, set+bin1.Name) 82 Expect(err).ToNot(HaveOccurred()) 83 }) 84 85 It("must drop an Index, and recreate it again to verify", func() { 86 idxTask, err := client.CreateIndex(wpolicy, ns, set, set+bin1.Name, bin1.Name, as.STRING) 87 Expect(err).ToNot(HaveOccurred()) 88 89 // wait until index is created 90 Expect(<-idxTask.OnComplete()).ToNot(HaveOccurred()) 91 92 // dropping second time is not expected to raise any errors 93 err = client.DropIndex(wpolicy, ns, set, set+bin1.Name) 94 Expect(err).ToNot(HaveOccurred()) 95 96 // create the index again; should not encounter any errors 97 idxTask, err = client.CreateIndex(wpolicy, ns, set, set+bin1.Name, bin1.Name, as.STRING) 98 Expect(err).ToNot(HaveOccurred()) 99 100 // wait until index is created 101 Expect(<-idxTask.OnComplete()).ToNot(HaveOccurred()) 102 103 err = client.DropIndex(wpolicy, ns, set, set+bin1.Name) 104 Expect(err).ToNot(HaveOccurred()) 105 }) 106 107 }) 108 109 }) 110}) 111