25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

198 lines
5.0 KiB

  1. package main
  2. import (
  3. "encoding/json"
  4. "flag"
  5. "fmt"
  6. "io"
  7. "io/ioutil"
  8. "os"
  9. "os/exec"
  10. "path/filepath"
  11. "strings"
  12. )
  13. var (
  14. buildDir = flag.String("build-dir", "build", "Specifies the build directory to push.")
  15. device = flag.String("device", "", "Specifies the device or emulator. See adb's -s argument.")
  16. aarch64 = flag.Bool("aarch64", false, "Build the test runners for aarch64 instead of arm.")
  17. arm = flag.Int("arm", 7, "Which arm revision to build for.")
  18. allTestsArgs = flag.String("all-tests-args", "", "Specifies space-separated arguments to pass to all_tests.go")
  19. runnerArgs = flag.String("runner-args", "", "Specifies space-separated arguments to pass to ssl/test/runner")
  20. )
  21. func adb(args ...string) error {
  22. if len(*device) > 0 {
  23. args = append([]string{"-s", *device}, args...)
  24. }
  25. cmd := exec.Command("adb", args...)
  26. cmd.Stdout = os.Stdout
  27. cmd.Stderr = os.Stderr
  28. return cmd.Run()
  29. }
  30. func goTool(args ...string) error {
  31. cmd := exec.Command("go", args...)
  32. cmd.Stdout = os.Stdout
  33. cmd.Stderr = os.Stderr
  34. if *aarch64 {
  35. cmd.Env = append(cmd.Env, "GOARCH=arm64")
  36. } else {
  37. cmd.Env = append(cmd.Env, "GOARCH=arm")
  38. cmd.Env = append(cmd.Env, fmt.Sprintf("GOARM=%d", *arm))
  39. }
  40. return cmd.Run()
  41. }
  42. // setWorkingDirectory walks up directories as needed until the current working
  43. // directory is the top of a BoringSSL checkout.
  44. func setWorkingDirectory() {
  45. for i := 0; i < 64; i++ {
  46. if _, err := os.Stat("BUILDING.md"); err == nil {
  47. return
  48. }
  49. os.Chdir("..")
  50. }
  51. panic("Couldn't find BUILDING.md in a parent directory!")
  52. }
  53. type test []string
  54. func parseTestConfig(filename string) ([]test, error) {
  55. in, err := os.Open(filename)
  56. if err != nil {
  57. return nil, err
  58. }
  59. defer in.Close()
  60. decoder := json.NewDecoder(in)
  61. var result []test
  62. if err := decoder.Decode(&result); err != nil {
  63. return nil, err
  64. }
  65. return result, nil
  66. }
  67. func copyFile(dst, src string) error {
  68. srcFile, err := os.Open(src)
  69. if err != nil {
  70. return err
  71. }
  72. defer srcFile.Close()
  73. srcInfo, err := srcFile.Stat()
  74. if err != nil {
  75. return err
  76. }
  77. dir := filepath.Dir(dst)
  78. if err := os.MkdirAll(dir, 0777); err != nil {
  79. return err
  80. }
  81. dstFile, err := os.OpenFile(dst, os.O_CREATE|os.O_WRONLY, srcInfo.Mode())
  82. if err != nil {
  83. return err
  84. }
  85. defer dstFile.Close()
  86. _, err = io.Copy(dstFile, srcFile)
  87. return err
  88. }
  89. func main() {
  90. flag.Parse()
  91. setWorkingDirectory()
  92. tests, err := parseTestConfig("util/all_tests.json")
  93. if err != nil {
  94. fmt.Printf("Failed to parse input: %s\n", err)
  95. os.Exit(1)
  96. }
  97. // Clear the target directory.
  98. if err := adb("shell", "rm -Rf /data/local/tmp/boringssl-tmp"); err != nil {
  99. fmt.Printf("Failed to clear target directory: %s\n", err)
  100. os.Exit(1)
  101. }
  102. // Stage everything in a temporary directory.
  103. tmpDir, err := ioutil.TempDir("", "boringssl-android")
  104. if err != nil {
  105. fmt.Printf("Error making temporary directory: %s\n", err)
  106. os.Exit(1)
  107. }
  108. defer os.RemoveAll(tmpDir)
  109. seenBinary := make(map[string]struct{})
  110. binaries := []string{"ssl/test/bssl_shim"}
  111. files := []string{
  112. "BUILDING.md",
  113. "util/all_tests.json",
  114. "ssl/test/runner/cert.pem",
  115. "ssl/test/runner/channel_id_key.pem",
  116. "ssl/test/runner/ecdsa_cert.pem",
  117. "ssl/test/runner/ecdsa_key.pem",
  118. "ssl/test/runner/key.pem",
  119. }
  120. for _, test := range tests {
  121. if _, ok := seenBinary[test[0]]; !ok {
  122. binaries = append(binaries, test[0])
  123. seenBinary[test[0]] = struct{}{}
  124. }
  125. for _, arg := range test[1:] {
  126. if strings.Contains(arg, "/") {
  127. files = append(files, arg)
  128. }
  129. }
  130. }
  131. fmt.Printf("Copying test binaries...\n")
  132. for _, binary := range binaries {
  133. if err := copyFile(filepath.Join(tmpDir, "build", binary), filepath.Join(*buildDir, binary)); err != nil {
  134. fmt.Printf("Failed to copy %s: %s\n", binary, err)
  135. os.Exit(1)
  136. }
  137. }
  138. fmt.Printf("Copying data files...\n")
  139. for _, file := range files {
  140. if err := copyFile(filepath.Join(tmpDir, file), file); err != nil {
  141. fmt.Printf("Failed to copy %s: %s\n", file, err)
  142. os.Exit(1)
  143. }
  144. }
  145. fmt.Printf("Building all_tests...\n")
  146. if err := goTool("build", "-o", filepath.Join(tmpDir, "util/all_tests"), "util/all_tests.go"); err != nil {
  147. fmt.Printf("Error building all_tests.go: %s\n", err)
  148. os.Exit(1)
  149. }
  150. fmt.Printf("Building runner...\n")
  151. if err := goTool("test", "-c", "-o", filepath.Join(tmpDir, "ssl/test/runner/runner"), "./ssl/test/runner/"); err != nil {
  152. fmt.Printf("Error building runner: %s\n", err)
  153. os.Exit(1)
  154. }
  155. fmt.Printf("Uploading files...\n")
  156. if err := adb("push", "-p", tmpDir, "/data/local/tmp/boringssl-tmp"); err != nil {
  157. fmt.Printf("Failed to push runner: %s\n", err)
  158. os.Exit(1)
  159. }
  160. fmt.Printf("Running unit tests...\n")
  161. if err := adb("shell", fmt.Sprintf("cd /data/local/tmp/boringssl-tmp && ./util/all_tests %s", *allTestsArgs)); err != nil {
  162. fmt.Printf("Failed to run unit tests: %s\n", err)
  163. os.Exit(1)
  164. }
  165. fmt.Printf("Running SSL tests...\n")
  166. if err := adb("shell", fmt.Sprintf("cd /data/local/tmp/boringssl-tmp/ssl/test/runner && ./runner %s", *runnerArgs)); err != nil {
  167. fmt.Printf("Failed to run SSL tests: %s\n", err)
  168. os.Exit(1)
  169. }
  170. }