github.com/true-sqn/fabric@v2.1.1+incompatible/core/chaincode/transaction_context_test.go (about)

     1  /*
     2  Copyright IBM Corp. All Rights Reserved.
     3  
     4  SPDX-License-Identifier: Apache-2.0
     5  */
     6  
     7  package chaincode_test
     8  
     9  import (
    10  	"fmt"
    11  
    12  	"github.com/hyperledger/fabric/core/chaincode"
    13  	"github.com/hyperledger/fabric/core/chaincode/mock"
    14  	. "github.com/onsi/ginkgo"
    15  	. "github.com/onsi/gomega"
    16  )
    17  
    18  var _ = Describe("TransactionContext", func() {
    19  	var (
    20  		resultsIterator    *mock.QueryResultsIterator
    21  		transactionContext *chaincode.TransactionContext
    22  	)
    23  
    24  	BeforeEach(func() {
    25  		resultsIterator = &mock.QueryResultsIterator{}
    26  		transactionContext = &chaincode.TransactionContext{}
    27  	})
    28  
    29  	Describe("InitializeQueryContext", func() {
    30  		var iter1, iter2 *mock.QueryResultsIterator
    31  
    32  		BeforeEach(func() {
    33  			iter1 = &mock.QueryResultsIterator{}
    34  			iter2 = &mock.QueryResultsIterator{}
    35  		})
    36  
    37  		It("stores a references to the results iterator", func() {
    38  			transactionContext.InitializeQueryContext("query-id-1", iter1)
    39  			transactionContext.InitializeQueryContext("query-id-2", iter2)
    40  
    41  			iter := transactionContext.GetQueryIterator("query-id-1")
    42  			Expect(iter).To(Equal(iter1))
    43  			iter = transactionContext.GetQueryIterator("query-id-2")
    44  			Expect(iter).To(Equal(iter2))
    45  		})
    46  
    47  		It("populates a pending query result", func() {
    48  			transactionContext.InitializeQueryContext("query-id", iter1)
    49  			pqr := transactionContext.GetPendingQueryResult("query-id")
    50  
    51  			Expect(pqr).To(Equal(&chaincode.PendingQueryResult{}))
    52  		})
    53  
    54  		It("populates a total return count", func() {
    55  			transactionContext.InitializeQueryContext("query-id", iter1)
    56  			count := transactionContext.GetTotalReturnCount("query-id")
    57  
    58  			Expect(*count).To(Equal(int32(0)))
    59  		})
    60  	})
    61  
    62  	Describe("GetQueryIterator", func() {
    63  		It("returns the results iteraterator provided to initialize query context", func() {
    64  			transactionContext.InitializeQueryContext("query-id", resultsIterator)
    65  			iter := transactionContext.GetQueryIterator("query-id")
    66  			Expect(iter).To(Equal(resultsIterator))
    67  
    68  			transactionContext.InitializeQueryContext("query-with-nil", nil)
    69  			iter = transactionContext.GetQueryIterator("query-with-nil")
    70  			Expect(iter).To(BeNil())
    71  		})
    72  
    73  		Context("when an unknown query id is used", func() {
    74  			It("returns a nil query iterator", func() {
    75  				iter := transactionContext.GetQueryIterator("unknown-id")
    76  				Expect(iter).To(BeNil())
    77  			})
    78  		})
    79  	})
    80  
    81  	Describe("GetPendingQueryResult", func() {
    82  		Context("when a query context has been initialized", func() {
    83  			BeforeEach(func() {
    84  				transactionContext.InitializeQueryContext("query-id", nil)
    85  			})
    86  
    87  			It("returns a non-nil pending query result", func() {
    88  				pqr := transactionContext.GetPendingQueryResult("query-id")
    89  				Expect(pqr).To(Equal(&chaincode.PendingQueryResult{}))
    90  			})
    91  		})
    92  
    93  		Context("when a query context has not been initialized", func() {
    94  			It("returns a nil pending query result", func() {
    95  				pqr := transactionContext.GetPendingQueryResult("query-id")
    96  				Expect(pqr).To(BeNil())
    97  			})
    98  		})
    99  	})
   100  
   101  	Describe("GetPendingTotalRecordCount", func() {
   102  		Context("when a query context has been initialized", func() {
   103  			BeforeEach(func() {
   104  				transactionContext.InitializeQueryContext("query-id", nil)
   105  			})
   106  
   107  			It("returns a non-nil total record count", func() {
   108  				retCount := transactionContext.GetTotalReturnCount("query-id")
   109  				Expect(*retCount).To(Equal(int32(0)))
   110  			})
   111  		})
   112  
   113  		Context("when a query context has not been initialized", func() {
   114  			It("returns a nil total return count", func() {
   115  				retCount := transactionContext.GetTotalReturnCount("query-id")
   116  				Expect(retCount).To(BeNil())
   117  			})
   118  		})
   119  	})
   120  
   121  	Describe("CleanupQueryContext", func() {
   122  		It("removes references to the the iterator and results", func() {
   123  			transactionContext.InitializeQueryContext("query-id", resultsIterator)
   124  			transactionContext.CleanupQueryContext("query-id")
   125  
   126  			iter := transactionContext.GetQueryIterator("query-id")
   127  			Expect(iter).To(BeNil())
   128  			pqr := transactionContext.GetPendingQueryResult("query-id")
   129  			Expect(pqr).To(BeNil())
   130  			retCount := transactionContext.GetTotalReturnCount("query-id")
   131  			Expect(retCount).To(BeNil())
   132  		})
   133  
   134  		It("closes the query iterator", func() {
   135  			transactionContext.InitializeQueryContext("query-id", resultsIterator)
   136  			transactionContext.CleanupQueryContext("query-id")
   137  
   138  			Expect(resultsIterator.CloseCallCount()).To(Equal(1))
   139  		})
   140  
   141  		Context("when the query iterator is nil", func() {
   142  			It("keeps calm and carries on", func() {
   143  				transactionContext.InitializeQueryContext("query-id", nil)
   144  				transactionContext.CleanupQueryContext("query-id")
   145  
   146  				pqr := transactionContext.GetPendingQueryResult("query-id")
   147  				Expect(pqr).To(BeNil())
   148  			})
   149  		})
   150  	})
   151  
   152  	Describe("CloseQueryIterators", func() {
   153  		var resultsIterators []*mock.QueryResultsIterator
   154  
   155  		BeforeEach(func() {
   156  			for i := 0; i < 5; i++ {
   157  				resultsIterators = append(resultsIterators, &mock.QueryResultsIterator{})
   158  				transactionContext.InitializeQueryContext(fmt.Sprintf("query-id-%d", i+1), resultsIterators[i])
   159  			}
   160  		})
   161  
   162  		It("closes all initialized results iterators", func() {
   163  			transactionContext.CloseQueryIterators()
   164  			for _, iter := range resultsIterators {
   165  				Expect(iter.CloseCallCount()).To(Equal(1))
   166  			}
   167  		})
   168  	})
   169  })