| // 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 |
| } |