#!/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