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  }