#!/bin/bash
# Copyright (c) 2009 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
# Test of the Mac Chrome installer.
# Where I am
DIR=$(dirname "${0}")
# My installer to test
INSTALLER="${DIR}"/keystone_install.sh
if [ ! -f "${INSTALLER}" ]; then
echo "Can't find scripts." >& 2
exit 1
fi
# What I test
PRODNAME="Google Chrome"
APPNAME="${PRODNAME}.app"
FWKNAME="${PRODNAME} Framework.framework"
# The version number for fake ksadmin to pretend to be
KSADMIN_VERSION_LIE="1.0.7.1306"
# Temp directory to be used as the disk image (source)
TEMPDIR=$(mktemp -d -t $(basename ${0}))
PATH=$PATH:"${TEMPDIR}"
# Clean up the temp directory
function cleanup_tempdir() {
chmod u+w "${TEMPDIR}"
rm -rf "${TEMPDIR}"
}
# Run the installer and make sure it fails.
# If it succeeds, we fail.
# Arg0: string to print
function fail_installer() {
echo $1
"${INSTALLER}" "${TEMPDIR}" >& /dev/null
RETURN=$?
if [ $RETURN -eq 0 ]; then
echo "Did not fail (which is a failure)" >& 2
cleanup_tempdir
exit 1
else
echo "Returns $RETURN"
fi
}
# Make sure installer works!
# Arg0: string to print
function pass_installer() {
echo $1
"${INSTALLER}" "${TEMPDIR}" >& /dev/null
RETURN=$?
if [ $RETURN -ne 0 ]; then
echo "FAILED; returned $RETURN but should have worked" >& 2
cleanup_tempdir
exit 1
else
echo "worked"
fi
}
# Make an old-style destination directory, to test updating from old-style
# versions to new-style versions.
function make_old_dest() {
DEST="${TEMPDIR}"/Dest.app
rm -rf "${DEST}"
mkdir -p "${DEST}"/Contents
defaults write "${DEST}/Contents/Info" KSVersion 0
cat >"${TEMPDIR}"/ksadmin <<EOF
#!/bin/sh
if [ "\${1}" = "--ksadmin-version" ] ; then
echo "${KSADMIN_VERSION_LIE}"
exit 0
fi
if [ -z "\${FAKE_SYSTEM_TICKET}" ] && [ "\${1}" = "-S" ] ; then
echo no system tix! >& 2
exit 1
fi
echo " xc=<KSPathExistenceChecker:0x45 path=${DEST}>"
exit 0
EOF
chmod u+x "${TEMPDIR}"/ksadmin
}
# Make a new-style destination directory, to test updating between new-style
# versions.
function make_new_dest() {
DEST="${TEMPDIR}"/Dest.app
rm -rf "${DEST}"
defaults write "${DEST}/Contents/Info" CFBundleShortVersionString 0
defaults write "${DEST}/Contents/Info" KSVersion 0
cat >"${TEMPDIR}"/ksadmin <<EOF
#!/bin/sh
if [ "\${1}" = "--ksadmin-version" ] ; then
echo "${KSADMIN_VERSION_LIE}"
exit 0
fi
if [ -z "\${FAKE_SYSTEM_TICKET}" ] && [ "\${1}" = "-S" ] ; then
echo no system tix! >& 2
exit 1
fi
echo " xc=<KSPathExistenceChecker:0x45 path=${DEST}>"
exit 0
EOF
chmod u+x "${TEMPDIR}"/ksadmin
}
# Make a simple source directory - the update that is to be applied
function make_src() {
chmod ugo+w "${TEMPDIR}"
rm -rf "${TEMPDIR}/${APPNAME}"
RSRCDIR="${TEMPDIR}/${APPNAME}/Contents/Versions/1/${FWKNAME}/Resources"
mkdir -p "${RSRCDIR}"
defaults write "${TEMPDIR}/${APPNAME}/Contents/Info" \
CFBundleShortVersionString "1"
defaults write "${TEMPDIR}/${APPNAME}/Contents/Info" \
KSProductID "com.google.Chrome"
defaults write "${TEMPDIR}/${APPNAME}/Contents/Info" \
KSVersion "2"
}
function make_basic_src_and_dest() {
make_src
make_new_dest
}
fail_installer "No source anything"
mkdir "${TEMPDIR}"/"${APPNAME}"
fail_installer "No source bundle"
make_basic_src_and_dest
chmod ugo-w "${TEMPDIR}"
fail_installer "Writable dest directory"
make_basic_src_and_dest
fail_installer "Was no KSUpdateURL in dest after copy"
make_basic_src_and_dest
defaults write "${TEMPDIR}/${APPNAME}/Contents/Info" KSUpdateURL "http://foobar"
export FAKE_SYSTEM_TICKET=1
fail_installer "User and system ticket both present"
export -n FAKE_SYSTEM_TICKET
make_src
make_old_dest
defaults write "${TEMPDIR}/${APPNAME}/Contents/Info" KSUpdateURL "http://foobar"
pass_installer "Old-style update"
make_basic_src_and_dest
defaults write "${TEMPDIR}/${APPNAME}/Contents/Info" KSUpdateURL "http://foobar"
pass_installer "ALL"
cleanup_tempdir