github.com/s7techlab/cckit@v0.10.5/extensions/debug/debug_state_test.go (about) 1 package debug_test 2 3 import ( 4 . "github.com/onsi/ginkgo" 5 . "github.com/onsi/gomega" 6 7 . "github.com/s7techlab/cckit/testing/gomega" 8 9 "strconv" 10 11 "github.com/s7techlab/cckit/extensions/debug" 12 testcc "github.com/s7techlab/cckit/testing" 13 ) 14 15 var _ = Describe(`State`, func() { 16 17 var ( 18 dbg = debug.NewStateService() 19 20 cc, ctx = testcc.NewTxHandler(`Debug`) 21 ) 22 23 Context(`Empty`, func() { 24 25 It("Allow to get empty key list", func() { 26 cc.From(Owner).Tx(func() { 27 keys, err := dbg.ListKeys(ctx, nil) // get all keys 28 Expect(err).NotTo(HaveOccurred()) 29 30 Expect(keys.Keys).To(HaveLen(0)) 31 }) 32 }) 33 34 It("Allow to clean", func() { 35 cc.From(Owner).Tx(func() { 36 deleted, err := dbg.DeleteStates(ctx, &debug.Prefixes{Prefixes: []*debug.Prefix{{ 37 Key: []string{`some`}, 38 }, { 39 Key: []string{`not exists prefix`}, 40 }}}) // get all keys 41 Expect(err).NotTo(HaveOccurred()) 42 43 Expect(len(deleted.Matches)).To(Equal(2)) 44 Expect(deleted.Matches[`some`]).To(Equal(uint32(0))) 45 Expect(deleted.Matches[`not exists prefix`]).To(Equal(uint32(0))) 46 }) 47 48 }) 49 50 }) 51 52 Context(`Non Empty`, func() { 53 54 It("Allow put value in state", func() { 55 for i := 0; i < 5; i++ { 56 cc.From(Owner).Tx(func() { 57 val := &debug.Value{ 58 Key: []string{`prefixA`, `key` + strconv.Itoa(i)}, 59 Value: []byte(`value` + strconv.Itoa(i)), 60 } 61 valReceived, err := dbg.PutState(ctx, val) 62 Expect(err).NotTo(HaveOccurred()) 63 Expect(valReceived).To(StringerEqual(val)) 64 }) 65 66 } 67 68 for i := 0; i < 7; i++ { 69 cc.From(Owner).Tx(func() { 70 _, err := dbg.PutState(ctx, &debug.Value{ 71 Key: []string{`prefixB`, `subprefixA`, `key` + strconv.Itoa(i)}, 72 Value: []byte(`value` + strconv.Itoa(i)), 73 }) 74 Expect(err).NotTo(HaveOccurred()) 75 }) 76 77 cc.From(Owner).Tx(func() { 78 _, err := dbg.PutState(ctx, &debug.Value{ 79 Key: []string{`prefixB`, `subprefixB`, `key` + strconv.Itoa(i)}, 80 Value: []byte(`value` + strconv.Itoa(i)), 81 }) 82 Expect(err).NotTo(HaveOccurred()) 83 }) 84 } 85 86 // put proto message 87 cc.From(Owner).Tx(func() { 88 _, err := dbg.PutState(ctx, &debug.Value{ 89 Key: []string{`keyA`}, 90 Value: testcc.MustProtoMarshal(&debug.Prefix{Key: []string{`keyA`}}), 91 }) 92 Expect(err).NotTo(HaveOccurred()) 93 }) 94 //cc.From(Owner).Invoke(`debugStatePut`, []string{`keyB`}, []byte(`valueKeyB`)) 95 //cc.From(Owner).Invoke(`debugStatePut`, []string{`keyC`}, []byte(`valueKeyC`)) 96 }) 97 98 It("Allow to get value from state", func() { 99 cc.From(Owner).Tx(func() { 100 val, err := dbg.GetState(ctx, &debug.CompositeKey{ 101 Key: []string{`prefixB`, `subprefixA`, `key` + strconv.Itoa(1)}, 102 }) 103 Expect(err).NotTo(HaveOccurred()) 104 Expect(val.Value).To(Equal([]byte(`value1`))) 105 }) 106 107 cc.From(Owner).Tx(func() { 108 val, err := dbg.GetState(ctx, &debug.CompositeKey{ 109 Key: []string{`keyA`}, 110 }) 111 Expect(err).NotTo(HaveOccurred()) 112 Expect(val.Value).To(Equal(testcc.MustProtoMarshal(&debug.Prefix{Key: []string{`keyA`}}))) 113 Expect(val.Json).To(Equal(``)) // we have no mapping in state for this entry 114 }) 115 }) 116 117 It("Allow to get keys", func() { 118 cc.From(Owner).Tx(func() { 119 keys, err := dbg.ListKeys(ctx, &debug.Prefix{ 120 Key: []string{`prefixA`}, 121 }) 122 Expect(err).NotTo(HaveOccurred()) 123 Expect(keys.Keys).To(HaveLen(5)) 124 125 for i := range keys.Keys { 126 Expect(keys.Keys[i].Key[0]).To(Equal(`prefixA`)) 127 } 128 }) 129 130 cc.From(Owner).Tx(func() { 131 keys, err := dbg.ListKeys(ctx, &debug.Prefix{ 132 Key: []string{`prefixB`, `subprefixB`}, 133 }) 134 Expect(err).NotTo(HaveOccurred()) 135 Expect(keys.Keys).To(HaveLen(7)) 136 137 for i := range keys.Keys { 138 Expect(keys.Keys[i].Key[0]).To(Equal(`prefixB`)) 139 Expect(keys.Keys[i].Key[1]).To(Equal(`subprefixB`)) 140 } 141 }) 142 }) 143 144 It("Allow to get ALL keys", func() { 145 cc.From(Owner).Tx(func() { 146 keys, err := dbg.ListKeys(ctx, nil) 147 Expect(err).NotTo(HaveOccurred()) 148 Expect(keys.Keys).To(HaveLen(20)) //total state entries inserted 149 }) 150 }) 151 152 It("Allow to delete state entry", func() { 153 cc.From(Owner).Tx(func() { 154 value, err := dbg.DeleteState(ctx, &debug.CompositeKey{ 155 Key: []string{`prefixA`, `key0`}, 156 }) 157 Expect(err).NotTo(HaveOccurred()) 158 Expect(value).To(StringerEqual(&debug.Value{ 159 Key: []string{`prefixA`, `key0`}, 160 Value: []byte(`value0`), 161 })) 162 }) 163 164 cc.From(Owner).Tx(func() { 165 keys, _ := dbg.ListKeys(ctx, &debug.Prefix{ 166 Key: []string{`prefixA`}, 167 }) 168 Expect(keys.Keys).To(HaveLen(4)) 169 }) 170 171 cc.From(Owner).Tx(func() { 172 _, _ = dbg.DeleteState(ctx, &debug.CompositeKey{ 173 Key: []string{`prefixA`, `key4`}, 174 }) 175 }) 176 177 cc.From(Owner).Tx(func() { 178 keys, _ := dbg.ListKeys(ctx, &debug.Prefix{ 179 Key: []string{`prefixA`}, 180 }) 181 Expect(keys.Keys).To(HaveLen(3)) 182 }) 183 }) 184 185 It("Allow to clean state entries with key prefix", func() { 186 cc.From(Owner).Tx(func() { 187 deleted, err := dbg.DeleteStates(ctx, &debug.Prefixes{Prefixes: []*debug.Prefix{{ 188 Key: []string{`prefixA`}, 189 }}}) 190 Expect(err).NotTo(HaveOccurred()) 191 192 Expect(len(deleted.Matches)).To(Equal(1)) 193 Expect(deleted.Matches[`prefixA`]).To(Equal(uint32(3))) 194 }) 195 196 cc.From(Owner).Tx(func() { 197 keys, _ := dbg.ListKeys(ctx, nil) 198 Expect(keys.Keys).To(HaveLen(15)) //total state after last clean and delete in previous test 199 }) 200 }) 201 202 It("Allow to clean ALL state", func() { 203 cc.From(Owner).Tx(func() { 204 deleted, err := dbg.DeleteStates(ctx, &debug.Prefixes{Prefixes: []*debug.Prefix{{ 205 Key: nil, 206 }}}) 207 Expect(err).NotTo(HaveOccurred()) 208 209 Expect(len(deleted.Matches)).To(Equal(1)) 210 Expect(deleted.Matches[``]).To(Equal(uint32(15))) 211 }) 212 213 cc.From(Owner).Tx(func() { 214 keys, _ := dbg.ListKeys(ctx, nil) 215 Expect(keys.Keys).To(HaveLen(0)) //total state after last clean and delete in previous test 216 }) 217 }) 218 }) 219 220 })