1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- // Copyright 2015 The Go Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style
- // license that can be found in the LICENSE file.
- package testtext
- import (
- "bytes"
- "fmt"
- "io/ioutil"
- "os"
- "os/exec"
- "path/filepath"
- "runtime"
- )
- // CodeSize builds the given code sample and returns the binary size or en error
- // if an error occurred. The code sample typically will look like this:
- // package main
- // import "golang.org/x/text/somepackage"
- // func main() {
- // somepackage.Func() // reference Func to cause it to be linked in.
- // }
- // See dict_test.go in the display package for an example.
- func CodeSize(s string) (int, error) {
- // Write the file.
- tmpdir, err := ioutil.TempDir(os.TempDir(), "testtext")
- if err != nil {
- return 0, fmt.Errorf("testtext: failed to create tmpdir: %v", err)
- }
- defer os.RemoveAll(tmpdir)
- filename := filepath.Join(tmpdir, "main.go")
- if err := ioutil.WriteFile(filename, []byte(s), 0644); err != nil {
- return 0, fmt.Errorf("testtext: failed to write main.go: %v", err)
- }
- // Build the binary.
- w := &bytes.Buffer{}
- cmd := exec.Command(filepath.Join(runtime.GOROOT(), "bin", "go"), "build", "-o", "main")
- cmd.Dir = tmpdir
- cmd.Stderr = w
- cmd.Stdout = w
- if err := cmd.Run(); err != nil {
- return 0, fmt.Errorf("testtext: failed to execute command: %v\nmain.go:\n%vErrors:%s", err, s, w)
- }
- // Determine the size.
- fi, err := os.Stat(filepath.Join(tmpdir, "main"))
- if err != nil {
- return 0, fmt.Errorf("testtext: failed to get file info: %v", err)
- }
- return int(fi.Size()), nil
- }
|