github.com/markdia/terraform@v0.5.1-0.20150508012022-f1ae920aa970/plugin/plugin_test.go (about)

     1  package plugin
     2  
     3  import (
     4  	"fmt"
     5  	"log"
     6  	"os"
     7  	"os/exec"
     8  	"testing"
     9  	"time"
    10  
    11  	tfrpc "github.com/hashicorp/terraform/rpc"
    12  	"github.com/hashicorp/terraform/terraform"
    13  )
    14  
    15  func helperProcess(s ...string) *exec.Cmd {
    16  	cs := []string{"-test.run=TestHelperProcess", "--"}
    17  	cs = append(cs, s...)
    18  	env := []string{
    19  		"GO_WANT_HELPER_PROCESS=1",
    20  		"TF_PLUGIN_MIN_PORT=10000",
    21  		"TF_PLUGIN_MAX_PORT=25000",
    22  	}
    23  
    24  	cmd := exec.Command(os.Args[0], cs...)
    25  	cmd.Env = append(env, os.Environ()...)
    26  	return cmd
    27  }
    28  
    29  // This is not a real test. This is just a helper process kicked off by
    30  // tests.
    31  func TestHelperProcess(*testing.T) {
    32  	if os.Getenv("GO_WANT_HELPER_PROCESS") != "1" {
    33  		return
    34  	}
    35  
    36  	defer os.Exit(0)
    37  
    38  	args := os.Args
    39  	for len(args) > 0 {
    40  		if args[0] == "--" {
    41  			args = args[1:]
    42  			break
    43  		}
    44  
    45  		args = args[1:]
    46  	}
    47  
    48  	if len(args) == 0 {
    49  		fmt.Fprintf(os.Stderr, "No command\n")
    50  		os.Exit(2)
    51  	}
    52  
    53  	cmd, args := args[0], args[1:]
    54  	switch cmd {
    55  	case "bad-version":
    56  		fmt.Printf("%s1|tcp|:1234\n", APIVersion)
    57  		<-make(chan int)
    58  	case "resource-provider":
    59  		Serve(&ServeOpts{
    60  			ProviderFunc: testProviderFixed(new(terraform.MockResourceProvider)),
    61  		})
    62  	case "resource-provisioner":
    63  		Serve(&ServeOpts{
    64  			ProvisionerFunc: testProvisionerFixed(
    65  				new(terraform.MockResourceProvisioner)),
    66  		})
    67  	case "invalid-rpc-address":
    68  		fmt.Println("lolinvalid")
    69  	case "mock":
    70  		fmt.Printf("%s|tcp|:1234\n", APIVersion)
    71  		<-make(chan int)
    72  	case "start-timeout":
    73  		time.Sleep(1 * time.Minute)
    74  		os.Exit(1)
    75  	case "stderr":
    76  		fmt.Printf("%s|tcp|:1234\n", APIVersion)
    77  		log.Println("HELLO")
    78  		log.Println("WORLD")
    79  	case "stdin":
    80  		fmt.Printf("%s|tcp|:1234\n", APIVersion)
    81  		data := make([]byte, 5)
    82  		if _, err := os.Stdin.Read(data); err != nil {
    83  			log.Printf("stdin read error: %s", err)
    84  			os.Exit(100)
    85  		}
    86  
    87  		if string(data) == "hello" {
    88  			os.Exit(0)
    89  		}
    90  
    91  		os.Exit(1)
    92  	default:
    93  		fmt.Fprintf(os.Stderr, "Unknown command: %q\n", cmd)
    94  		os.Exit(2)
    95  	}
    96  }
    97  
    98  func testProviderFixed(p terraform.ResourceProvider) tfrpc.ProviderFunc {
    99  	return func() terraform.ResourceProvider {
   100  		return p
   101  	}
   102  }
   103  
   104  func testProvisionerFixed(p terraform.ResourceProvisioner) tfrpc.ProvisionerFunc {
   105  	return func() terraform.ResourceProvisioner {
   106  		return p
   107  	}
   108  }