blob: 1e7c9cda8ee88b3ccbe5414da8a88462d6a2b8c6 [file] [log] [blame]
#!/bin/bash
#
# Copyright 2016 Google Inc.
#
# 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.
#
# Run the remote config tests.
#
# We need to know the directory this file is located in. Unfortunately,
# if we're 'source'd from a script in a different directory $(dirname $0) gives
# us the directory that *that* script is located in
this_dir=$(dirname "${BASH_SOURCE[0]}")
# This script is invoked in two ways:
# 1. run from apache_debug_remote_config_test.
# 2. sourced from nginx_system_test.sh, after sourcing system/system_test.sh.
# In the latter case, system_test_helpers.sh is already loaded, and it doesn't
# work to load it twice.
if [ "${HELPERS_LOADED:-0}" != 1 ]; then
source "$this_dir/../automatic/system_test_helpers.sh" || exit 1
fi
if [ "$SECONDARY_HOSTNAME" != "" ]; then
start_test "Starting up pathological server on $RCPORT"
"$this_dir/pathological_server.py" "$RCPORT" &
server_pid=$!
trap "kill $server_pid" EXIT
echo "Server running with pid $server_pid"
echo "Verifying that the server came up"
sleep 1 # Give the server time to come up.
check "$CURL" -sS -D- "localhost:$RCPORT/standard"
if ! "${SKIP_FILESYSTEM_WRITE_ACCESS_TESTS:-false}" && \
[ "$SERVER_NAME" = "apache" ] ; then
start_test remote config will not apply server scoped options.
# Check that server scoped options are ignored, but directory scoped options
# are applied.
URL="$(generate_url remote-config-out-of-scope.example.com \
/mod_pagespeed_test/forbidden.html)"
echo wget $URL $SECONDARY_HOSTNAME $WGET_DUMP
OUT=$(http_proxy=$SECONDARY_HOSTNAME $WGET_DUMP --save-headers $URL)
if [ -s $APACHE_LOG ]; then
check_from "$(cat $APACHE_LOG)" \
grep "Setting option UrlSigningKey with value secretkey failed"
check_not_from "$(cat $APACHE_LOG)" \
grep "Setting option RequestOptionOverride with value secretkey failed"
fi
HTA=$APACHE_DOC_ROOT/mod_pagespeed_test/remote_config/withhtaccess/.htaccess
start_test htaccess references a remote configuration file.
# First, check that the remote configuration is applied via .htaccess files.
# PORT isn't known until the test is run, so we must extract it from the
# $SECONDARY_HOSTNAME variable.
PORT=$(echo $SECONDARY_HOSTNAME | cut -d \: -f 2)
HOST="http://localhost"
RCPATH="/mod_pagespeed_test/remote_config/remote.cfg"
echo "ModPagespeedRemoteConfigurationUrl \"$HOST:$PORT$RCPATH\"" > $HTA
URL="$(generate_url remote-config-with-htaccess.example.com \
/mod_pagespeed_test/remote_config/withhtaccess/remotecfgtest.html)"
echo wget $URL
http_proxy=$SECONDARY_HOSTNAME fetch_until -save "$URL" 'fgrep -c <!--' 0
start_test htaccess is overridded by remote configuration file.
RCPATH="/mod_pagespeed_test/remote_config/remote.cfg.enable_comments"
PORT=$(echo $SECONDARY_HOSTNAME | cut -d \: -f 2)
echo "ModPagespeedEnableFilters remove_comments,collapse_whitespace" > \
$APACHE_DOC_ROOT/mod_pagespeed_test/remote_config/withhtaccess/.htaccess
URL="$(generate_url remote-config-with-htaccess.example.com \
/mod_pagespeed_test/remote_config/withhtaccess/remotecfgtest.html)"
echo wget $URL
http_proxy=$SECONDARY_HOSTNAME fetch_until -save "$URL" 'fgrep -c <!--' 0
echo "ModPagespeedEnableFilters remove_comments,collapse_whitespace" > $HTA
echo "ModPagespeedRemoteConfigurationUrl \"$HOST:$PORT$RCPATH\"" >> $HTA
URL="$(generate_url remote-config-with-htaccess.example.com \
/mod_pagespeed_test/remote_config/withhtaccess/remotecfgtest.html)"
echo wget $URL
http_proxy=$SECONDARY_HOSTNAME fetch_until -save "$URL" 'fgrep -c <!--' 2
rm -f $HTA
fi
# Tests for remote configuration files.
# The remote configuration location is stored in the debug.conf.template.
start_test Remote Configuration On: by default comments and whitespace removed
URL="$(generate_url remote-config.example.com \
/mod_pagespeed_test/forbidden.html)"
echo wget $URL
http_proxy=$SECONDARY_HOSTNAME fetch_until -save "$URL" 'fgrep -c <!--' 0
start_test Remote Configuration On: File missing end token.
URL="$(generate_url remote-config-invalid.example.com \
/mod_pagespeed_test/forbidden.html)"
echo wget $URL
# Fetch a few times to be satisfied that the configuration should be fetched.
OUT=$(http_proxy=$SECONDARY_HOSTNAME $WGET_DUMP --save-headers $URL)
check_from "$OUT" grep "<!--"
OUT=$(http_proxy=$SECONDARY_HOSTNAME $WGET_DUMP --save-headers $URL)
check_from "$OUT" grep "<!--"
OUT=$(http_proxy=$SECONDARY_HOSTNAME $WGET_DUMP --save-headers $URL)
check_from "$OUT" grep "<!--"
start_test Remote Configuration On: Some invalid options.
URL="$(generate_url remote-config-partially-invalid.example.com \
/mod_pagespeed_test/forbidden.html)"
# Some options are invalid, check that they are skipped and the rest of the
# options get applied.
echo wget $URL
http_proxy=$SECONDARY_HOSTNAME fetch_until -save "$URL" 'fgrep -c <!--' 0
start_test Remote Configuration On: overridden by query parameter.
URL="$(generate_url remote-config.example.com \
/mod_pagespeed_test/forbidden.html)"
# First check to see that the remote config is applied.
echo wget $URL
http_proxy=$SECONDARY_HOSTNAME fetch_until -save "$URL" 'fgrep -c <!--' 0
# And now check to see that the query parameters override the remote config.
URL="$(generate_url remote-config.example.com \
/mod_pagespeed_test/forbidden.html?PageSpeedFilters=-remove_comments)"
echo wget $URL
http_proxy=$SECONDARY_HOSTNAME fetch_until -save "$URL" 'fgrep -c <!--' 2
start_test second remote config fetch fails, cached value still applies.
URL="$(generate_url remote-config-failed-fetch.example.com \
/mod_pagespeed_test/forbidden.html)"
http_proxy=$SECONDARY_HOSTNAME fetch_until -save "$URL" 'fgrep -c <!--' 0
http_proxy=$SECONDARY_HOSTNAME fetch_until -save "$URL" 'fgrep -c <!--' 0
echo "Sleeping so that cache will expire"
sleep 2
http_proxy=$SECONDARY_HOSTNAME fetch_until -save "$URL" 'fgrep -c <!--' 0
start_test config takes too long to fetch, is not applied.
URL="$(generate_url remote-config-slow-fetch.example.com \
/mod_pagespeed_test/forbidden.html)"
# Fetch a few times to be satisfied that the configuration should have been
# fetched.
OUT=$(http_proxy=$SECONDARY_HOSTNAME $WGET_DUMP --save-headers $URL)
check_from "$OUT" grep "<!--"
OUT=$(http_proxy=$SECONDARY_HOSTNAME $WGET_DUMP --save-headers $URL)
check_from "$OUT" grep "<!--"
start_test Remote Configuration specify an experiment.
# Remote config url is configured to sleep an impossibly long time.
URL="$(generate_url remote-config-experiment.example.com \
/mod_pagespeed_test/forbidden.html)"
# Some options are invalid, check that they are skipped and the rest of the
# options get applied.
http_proxy=$SECONDARY_HOSTNAME fetch_until -save "$URL" \
'fgrep -c MyExperimentID' 1
start_test config takes a long time to fetch but is still applied.
# Remote config url is configured to sleep for 2s. This depends on the "sleep
# 2" above. If it were removed and everything else ran instantly then we
# might not have a cached copy of the remote config file here.
URL="$(generate_url remote-config-slightly-slow-fetch.example.com \
/mod_pagespeed_test/forbidden.html)"
http_proxy=$SECONDARY_HOSTNAME fetch_until -save "$URL" 'fgrep -c <!--' 0
start_test config is expired, but is still applied.
# Remote config url is configured to sleep for 2s, and returns expired
# content. This also depends on the "sleep 2" above.
URL="$(generate_url remote-config-slightly-slow-expired-fetch.example.com \
/mod_pagespeed_test/forbidden.html)"
OUT=$(http_proxy=$SECONDARY_HOSTNAME $WGET_DUMP --save-headers $URL)
# TODO(jefftk): we doc that:
# The remote configuration file will be fetched on the server's startup, and
# cached for the extent determined by the remote server's Cache-Control and
# Expires headers. For example, if the remote configuration hosting server
# provides the header Cache-Control: max-age=3600, the next fetch of the
# remote configuration will happen at the first request after 3600
# seconds. Failed fetches after successful fetches will continue to serve
# the stale config.
# but it doesn't look like we use the stale config here.
# http_proxy=$SECONDARY_HOSTNAME fetch_until -save "$URL" 'fgrep -c <!--' 0
start_test config is forbidden, and so never applied
# Remote config url 403s, but returns valid remote config. Still not applied.
URL="$(generate_url remote-config-forbidden.example.com \
/mod_pagespeed_test/forbidden.html)"
OUT=$(http_proxy=$SECONDARY_HOSTNAME $WGET_DUMP --save-headers $URL)
check_not_from "$OUT" grep "<!--"
start_test config is forbidden only on first request
# Remote config url 403s the first request and 200s after that, so it should
# be applied.
URL="$(generate_url remote-config-forbidden.example.com \
/mod_pagespeed_test/forbidden.html)"
OUT=$(http_proxy=$SECONDARY_HOSTNAME $WGET_DUMP --save-headers $URL)
check_not_from "$OUT" grep "<!--"
fi
check_failures_and_exit