Repository: grpc/grpc-go
File: internal/grpctest/tlogger_test.go (Go)

Code before:
	}
	if tl.initialized {
		t.Error("tl.initialized = true; want false")
	}
	if tl.t != nil {
		t.Error("tl.t is not nil")
	}
	if !tl.start.IsZero() {
		t.Error("tl.start is not zero")
	}
}

func (s) TestInitVerbosityLevel(t *testing.T) {
	// Save original env var and reset atomic value
	tLoggerAtomic.Store(&tLogger{errors: map[*regexp.Regexp]int{}})

	// Test with valid verbosity level
	testLevel := "2"
	t.Setenv("GRPC_GO_LOG_VERBOSITY_LEVEL", testLevel)

	// Initialize tl with verbosity level
	tl := getLogger()
	vLevel := os.Getenv("GRPC_GO_LOG_VERBOSITY_LEVEL")
	if vl, err := strconv.Atoi(vLevel); err == nil {
		tl.v = vl
	}

	// Verify verbosity level
	if tl.v != 2 {
		t.Errorf("tl.v = %d; want 2", tl.v)
	}

	// Test with invalid verbosity level
	t.Setenv("GRPC_GO_LOG_VERBOSITY_LEVEL", "invalid")

	// Reset atomic value and initialize new tl
	tLoggerAtomic.Store(&tLogger{errors: map[*regexp.Regexp]int{}})
	tl = getLogger()
	vLevel = os.Getenv("GRPC_GO_LOG_VERBOSITY_LEVEL")
	if vl, err := strconv.Atoi(vLevel); err == nil {
		tl.v = vl
	}

	// Verify verbosity level remains at default (0) for invalid input
	if tl.v != 0 {
		t.Errorf("tl.v = %d; want 0", tl.v)
	}
}

func (s) TestAtomicValue(t *testing.T) {
	// Save original logger

Review comment (refactor):
I don't think we should duplicate the parsing logic in the test. The parsing in the non-test code may change without breaking the test. In my opinion, we don't need to add a test for verbosity level. If we were to write such a test, we would:
1. Make the env var a global. `var vLevel = os.Getenv("GRPC_GO_LOG_VERBOSITY_LEVEL")`
2. Create a constructor for the tLogger and call it from `init()`.
3. In the test, set the `vLevel` variable and call the constructor.

Code after:
/*
 *
 * Copyright 2020 gRPC authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */

package grpctest

import (
	"testing"

	"google.golang.org/grpc/grpclog"
)

type s struct {
	Tester
}

func Test(t *testing.T) {
	RunSubTests(t, s{})
}

func (s) TestInfo(*testing.T) {
	grpclog.Info("Info", "message.")
}

func (s) TestInfoln(*testing.T) {
	grpclog.Infoln("Info", "message.")
}

func (s) TestInfof(*testing.T) {
	grpclog.Infof("%v %v.", "Info", "message")
}

func (s) TestInfoDepth(*testing.T) {
	grpclog.InfoDepth(0, "Info", "depth", "message.")
}

func (s) TestWarning(*testing.T) {
	grpclog.Warning("Warning", "message.")
}

func (s) TestWarningln(*testing.T) {
	grpclog.Warningln("Warning", "message.")
}

func (s) TestWarningf(*testing.T) {
	grpclog.Warningf("%v %v.", "Warning", "message")
}

func (s) TestWarningDepth(*testing.T) {
	grpclog.WarningDepth(0, "Warning", "depth", "message.")
}

func (s) TestError(*testing.T) {
	const numErrors = 10
	ExpectError("Expected error")
	ExpectError("Expected ln error")
	ExpectError("Expected formatted error")
	ExpectErrorN("Expected repeated error", numErrors)
	grpclog.Error("Expected", "error")
	grpclog.Errorln("Expected", "ln", "error")
	grpclog.Errorf("%v %v %v", "Expected", "formatted", "error")
	for i := 0; i < numErrors; i++ {
		grpclog.Error("Expected repeated error")
	}
}