github.com/hashicorp/packer@v1.14.3/packer/plugin_test.go (about) 1 // Copyright (c) HashiCorp, Inc. 2 // SPDX-License-Identifier: BUSL-1.1 3 4 package packer 5 6 import ( 7 "fmt" 8 "log" 9 "os" 10 "os/exec" 11 "testing" 12 "time" 13 14 packersdk "github.com/hashicorp/packer-plugin-sdk/packer" 15 pluginsdk "github.com/hashicorp/packer-plugin-sdk/plugin" 16 ) 17 18 func helperProcess(s ...string) *exec.Cmd { 19 cs := []string{"-test.run=TestHelperProcess", "--"} 20 cs = append(cs, s...) 21 env := []string{ 22 "GO_WANT_HELPER_PROCESS=1", 23 "PACKER_PLUGIN_MIN_PORT=10000", 24 "PACKER_PLUGIN_MAX_PORT=25000", 25 } 26 27 cmd := exec.Command(os.Args[0], cs...) 28 cmd.Env = append(env, os.Environ()...) 29 return cmd 30 } 31 32 // This is not a real test. This is just a helper process kicked off by 33 // tests. 34 func TestHelperProcess(*testing.T) { 35 if os.Getenv("GO_WANT_HELPER_PROCESS") != "1" { 36 return 37 } 38 39 defer os.Exit(0) 40 41 args := os.Args 42 for len(args) > 0 { 43 if args[0] == "--" { 44 args = args[1:] 45 break 46 } 47 48 args = args[1:] 49 } 50 51 if len(args) == 0 { 52 fmt.Fprintf(os.Stderr, "No command\n") 53 os.Exit(2) 54 } 55 56 cmd, _ := args[0], args[1:] 57 switch cmd { 58 case "bad-version": 59 fmt.Printf("%s1|%s|tcp|:1234\n", pluginsdk.APIVersionMajor, pluginsdk.APIVersionMinor) 60 <-make(chan int) 61 case "builder": 62 server, err := pluginsdk.Server() 63 if err != nil { 64 log.Printf("[ERR] %s", err) 65 os.Exit(1) 66 } 67 err = server.RegisterBuilder(new(packersdk.MockBuilder)) 68 if err != nil { 69 log.Printf("[ERR] %s", err) 70 os.Exit(1) 71 } 72 server.Serve() 73 case "hook": 74 server, err := pluginsdk.Server() 75 if err != nil { 76 log.Printf("[ERR] %s", err) 77 os.Exit(1) 78 } 79 err = server.RegisterHook(new(packersdk.MockHook)) 80 if err != nil { 81 log.Printf("[ERR] %s", err) 82 os.Exit(1) 83 } 84 server.Serve() 85 case "invalid-rpc-address": 86 fmt.Println("lolinvalid") 87 case "mock": 88 fmt.Printf("%s|%s|tcp|:1234\n", pluginsdk.APIVersionMajor, pluginsdk.APIVersionMinor) 89 <-make(chan int) 90 case "post-processor": 91 server, err := pluginsdk.Server() 92 if err != nil { 93 log.Printf("[ERR] %s", err) 94 os.Exit(1) 95 } 96 err = server.RegisterPostProcessor(new(helperPostProcessor)) 97 if err != nil { 98 log.Printf("[ERR] %s", err) 99 os.Exit(1) 100 } 101 server.Serve() 102 case "provisioner": 103 server, err := pluginsdk.Server() 104 if err != nil { 105 log.Printf("[ERR] %s", err) 106 os.Exit(1) 107 } 108 err = server.RegisterProvisioner(new(packersdk.MockProvisioner)) 109 if err != nil { 110 log.Printf("[ERR] %s", err) 111 os.Exit(1) 112 } 113 server.Serve() 114 case "datasource": 115 server, err := pluginsdk.Server() 116 if err != nil { 117 log.Printf("[ERR] %s", err) 118 os.Exit(1) 119 } 120 err = server.RegisterDatasource(new(packersdk.MockDatasource)) 121 if err != nil { 122 log.Printf("[ERR] %s", err) 123 os.Exit(1) 124 } 125 server.Serve() 126 case "start-timeout": 127 time.Sleep(1 * time.Minute) 128 os.Exit(1) 129 case "stderr": 130 fmt.Printf("%s|%s|tcp|:1234\n", pluginsdk.APIVersionMajor, pluginsdk.APIVersionMinor) 131 log.Println("HELLO") 132 log.Println("WORLD") 133 case "stdin": 134 fmt.Printf("%s|%s|tcp|:1234\n", pluginsdk.APIVersionMajor, pluginsdk.APIVersionMinor) 135 data := make([]byte, 5) 136 if _, err := os.Stdin.Read(data); err != nil { 137 log.Printf("stdin read error: %s", err) 138 os.Exit(100) 139 } 140 141 if string(data) == "hello" { 142 os.Exit(0) 143 } 144 145 os.Exit(1) 146 default: 147 fmt.Fprintf(os.Stderr, "Unknown command: %q\n", cmd) 148 os.Exit(2) 149 } 150 }