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  }