github.com/m3db/m3@v1.5.1-0.20231129193456-75a402aa583b/src/dbnode/persist/fs/msgpack/encoder_test.go (about)

     1  // Copyright (c) 2016 Uber Technologies, Inc
     2  //
     3  // Permission is hereby granted, free of charge, to any person obtaining a copy
     4  // of this software and associated documentation files (the "Software"), to deal
     5  // in the Software without restriction, including without limitation the rights
     6  // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
     7  // copies of the Software, and to permit persons to whom the Software is
     8  // furnished to do so, subject to the following conditions:
     9  //
    10  // The above copyright notice and this permission notice shall be included in
    11  // all copies or substantial portions of the Software
    12  //
    13  // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    14  // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    15  // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    16  // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    17  // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    18  // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
    19  // THE SOFTWARE
    20  
    21  package msgpack
    22  
    23  import (
    24  	"errors"
    25  	"testing"
    26  
    27  	"github.com/m3db/m3/src/dbnode/persist/schema"
    28  
    29  	"github.com/stretchr/testify/require"
    30  )
    31  
    32  var (
    33  	errTestVarint   = errors.New("test varint error")
    34  	errTestFloat64  = errors.New("test float64 error")
    35  	errTestBytes    = errors.New("test bytes error")
    36  	errTestArrayLen = errors.New("test array len error")
    37  )
    38  
    39  func testCapturingEncoder(t *testing.T) (*Encoder, *[]interface{}) {
    40  	encoder := NewEncoder()
    41  
    42  	var result []interface{}
    43  	actualEncodeVarintFn := encoder.encodeVarintFn
    44  	encoder.encodeVarintFn = func(value int64) {
    45  		actualEncodeVarintFn(value)
    46  		result = append(result, value)
    47  	}
    48  
    49  	actualEncodeVarUintFn := encoder.encodeVarUintFn
    50  	encoder.encodeVarUintFn = func(value uint64) {
    51  		actualEncodeVarUintFn(value)
    52  		result = append(result, value)
    53  	}
    54  
    55  	actualEncodeFloat64Fn := encoder.encodeFloat64Fn
    56  	encoder.encodeFloat64Fn = func(value float64) {
    57  		actualEncodeFloat64Fn(value)
    58  		result = append(result, value)
    59  	}
    60  
    61  	actualEncodeBytesFn := encoder.encodeBytesFn
    62  	encoder.encodeBytesFn = func(value []byte) {
    63  		actualEncodeBytesFn(value)
    64  		result = append(result, value)
    65  	}
    66  
    67  	actualEncodeArrayLenFn := encoder.encodeArrayLenFn
    68  	encoder.encodeArrayLenFn = func(value int) {
    69  		actualEncodeArrayLenFn(value)
    70  		result = append(result, value)
    71  	}
    72  
    73  	return encoder, &result
    74  }
    75  
    76  func testExpectedResultForIndexInfo(t *testing.T, indexInfo schema.IndexInfo) []interface{} {
    77  	_, currRoot := numFieldsForType(rootObjectType)
    78  	_, currIndexInfo := numFieldsForType(indexInfoType)
    79  	_, currSummariesInfo := numFieldsForType(indexSummariesInfoType)
    80  	_, currIndexBloomFilterInfo := numFieldsForType(indexBloomFilterInfoType)
    81  	return []interface{}{
    82  		int64(indexInfoVersion),
    83  		currRoot,
    84  		int64(indexInfoType),
    85  		currIndexInfo,
    86  		indexInfo.BlockStart,
    87  		indexInfo.BlockSize,
    88  		indexInfo.Entries,
    89  		indexInfo.MajorVersion,
    90  		currSummariesInfo,
    91  		indexInfo.Summaries.Summaries,
    92  		currIndexBloomFilterInfo,
    93  		indexInfo.BloomFilter.NumElementsM,
    94  		indexInfo.BloomFilter.NumHashesK,
    95  		indexInfo.SnapshotTime,
    96  		int64(indexInfo.FileType),
    97  		indexInfo.SnapshotID,
    98  		int64(indexInfo.VolumeIndex),
    99  		indexInfo.MinorVersion,
   100  	}
   101  }
   102  
   103  func testExpectedResultForIndexEntry(t *testing.T, indexEntry schema.IndexEntry) []interface{} {
   104  	_, currRoot := numFieldsForType(rootObjectType)
   105  	_, currIndexEntry := numFieldsForType(indexEntryType)
   106  	return []interface{}{
   107  		int64(indexEntryVersion),
   108  		currRoot,
   109  		int64(indexEntryType),
   110  		currIndexEntry,
   111  		indexEntry.Index,
   112  		indexEntry.ID,
   113  		indexEntry.Size,
   114  		indexEntry.Offset,
   115  		indexEntry.DataChecksum,
   116  		indexEntry.EncodedTags,
   117  		int64(testIndexEntryChecksum), // Checksum auto-added to the end of the index entry
   118  	}
   119  }
   120  
   121  func testExpectedResultForLogInfo(t *testing.T, logInfo schema.LogInfo) []interface{} {
   122  	_, currRoot := numFieldsForType(rootObjectType)
   123  	_, currLogInfo := numFieldsForType(logInfoType)
   124  	return []interface{}{
   125  		int64(logInfoVersion),
   126  		currRoot,
   127  		int64(logInfoType),
   128  		currLogInfo,
   129  		logInfo.DeprecatedDoNotUseStart,
   130  		logInfo.DeprecatedDoNotUseDuration,
   131  		logInfo.Index,
   132  	}
   133  }
   134  
   135  func testExpectedResultForLogEntry(t *testing.T, logEntry schema.LogEntry) []interface{} {
   136  	_, currRoot := numFieldsForType(rootObjectType)
   137  	_, currLogEntry := numFieldsForType(logEntryType)
   138  	return []interface{}{
   139  		int64(logEntryVersion),
   140  		currRoot,
   141  		int64(logEntryType),
   142  		currLogEntry,
   143  		logEntry.Index,
   144  		logEntry.Create,
   145  		logEntry.Metadata,
   146  		logEntry.Timestamp,
   147  		logEntry.Value,
   148  		uint64(logEntry.Unit),
   149  		logEntry.Annotation,
   150  	}
   151  }
   152  
   153  func testExpectedResultForLogMetadata(t *testing.T, logMetadata schema.LogMetadata) []interface{} {
   154  	_, currRoot := numFieldsForType(rootObjectType)
   155  	_, currLogMetadata := numFieldsForType(logMetadataType)
   156  	return []interface{}{
   157  		int64(logMetadataVersion),
   158  		currRoot,
   159  		int64(logMetadataType),
   160  		currLogMetadata,
   161  		logMetadata.ID,
   162  		logMetadata.Namespace,
   163  		uint64(logMetadata.Shard),
   164  		logMetadata.EncodedTags,
   165  	}
   166  }
   167  
   168  func TestEncodeIndexInfo(t *testing.T) {
   169  	enc, actual := testCapturingEncoder(t)
   170  	require.NoError(t, enc.EncodeIndexInfo(testIndexInfo))
   171  	expected := testExpectedResultForIndexInfo(t, testIndexInfo)
   172  	require.Equal(t, expected, *actual)
   173  }
   174  
   175  func TestEncodeIndexEntry(t *testing.T) {
   176  	enc, actual := testCapturingEncoder(t)
   177  	require.NoError(t, enc.EncodeIndexEntry(testIndexEntry))
   178  	expected := testExpectedResultForIndexEntry(t, testIndexEntry)
   179  	require.Equal(t, expected, *actual)
   180  }
   181  
   182  func TestEncodeLogInfo(t *testing.T) {
   183  	enc, actual := testCapturingEncoder(t)
   184  	require.NoError(t, enc.EncodeLogInfo(testLogInfo))
   185  	expected := testExpectedResultForLogInfo(t, testLogInfo)
   186  	require.Equal(t, expected, *actual)
   187  }
   188  
   189  func TestEncodeLogEntry(t *testing.T) {
   190  	enc, actual := testCapturingEncoder(t)
   191  	require.NoError(t, enc.EncodeLogEntry(testLogEntry))
   192  	expected := testExpectedResultForLogEntry(t, testLogEntry)
   193  	require.Equal(t, expected, *actual)
   194  }
   195  
   196  func TestEncodeLogEntryFast(t *testing.T) {
   197  	buffer, err := EncodeLogEntryFast(nil, testLogEntry)
   198  	require.NoError(t, err)
   199  
   200  	enc := NewEncoder()
   201  	enc.EncodeLogEntry(testLogEntry)
   202  	expected := enc.Bytes()
   203  
   204  	require.Equal(t, expected, buffer)
   205  }
   206  
   207  func TestEncodeLogMetadata(t *testing.T) {
   208  	enc, actual := testCapturingEncoder(t)
   209  	require.NoError(t, enc.EncodeLogMetadata(testLogMetadata))
   210  	expected := testExpectedResultForLogMetadata(t, testLogMetadata)
   211  	require.Equal(t, expected, *actual)
   212  }
   213  
   214  func TestEncodeLogMetadataFast(t *testing.T) {
   215  	buffer, err := EncodeLogMetadataFast(nil, testLogMetadata)
   216  	require.NoError(t, err)
   217  
   218  	enc := NewEncoder()
   219  	enc.EncodeLogMetadata(testLogMetadata)
   220  	expected := enc.Bytes()
   221  
   222  	require.Equal(t, expected, buffer)
   223  }
   224  
   225  func TestEncodeVarintError(t *testing.T) {
   226  	enc, _ := testCapturingEncoder(t)
   227  	enc.encodeVarintFn = func(value int64) { enc.err = errTestVarint }
   228  	require.Equal(t, errTestVarint, enc.EncodeIndexInfo(testIndexInfo))
   229  }
   230  
   231  func TestEncodeFloat64Error(t *testing.T) {
   232  	enc, _ := testCapturingEncoder(t)
   233  	enc.encodeFloat64Fn = func(value float64) { enc.err = errTestFloat64 }
   234  	require.Equal(t, errTestFloat64, enc.EncodeLogEntry(testLogEntry))
   235  }
   236  
   237  func TestEncodeBytesError(t *testing.T) {
   238  	enc, _ := testCapturingEncoder(t)
   239  	enc.encodeBytesFn = func(value []byte) { enc.err = errTestBytes }
   240  	require.Equal(t, errTestBytes, enc.EncodeIndexEntry(testIndexEntry))
   241  }
   242  
   243  func TestEncodeArrayLenError(t *testing.T) {
   244  	enc, _ := testCapturingEncoder(t)
   245  	enc.encodeArrayLenFn = func(value int) { enc.err = errTestArrayLen }
   246  	require.Equal(t, errTestArrayLen, enc.EncodeLogInfo(testLogInfo))
   247  }