content: /**
   * Licensed to the Apache Software Foundation (ASF) under one or more
   * contributor license agreements.  See the NOTICE file distributed with
   * this work for additional information regarding copyright ownership.
   * The ASF licenses this file to You 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 org.apache.activemq.karaf.itest;
  
  import static org.junit.Assert.assertEquals;
  import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
  
  import java.io.IOException;
  import java.net.URI;
  import java.util.concurrent.Callable;
  
  import org.apache.http.client.CredentialsProvider;
  import org.apache.http.client.methods.CloseableHttpResponse;
  import org.apache.http.client.methods.HttpGet;
  import org.apache.http.client.methods.HttpPost;
  import org.apache.http.client.utils.URIBuilder;
  import org.apache.http.impl.client.BasicCredentialsProvider;
  import org.apache.http.impl.client.CloseableHttpClient;
  import org.apache.http.impl.client.HttpClientBuilder;
  import org.apache.http.util.EntityUtils;
  import org.junit.Test;
  import org.junit.Ignore;
  import org.ops4j.pax.exam.Configuration;
  import org.ops4j.pax.exam.Option;
  import org.ops4j.pax.exam.options.WrappedUrlProvisionOption;
  
  
  public class ActiveMQBrokerFeatureTest extends AbstractFeatureTest {
  	static final String WEB_CONSOLE_URL = "http://localhost:8181/activemqweb/";
  
      @Configuration
      public static Option[] configure() {
          return new Option[] //
          {
           configure("connector", "activemq-broker", "activemq-shell"), //
           // To access web console
           //mavenBundle("commons-codec", "commons-codec").versionAsInProject(),
           mavenBundle("org.apache.httpcomponents", "httpcore-osgi").version("4.4.4"),
           mavenBundle("org.apache.httpcomponents", "httpclient-osgi").version("4.5.2"),
           configureBrokerStart()
          };
      }
  
      protected String installWrappedBundle(WrappedUrlProvisionOption option) {
          return executeCommand("bundle:install 'wrap:" + option.getURL() + "'");
      }
  
      @Test(timeout=5 * 60 * 1000)
      @Ignore
      public void test() throws Throwable {
          assertBrokerStarted();
          JMSTester jms = new JMSTester();
          jms.produceAndConsume(sessionFactory);
          jms.tempSendReceive();
          jms.close();
      }
  
      private void produceMessageWebConsole(String nameAndPayload) throws Exception {
      	CredentialsProvider credsProvider = new BasicCredentialsProvider();
          credsProvider.setCredentials(
                  new org.apache.http.auth.AuthScope("httpbin.org", 80),
                  new org.apache.http.auth.UsernamePasswordCredentials(KarafShellHelper.USER, KarafShellHelper.PASSWORD));
      	CloseableHttpClient client = HttpClientBuilder.create() //
      			.setDefaultCredentialsProvider(credsProvider)
      			.build();
  
          System.err.println(executeCommand("activemq:bstat").trim());
          System.err.println("attempting to access web console..");
  
  		withinReason(new Callable<Boolean>() {
  			public Boolean call() throws Exception {
  				CloseableHttpResponse response = client.execute(new HttpGet(WEB_CONSOLE_URL + "index.jsp"));
                  return response.getStatusLine().getStatusCode() != 200;
  			}
  		});
  
          System.err.println("attempting publish via web console..");
  
          // need to first get the secret
          CloseableHttpResponse response = client.execute(new HttpGet(WEB_CONSOLE_URL + "send.jsp"));
          int code = response.getStatusLine().getStatusCode();
          assertEquals("getting send succeeded", 200, code);
  
          String secret = getSecret(EntityUtils.toString(response.getEntity()));
  
          URI sendUri = new URIBuilder(WEB_CONSOLE_URL + "sendMessage.action") //
          		.addParameter("secret", secret) //
          		.addParameter("JMSText", nameAndPayload)
          		.addParameter("JMSDestination", nameAndPayload)
          		.addParameter("JMSDestinationType", "queue")
          		.build();
          HttpPost post = new HttpPost(sendUri);
          CloseableHttpResponse sendResponse = client.execute(post);
          assertEquals("post succeeded, " + post, 302, sendResponse.getStatusLine().getStatusCode());
          System.err.println(executeCommand("activemq:bstat").trim());
      }
  
  	private String getSecret(String response) throws IOException {
          final String secretMarker = "<input type=\"hidden\" name=\"secret\" value=\"";
          String secret = response.substring(response.indexOf(secretMarker) + secretMarker.length());
          secret = secret.substring(0, secret.indexOf("\"/>"));
  		return secret;
  	}
      
      @Test
      @Ignore
      public void testSendReceiveWeb() throws Throwable {
          assertBrokerStarted();
          JMSTester jms = new JMSTester();
          final String nameAndPayload = String.valueOf(System.currentTimeMillis());
        	produceMessageWebConsole(nameAndPayload);
          assertEquals("got our message", nameAndPayload, jms.consumeMessage(nameAndPayload));
          jms.tempSendReceive();
          jms.close();
      }
  
  }
  