k8s.io/kube-openapi@v0.0.0-20240228011516-70dd3763d340/pkg/internal/third_party/go-json-experiment/json/inline_test.go (about)

     1  // Copyright 2020 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package json
     6  
     7  import (
     8  	"os"
     9  	"os/exec"
    10  	"strings"
    11  	"testing"
    12  )
    13  
    14  // Whether a function is inlineable is dependent on the Go compiler version
    15  // and also relies on the presence of the Go toolchain itself being installed.
    16  // This test is disabled by default and explicitly enabled with an
    17  // environment variable that is specified in our integration tests,
    18  // which have fine control over exactly which Go version is being tested.
    19  var testInline = os.Getenv("TEST_INLINE") != ""
    20  
    21  func TestInline(t *testing.T) {
    22  	if !testInline {
    23  		t.SkipNow()
    24  	}
    25  
    26  	fncs := func() map[string]bool {
    27  		m := make(map[string]bool)
    28  		for _, s := range []string{
    29  			"Encoder.needFlush",
    30  			"Decoder.ReadValue", // thin wrapper over Decoder.readValue
    31  			"decodeBuffer.needMore",
    32  			"consumeWhitespace",
    33  			"consumeNull",
    34  			"consumeFalse",
    35  			"consumeTrue",
    36  			"consumeSimpleString",
    37  			"consumeString", // thin wrapper over consumeStringResumable
    38  			"consumeSimpleNumber",
    39  			"consumeNumber",         // thin wrapper over consumeNumberResumable
    40  			"unescapeStringMayCopy", // thin wrapper over unescapeString
    41  			"hasSuffixByte",
    42  			"trimSuffixByte",
    43  			"trimSuffixString",
    44  			"trimSuffixWhitespace",
    45  			"stateMachine.appendLiteral",
    46  			"stateMachine.appendNumber",
    47  			"stateMachine.appendString",
    48  			"stateMachine.depth",
    49  			"stateMachine.reset",
    50  			"stateMachine.mayAppendDelim",
    51  			"stateMachine.needDelim",
    52  			"stateMachine.popArray",
    53  			"stateMachine.popObject",
    54  			"stateMachine.pushArray",
    55  			"stateMachine.pushObject",
    56  			"stateEntry.increment",
    57  			"stateEntry.decrement",
    58  			"stateEntry.isArray",
    59  			"stateEntry.isObject",
    60  			"stateEntry.length",
    61  			"stateEntry.needImplicitColon",
    62  			"stateEntry.needImplicitComma",
    63  			"stateEntry.needObjectName",
    64  			"stateEntry.needObjectValue",
    65  			"objectNameStack.reset",
    66  			"objectNameStack.length",
    67  			"objectNameStack.getUnquoted",
    68  			"objectNameStack.push",
    69  			"objectNameStack.replaceLastQuotedOffset",
    70  			"objectNameStack.replaceLastUnquotedName",
    71  			"objectNameStack.pop",
    72  			"objectNameStack.ensureCopiedBuffer",
    73  			"objectNamespace.insertQuoted",   // thin wrapper over objectNamespace.insert
    74  			"objectNamespace.insertUnquoted", // thin wrapper over objectNamespace.insert
    75  			"Token.String",                   // thin wrapper over Token.string
    76  			"foldName",                       // thin wrapper over appendFoldedName
    77  			"hash64",
    78  		} {
    79  			m[s] = true
    80  		}
    81  		return m
    82  	}()
    83  
    84  	cmd := exec.Command("go", "build", "-gcflags=-m")
    85  	b, err := cmd.CombinedOutput()
    86  	if err != nil {
    87  		t.Fatalf("exec.Command error: %v\n\n%s", err, b)
    88  	}
    89  	for _, line := range strings.Split(string(b), "\n") {
    90  		const phrase = ": can inline "
    91  		if i := strings.Index(line, phrase); i >= 0 {
    92  			fnc := line[i+len(phrase):]
    93  			fnc = strings.ReplaceAll(fnc, "(", "")
    94  			fnc = strings.ReplaceAll(fnc, "*", "")
    95  			fnc = strings.ReplaceAll(fnc, ")", "")
    96  			delete(fncs, fnc)
    97  		}
    98  	}
    99  	for fnc := range fncs {
   100  		t.Errorf("%v is not inlineable, expected it to be", fnc)
   101  	}
   102  }