Skip to content

Commit

Permalink
spanner: WIP - cleanup mockserver and mockclient
Browse files Browse the repository at this point in the history
  • Loading branch information
hengfengli committed Jul 13, 2020
1 parent d519cb8 commit 3e22d1a
Show file tree
Hide file tree
Showing 6 changed files with 449 additions and 995 deletions.
3 changes: 3 additions & 0 deletions spanner/cmp_test.go
Expand Up @@ -51,6 +51,9 @@ func testEqual(a, b interface{}) bool {
if strings.Contains(path.GoString(), "{*status.Error}.unknownFields") {
return true
}
if strings.Contains(path.GoString(), "{*status.Error}.e") {
return true
}
return false
}, cmp.Ignore()))
}
63 changes: 53 additions & 10 deletions spanner/internal/testutil/inmem_spanner_server.go
Expand Up @@ -17,6 +17,7 @@ package testutil
import (
"bytes"
"context"
"encoding/binary"
"fmt"
"math/rand"
"sort"
Expand All @@ -35,6 +36,24 @@ import (
gstatus "google.golang.org/grpc/status"
)

var (
// KvMeta is the Metadata for mocked KV table.
KvMeta = spannerpb.ResultSetMetadata{
RowType: &spannerpb.StructType{
Fields: []*spannerpb.StructType_Field{
{
Name: "Key",
Type: &spannerpb.Type{Code: spannerpb.TypeCode_STRING},
},
{
Name: "Value",
Type: &spannerpb.Type{Code: spannerpb.TypeCode_STRING},
},
},
},
}
)

// StatementResultType indicates the type of result returned by a SQL
// statement.
type StatementResultType int
Expand Down Expand Up @@ -70,10 +89,11 @@ const (
// StatementResult represents a mocked result on the test server. The result is
// either of: a ResultSet, an update count or an error.
type StatementResult struct {
Type StatementResultType
Err error
ResultSet *spannerpb.ResultSet
UpdateCount int64
Type StatementResultType
Err error
ResultSet *spannerpb.ResultSet
UpdateCount int64
ResumeTokens [][]byte
}

// PartialResultSetExecutionTime represents execution times and errors that
Expand All @@ -85,10 +105,10 @@ type PartialResultSetExecutionTime struct {
Err error
}

// Converts a ResultSet to a PartialResultSet. This method is used to convert
// a mocked result to a PartialResultSet when one of the streaming methods are
// called.
func (s *StatementResult) toPartialResultSets(resumeToken []byte) (result []*spannerpb.PartialResultSet, err error) {
// ToPartialResultSets converts a ResultSet to a PartialResultSet. This method
// is used to convert a mocked result to a PartialResultSet when one of the
// streaming methods are called.
func (s *StatementResult) ToPartialResultSets(resumeToken []byte) (result []*spannerpb.PartialResultSet, err error) {
var startIndex uint64
if len(resumeToken) > 0 {
if startIndex, err = DecodeResumeToken(resumeToken); err != nil {
Expand All @@ -109,11 +129,18 @@ func (s *StatementResult) toPartialResultSets(resumeToken []byte) (result []*spa
idx++
}
}
var rt []byte
if len(s.ResumeTokens) == 0 {
rt = EncodeResumeToken(startIndex + rowCount)
} else {
rt = s.ResumeTokens[startIndex]
}
result = append(result, &spannerpb.PartialResultSet{
Metadata: s.ResultSet.Metadata,
Values: values,
ResumeToken: EncodeResumeToken(startIndex + rowCount),
ResumeToken: rt,
})

startIndex += rowCount
if startIndex == totalRows {
break
Expand Down Expand Up @@ -796,7 +823,7 @@ func (s *inMemSpannerServer) ExecuteStreamingSql(req *spannerpb.ExecuteSqlReques
case StatementResultError:
return statementResult.Err
case StatementResultResultSet:
parts, err := statementResult.toPartialResultSets(req.ResumeToken)
parts, err := statementResult.ToPartialResultSets(req.ResumeToken)
if err != nil {
return err
}
Expand Down Expand Up @@ -1014,3 +1041,19 @@ func (s *inMemSpannerServer) PartitionRead(ctx context.Context, req *spannerpb.P
s.mu.Unlock()
return nil, gstatus.Error(codes.Unimplemented, "Method not yet implemented")
}

// EncodeResumeToken return mock resume token encoding for an uint64 integer.
func EncodeResumeToken(t uint64) []byte {
rt := make([]byte, 16)
binary.PutUvarint(rt, t)
return rt
}

// DecodeResumeToken decodes a mock resume token into an uint64 integer.
func DecodeResumeToken(t []byte) (uint64, error) {
s, n := binary.Uvarint(t)
if n <= 0 {
return 0, fmt.Errorf("invalid resume token: %v", t)
}
return s, nil
}

0 comments on commit 3e22d1a

Please sign in to comment.