github.com/inklabsfoundation/inkchain@v0.17.1-0.20181025012015-c3cef8062f19/core/ledger/kvledger/txmgmt/statedb/commontests/test_common.go (about) 1 /* 2 Copyright IBM Corp. 2016 All Rights Reserved. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package commontests 18 19 import ( 20 "strings" 21 "testing" 22 23 "github.com/inklabsfoundation/inkchain/common/ledger/testutil" 24 "github.com/inklabsfoundation/inkchain/core/ledger/kvledger/txmgmt/statedb" 25 "github.com/inklabsfoundation/inkchain/core/ledger/kvledger/txmgmt/version" 26 ) 27 28 // TestGetStateMultipleKeys tests read for given multiple keys 29 func TestGetStateMultipleKeys(t *testing.T, dbProvider statedb.VersionedDBProvider) { 30 db, err := dbProvider.GetDBHandle("testgetmultiplekeys") 31 testutil.AssertNoError(t, err, "") 32 33 // Test that savepoint is nil for a new state db 34 sp, err := db.GetLatestSavePoint() 35 testutil.AssertNoError(t, err, "Error upon GetLatestSavePoint()") 36 testutil.AssertNil(t, sp) 37 38 batch := statedb.NewUpdateBatch() 39 expectedValues := make([]*statedb.VersionedValue, 2) 40 vv1 := statedb.VersionedValue{Value: []byte("value1"), Version: version.NewHeight(1, 1)} 41 expectedValues[0] = &vv1 42 vv2 := statedb.VersionedValue{Value: []byte("value2"), Version: version.NewHeight(1, 2)} 43 expectedValues[1] = &vv2 44 vv3 := statedb.VersionedValue{Value: []byte("value3"), Version: version.NewHeight(1, 3)} 45 vv4 := statedb.VersionedValue{Value: []byte{}, Version: version.NewHeight(1, 4)} 46 batch.Put("ns1", "key1", vv1.Value, vv1.Version) 47 batch.Put("ns1", "key2", vv2.Value, vv2.Version) 48 batch.Put("ns2", "key3", vv3.Value, vv3.Version) 49 batch.Put("ns2", "key4", vv4.Value, vv4.Version) 50 savePoint := version.NewHeight(2, 5) 51 db.ApplyUpdates(batch, savePoint) 52 53 actualValues, _ := db.GetStateMultipleKeys("ns1", []string{"key1", "key2"}) 54 testutil.AssertEquals(t, actualValues, expectedValues) 55 } 56 57 // TestBasicRW tests basic read-write 58 func TestBasicRW(t *testing.T, dbProvider statedb.VersionedDBProvider) { 59 db, err := dbProvider.GetDBHandle("testbasicrw") 60 testutil.AssertNoError(t, err, "") 61 62 // Test that savepoint is nil for a new state db 63 sp, err := db.GetLatestSavePoint() 64 testutil.AssertNoError(t, err, "Error upon GetLatestSavePoint()") 65 testutil.AssertNil(t, sp) 66 67 // Test retrieval of non-existent key - returns nil rather than error 68 val, err := db.GetState("ns", "key1") 69 testutil.AssertNoError(t, err, "Should receive nil rather than error upon reading non existent key") 70 testutil.AssertNil(t, val) 71 72 batch := statedb.NewUpdateBatch() 73 vv1 := statedb.VersionedValue{Value: []byte("value1"), Version: version.NewHeight(1, 1)} 74 vv2 := statedb.VersionedValue{Value: []byte("value2"), Version: version.NewHeight(1, 2)} 75 vv3 := statedb.VersionedValue{Value: []byte("value3"), Version: version.NewHeight(1, 3)} 76 vv4 := statedb.VersionedValue{Value: []byte{}, Version: version.NewHeight(1, 4)} 77 batch.Put("ns1", "key1", vv1.Value, vv1.Version) 78 batch.Put("ns1", "key2", vv2.Value, vv2.Version) 79 batch.Put("ns2", "key3", vv3.Value, vv3.Version) 80 batch.Put("ns2", "key4", vv4.Value, vv4.Version) 81 savePoint := version.NewHeight(2, 5) 82 db.ApplyUpdates(batch, savePoint) 83 84 vv, _ := db.GetState("ns1", "key1") 85 testutil.AssertEquals(t, vv, &vv1) 86 87 vv, _ = db.GetState("ns2", "key4") 88 testutil.AssertEquals(t, vv, &vv4) 89 90 sp, err = db.GetLatestSavePoint() 91 testutil.AssertNoError(t, err, "") 92 testutil.AssertEquals(t, sp, savePoint) 93 } 94 95 // TestMultiDBBasicRW tests basic read-write on multiple dbs 96 func TestMultiDBBasicRW(t *testing.T, dbProvider statedb.VersionedDBProvider) { 97 db1, err := dbProvider.GetDBHandle("testmultidbbasicrw") 98 testutil.AssertNoError(t, err, "") 99 100 db2, err := dbProvider.GetDBHandle("testmultidbbasicrw2") 101 testutil.AssertNoError(t, err, "") 102 103 batch1 := statedb.NewUpdateBatch() 104 vv1 := statedb.VersionedValue{Value: []byte("value1_db1"), Version: version.NewHeight(1, 1)} 105 vv2 := statedb.VersionedValue{Value: []byte("value2_db1"), Version: version.NewHeight(1, 2)} 106 batch1.Put("ns1", "key1", vv1.Value, vv1.Version) 107 batch1.Put("ns1", "key2", vv2.Value, vv2.Version) 108 savePoint1 := version.NewHeight(1, 2) 109 db1.ApplyUpdates(batch1, savePoint1) 110 111 batch2 := statedb.NewUpdateBatch() 112 vv3 := statedb.VersionedValue{Value: []byte("value1_db2"), Version: version.NewHeight(1, 4)} 113 vv4 := statedb.VersionedValue{Value: []byte("value2_db2"), Version: version.NewHeight(1, 5)} 114 batch2.Put("ns1", "key1", vv3.Value, vv3.Version) 115 batch2.Put("ns1", "key2", vv4.Value, vv4.Version) 116 savePoint2 := version.NewHeight(1, 5) 117 db2.ApplyUpdates(batch2, savePoint2) 118 119 vv, _ := db1.GetState("ns1", "key1") 120 testutil.AssertEquals(t, vv, &vv1) 121 122 sp, err := db1.GetLatestSavePoint() 123 testutil.AssertNoError(t, err, "") 124 testutil.AssertEquals(t, sp, savePoint1) 125 126 vv, _ = db2.GetState("ns1", "key1") 127 testutil.AssertEquals(t, vv, &vv3) 128 129 sp, err = db2.GetLatestSavePoint() 130 testutil.AssertNoError(t, err, "") 131 testutil.AssertEquals(t, sp, savePoint2) 132 } 133 134 // TestDeletes tests deteles 135 func TestDeletes(t *testing.T, dbProvider statedb.VersionedDBProvider) { 136 db, err := dbProvider.GetDBHandle("testdeletes") 137 testutil.AssertNoError(t, err, "") 138 139 batch := statedb.NewUpdateBatch() 140 vv1 := statedb.VersionedValue{Value: []byte("value1"), Version: version.NewHeight(1, 1)} 141 vv2 := statedb.VersionedValue{Value: []byte("value2"), Version: version.NewHeight(1, 2)} 142 vv3 := statedb.VersionedValue{Value: []byte("value1"), Version: version.NewHeight(1, 3)} 143 vv4 := statedb.VersionedValue{Value: []byte("value2"), Version: version.NewHeight(1, 4)} 144 145 batch.Put("ns", "key1", vv1.Value, vv1.Version) 146 batch.Put("ns", "key2", vv2.Value, vv2.Version) 147 batch.Put("ns", "key3", vv2.Value, vv3.Version) 148 batch.Put("ns", "key4", vv2.Value, vv4.Version) 149 batch.Delete("ns", "key3", version.NewHeight(1, 5)) 150 savePoint := version.NewHeight(1, 5) 151 err = db.ApplyUpdates(batch, savePoint) 152 testutil.AssertNoError(t, err, "") 153 vv, _ := db.GetState("ns", "key2") 154 testutil.AssertEquals(t, vv, &vv2) 155 156 vv, err = db.GetState("ns", "key3") 157 testutil.AssertNoError(t, err, "") 158 testutil.AssertNil(t, vv) 159 160 batch = statedb.NewUpdateBatch() 161 batch.Delete("ns", "key2", version.NewHeight(1, 6)) 162 err = db.ApplyUpdates(batch, savePoint) 163 testutil.AssertNoError(t, err, "") 164 vv, err = db.GetState("ns", "key2") 165 testutil.AssertNoError(t, err, "") 166 testutil.AssertNil(t, vv) 167 } 168 169 // TestIterator tests the iterator 170 func TestIterator(t *testing.T, dbProvider statedb.VersionedDBProvider) { 171 db, err := dbProvider.GetDBHandle("testiterator") 172 testutil.AssertNoError(t, err, "") 173 db.Open() 174 defer db.Close() 175 batch := statedb.NewUpdateBatch() 176 batch.Put("ns1", "key1", []byte("value1"), version.NewHeight(1, 1)) 177 batch.Put("ns1", "key2", []byte("value2"), version.NewHeight(1, 2)) 178 batch.Put("ns1", "key3", []byte("value3"), version.NewHeight(1, 3)) 179 batch.Put("ns1", "key4", []byte("value4"), version.NewHeight(1, 4)) 180 batch.Put("ns2", "key5", []byte("value5"), version.NewHeight(1, 5)) 181 batch.Put("ns2", "key6", []byte("value6"), version.NewHeight(1, 6)) 182 batch.Put("ns3", "key7", []byte("value7"), version.NewHeight(1, 7)) 183 savePoint := version.NewHeight(2, 5) 184 db.ApplyUpdates(batch, savePoint) 185 186 itr1, _ := db.GetStateRangeScanIterator("ns1", "key1", "") 187 testItr(t, itr1, []string{"key1", "key2", "key3", "key4"}) 188 189 itr2, _ := db.GetStateRangeScanIterator("ns1", "key2", "key3") 190 testItr(t, itr2, []string{"key2"}) 191 192 itr3, _ := db.GetStateRangeScanIterator("ns1", "", "") 193 testItr(t, itr3, []string{"key1", "key2", "key3", "key4"}) 194 195 itr4, _ := db.GetStateRangeScanIterator("ns2", "", "") 196 testItr(t, itr4, []string{"key5", "key6"}) 197 } 198 199 func testItr(t *testing.T, itr statedb.ResultsIterator, expectedKeys []string) { 200 defer itr.Close() 201 for _, expectedKey := range expectedKeys { 202 queryResult, _ := itr.Next() 203 vkv := queryResult.(*statedb.VersionedKV) 204 key := vkv.Key 205 testutil.AssertEquals(t, key, expectedKey) 206 } 207 last, err := itr.Next() 208 testutil.AssertNoError(t, err, "") 209 testutil.AssertNil(t, last) 210 } 211 212 // TestQuery tests queries 213 func TestQuery(t *testing.T, dbProvider statedb.VersionedDBProvider) { 214 db, err := dbProvider.GetDBHandle("testquery") 215 testutil.AssertNoError(t, err, "") 216 db.Open() 217 defer db.Close() 218 batch := statedb.NewUpdateBatch() 219 jsonValue1 := "{\"asset_name\": \"marble1\",\"color\": \"blue\",\"size\": 1,\"owner\": \"tom\"}" 220 batch.Put("ns1", "key1", []byte(jsonValue1), version.NewHeight(1, 1)) 221 jsonValue2 := "{\"asset_name\": \"marble2\",\"color\": \"blue\",\"size\": 2,\"owner\": \"jerry\"}" 222 batch.Put("ns1", "key2", []byte(jsonValue2), version.NewHeight(1, 2)) 223 jsonValue3 := "{\"asset_name\": \"marble3\",\"color\": \"blue\",\"size\": 3,\"owner\": \"fred\"}" 224 batch.Put("ns1", "key3", []byte(jsonValue3), version.NewHeight(1, 3)) 225 jsonValue4 := "{\"asset_name\": \"marble4\",\"color\": \"blue\",\"size\": 4,\"owner\": \"martha\"}" 226 batch.Put("ns1", "key4", []byte(jsonValue4), version.NewHeight(1, 4)) 227 jsonValue5 := "{\"asset_name\": \"marble5\",\"color\": \"blue\",\"size\": 5,\"owner\": \"fred\"}" 228 batch.Put("ns1", "key5", []byte(jsonValue5), version.NewHeight(1, 5)) 229 jsonValue6 := "{\"asset_name\": \"marble6\",\"color\": \"blue\",\"size\": 6,\"owner\": \"elaine\"}" 230 batch.Put("ns1", "key6", []byte(jsonValue6), version.NewHeight(1, 6)) 231 jsonValue7 := "{\"asset_name\": \"marble7\",\"color\": \"blue\",\"size\": 7,\"owner\": \"fred\"}" 232 batch.Put("ns1", "key7", []byte(jsonValue7), version.NewHeight(1, 7)) 233 jsonValue8 := "{\"asset_name\": \"marble8\",\"color\": \"blue\",\"size\": 8,\"owner\": \"elaine\"}" 234 batch.Put("ns1", "key8", []byte(jsonValue8), version.NewHeight(1, 8)) 235 jsonValue9 := "{\"asset_name\": \"marble9\",\"color\": \"green\",\"size\": 9,\"owner\": \"fred\"}" 236 batch.Put("ns1", "key9", []byte(jsonValue9), version.NewHeight(1, 9)) 237 jsonValue10 := "{\"asset_name\": \"marble10\",\"color\": \"green\",\"size\": 10,\"owner\": \"mary\"}" 238 batch.Put("ns1", "key10", []byte(jsonValue10), version.NewHeight(1, 10)) 239 jsonValue11 := "{\"asset_name\": \"marble11\",\"color\": \"cyan\",\"size\": 1000007,\"owner\": \"joe\"}" 240 batch.Put("ns1", "key11", []byte(jsonValue11), version.NewHeight(1, 11)) 241 242 //add keys for a separate namespace 243 batch.Put("ns2", "key1", []byte(jsonValue1), version.NewHeight(1, 12)) 244 batch.Put("ns2", "key2", []byte(jsonValue2), version.NewHeight(1, 13)) 245 batch.Put("ns2", "key3", []byte(jsonValue3), version.NewHeight(1, 14)) 246 batch.Put("ns2", "key4", []byte(jsonValue4), version.NewHeight(1, 15)) 247 batch.Put("ns2", "key5", []byte(jsonValue5), version.NewHeight(1, 16)) 248 batch.Put("ns2", "key6", []byte(jsonValue6), version.NewHeight(1, 17)) 249 batch.Put("ns2", "key7", []byte(jsonValue7), version.NewHeight(1, 18)) 250 batch.Put("ns2", "key8", []byte(jsonValue8), version.NewHeight(1, 19)) 251 batch.Put("ns2", "key9", []byte(jsonValue9), version.NewHeight(1, 20)) 252 batch.Put("ns2", "key10", []byte(jsonValue10), version.NewHeight(1, 21)) 253 254 savePoint := version.NewHeight(2, 22) 255 db.ApplyUpdates(batch, savePoint) 256 257 // query for owner=jerry, use namespace "ns1" 258 itr, err := db.ExecuteQuery("ns1", "{\"selector\":{\"owner\":\"jerry\"}}") 259 testutil.AssertNoError(t, err, "") 260 261 // verify one jerry result 262 queryResult1, err := itr.Next() 263 testutil.AssertNoError(t, err, "") 264 testutil.AssertNotNil(t, queryResult1) 265 versionedQueryRecord := queryResult1.(*statedb.VersionedKV) 266 stringRecord := string(versionedQueryRecord.Value) 267 bFoundRecord := strings.Contains(stringRecord, "jerry") 268 testutil.AssertEquals(t, bFoundRecord, true) 269 270 // verify no more results 271 queryResult2, err := itr.Next() 272 testutil.AssertNoError(t, err, "") 273 testutil.AssertNil(t, queryResult2) 274 275 // query for owner=jerry, use namespace "ns2" 276 itr, err = db.ExecuteQuery("ns2", "{\"selector\":{\"owner\":\"jerry\"}}") 277 testutil.AssertNoError(t, err, "") 278 279 // verify one jerry result 280 queryResult1, err = itr.Next() 281 testutil.AssertNoError(t, err, "") 282 testutil.AssertNotNil(t, queryResult1) 283 versionedQueryRecord = queryResult1.(*statedb.VersionedKV) 284 stringRecord = string(versionedQueryRecord.Value) 285 bFoundRecord = strings.Contains(stringRecord, "jerry") 286 testutil.AssertEquals(t, bFoundRecord, true) 287 288 // verify no more results 289 queryResult2, err = itr.Next() 290 testutil.AssertNoError(t, err, "") 291 testutil.AssertNil(t, queryResult2) 292 293 // query for owner=jerry, use namespace "ns3" 294 itr, err = db.ExecuteQuery("ns3", "{\"selector\":{\"owner\":\"jerry\"}}") 295 testutil.AssertNoError(t, err, "") 296 297 // verify results - should be no records 298 queryResult1, err = itr.Next() 299 testutil.AssertNoError(t, err, "") 300 testutil.AssertNil(t, queryResult1) 301 302 // query using bad query string 303 itr, err = db.ExecuteQuery("ns1", "this is an invalid query string") 304 testutil.AssertError(t, err, "Should have received an error for invalid query string") 305 306 // query returns 0 records 307 itr, err = db.ExecuteQuery("ns1", "{\"selector\":{\"owner\":\"not_a_valid_name\"}}") 308 testutil.AssertNoError(t, err, "") 309 310 // verify no results 311 queryResult3, err := itr.Next() 312 testutil.AssertNoError(t, err, "") 313 testutil.AssertNil(t, queryResult3) 314 315 // query with fields, namespace "ns1" 316 itr, err = db.ExecuteQuery("ns1", "{\"selector\":{\"owner\":\"jerry\"},\"fields\": [\"owner\", \"asset_name\", \"color\", \"size\"]}") 317 testutil.AssertNoError(t, err, "") 318 319 // verify one jerry result 320 queryResult1, err = itr.Next() 321 testutil.AssertNoError(t, err, "") 322 testutil.AssertNotNil(t, queryResult1) 323 versionedQueryRecord = queryResult1.(*statedb.VersionedKV) 324 stringRecord = string(versionedQueryRecord.Value) 325 bFoundRecord = strings.Contains(stringRecord, "jerry") 326 testutil.AssertEquals(t, bFoundRecord, true) 327 328 // verify no more results 329 queryResult2, err = itr.Next() 330 testutil.AssertNoError(t, err, "") 331 testutil.AssertNil(t, queryResult2) 332 333 // query with fields, namespace "ns2" 334 itr, err = db.ExecuteQuery("ns2", "{\"selector\":{\"owner\":\"jerry\"},\"fields\": [\"owner\", \"asset_name\", \"color\", \"size\"]}") 335 testutil.AssertNoError(t, err, "") 336 337 // verify one jerry result 338 queryResult1, err = itr.Next() 339 testutil.AssertNoError(t, err, "") 340 testutil.AssertNotNil(t, queryResult1) 341 versionedQueryRecord = queryResult1.(*statedb.VersionedKV) 342 stringRecord = string(versionedQueryRecord.Value) 343 bFoundRecord = strings.Contains(stringRecord, "jerry") 344 testutil.AssertEquals(t, bFoundRecord, true) 345 346 // verify no more results 347 queryResult2, err = itr.Next() 348 testutil.AssertNoError(t, err, "") 349 testutil.AssertNil(t, queryResult2) 350 351 // query with fields, namespace "ns3" 352 itr, err = db.ExecuteQuery("ns3", "{\"selector\":{\"owner\":\"jerry\"},\"fields\": [\"owner\", \"asset_name\", \"color\", \"size\"]}") 353 testutil.AssertNoError(t, err, "") 354 355 // verify no results 356 queryResult1, err = itr.Next() 357 testutil.AssertNoError(t, err, "") 358 testutil.AssertNil(t, queryResult1) 359 360 // query with complex selector, namespace "ns1" 361 itr, err = db.ExecuteQuery("ns1", "{\"selector\":{\"$and\":[{\"size\":{\"$gt\": 5}},{\"size\":{\"$lt\":8}},{\"$not\":{\"size\":6}}]}}") 362 testutil.AssertNoError(t, err, "") 363 364 // verify one fred result 365 queryResult1, err = itr.Next() 366 testutil.AssertNoError(t, err, "") 367 testutil.AssertNotNil(t, queryResult1) 368 versionedQueryRecord = queryResult1.(*statedb.VersionedKV) 369 stringRecord = string(versionedQueryRecord.Value) 370 bFoundRecord = strings.Contains(stringRecord, "fred") 371 testutil.AssertEquals(t, bFoundRecord, true) 372 373 // verify no more results 374 queryResult2, err = itr.Next() 375 testutil.AssertNoError(t, err, "") 376 testutil.AssertNil(t, queryResult2) 377 378 // query with complex selector, namespace "ns2" 379 itr, err = db.ExecuteQuery("ns2", "{\"selector\":{\"$and\":[{\"size\":{\"$gt\": 5}},{\"size\":{\"$lt\":8}},{\"$not\":{\"size\":6}}]}}") 380 testutil.AssertNoError(t, err, "") 381 382 // verify one fred result 383 queryResult1, err = itr.Next() 384 testutil.AssertNoError(t, err, "") 385 testutil.AssertNotNil(t, queryResult1) 386 versionedQueryRecord = queryResult1.(*statedb.VersionedKV) 387 stringRecord = string(versionedQueryRecord.Value) 388 bFoundRecord = strings.Contains(stringRecord, "fred") 389 testutil.AssertEquals(t, bFoundRecord, true) 390 391 // verify no more results 392 queryResult2, err = itr.Next() 393 testutil.AssertNoError(t, err, "") 394 testutil.AssertNil(t, queryResult2) 395 396 // query with complex selector, namespace "ns3" 397 itr, err = db.ExecuteQuery("ns3", "{\"selector\":{\"$and\":[{\"size\":{\"$gt\": 5}},{\"size\":{\"$lt\":8}},{\"$not\":{\"size\":6}}]}}") 398 testutil.AssertNoError(t, err, "") 399 400 // verify no more results 401 queryResult1, err = itr.Next() 402 testutil.AssertNoError(t, err, "") 403 testutil.AssertNil(t, queryResult1) 404 405 // query with embedded implicit "AND" and explicit "OR", namespace "ns1" 406 itr, err = db.ExecuteQuery("ns1", "{\"selector\":{\"color\":\"green\",\"$or\":[{\"owner\":\"fred\"},{\"owner\":\"mary\"}]}}") 407 testutil.AssertNoError(t, err, "") 408 409 // verify one green result 410 queryResult1, err = itr.Next() 411 testutil.AssertNoError(t, err, "") 412 testutil.AssertNotNil(t, queryResult1) 413 versionedQueryRecord = queryResult1.(*statedb.VersionedKV) 414 stringRecord = string(versionedQueryRecord.Value) 415 bFoundRecord = strings.Contains(stringRecord, "green") 416 testutil.AssertEquals(t, bFoundRecord, true) 417 418 // verify another green result 419 queryResult2, err = itr.Next() 420 testutil.AssertNoError(t, err, "") 421 testutil.AssertNotNil(t, queryResult2) 422 versionedQueryRecord = queryResult2.(*statedb.VersionedKV) 423 stringRecord = string(versionedQueryRecord.Value) 424 bFoundRecord = strings.Contains(stringRecord, "green") 425 testutil.AssertEquals(t, bFoundRecord, true) 426 427 // verify no more results 428 queryResult3, err = itr.Next() 429 testutil.AssertNoError(t, err, "") 430 testutil.AssertNil(t, queryResult3) 431 432 // query with embedded implicit "AND" and explicit "OR", namespace "ns2" 433 itr, err = db.ExecuteQuery("ns2", "{\"selector\":{\"color\":\"green\",\"$or\":[{\"owner\":\"fred\"},{\"owner\":\"mary\"}]}}") 434 testutil.AssertNoError(t, err, "") 435 436 // verify one green result 437 queryResult1, err = itr.Next() 438 testutil.AssertNoError(t, err, "") 439 testutil.AssertNotNil(t, queryResult1) 440 versionedQueryRecord = queryResult1.(*statedb.VersionedKV) 441 stringRecord = string(versionedQueryRecord.Value) 442 bFoundRecord = strings.Contains(stringRecord, "green") 443 testutil.AssertEquals(t, bFoundRecord, true) 444 445 // verify another green result 446 queryResult2, err = itr.Next() 447 testutil.AssertNoError(t, err, "") 448 testutil.AssertNotNil(t, queryResult2) 449 versionedQueryRecord = queryResult2.(*statedb.VersionedKV) 450 stringRecord = string(versionedQueryRecord.Value) 451 bFoundRecord = strings.Contains(stringRecord, "green") 452 testutil.AssertEquals(t, bFoundRecord, true) 453 454 // verify no more results 455 queryResult3, err = itr.Next() 456 testutil.AssertNoError(t, err, "") 457 testutil.AssertNil(t, queryResult3) 458 459 // query with embedded implicit "AND" and explicit "OR", namespace "ns3" 460 itr, err = db.ExecuteQuery("ns3", "{\"selector\":{\"color\":\"green\",\"$or\":[{\"owner\":\"fred\"},{\"owner\":\"mary\"}]}}") 461 testutil.AssertNoError(t, err, "") 462 463 // verify no results 464 queryResult1, err = itr.Next() 465 testutil.AssertNoError(t, err, "") 466 testutil.AssertNil(t, queryResult1) 467 468 // query with integer with digit-count equals 7 and response received is also received 469 // with same digit-count and there is no float transformation 470 itr, err = db.ExecuteQuery("ns1", "{\"selector\":{\"$and\":[{\"size\":{\"$eq\": 1000007}}]}}") 471 testutil.AssertNoError(t, err, "") 472 473 // verify one jerry result 474 queryResult1, err = itr.Next() 475 testutil.AssertNoError(t, err, "") 476 testutil.AssertNotNil(t, queryResult1) 477 versionedQueryRecord = queryResult1.(*statedb.VersionedKV) 478 stringRecord = string(versionedQueryRecord.Value) 479 bFoundRecord = strings.Contains(stringRecord, "joe") 480 testutil.AssertEquals(t, bFoundRecord, true) 481 bFoundRecord = strings.Contains(stringRecord, "1000007") 482 testutil.AssertEquals(t, bFoundRecord, true) 483 484 // verify no more results 485 queryResult2, err = itr.Next() 486 testutil.AssertNoError(t, err, "") 487 testutil.AssertNil(t, queryResult2) 488 489 }