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 }