de.codecentric.boot.admin.AdminApplicationHazelcastTest.java Source code

Java tutorial

Introduction

Here is the source code for de.codecentric.boot.admin.AdminApplicationHazelcastTest.java

Source

/*
 * Copyright 2014 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package de.codecentric.boot.admin;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.context.embedded.EmbeddedWebApplicationContext;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;

import com.hazelcast.config.Config;
import com.hazelcast.config.EvictionPolicy;
import com.hazelcast.config.ListConfig;
import com.hazelcast.config.MapConfig;

import de.codecentric.boot.admin.config.EnableAdminServer;
import de.codecentric.boot.admin.model.Application;

/**
 * Integration test to verify the correct functionality of the REST API with Hazelcast
 *
 * @author Dennis Schulte
 */
public class AdminApplicationHazelcastTest {
    private TestRestTemplate template = new TestRestTemplate();
    private EmbeddedWebApplicationContext instance1;
    private EmbeddedWebApplicationContext instance2;

    @Before
    public void setup() throws InterruptedException {
        System.setProperty("hazelcast.wait.seconds.before.join", "0");
        instance1 = (EmbeddedWebApplicationContext) SpringApplication.run(TestAdminApplication.class,
                new String[] { "--server.port=0", "--spring.jmx.enabled=false" });
        instance2 = (EmbeddedWebApplicationContext) SpringApplication.run(TestAdminApplication.class,
                new String[] { "--server.port=0", "--spring.jmx.enabled=false" });
    }

    @After
    public void shutdown() {
        instance1.close();
        instance2.close();
    }

    @Test
    public void test() {
        Application app = Application.create("Hazelcast Test").withHealthUrl("http://127.0.0.1/health").build();
        Application app2 = Application.create("Hazelcast Test").withHealthUrl("http://127.0.0.1:2/health").build();
        Application app3 = Application.create("Do not find").withHealthUrl("http://127.0.0.1:3/health").build();

        // publish app on instance1
        ResponseEntity<Application> postResponse = registerApp(app, instance1);
        app = postResponse.getBody();
        assertEquals(HttpStatus.CREATED, postResponse.getStatusCode());
        assertNotNull(app.getId());

        // publish app2 on instance2
        ResponseEntity<Application> postResponse2 = registerApp(app2, instance2);
        app2 = postResponse2.getBody();
        assertEquals(HttpStatus.CREATED, postResponse.getStatusCode());
        assertNotNull(app2.getId());

        // retrieve app from instance2
        ResponseEntity<Application> getResponse = getApp(app.getId(), instance2);
        assertEquals(HttpStatus.OK, getResponse.getStatusCode());
        assertEquals(app, getResponse.getBody());

        // retrieve app and app2 from instance1 (but not app3)
        app3 = registerApp(app3, instance1).getBody();
        Collection<Application> apps = getAppByName("Hazelcast Test", instance1).getBody();
        assertEquals(2, apps.size());
        assertTrue(apps.contains(app));
        assertTrue(apps.contains(app2));
        assertFalse(apps.contains(app3));
    }

    private ResponseEntity<Application> getApp(String id, EmbeddedWebApplicationContext context) {
        int port = context.getEmbeddedServletContainer().getPort();
        ResponseEntity<Application> getResponse = template
                .getForEntity("http://localhost:" + port + "/api/applications/" + id, Application.class);
        return getResponse;
    }

    private ResponseEntity<Application> registerApp(Application app, EmbeddedWebApplicationContext context) {
        int port = context.getEmbeddedServletContainer().getPort();
        return template.postForEntity("http://localhost:" + port + "/api/applications", app, Application.class);
    }

    @SuppressWarnings("unchecked")
    private ResponseEntity<Collection<Application>> getAppByName(String name,
            EmbeddedWebApplicationContext context) {
        int port = context.getEmbeddedServletContainer().getPort();
        ResponseEntity<?> getResponse = template.getForEntity(
                "http://localhost:" + port + "/api/applications?name={name}", ApplicationList.class,
                Collections.singletonMap("name", name));
        return (ResponseEntity<Collection<Application>>) getResponse;
    }

    @Configuration
    @EnableAutoConfiguration
    @EnableAdminServer
    public static class TestAdminApplication {
        @Bean
        public Config hazelcastConfig() {
            return new Config()
                    .addMapConfig(new MapConfig("spring-boot-admin-application-store").setBackupCount(1)
                            .setEvictionPolicy(EvictionPolicy.NONE))
                    .addListConfig(new ListConfig("spring-boot-admin-application-store").setBackupCount(1)
                            .setMaxSize(1000));
        }
    }

    public static class ApplicationList extends ArrayList<Application> {
        private static final long serialVersionUID = 1L;
        // needed for JSON deserialization
    }

}