94 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			94 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package http
 | |
| 
 | |
| import (
 | |
| 	"context"
 | |
| 	"fmt"
 | |
| 	"net"
 | |
| 	"net/http"
 | |
| 	"sync"
 | |
| 	"testing"
 | |
| 
 | |
| 	"github.com/micro/go-micro/v2"
 | |
| 	"github.com/micro/go-micro/v2/client"
 | |
| 	"github.com/micro/go-micro/v2/registry/memory"
 | |
| 	"github.com/micro/go-micro/v2/server"
 | |
| )
 | |
| 
 | |
| type testHandler struct{}
 | |
| 
 | |
| func (t *testHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
 | |
| 	w.Write([]byte(`{"hello": "world"}`))
 | |
| }
 | |
| 
 | |
| func TestHTTPProxy(t *testing.T) {
 | |
| 	c, err := net.Listen("tcp", "localhost:0")
 | |
| 	if err != nil {
 | |
| 		t.Fatal(err)
 | |
| 	}
 | |
| 	defer c.Close()
 | |
| 	addr := c.Addr().String()
 | |
| 
 | |
| 	url := fmt.Sprintf("http://%s", addr)
 | |
| 
 | |
| 	testCases := []struct {
 | |
| 		// http endpoint to call e.g /foo/bar
 | |
| 		httpEp string
 | |
| 		// rpc endpoint called e.g Foo.Bar
 | |
| 		rpcEp string
 | |
| 		// should be an error
 | |
| 		err bool
 | |
| 	}{
 | |
| 		{"/", "Foo.Bar", false},
 | |
| 		{"/", "Foo.Baz", false},
 | |
| 		{"/helloworld", "Hello.World", true},
 | |
| 	}
 | |
| 
 | |
| 	// handler
 | |
| 	http.Handle("/", new(testHandler))
 | |
| 
 | |
| 	// new proxy
 | |
| 	p := NewSingleHostProxy(url)
 | |
| 
 | |
| 	ctx, cancel := context.WithCancel(context.Background())
 | |
| 	defer cancel()
 | |
| 
 | |
| 	var wg sync.WaitGroup
 | |
| 	wg.Add(1)
 | |
| 
 | |
| 	// new micro service
 | |
| 	service := micro.NewService(
 | |
| 		micro.Context(ctx),
 | |
| 		micro.Name("foobar"),
 | |
| 		micro.Registry(memory.NewRegistry()),
 | |
| 		micro.AfterStart(func() error {
 | |
| 			wg.Done()
 | |
| 			return nil
 | |
| 		}),
 | |
| 	)
 | |
| 
 | |
| 	// set router
 | |
| 	service.Server().Init(
 | |
| 		server.WithRouter(p),
 | |
| 	)
 | |
| 
 | |
| 	// run service
 | |
| 	// server
 | |
| 	go http.Serve(c, nil)
 | |
| 	go service.Run()
 | |
| 
 | |
| 	// wait till service is started
 | |
| 	wg.Wait()
 | |
| 
 | |
| 	for _, test := range testCases {
 | |
| 		req := service.Client().NewRequest("foobar", test.rpcEp, map[string]string{"foo": "bar"}, client.WithContentType("application/json"))
 | |
| 		var rsp map[string]string
 | |
| 		err := service.Client().Call(ctx, req, &rsp)
 | |
| 		if err != nil && test.err == false {
 | |
| 			t.Fatal(err)
 | |
| 		}
 | |
| 		if v := rsp["hello"]; v != "world" {
 | |
| 			t.Fatalf("Expected hello world got %s from %s", v, test.rpcEp)
 | |
| 		}
 | |
| 	}
 | |
| }
 |