1#!/bin/bash 2 3# Copyright (c) 2009 The Chromium Authors. All rights reserved. 4# Use of this source code is governed by a BSD-style license that can be 5# found in the LICENSE file. 6 7# Test of the Mac Chrome installer. 8 9 10# Where I am 11DIR=$(dirname "${0}") 12 13# My installer to test 14INSTALLER="${DIR}"/keystone_install.sh 15if [ ! -f "${INSTALLER}" ]; then 16 echo "Can't find scripts." >& 2 17 exit 1 18fi 19 20# What I test 21PRODNAME="Google Chrome" 22APPNAME="${PRODNAME}.app" 23FWKNAME="${PRODNAME} Framework.framework" 24 25# The version number for fake ksadmin to pretend to be 26KSADMIN_VERSION_LIE="1.0.7.1306" 27 28# Temp directory to be used as the disk image (source) 29TEMPDIR=$(mktemp -d -t $(basename ${0})) 30PATH=$PATH:"${TEMPDIR}" 31 32# Clean up the temp directory 33function cleanup_tempdir() { 34 chmod u+w "${TEMPDIR}" 35 rm -rf "${TEMPDIR}" 36} 37 38# Run the installer and make sure it fails. 39# If it succeeds, we fail. 40# Arg0: string to print 41function fail_installer() { 42 echo $1 43 "${INSTALLER}" "${TEMPDIR}" >& /dev/null 44 RETURN=$? 45 if [ $RETURN -eq 0 ]; then 46 echo "Did not fail (which is a failure)" >& 2 47 cleanup_tempdir 48 exit 1 49 else 50 echo "Returns $RETURN" 51 fi 52} 53 54# Make sure installer works! 55# Arg0: string to print 56function pass_installer() { 57 echo $1 58 "${INSTALLER}" "${TEMPDIR}" >& /dev/null 59 RETURN=$? 60 if [ $RETURN -ne 0 ]; then 61 echo "FAILED; returned $RETURN but should have worked" >& 2 62 cleanup_tempdir 63 exit 1 64 else 65 echo "worked" 66 fi 67} 68 69# Make an old-style destination directory, to test updating from old-style 70# versions to new-style versions. 71function make_old_dest() { 72 DEST="${TEMPDIR}"/Dest.app 73 rm -rf "${DEST}" 74 mkdir -p "${DEST}"/Contents 75 defaults write "${DEST}/Contents/Info" KSVersion 0 76 cat >"${TEMPDIR}"/ksadmin <<EOF 77#!/bin/sh 78if [ "\${1}" = "--ksadmin-version" ] ; then 79 echo "${KSADMIN_VERSION_LIE}" 80 exit 0 81fi 82if [ -z "\${FAKE_SYSTEM_TICKET}" ] && [ "\${1}" = "-S" ] ; then 83 echo no system tix! >& 2 84 exit 1 85fi 86echo " xc=<KSPathExistenceChecker:0x45 path=${DEST}>" 87exit 0 88EOF 89 chmod u+x "${TEMPDIR}"/ksadmin 90} 91 92# Make a new-style destination directory, to test updating between new-style 93# versions. 94function make_new_dest() { 95 DEST="${TEMPDIR}"/Dest.app 96 rm -rf "${DEST}" 97 defaults write "${DEST}/Contents/Info" CFBundleShortVersionString 0 98 defaults write "${DEST}/Contents/Info" KSVersion 0 99 cat >"${TEMPDIR}"/ksadmin <<EOF 100#!/bin/sh 101if [ "\${1}" = "--ksadmin-version" ] ; then 102 echo "${KSADMIN_VERSION_LIE}" 103 exit 0 104fi 105if [ -z "\${FAKE_SYSTEM_TICKET}" ] && [ "\${1}" = "-S" ] ; then 106 echo no system tix! >& 2 107 exit 1 108fi 109echo " xc=<KSPathExistenceChecker:0x45 path=${DEST}>" 110exit 0 111EOF 112 chmod u+x "${TEMPDIR}"/ksadmin 113} 114 115# Make a simple source directory - the update that is to be applied 116function make_src() { 117 chmod ugo+w "${TEMPDIR}" 118 rm -rf "${TEMPDIR}/${APPNAME}" 119 RSRCDIR="${TEMPDIR}/${APPNAME}/Contents/Versions/1/${FWKNAME}/Resources" 120 mkdir -p "${RSRCDIR}" 121 defaults write "${TEMPDIR}/${APPNAME}/Contents/Info" \ 122 CFBundleShortVersionString "1" 123 defaults write "${TEMPDIR}/${APPNAME}/Contents/Info" \ 124 KSProductID "com.google.Chrome" 125 defaults write "${TEMPDIR}/${APPNAME}/Contents/Info" \ 126 KSVersion "2" 127} 128 129function make_basic_src_and_dest() { 130 make_src 131 make_new_dest 132} 133 134fail_installer "No source anything" 135 136mkdir "${TEMPDIR}"/"${APPNAME}" 137fail_installer "No source bundle" 138 139make_basic_src_and_dest 140chmod ugo-w "${TEMPDIR}" 141fail_installer "Writable dest directory" 142 143make_basic_src_and_dest 144fail_installer "Was no KSUpdateURL in dest after copy" 145 146make_basic_src_and_dest 147defaults write "${TEMPDIR}/${APPNAME}/Contents/Info" KSUpdateURL "http://foobar" 148export FAKE_SYSTEM_TICKET=1 149fail_installer "User and system ticket both present" 150export -n FAKE_SYSTEM_TICKET 151 152make_src 153make_old_dest 154defaults write "${TEMPDIR}/${APPNAME}/Contents/Info" KSUpdateURL "http://foobar" 155pass_installer "Old-style update" 156 157make_basic_src_and_dest 158defaults write "${TEMPDIR}/${APPNAME}/Contents/Info" KSUpdateURL "http://foobar" 159pass_installer "ALL" 160 161cleanup_tempdir 162