LCOV - code coverage report
Current view: top level - pebble/internal/base - test_utils.go (source / functions) Hit Total Coverage
Test: 2024-04-26 08:15Z 282f0c3b - meta test only.lcov Lines: 0 151 0.0 %
Date: 2024-04-26 08:16:25 Functions: 0 0 -

          Line data    Source code
       1             : // Copyright 2024 The LevelDB-Go and Pebble Authors. All rights reserved. Use
       2             : // of this source code is governed by a BSD-style license that can be found in
       3             : // the LICENSE file.
       4             : 
       5             : package base
       6             : 
       7             : import (
       8             :         "context"
       9             :         "io"
      10             :         "strconv"
      11             :         "strings"
      12             : )
      13             : 
      14             : // NewDeletableSumValueMerger return a ValueMerger which computes the sum of its
      15             : // arguments, but transforms a zero sum into a non-existent entry.
      16           0 : func NewDeletableSumValueMerger(key, value []byte) (ValueMerger, error) {
      17           0 :         m := &deletableSumValueMerger{}
      18           0 :         return m, m.MergeNewer(value)
      19           0 : }
      20             : 
      21             : type deletableSumValueMerger struct {
      22             :         sum int64
      23             : }
      24             : 
      25           0 : func (m *deletableSumValueMerger) parseAndCalculate(value []byte) error {
      26           0 :         v, err := strconv.ParseInt(string(value), 10, 64)
      27           0 :         if err == nil {
      28           0 :                 m.sum += v
      29           0 :         }
      30           0 :         return err
      31             : }
      32             : 
      33           0 : func (m *deletableSumValueMerger) MergeNewer(value []byte) error {
      34           0 :         return m.parseAndCalculate(value)
      35           0 : }
      36             : 
      37           0 : func (m *deletableSumValueMerger) MergeOlder(value []byte) error {
      38           0 :         return m.parseAndCalculate(value)
      39           0 : }
      40             : 
      41           0 : func (m *deletableSumValueMerger) Finish(includesBase bool) ([]byte, io.Closer, error) {
      42           0 :         if m.sum == 0 {
      43           0 :                 return nil, nil, nil
      44           0 :         }
      45           0 :         return []byte(strconv.FormatInt(m.sum, 10)), nil, nil
      46             : }
      47             : 
      48             : func (m *deletableSumValueMerger) DeletableFinish(
      49             :         includesBase bool,
      50           0 : ) ([]byte, bool, io.Closer, error) {
      51           0 :         value, closer, err := m.Finish(includesBase)
      52           0 :         return value, len(value) == 0, closer, err
      53           0 : }
      54             : 
      55             : // FakeKVs constructs InternalKVs from the given key strings, in the format
      56             : // "key:seq-num". The values are empty.
      57           0 : func FakeKVs(keys ...string) []InternalKV {
      58           0 :         kvs := make([]InternalKV, len(keys))
      59           0 :         for i, k := range keys {
      60           0 :                 kvs[i] = InternalKV{K: fakeIkey(k)}
      61           0 :         }
      62           0 :         return kvs
      63             : }
      64             : 
      65           0 : func fakeIkey(s string) InternalKey {
      66           0 :         j := strings.Index(s, ":")
      67           0 :         seqNum, err := strconv.Atoi(s[j+1:])
      68           0 :         if err != nil {
      69           0 :                 panic(err)
      70             :         }
      71           0 :         return MakeInternalKey([]byte(s[:j]), uint64(seqNum), InternalKeyKindSet)
      72             : }
      73             : 
      74             : // NewFakeIter returns an iterator over the given KVs.
      75           0 : func NewFakeIter(kvs []InternalKV) *FakeIter {
      76           0 :         return &FakeIter{
      77           0 :                 kvs:   kvs,
      78           0 :                 index: 0,
      79           0 :                 valid: len(kvs) > 0,
      80           0 :         }
      81           0 : }
      82             : 
      83             : // FakeIter is an iterator over a fixed set of KVs.
      84             : type FakeIter struct {
      85             :         lower    []byte
      86             :         upper    []byte
      87             :         kvs      []InternalKV
      88             :         index    int
      89             :         valid    bool
      90             :         closeErr error
      91             : }
      92             : 
      93             : // FakeIter implements the InternalIterator interface.
      94             : var _ InternalIterator = (*FakeIter)(nil)
      95             : 
      96             : // SetCloseErr causes future calls to Error() and Close() to return this error.
      97           0 : func (f *FakeIter) SetCloseErr(closeErr error) {
      98           0 :         f.closeErr = closeErr
      99           0 : }
     100             : 
     101           0 : func (f *FakeIter) String() string {
     102           0 :         return "fake"
     103           0 : }
     104             : 
     105             : // SeekGE is part of the InternalIterator interface.
     106           0 : func (f *FakeIter) SeekGE(key []byte, flags SeekGEFlags) *InternalKV {
     107           0 :         f.valid = false
     108           0 :         for f.index = 0; f.index < len(f.kvs); f.index++ {
     109           0 :                 if DefaultComparer.Compare(key, f.key().UserKey) <= 0 {
     110           0 :                         if f.upper != nil && DefaultComparer.Compare(f.upper, f.key().UserKey) <= 0 {
     111           0 :                                 return nil
     112           0 :                         }
     113           0 :                         f.valid = true
     114           0 :                         return f.KV()
     115             :                 }
     116             :         }
     117           0 :         return nil
     118             : }
     119             : 
     120             : // SeekPrefixGE is part of the InternalIterator interface.
     121           0 : func (f *FakeIter) SeekPrefixGE(prefix, key []byte, flags SeekGEFlags) *InternalKV {
     122           0 :         return f.SeekGE(key, flags)
     123           0 : }
     124             : 
     125             : // SeekLT is part of the InternalIterator interface.
     126           0 : func (f *FakeIter) SeekLT(key []byte, flags SeekLTFlags) *InternalKV {
     127           0 :         f.valid = false
     128           0 :         for f.index = len(f.kvs) - 1; f.index >= 0; f.index-- {
     129           0 :                 if DefaultComparer.Compare(key, f.key().UserKey) > 0 {
     130           0 :                         if f.lower != nil && DefaultComparer.Compare(f.lower, f.key().UserKey) > 0 {
     131           0 :                                 return nil
     132           0 :                         }
     133           0 :                         f.valid = true
     134           0 :                         return f.KV()
     135             :                 }
     136             :         }
     137           0 :         return nil
     138             : }
     139             : 
     140             : // First is part of the InternalIterator interface.
     141           0 : func (f *FakeIter) First() *InternalKV {
     142           0 :         f.valid = false
     143           0 :         f.index = -1
     144           0 :         if kv := f.Next(); kv == nil {
     145           0 :                 return nil
     146           0 :         }
     147           0 :         if f.upper != nil && DefaultComparer.Compare(f.upper, f.key().UserKey) <= 0 {
     148           0 :                 return nil
     149           0 :         }
     150           0 :         f.valid = true
     151           0 :         return f.KV()
     152             : }
     153             : 
     154             : // Last is part of the InternalIterator interface.
     155           0 : func (f *FakeIter) Last() *InternalKV {
     156           0 :         f.valid = false
     157           0 :         f.index = len(f.kvs)
     158           0 :         if kv := f.Prev(); kv == nil {
     159           0 :                 return nil
     160           0 :         }
     161           0 :         if f.lower != nil && DefaultComparer.Compare(f.lower, f.key().UserKey) > 0 {
     162           0 :                 return nil
     163           0 :         }
     164           0 :         f.valid = true
     165           0 :         return f.KV()
     166             : }
     167             : 
     168             : // Next is part of the InternalIterator interface.
     169           0 : func (f *FakeIter) Next() *InternalKV {
     170           0 :         f.valid = false
     171           0 :         if f.index == len(f.kvs) {
     172           0 :                 return nil
     173           0 :         }
     174           0 :         f.index++
     175           0 :         if f.index == len(f.kvs) {
     176           0 :                 return nil
     177           0 :         }
     178           0 :         if f.upper != nil && DefaultComparer.Compare(f.upper, f.key().UserKey) <= 0 {
     179           0 :                 return nil
     180           0 :         }
     181           0 :         f.valid = true
     182           0 :         return f.KV()
     183             : }
     184             : 
     185             : // Prev is part of the InternalIterator interface.
     186           0 : func (f *FakeIter) Prev() *InternalKV {
     187           0 :         f.valid = false
     188           0 :         if f.index < 0 {
     189           0 :                 return nil
     190           0 :         }
     191           0 :         f.index--
     192           0 :         if f.index < 0 {
     193           0 :                 return nil
     194           0 :         }
     195           0 :         if f.lower != nil && DefaultComparer.Compare(f.lower, f.key().UserKey) > 0 {
     196           0 :                 return nil
     197           0 :         }
     198           0 :         f.valid = true
     199           0 :         return f.KV()
     200             : }
     201             : 
     202             : // NextPrefix is part of the InternalIterator interface.
     203           0 : func (f *FakeIter) NextPrefix(succKey []byte) *InternalKV {
     204           0 :         return f.SeekGE(succKey, SeekGEFlagsNone)
     205           0 : }
     206             : 
     207             : // key returns the current Key the iterator is positioned at regardless of the
     208             : // value of f.valid.
     209           0 : func (f *FakeIter) key() *InternalKey {
     210           0 :         return &f.kvs[f.index].K
     211           0 : }
     212             : 
     213             : // KV is part of the InternalIterator interface.
     214           0 : func (f *FakeIter) KV() *InternalKV {
     215           0 :         if f.valid {
     216           0 :                 return &f.kvs[f.index]
     217           0 :         }
     218             :         // It is invalid to call Key() when Valid() returns false. Rather than
     219             :         // returning nil here which would technically be more correct, return a
     220             :         // non-nil key which is the behavior of some InternalIterator
     221             :         // implementations. This provides better testing of users of
     222             :         // InternalIterators.
     223           0 :         if f.index < 0 {
     224           0 :                 return &f.kvs[0]
     225           0 :         }
     226           0 :         return &f.kvs[len(f.kvs)-1]
     227             : }
     228             : 
     229             : // Valid is part of the InternalIterator interface.
     230           0 : func (f *FakeIter) Valid() bool {
     231           0 :         return f.index >= 0 && f.index < len(f.kvs) && f.valid
     232           0 : }
     233             : 
     234             : // Error is part of the InternalIterator interface.
     235           0 : func (f *FakeIter) Error() error {
     236           0 :         return f.closeErr
     237           0 : }
     238             : 
     239             : // Close is part of the InternalIterator interface.
     240           0 : func (f *FakeIter) Close() error {
     241           0 :         return f.closeErr
     242           0 : }
     243             : 
     244             : // SetBounds is part of the InternalIterator interface.
     245           0 : func (f *FakeIter) SetBounds(lower, upper []byte) {
     246           0 :         f.lower = lower
     247           0 :         f.upper = upper
     248           0 : }
     249             : 
     250             : // SetContext is part of the InternalIterator interface.
     251           0 : func (f *FakeIter) SetContext(_ context.Context) {}

Generated by: LCOV version 1.14