github.com/someshkoli/terratest@v0.41.1/modules/http-helper/dummy_server.go (about)

     1  package http_helper
     2  
     3  import (
     4  	"fmt"
     5  	"net"
     6  	"net/http"
     7  	"strconv"
     8  	"sync/atomic"
     9  
    10  	"github.com/gruntwork-io/terratest/modules/logger"
    11  	"github.com/gruntwork-io/terratest/modules/testing"
    12  )
    13  
    14  // RunDummyServer runs a dummy HTTP server on a unique port that will return the given text. Returns the Listener for the server, the
    15  // port it's listening on, or an error if something went wrong while trying to start the listener. Make sure to call
    16  // the Close() method on the Listener when you're done!
    17  func RunDummyServer(t testing.TestingT, text string) (net.Listener, int) {
    18  	listener, port, err := RunDummyServerE(t, text)
    19  	if err != nil {
    20  		t.Fatal(err)
    21  	}
    22  	return listener, port
    23  }
    24  
    25  // RunDummyServerE runs a dummy HTTP server on a unique port that will return the given text. Returns the Listener for the server, the
    26  // port it's listening on, or an error if something went wrong while trying to start the listener. Make sure to call
    27  // the Close() method on the Listener when you're done!
    28  func RunDummyServerE(t testing.TestingT, text string) (net.Listener, int, error) {
    29  	port := getNextPort()
    30  
    31  	// Create new serve mux so that multiple handlers can be created
    32  	server := http.NewServeMux()
    33  	server.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    34  		fmt.Fprintf(w, text)
    35  	})
    36  
    37  	logger.Logf(t, "Starting dummy HTTP server in port %d that will return the text '%s'", port, text)
    38  
    39  	listener, err := net.Listen("tcp", ":"+strconv.Itoa(port))
    40  	if err != nil {
    41  		return nil, 0, fmt.Errorf("error listening: %s", err)
    42  	}
    43  
    44  	go http.Serve(listener, server)
    45  
    46  	return listener, port, err
    47  }
    48  
    49  // RunDummyServerWithHandlers runs a dummy HTTP server on a unique port that will serve given handlers. Returns the Listener for the server,
    50  // the port it's listening on, or an error if something went wrong while trying to start the listener. Make sure to call
    51  // the Close() method on the Listener when you're done!
    52  func RunDummyServerWithHandlers(t testing.TestingT, handlers map[string]func(http.ResponseWriter, *http.Request)) (net.Listener, int) {
    53  	listener, port, err := RunDummyServerWithHandlersE(t, handlers)
    54  	if err != nil {
    55  		t.Fatal(err)
    56  	}
    57  	return listener, port
    58  }
    59  
    60  // RunDummyServerWithHandlersE runs a dummy HTTP server on a unique port that will server given handlers. Returns the Listener for the server,
    61  // the port it's listening on, or an error if something went wrong while trying to start the listener. Make sure to call
    62  // the Close() method on the Listener when you're done!
    63  func RunDummyServerWithHandlersE(t testing.TestingT, handlers map[string]func(http.ResponseWriter, *http.Request)) (net.Listener, int, error) {
    64  	port := getNextPort()
    65  
    66  	for path, handler := range handlers {
    67  		http.HandleFunc(path, handler)
    68  	}
    69  
    70  	logger.Logf(t, "Starting dummy HTTP server in port %d", port)
    71  
    72  	listener, err := net.Listen("tcp", ":"+strconv.Itoa(port))
    73  	if err != nil {
    74  		return nil, 0, fmt.Errorf("error listening: %s", err)
    75  	}
    76  
    77  	go http.Serve(listener, nil)
    78  
    79  	return listener, port, err
    80  }
    81  
    82  // DO NOT ACCESS THIS VARIABLE DIRECTLY. See getNextPort() below.
    83  var testServerPort int32 = 8080
    84  
    85  // Since we run tests in parallel, we need to ensure that each test runs on a different port. This function returns a
    86  // unique port by atomically incrementing the testServerPort variable.
    87  func getNextPort() int {
    88  	return int(atomic.AddInt32(&testServerPort, 1))
    89  }