Skip to content

Commit

Permalink
feat(v2): add GoVersion package variable (#283)
Browse files Browse the repository at this point in the history
  • Loading branch information
noahdietz committed Jun 8, 2023
1 parent 8f95937 commit 26553cc
Show file tree
Hide file tree
Showing 2 changed files with 105 additions and 2 deletions.
66 changes: 65 additions & 1 deletion v2/header.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,71 @@

package gax

import "bytes"
import (
"bytes"
"runtime"
"strings"
"unicode"
)

var (
// GoVersion is a header-safe representation of the current runtime
// environment's Go version. This is for GAX consumers that need to
// report the Go runtime version in API calls.
GoVersion string
// version is a package internal global variable for testing purposes.
version = runtime.Version
)

// versionUnknown is only used when the runtime version cannot be determined.
const versionUnknown = "UNKNOWN"

func init() {
GoVersion = goVersion()
}

// goVersion returns a Go runtime version derived from the runtime environment
// that is modified to be suitable for reporting in a header, meaning it has no
// whitespace. If it is unable to determine the Go runtime version, it returns
// versionUnknown.
func goVersion() string {
const develPrefix = "devel +"

s := version()
if strings.HasPrefix(s, develPrefix) {
s = s[len(develPrefix):]
if p := strings.IndexFunc(s, unicode.IsSpace); p >= 0 {
s = s[:p]
}
return s
}

notSemverRune := func(r rune) bool {
return !strings.ContainsRune("0123456789.", r)
}

if strings.HasPrefix(s, "go1") {
s = s[2:]
var prerelease string
if p := strings.IndexFunc(s, notSemverRune); p >= 0 {
s, prerelease = s[:p], s[p:]
}
if strings.HasSuffix(s, ".") {
s += "0"
} else if strings.Count(s, ".") < 2 {
s += ".0"
}
if prerelease != "" {
// Some release candidates already have a dash in them.
if !strings.HasPrefix(prerelease, "-") {
prerelease = "-" + prerelease
}
s += prerelease
}
return s
}
return "UNKNOWN"
}

// XGoogHeader is for use by the Google Cloud Libraries only.
//
Expand Down
41 changes: 40 additions & 1 deletion v2/header_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,11 @@

package gax

import "testing"
import (
"testing"

"github.com/google/go-cmp/cmp"
)

func TestXGoogHeader(t *testing.T) {
for _, tst := range []struct {
Expand All @@ -46,3 +50,38 @@ func TestXGoogHeader(t *testing.T) {
}
}
}

func TestGoVersion(t *testing.T) {
testVersion := func(v string) func() string {
return func() string {
return v
}
}
for _, tst := range []struct {
v func() string
want string
}{
{
testVersion("go1.19"),
"1.19.0",
},
{
testVersion("go1.21-20230317-RC01"),
"1.21.0-20230317-RC01",
},
{
testVersion("devel +abc1234"),
"abc1234",
},
{
testVersion("this should be unknown"),
versionUnknown,
},
} {
version = tst.v
got := goVersion()
if diff := cmp.Diff(got, tst.want); diff != "" {
t.Errorf("got(-),want(+):\n%s", diff)
}
}
}

0 comments on commit 26553cc

Please sign in to comment.