package org.wildfly.swarm.jolokia;

import java.io.InputStream;

import org.apache.http.HttpEntity;
import org.apache.http.StatusLine;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.shrinkwrap.api.Archive;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.asset.EmptyAsset;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.wildfly.swarm.Swarm;
import org.wildfly.swarm.arquillian.CreateSwarm;
import org.wildfly.swarm.spi.api.JARArchive;

import static org.junit.Assert.assertTrue;

/**
 * @author Bob McWhirter
 */
@RunWith(Arquillian.class)
public class JolokiaSecuredTest {

    @Deployment(testable = false)
    public static Archive deployment() {
        JARArchive deployment = ShrinkWrap.create(JARArchive.class);
        deployment.add(EmptyAsset.INSTANCE, "nothing");
        return deployment;
    }

    @CreateSwarm
    public static Swarm createSwarm() throws Exception {
        Swarm swarm = new Swarm()
                .fraction(new JolokiaFraction()
                        .prepareJolokiaWar(JolokiaFraction.jolokiaAccess(access -> {
                            // allow nobody, basically
                            access.host("1.1.1.1");
                        }))
                );
        return swarm;
    }


    @Test
    public void testJolokia() throws Exception {

        HttpClientBuilder builder = HttpClientBuilder.create();
        CloseableHttpClient client = builder.build();

        HttpUriRequest request = new HttpGet("http://localhost:8080/jolokia");
        CloseableHttpResponse response = client.execute(request);

        // oddly it returns a 200, with a json status of 403

        HttpEntity entity = response.getEntity();

        InputStream content = entity.getContent();

        byte[] buf = new byte[1024];
        int len = 0;

        StringBuilder str = new StringBuilder();

        while ((len = content.read(buf)) >= 0) {
            str.append(new String(buf, 0, len));
        }

        assertTrue(str.toString().contains("\"status\":403"));
    }
}
