...

Source file src/go.mongodb.org/mongo-driver/bson/bsonrw/value_reader_writer_test.go

Documentation: go.mongodb.org/mongo-driver/bson/bsonrw

     1  // Copyright (C) MongoDB, Inc. 2017-present.
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License"); you may
     4  // not use this file except in compliance with the License. You may obtain
     5  // a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
     6  
     7  package bsonrw
     8  
     9  import (
    10  	"testing"
    11  
    12  	"go.mongodb.org/mongo-driver/bson/bsontype"
    13  	"go.mongodb.org/mongo-driver/bson/primitive"
    14  	"go.mongodb.org/mongo-driver/x/bsonx/bsoncore"
    15  )
    16  
    17  type VRWInvoked byte
    18  
    19  const (
    20  	_                         = iota
    21  	llvrwReadArray VRWInvoked = 1
    22  	llvrwReadBinary
    23  	llvrwReadBoolean
    24  	llvrwReadDocument
    25  	llvrwReadCodeWithScope
    26  	llvrwReadDBPointer
    27  	llvrwReadDateTime
    28  	llvrwReadDecimal128
    29  	llvrwReadDouble
    30  	llvrwReadInt32
    31  	llvrwReadInt64
    32  	llvrwReadJavascript
    33  	llvrwReadMaxKey
    34  	llvrwReadMinKey
    35  	llvrwReadNull
    36  	llvrwReadObjectID
    37  	llvrwReadRegex
    38  	llvrwReadString
    39  	llvrwReadSymbol
    40  	llvrwReadTimestamp
    41  	llvrwReadUndefined
    42  	llvrwReadElement
    43  	llvrwReadValue
    44  	llvrwWriteArray
    45  	llvrwWriteBinary
    46  	llvrwWriteBinaryWithSubtype
    47  	llvrwWriteBoolean
    48  	llvrwWriteCodeWithScope
    49  	llvrwWriteDBPointer
    50  	llvrwWriteDateTime
    51  	llvrwWriteDecimal128
    52  	llvrwWriteDouble
    53  	llvrwWriteInt32
    54  	llvrwWriteInt64
    55  	llvrwWriteJavascript
    56  	llvrwWriteMaxKey
    57  	llvrwWriteMinKey
    58  	llvrwWriteNull
    59  	llvrwWriteObjectID
    60  	llvrwWriteRegex
    61  	llvrwWriteString
    62  	llvrwWriteDocument
    63  	llvrwWriteSymbol
    64  	llvrwWriteTimestamp
    65  	llvrwWriteUndefined
    66  	llvrwWriteDocumentElement
    67  	llvrwWriteDocumentEnd
    68  	llvrwWriteArrayElement
    69  	llvrwWriteArrayEnd
    70  )
    71  
    72  type TestValueReaderWriter struct {
    73  	t        *testing.T
    74  	invoked  VRWInvoked
    75  	readval  interface{}
    76  	bsontype bsontype.Type
    77  	err      error
    78  	errAfter VRWInvoked // error after this method is called
    79  }
    80  
    81  func (llvrw *TestValueReaderWriter) Type() bsontype.Type {
    82  	return llvrw.bsontype
    83  }
    84  
    85  func (llvrw *TestValueReaderWriter) Skip() error {
    86  	panic("not implemented")
    87  }
    88  
    89  func (llvrw *TestValueReaderWriter) ReadArray() (ArrayReader, error) {
    90  	llvrw.invoked = llvrwReadArray
    91  	if llvrw.errAfter == llvrw.invoked {
    92  		return nil, llvrw.err
    93  	}
    94  
    95  	return llvrw, nil
    96  }
    97  
    98  func (llvrw *TestValueReaderWriter) ReadBinary() (b []byte, btype byte, err error) {
    99  	llvrw.invoked = llvrwReadBinary
   100  	if llvrw.errAfter == llvrw.invoked {
   101  		return nil, 0x00, llvrw.err
   102  	}
   103  
   104  	switch tt := llvrw.readval.(type) {
   105  	case bsoncore.Value:
   106  		subtype, data, _, ok := bsoncore.ReadBinary(tt.Data)
   107  		if !ok {
   108  			llvrw.t.Error("Invalid Value provided for return value of ReadBinary.")
   109  			return nil, 0x00, nil
   110  		}
   111  		return data, subtype, nil
   112  	default:
   113  		llvrw.t.Errorf("Incorrect type provided for return value of ReadBinary: %T", llvrw.readval)
   114  		return nil, 0x00, nil
   115  	}
   116  }
   117  
   118  func (llvrw *TestValueReaderWriter) ReadBoolean() (bool, error) {
   119  	llvrw.invoked = llvrwReadBoolean
   120  	if llvrw.errAfter == llvrw.invoked {
   121  		return false, llvrw.err
   122  	}
   123  
   124  	b, ok := llvrw.readval.(bool)
   125  	if !ok {
   126  		llvrw.t.Errorf("Incorrect type provided for return value of ReadBoolean: %T", llvrw.readval)
   127  		return false, nil
   128  	}
   129  
   130  	return b, llvrw.err
   131  }
   132  
   133  func (llvrw *TestValueReaderWriter) ReadDocument() (DocumentReader, error) {
   134  	llvrw.invoked = llvrwReadDocument
   135  	if llvrw.errAfter == llvrw.invoked {
   136  		return nil, llvrw.err
   137  	}
   138  
   139  	return llvrw, nil
   140  }
   141  
   142  func (llvrw *TestValueReaderWriter) ReadCodeWithScope() (code string, dr DocumentReader, err error) {
   143  	llvrw.invoked = llvrwReadCodeWithScope
   144  	if llvrw.errAfter == llvrw.invoked {
   145  		return "", nil, llvrw.err
   146  	}
   147  
   148  	return "", llvrw, nil
   149  }
   150  
   151  func (llvrw *TestValueReaderWriter) ReadDBPointer() (ns string, oid primitive.ObjectID, err error) {
   152  	llvrw.invoked = llvrwReadDBPointer
   153  	if llvrw.errAfter == llvrw.invoked {
   154  		return "", primitive.ObjectID{}, llvrw.err
   155  	}
   156  
   157  	switch tt := llvrw.readval.(type) {
   158  	case bsoncore.Value:
   159  		ns, oid, _, ok := bsoncore.ReadDBPointer(tt.Data)
   160  		if !ok {
   161  			llvrw.t.Error("Invalid Value instance provided for return value of ReadDBPointer")
   162  			return "", primitive.ObjectID{}, nil
   163  		}
   164  		return ns, oid, nil
   165  	default:
   166  		llvrw.t.Errorf("Incorrect type provided for return value of ReadDBPointer: %T", llvrw.readval)
   167  		return "", primitive.ObjectID{}, nil
   168  	}
   169  }
   170  
   171  func (llvrw *TestValueReaderWriter) ReadDateTime() (int64, error) {
   172  	llvrw.invoked = llvrwReadDateTime
   173  	if llvrw.errAfter == llvrw.invoked {
   174  		return 0, llvrw.err
   175  	}
   176  
   177  	dt, ok := llvrw.readval.(int64)
   178  	if !ok {
   179  		llvrw.t.Errorf("Incorrect type provided for return value of ReadDateTime: %T", llvrw.readval)
   180  		return 0, nil
   181  	}
   182  
   183  	return dt, nil
   184  }
   185  
   186  func (llvrw *TestValueReaderWriter) ReadDecimal128() (primitive.Decimal128, error) {
   187  	llvrw.invoked = llvrwReadDecimal128
   188  	if llvrw.errAfter == llvrw.invoked {
   189  		return primitive.Decimal128{}, llvrw.err
   190  	}
   191  
   192  	d128, ok := llvrw.readval.(primitive.Decimal128)
   193  	if !ok {
   194  		llvrw.t.Errorf("Incorrect type provided for return value of ReadDecimal128: %T", llvrw.readval)
   195  		return primitive.Decimal128{}, nil
   196  	}
   197  
   198  	return d128, nil
   199  }
   200  
   201  func (llvrw *TestValueReaderWriter) ReadDouble() (float64, error) {
   202  	llvrw.invoked = llvrwReadDouble
   203  	if llvrw.errAfter == llvrw.invoked {
   204  		return 0, llvrw.err
   205  	}
   206  
   207  	f64, ok := llvrw.readval.(float64)
   208  	if !ok {
   209  		llvrw.t.Errorf("Incorrect type provided for return value of ReadDouble: %T", llvrw.readval)
   210  		return 0, nil
   211  	}
   212  
   213  	return f64, nil
   214  }
   215  
   216  func (llvrw *TestValueReaderWriter) ReadInt32() (int32, error) {
   217  	llvrw.invoked = llvrwReadInt32
   218  	if llvrw.errAfter == llvrw.invoked {
   219  		return 0, llvrw.err
   220  	}
   221  
   222  	i32, ok := llvrw.readval.(int32)
   223  	if !ok {
   224  		llvrw.t.Errorf("Incorrect type provided for return value of ReadInt32: %T", llvrw.readval)
   225  		return 0, nil
   226  	}
   227  
   228  	return i32, nil
   229  }
   230  
   231  func (llvrw *TestValueReaderWriter) ReadInt64() (int64, error) {
   232  	llvrw.invoked = llvrwReadInt64
   233  	if llvrw.errAfter == llvrw.invoked {
   234  		return 0, llvrw.err
   235  	}
   236  	i64, ok := llvrw.readval.(int64)
   237  	if !ok {
   238  		llvrw.t.Errorf("Incorrect type provided for return value of ReadInt64: %T", llvrw.readval)
   239  		return 0, nil
   240  	}
   241  
   242  	return i64, nil
   243  }
   244  
   245  func (llvrw *TestValueReaderWriter) ReadJavascript() (code string, err error) {
   246  	llvrw.invoked = llvrwReadJavascript
   247  	if llvrw.errAfter == llvrw.invoked {
   248  		return "", llvrw.err
   249  	}
   250  	js, ok := llvrw.readval.(string)
   251  	if !ok {
   252  		llvrw.t.Errorf("Incorrect type provided for return value of ReadJavascript: %T", llvrw.readval)
   253  		return "", nil
   254  	}
   255  
   256  	return js, nil
   257  }
   258  
   259  func (llvrw *TestValueReaderWriter) ReadMaxKey() error {
   260  	llvrw.invoked = llvrwReadMaxKey
   261  	if llvrw.errAfter == llvrw.invoked {
   262  		return llvrw.err
   263  	}
   264  
   265  	return nil
   266  }
   267  
   268  func (llvrw *TestValueReaderWriter) ReadMinKey() error {
   269  	llvrw.invoked = llvrwReadMinKey
   270  	if llvrw.errAfter == llvrw.invoked {
   271  		return llvrw.err
   272  	}
   273  
   274  	return nil
   275  }
   276  
   277  func (llvrw *TestValueReaderWriter) ReadNull() error {
   278  	llvrw.invoked = llvrwReadNull
   279  	if llvrw.errAfter == llvrw.invoked {
   280  		return llvrw.err
   281  	}
   282  
   283  	return nil
   284  }
   285  
   286  func (llvrw *TestValueReaderWriter) ReadObjectID() (primitive.ObjectID, error) {
   287  	llvrw.invoked = llvrwReadObjectID
   288  	if llvrw.errAfter == llvrw.invoked {
   289  		return primitive.ObjectID{}, llvrw.err
   290  	}
   291  	oid, ok := llvrw.readval.(primitive.ObjectID)
   292  	if !ok {
   293  		llvrw.t.Errorf("Incorrect type provided for return value of ReadObjectID: %T", llvrw.readval)
   294  		return primitive.ObjectID{}, nil
   295  	}
   296  
   297  	return oid, nil
   298  }
   299  
   300  func (llvrw *TestValueReaderWriter) ReadRegex() (pattern string, options string, err error) {
   301  	llvrw.invoked = llvrwReadRegex
   302  	if llvrw.errAfter == llvrw.invoked {
   303  		return "", "", llvrw.err
   304  	}
   305  	switch tt := llvrw.readval.(type) {
   306  	case bsoncore.Value:
   307  		pattern, options, _, ok := bsoncore.ReadRegex(tt.Data)
   308  		if !ok {
   309  			llvrw.t.Error("Invalid Value instance provided for ReadRegex")
   310  			return "", "", nil
   311  		}
   312  		return pattern, options, nil
   313  	default:
   314  		llvrw.t.Errorf("Incorrect type provided for return value of ReadRegex: %T", llvrw.readval)
   315  		return "", "", nil
   316  	}
   317  }
   318  
   319  func (llvrw *TestValueReaderWriter) ReadString() (string, error) {
   320  	llvrw.invoked = llvrwReadString
   321  	if llvrw.errAfter == llvrw.invoked {
   322  		return "", llvrw.err
   323  	}
   324  	str, ok := llvrw.readval.(string)
   325  	if !ok {
   326  		llvrw.t.Errorf("Incorrect type provided for return value of ReadString: %T", llvrw.readval)
   327  		return "", nil
   328  	}
   329  
   330  	return str, nil
   331  }
   332  
   333  func (llvrw *TestValueReaderWriter) ReadSymbol() (symbol string, err error) {
   334  	llvrw.invoked = llvrwReadSymbol
   335  	if llvrw.errAfter == llvrw.invoked {
   336  		return "", llvrw.err
   337  	}
   338  	switch tt := llvrw.readval.(type) {
   339  	case bsoncore.Value:
   340  		symbol, _, ok := bsoncore.ReadSymbol(tt.Data)
   341  		if !ok {
   342  			llvrw.t.Error("Invalid Value instance provided for ReadSymbol")
   343  			return "", nil
   344  		}
   345  		return symbol, nil
   346  	default:
   347  		llvrw.t.Errorf("Incorrect type provided for return value of ReadSymbol: %T", llvrw.readval)
   348  		return "", nil
   349  	}
   350  }
   351  
   352  func (llvrw *TestValueReaderWriter) ReadTimestamp() (t uint32, i uint32, err error) {
   353  	llvrw.invoked = llvrwReadTimestamp
   354  	if llvrw.errAfter == llvrw.invoked {
   355  		return 0, 0, llvrw.err
   356  	}
   357  	switch tt := llvrw.readval.(type) {
   358  	case bsoncore.Value:
   359  		t, i, _, ok := bsoncore.ReadTimestamp(tt.Data)
   360  		if !ok {
   361  			llvrw.t.Errorf("Invalid Value instance provided for return value of ReadTimestamp")
   362  			return 0, 0, nil
   363  		}
   364  		return t, i, nil
   365  	default:
   366  		llvrw.t.Errorf("Incorrect type provided for return value of ReadTimestamp: %T", llvrw.readval)
   367  		return 0, 0, nil
   368  	}
   369  }
   370  
   371  func (llvrw *TestValueReaderWriter) ReadUndefined() error {
   372  	llvrw.invoked = llvrwReadUndefined
   373  	if llvrw.errAfter == llvrw.invoked {
   374  		return llvrw.err
   375  	}
   376  
   377  	return nil
   378  }
   379  
   380  func (llvrw *TestValueReaderWriter) WriteArray() (ArrayWriter, error) {
   381  	llvrw.invoked = llvrwWriteArray
   382  	if llvrw.errAfter == llvrw.invoked {
   383  		return nil, llvrw.err
   384  	}
   385  	return llvrw, nil
   386  }
   387  
   388  func (llvrw *TestValueReaderWriter) WriteBinary([]byte) error {
   389  	llvrw.invoked = llvrwWriteBinary
   390  	if llvrw.errAfter == llvrw.invoked {
   391  		return llvrw.err
   392  	}
   393  	return nil
   394  }
   395  
   396  func (llvrw *TestValueReaderWriter) WriteBinaryWithSubtype([]byte, byte) error {
   397  	llvrw.invoked = llvrwWriteBinaryWithSubtype
   398  	if llvrw.errAfter == llvrw.invoked {
   399  		return llvrw.err
   400  	}
   401  	return nil
   402  }
   403  
   404  func (llvrw *TestValueReaderWriter) WriteBoolean(bool) error {
   405  	llvrw.invoked = llvrwWriteBoolean
   406  	if llvrw.errAfter == llvrw.invoked {
   407  		return llvrw.err
   408  	}
   409  	return nil
   410  }
   411  
   412  func (llvrw *TestValueReaderWriter) WriteCodeWithScope(string) (DocumentWriter, error) {
   413  	llvrw.invoked = llvrwWriteCodeWithScope
   414  	if llvrw.errAfter == llvrw.invoked {
   415  		return nil, llvrw.err
   416  	}
   417  	return llvrw, nil
   418  }
   419  
   420  func (llvrw *TestValueReaderWriter) WriteDBPointer(string, primitive.ObjectID) error {
   421  	llvrw.invoked = llvrwWriteDBPointer
   422  	if llvrw.errAfter == llvrw.invoked {
   423  		return llvrw.err
   424  	}
   425  	return nil
   426  }
   427  
   428  func (llvrw *TestValueReaderWriter) WriteDateTime(int64) error {
   429  	llvrw.invoked = llvrwWriteDateTime
   430  	if llvrw.errAfter == llvrw.invoked {
   431  		return llvrw.err
   432  	}
   433  	return nil
   434  }
   435  
   436  func (llvrw *TestValueReaderWriter) WriteDecimal128(primitive.Decimal128) error {
   437  	llvrw.invoked = llvrwWriteDecimal128
   438  	if llvrw.errAfter == llvrw.invoked {
   439  		return llvrw.err
   440  	}
   441  	return nil
   442  }
   443  
   444  func (llvrw *TestValueReaderWriter) WriteDouble(float64) error {
   445  	llvrw.invoked = llvrwWriteDouble
   446  	if llvrw.errAfter == llvrw.invoked {
   447  		return llvrw.err
   448  	}
   449  	return nil
   450  }
   451  
   452  func (llvrw *TestValueReaderWriter) WriteInt32(int32) error {
   453  	llvrw.invoked = llvrwWriteInt32
   454  	if llvrw.errAfter == llvrw.invoked {
   455  		return llvrw.err
   456  	}
   457  	return nil
   458  }
   459  
   460  func (llvrw *TestValueReaderWriter) WriteInt64(int64) error {
   461  	llvrw.invoked = llvrwWriteInt64
   462  	if llvrw.errAfter == llvrw.invoked {
   463  		return llvrw.err
   464  	}
   465  	return nil
   466  }
   467  
   468  func (llvrw *TestValueReaderWriter) WriteJavascript(string) error {
   469  	llvrw.invoked = llvrwWriteJavascript
   470  	if llvrw.errAfter == llvrw.invoked {
   471  		return llvrw.err
   472  	}
   473  	return nil
   474  }
   475  
   476  func (llvrw *TestValueReaderWriter) WriteMaxKey() error {
   477  	llvrw.invoked = llvrwWriteMaxKey
   478  	if llvrw.errAfter == llvrw.invoked {
   479  		return llvrw.err
   480  	}
   481  	return nil
   482  }
   483  
   484  func (llvrw *TestValueReaderWriter) WriteMinKey() error {
   485  	llvrw.invoked = llvrwWriteMinKey
   486  	if llvrw.errAfter == llvrw.invoked {
   487  		return llvrw.err
   488  	}
   489  	return nil
   490  }
   491  
   492  func (llvrw *TestValueReaderWriter) WriteNull() error {
   493  	llvrw.invoked = llvrwWriteNull
   494  	if llvrw.errAfter == llvrw.invoked {
   495  		return llvrw.err
   496  	}
   497  	return nil
   498  }
   499  
   500  func (llvrw *TestValueReaderWriter) WriteObjectID(primitive.ObjectID) error {
   501  	llvrw.invoked = llvrwWriteObjectID
   502  	if llvrw.errAfter == llvrw.invoked {
   503  		return llvrw.err
   504  	}
   505  	return nil
   506  }
   507  
   508  func (llvrw *TestValueReaderWriter) WriteRegex(string, string) error {
   509  	llvrw.invoked = llvrwWriteRegex
   510  	if llvrw.errAfter == llvrw.invoked {
   511  		return llvrw.err
   512  	}
   513  	return nil
   514  }
   515  
   516  func (llvrw *TestValueReaderWriter) WriteString(string) error {
   517  	llvrw.invoked = llvrwWriteString
   518  	if llvrw.errAfter == llvrw.invoked {
   519  		return llvrw.err
   520  	}
   521  	return nil
   522  }
   523  
   524  func (llvrw *TestValueReaderWriter) WriteDocument() (DocumentWriter, error) {
   525  	llvrw.invoked = llvrwWriteDocument
   526  	if llvrw.errAfter == llvrw.invoked {
   527  		return nil, llvrw.err
   528  	}
   529  	return llvrw, nil
   530  }
   531  
   532  func (llvrw *TestValueReaderWriter) WriteSymbol(string) error {
   533  	llvrw.invoked = llvrwWriteSymbol
   534  	if llvrw.errAfter == llvrw.invoked {
   535  		return llvrw.err
   536  	}
   537  	return nil
   538  }
   539  
   540  func (llvrw *TestValueReaderWriter) WriteTimestamp(uint32, uint32) error {
   541  	llvrw.invoked = llvrwWriteTimestamp
   542  	if llvrw.errAfter == llvrw.invoked {
   543  		return llvrw.err
   544  	}
   545  	return nil
   546  }
   547  
   548  func (llvrw *TestValueReaderWriter) WriteUndefined() error {
   549  	llvrw.invoked = llvrwWriteUndefined
   550  	if llvrw.errAfter == llvrw.invoked {
   551  		return llvrw.err
   552  	}
   553  	return nil
   554  }
   555  
   556  func (llvrw *TestValueReaderWriter) ReadElement() (string, ValueReader, error) {
   557  	llvrw.invoked = llvrwReadElement
   558  	if llvrw.errAfter == llvrw.invoked {
   559  		return "", nil, llvrw.err
   560  	}
   561  
   562  	return "", llvrw, nil
   563  }
   564  
   565  func (llvrw *TestValueReaderWriter) WriteDocumentElement(string) (ValueWriter, error) {
   566  	llvrw.invoked = llvrwWriteDocumentElement
   567  	if llvrw.errAfter == llvrw.invoked {
   568  		return nil, llvrw.err
   569  	}
   570  
   571  	return llvrw, nil
   572  }
   573  
   574  func (llvrw *TestValueReaderWriter) WriteDocumentEnd() error {
   575  	llvrw.invoked = llvrwWriteDocumentEnd
   576  	if llvrw.errAfter == llvrw.invoked {
   577  		return llvrw.err
   578  	}
   579  
   580  	return nil
   581  }
   582  
   583  func (llvrw *TestValueReaderWriter) ReadValue() (ValueReader, error) {
   584  	llvrw.invoked = llvrwReadValue
   585  	if llvrw.errAfter == llvrw.invoked {
   586  		return nil, llvrw.err
   587  	}
   588  
   589  	return llvrw, nil
   590  }
   591  
   592  func (llvrw *TestValueReaderWriter) WriteArrayElement() (ValueWriter, error) {
   593  	llvrw.invoked = llvrwWriteArrayElement
   594  	if llvrw.errAfter == llvrw.invoked {
   595  		return nil, llvrw.err
   596  	}
   597  
   598  	return llvrw, nil
   599  }
   600  
   601  func (llvrw *TestValueReaderWriter) WriteArrayEnd() error {
   602  	llvrw.invoked = llvrwWriteArrayEnd
   603  	if llvrw.errAfter == llvrw.invoked {
   604  		return llvrw.err
   605  	}
   606  
   607  	return nil
   608  }
   609  

View as plain text