/*
 * 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.sling.launchpad.webapp.integrationtest.servlets.resolution;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

import org.apache.sling.commons.testing.integration.HttpTestBase;

/** Base class for servlet resolution tests */
class ResolutionTestBase extends HttpTestBase {
  public static final String CLASS_PROP = "servlet.class.name";
  public static final String TEST_SERVLET_MARKER = "created by org.apache.sling.launchpad.testservices.servlets";
  public static final String TEST_RESOURCE_TYPE = "LAUNCHPAD_TEST_ResourceType";
  public static final String TEST_PATH = "/servlet-resolution-tests/" + System.currentTimeMillis();
   
  public static final String EXT_SERVLET_SUFFIX = "testservices.servlets.ExtensionServlet";
  public static final String SEL_SERVLET_SUFFIX = "testservices.servlets.SelectorServlet";
  public static final String PREFIX_0_SERVLET_SUFFIX = "testservices.servlets.PrefixServletZero";
  public static final String PREFIX_M1_SERVLET_SUFFIX = "testservices.servlets.PrefixServletMinusOne";
  public static final String PUT_SERVLET_SUFFIX = "testservices.servlets.PutMethodServlet";
  
  protected TestNode testNodeNORT;
  protected TestNode testNodeRT;
  
  @Override
  protected void setUp() throws Exception {
    super.setUp();
    testNodeNORT = new TestNode(HTTP_BASE_URL + TEST_PATH, null);
    final Map<String, String> properties = new HashMap<String, String>();
    properties.put("sling:resourceType", TEST_RESOURCE_TYPE);
    testNodeRT = new TestNode(HTTP_BASE_URL + TEST_PATH, properties);
  }

  @Override
  protected void tearDown() throws Exception {
    super.tearDown();
    testNodeNORT.delete();
    testNodeRT.delete();
  }

  /** Asserts that the given content is in Properties format and
   *  contains a property named CLASS_PROP that ends with
   *  expected suffix  
   */
  protected void assertServlet(String content, String expectedSuffix) throws IOException {
    final Properties props = new Properties();
    final InputStream is = new ByteArrayInputStream(content.getBytes());
    props.load(is);
    assertTrue(
        "Content represents a non-empty Properties object (" + content + ")",
        props.size() > 0);
    final String clazz = props.getProperty(CLASS_PROP);
    assertNotNull(
        "Content contains " + CLASS_PROP + " property (" + content + ")",
        clazz);
    assertTrue(
        CLASS_PROP + " property value (" + clazz + ") ends with " + expectedSuffix,
        clazz.endsWith(expectedSuffix));
  }
  
  /** Assert that content does not contain TEST_SERVLET_MARKER
   */
  protected void assertNotTestServlet(String content) {
    if(content.contains(TEST_SERVLET_MARKER)) {
      fail("Content should not contain " + TEST_SERVLET_MARKER + " marker (" + content + ")");
    }
  }
}
