func init() {

	//Endpoints associated with the test
	var (
		xaviAgentURL = testsupport.XaviAgentRESTEnpointBaseURI
		testUrl      = testsupport.XaviAcceptanceTestEndpointBaseURL + "/hello"
		server1Url   = testsupport.CohostedMountebankEndpointBaseURL + "/imposters/3000"
		server2Url   = testsupport.CohostedMountebankEndpointBaseURL + "/imposters/3100"
	)

	//XAVI definitions for the test scenario
	const (
		hello1Server = `{"Address":"localhost","Port":3000,"PingURI":"/hello"}`
		hello2Server = `{"Address":"localhost","Port":3100,"PingURI":"/hello"}`
		backend      = `{"ServerNames":["hello1","hello2"],"LoadBalancerPolicy":"round-robin"}`
		route        = `{"URIRoot":"/hello","Backends":["demo-backend"],"Plugins":null,"MsgProps":""}`
		listener     = `{"RouteNames":["demo-route"]}`
	)

	var (
		testFailure         bool
		server1RequestCount int
		server2RequestCount int
		spawnedPID          int
	)

	var doSetup = func() error {
		log.Info("set up")
		testPort, err := testsupport.GetPortFromURL(testUrl)
		if err != nil {
			return err
		}

		//
		// XAVI configuration for the test
		//
		err = testsupport.PutDefinitionOk("v1/servers/hello1", hello1Server, xaviAgentURL)
		if err != nil {
			return err
		}

		err = testsupport.PutDefinitionOk("v1/servers/hello2", hello2Server, xaviAgentURL)
		if err != nil {
			return err
		}

		err = testsupport.PutDefinitionOk("v1/backends/demo-backend", backend, xaviAgentURL)
		if err != nil {
			return err
		}

		err = testsupport.PutDefinitionOk("v1/routes/demo-route", route, xaviAgentURL)
		if err != nil {
			return err
		}

		err = testsupport.PutDefinitionOk("v1/listeners/demo-listener", listener, xaviAgentURL)
		if err != nil {
			return err
		}

		//
		// Configuration of the mountebank imposters that represent the servers proxied in
		// the test.
		//
		testsupport.MountebankSetup(testsupport.CohostedMountebankEndpointBaseURL+"/imposters", testsupport.RoundRobin3000Config)
		testsupport.MountebankSetup(testsupport.CohostedMountebankEndpointBaseURL+"/imposters", testsupport.RoundRobin3100Config)

		//
		// Spawn the XAVI process that represents the system under test
		//
		spawnedPID, err = testsupport.Spawn("demo-listener", testPort, xaviAgentURL)
		log.Info("Spawned ", spawnedPID)
		return err
	}

	Given(`^I have a backend definitions with two servers$`, func() {
		if err := doSetup(); err != nil {
			log.Info("Setup failed: ", err.Error())
			T.Errorf("Error in test setup: %s", err.Error())
			testFailure = true
			return
		}

		//Baseline the imposter request counts
		endpointOutput, err := testsupport.GetTestEndpointOutput(server1Url)
		assert.Nil(T, err)
		log.Infof("Counting requests from %s for %s", endpointOutput, server1Url)
		server1RequestCount = testsupport.CountRequestFrom(endpointOutput)

		endpointOutput, err = testsupport.GetTestEndpointOutput(server2Url)
		assert.Nil(T, err)
		server2RequestCount = testsupport.CountRequestFrom(endpointOutput)
		log.Info("server 1 request count: ", server1RequestCount)
		log.Info("server 2 request count: ", server2RequestCount)
	})

	And(`^The load balancing policy is round robin$`, func() {
	})

	And(`^I send two requests to the listener$`, func() {
		if testFailure {
			return
		}
		log.Infof("send request to %s", testUrl)
		assert.Equal(T, 200, testsupport.GetTestEndpoint(testUrl))
		log.Infof("send request to %s", testUrl)
		assert.Equal(T, 200, testsupport.GetTestEndpoint(testUrl))

	})

	Then(`^Each server gets a single request$`, func() {
		if testFailure {
			return
		}

		//Grab the latest request counts for comparison to the baseline counts
		endpointOutput, err := testsupport.GetTestEndpointOutput(server1Url)
		assert.Nil(T, err)
		latestServer1Count := testsupport.CountRequestFrom(endpointOutput)

		endpointOutput, err = testsupport.GetTestEndpointOutput(server2Url)
		assert.Nil(T, err)
		latestServer2Count := testsupport.CountRequestFrom(endpointOutput)

		log.Info("updated server 1 request count: ", latestServer1Count)
		log.Info("update server 2 request count: ", latestServer2Count)

		assert.Equal(T, server1RequestCount+1, latestServer1Count)
		assert.Equal(T, server2RequestCount+1, latestServer2Count)

	})

	After("@basicroundrobin", func() {
		log.Info("After")
		testPort, err := testsupport.GetPortFromURL(testUrl)
		assert.NotNil(T, err)
		testsupport.KillSpawnedProcess(spawnedPID, testPort, xaviAgentURL)
	})

}
示例#2
0
func init() {

	//Endpoints associated with the test
	var (
		xaviAgentURL = testsupport.XaviAgentRESTEnpointBaseURI
		testUrl      = testsupport.XaviAcceptanceTestEndpointBaseURL + "/hello"
		server2Url   = testsupport.CohostedMountebankEndpointBaseURL + "/imposters/3100"
	)

	//XAVI definitions for the test scenario
	const (
		hello1Server = `{"Address":"localhost","Port":3000,"PingURI":"/hello","HealthCheck":"http-get",
							"HealthCheckInterval":200,"HealthCheckTimeout":150}`
		hello2Server = `{"Address":"localhost","Port":3100,"PingURI":"/hello","HealthCheck":"http-get",
							"HealthCheckInterval":200,"HealthCheckTimeout":150}`
		backend  = `{"ServerNames":["hello1","hello2"],"LoadBalancerPolicy":"round-robin"}`
		route    = `{"URIRoot":"/hello","Backends":["demo-backend"],"Plugins":null,"MsgProps":""}`
		listener = `{"RouteNames":["demo-route"]}`
	)

	var (
		failedState bool
		failures    int
		spawnedPID  int
	)

	var doSetup = func() error {
		testPort, err := testsupport.GetPortFromURL(testUrl)
		if err != nil {
			return err
		}

		log.Info("Delete mb imposter")
		testsupport.DeleteMountebankImposter(server2Url)

		//
		// XAVI configuration for the test
		//
		err = testsupport.PutDefinitionOk("v1/servers/hello1", hello1Server, xaviAgentURL)
		if err != nil {
			return err
		}

		err = testsupport.PutDefinitionOk("v1/servers/hello2", hello2Server, xaviAgentURL)
		if err != nil {
			return err
		}

		err = testsupport.PutDefinitionOk("v1/backends/demo-backend", backend, xaviAgentURL)
		if err != nil {
			return err
		}

		err = testsupport.PutDefinitionOk("v1/routes/demo-route", route, xaviAgentURL)
		if err != nil {
			return err
		}

		err = testsupport.PutDefinitionOk("v1/listeners/demo-listener", listener, xaviAgentURL)
		if err != nil {
			return err
		}

		//
		// Configuration of the mountebank imposters that represent the servers proxied in
		// the test. Note we only set up one imposter to simulate the unhealhy endpoint
		//
		log.Info("Set up the healthy server on port 3000")
		testsupport.MountebankSetup(testsupport.CohostedMountebankEndpointBaseURL+"/imposters", testsupport.RoundRobin3000Config)

		spawnedPID, err = testsupport.Spawn("demo-listener", testPort, xaviAgentURL)
		log.Info("spawnedPID is ", spawnedPID)
		return err
	}

	Given(`^A backend with some unhealthy servers$`, func() {
		log.Warn("Healthcheck test disabled - see comment in steps file")
		failedState = true
		return

		if err := doSetup(); err != nil {
			log.Info("Setup failed: ", err.Error())
			T.Errorf("Error in test setup: %s", err.Error())
			failedState = true
			return
		}
	})

	And(`^I invoke a service against the backend$`, func() {
		if failedState {
			return
		}
		time.Sleep(2 * time.Second)
		for i := 0; i < 5; i++ {
			log.Println("send request")
			if testsupport.GetTestEndpoint(testUrl) != 200 {
				failures = failures + 1
			}
		}
	})

	Then(`^The service calls succeed against the healthy backends$`, func() {
		if failedState {
			return
		}
		assert.Equal(T, 0, failures)
	})

	Given(`^A previously unhealthy server becomes healthy$`, func() {
		if failedState {
			log.Warn("Healthcheck test disabled - see comment in steps file")
			//uncomment the following when re-enabling the test
			//T.Errorf("requisite test set up failed")
			return
		}
		log.Info("Set up a healthy server on port 3100")
		testsupport.MountebankSetup(testsupport.CohostedMountebankEndpointBaseURL+"/imposters", testsupport.RoundRobin3100Config)
	})

	Then(`^The healed backend recieves traffic$`, func() {
		if failedState {
			return
		}
		failures = 0
		time.Sleep(2 * time.Second)
		for i := 0; i < 5; i++ {
			log.Info("get ", testUrl)
			if testsupport.GetTestEndpoint(testUrl) != 200 {
				failures = failures + 1
			}
			assert.Equal(T, 0, failures)
		}

	})

	After("@withhealed", func() {
		log.Warn("Healthcheck test disabled - see comment in steps file")
		return

		testPort, err := testsupport.GetPortFromURL(testUrl)
		assert.NotNil(T, err)
		testsupport.KillSpawnedProcess(spawnedPID, testPort, xaviAgentURL)
	})

}
func init() {

	//Definitions used to set up the xavi test server to be spawned
	const (
		prefLocalServer1 = `{"Address":"localhost","Port":3001,"PingURI":"/hello"}`
		prefLocalServer2 = `{"Address":"mbhost","Port":3001,"PingURI":"/hello"}`
		backend          = `{"ServerNames":["local-hello","remote-hello"],"LoadBalancerPolicy":"prefer-local"}`
		route            = `{"URIRoot":"/hello2","Backends":["pref-local-backend"],"Plugins":null,"MsgProps":""}`
		listener         = `{"RouteNames":["pref-local-route"]}`
	)

	//Endpoints associated with the test
	var (
		xaviAgentURL = testsupport.XaviAgentRESTEnpointBaseURI
		testUrl      = testsupport.XaviAcceptanceTestEndpointBaseURL + "/hello2"
		server1Url   = testsupport.CohostedMountebankEndpointBaseURL + "/imposters/3001"
		server2Url   = testsupport.StandaloneMountebackEndpointBaseURL + "/imposters/3001"
	)

	var (
		server1RequestCount int
		server2RequestCount int
		spawnedPID          int
		testFailure         bool
	)

	var doSetup = func() error {

		testPort, err := testsupport.GetPortFromURL(testUrl)
		if err != nil {
			return err
		}

		//
		// Set up XAVI definitions
		//
		log.Info("agent url: ", xaviAgentURL)
		log.Info("server1Url: ", server1Url)

		err = testsupport.PutDefinitionOk("v1/servers/local-hello", prefLocalServer1, xaviAgentURL)
		if err != nil {
			return err
		}

		err = testsupport.PutDefinitionOk("v1/servers/remote-hello", prefLocalServer2, xaviAgentURL)
		if err != nil {
			return err
		}

		err = testsupport.PutDefinitionOk("v1/backends/pref-local-backend", backend, xaviAgentURL)
		if err != nil {
			return err
		}

		err = testsupport.PutDefinitionOk("v1/routes/pref-local-route", route, xaviAgentURL)
		if err != nil {
			return err
		}

		err = testsupport.PutDefinitionOk("v1/listeners/pref-local-listener", listener, xaviAgentURL)
		if err != nil {
			return err
		}

		//
		// Setup the imposters that represent the servers associated with the XAVI backend def
		//
		testsupport.DeleteMountebankImposter(server1Url)
		testsupport.DeleteMountebankImposter(server2Url)
		testsupport.MountebankSetup(testsupport.CohostedMountebankEndpointBaseURL+"/imposters", prefLocalImposter)
		testsupport.MountebankSetup(testsupport.StandaloneMountebackEndpointBaseURL+"/imposters", prefLocalImposter)

		//
		// Spawn the XAVI instance to test with the above configuration
		//
		spawnedPID, err = testsupport.Spawn("pref-local-listener", testPort, xaviAgentURL)
		log.Println("Spawned ", spawnedPID)
		return err
	}

	Given(`^A preflocal route with backend definitions with two servers$`, func() {

		if err := doSetup(); err != nil {
			log.Info("Setup failed: ", err.Error())
			T.Errorf("Error in test setup: %s", err.Error())
			testFailure = true
			return
		}

		//Baseline the request counts at the imposters
		endpointOutput, err := testsupport.GetTestEndpointOutput(server1Url)
		assert.Nil(T, err)
		server1RequestCount = testsupport.CountRequestFrom(endpointOutput)

		endpointOutput, err = testsupport.GetTestEndpointOutput(server2Url)
		assert.Nil(T, err)
		server2RequestCount = testsupport.CountRequestFrom(endpointOutput)

		log.Info("server 1 request count: ", server1RequestCount)
		log.Info("server 2 request count: ", server2RequestCount)

	})

	And(`^The load balancing policy is prefer local$`, func() {
	})

	And(`^I send two requests to the prelocal listener$`, func() {
		if testFailure {
			return
		}
		//Send two requests to the proxies endpoint
		log.Info("send request to endpoint ", testUrl)
		assert.Equal(T, 200, testsupport.GetTestEndpoint(testUrl))
		log.Info("send request")
		assert.Equal(T, 200, testsupport.GetTestEndpoint(testUrl))

	})

	Then(`^Only the local server handles the requests$`, func() {
		if testFailure {
			return
		}

		//Grab the counts and compare them to the baseline - only the endpoint in the
		//container should see requests
		endpointOutput, err := testsupport.GetTestEndpointOutput(server1Url)
		assert.Nil(T, err)
		latestServer1Count := testsupport.CountRequestFrom(endpointOutput)

		endpointOutput, err = testsupport.GetTestEndpointOutput(server2Url)
		assert.Nil(T, err)
		latestServer2Count := testsupport.CountRequestFrom(endpointOutput)

		log.Info("updated server 1 request count", latestServer1Count)
		log.Info("update server 2 request count", latestServer2Count)

		assert.Equal(T, server1RequestCount+2, latestServer1Count)
		assert.Equal(T, server2RequestCount, latestServer2Count)

	})

	After("@preflocal", func() {
		testPort, err := testsupport.GetPortFromURL(testUrl)
		assert.NotNil(T, err)
		testsupport.KillSpawnedProcess(spawnedPID, testPort, xaviAgentURL)
	})

}