github.com/go-xe2/third@v1.0.3/golang.org/x/text/internal/testtext/codesize.go (about)

     1  // Copyright 2015 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 testtext
     6  
     7  import (
     8  	"bytes"
     9  	"fmt"
    10  	"io/ioutil"
    11  	"os"
    12  	"os/exec"
    13  	"path/filepath"
    14  	"runtime"
    15  )
    16  
    17  // CodeSize builds the given code sample and returns the binary size or en error
    18  // if an error occurred. The code sample typically will look like this:
    19  //     package main
    20  //     import "github.com/go-xe2/third/golang.org/x/text/somepackage"
    21  //     func main() {
    22  //         somepackage.Func() // reference Func to cause it to be linked in.
    23  //     }
    24  // See dict_test.go in the display package for an example.
    25  func CodeSize(s string) (int, error) {
    26  	// Write the file.
    27  	tmpdir, err := ioutil.TempDir(os.TempDir(), "testtext")
    28  	if err != nil {
    29  		return 0, fmt.Errorf("testtext: failed to create tmpdir: %v", err)
    30  	}
    31  	defer os.RemoveAll(tmpdir)
    32  	filename := filepath.Join(tmpdir, "main.go")
    33  	if err := ioutil.WriteFile(filename, []byte(s), 0644); err != nil {
    34  		return 0, fmt.Errorf("testtext: failed to write main.go: %v", err)
    35  	}
    36  
    37  	// Build the binary.
    38  	w := &bytes.Buffer{}
    39  	cmd := exec.Command(filepath.Join(runtime.GOROOT(), "bin", "go"), "build", "-o", "main")
    40  	cmd.Dir = tmpdir
    41  	cmd.Stderr = w
    42  	cmd.Stdout = w
    43  	if err := cmd.Run(); err != nil {
    44  		return 0, fmt.Errorf("testtext: failed to execute command: %v\nmain.go:\n%vErrors:%s", err, s, w)
    45  	}
    46  
    47  	// Determine the size.
    48  	fi, err := os.Stat(filepath.Join(tmpdir, "main"))
    49  	if err != nil {
    50  		return 0, fmt.Errorf("testtext: failed to get file info: %v", err)
    51  	}
    52  	return int(fi.Size()), nil
    53  }