blob: e578f8521cb12fd80fd5be2be282b7bdd6372ac3 [file] [log] [blame]
Gilad Arnold553b0ec2013-01-26 01:00:39 -08001#!/bin/bash
2#
Amin Hassanif94b6432018-01-26 17:39:47 -08003# Copyright (C) 2013 The Android Open Source Project
4#
5# Licensed under the Apache License, Version 2.0 (the "License");
6# you may not use this file except in compliance with the License.
7# You may obtain a copy of the License at
8#
9# http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS,
13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
16#
Gilad Arnold553b0ec2013-01-26 01:00:39 -080017
18# A test script for paycheck.py and the update_payload.py library.
19#
20# This script requires three payload files, along with a metadata signature for
21# each, and a public key for verifying signatures. Payload include:
22#
23# - A full payload for release X (old_full_payload)
24#
25# - A full payload for release Y (new_full_payload), where Y > X
26#
27# - A delta payload from X to Y (delta_payload)
28#
29# The test performs the following:
30#
31# - It verifies each payload against its metadata signature, also asserting the
32# payload type. Another artifact is a human-readable payload report, which
33# is output to stdout to be inspected by the user.
34#
Gilad Arnold553b0ec2013-01-26 01:00:39 -080035# - It applies old_full_payload to yield old kernel (old_kern.part) and rootfs
36# (old_root.part) partitions.
37#
38# - It applies delta_payload to old_{kern,root}.part to yield new kernel
39# (new_delta_kern.part) and rootfs (new_delta_root.part) partitions.
40#
41# - It applies new_full_payload to yield reference new kernel
42# (new_full_kern.part) and rootfs (new_full_root.part) partitions.
43#
44# - It compares new_{delta,full}_kern.part and new_{delta,full}_root.part to
45# ensure that they are binary identical.
46#
47# If all steps have completed successfully we know with high certainty that
Amin Hassania5489022018-01-26 11:23:26 -080048# paycheck.py (and hence update_payload.py) correctly parses both full and delta
49# payloads, and applies them to yield the expected result. Finally, each
50# paycheck.py execution is timed.
Gilad Arnold553b0ec2013-01-26 01:00:39 -080051
52
Gilad Arnold9157a1a2013-04-30 15:40:01 -070053# Stop on errors, unset variables.
54set -e
55set -u
56
57# Temporary image files.
Gilad Arnold553b0ec2013-01-26 01:00:39 -080058OLD_KERN_PART=old_kern.part
59OLD_ROOT_PART=old_root.part
60NEW_DELTA_KERN_PART=new_delta_kern.part
61NEW_DELTA_ROOT_PART=new_delta_root.part
62NEW_FULL_KERN_PART=new_full_kern.part
63NEW_FULL_ROOT_PART=new_full_root.part
64
Gilad Arnold553b0ec2013-01-26 01:00:39 -080065
66log() {
67 echo "$@" >&2
68}
69
70die() {
71 log "$@"
72 exit 1
73}
74
75usage_and_exit() {
76 cat >&2 <<EOF
Gilad Arnoldd0130282013-05-13 08:12:39 -070077Usage: ${0##*/} old_full_payload delta_payload new_full_payload
Gilad Arnold553b0ec2013-01-26 01:00:39 -080078EOF
79 exit
80}
81
82check_payload() {
83 payload_file=$1
Gilad Arnoldd0130282013-05-13 08:12:39 -070084 payload_type=$2
Gilad Arnold553b0ec2013-01-26 01:00:39 -080085
Gilad Arnoldd0130282013-05-13 08:12:39 -070086 time ${paycheck} -t ${payload_type} ${payload_file}
Gilad Arnold553b0ec2013-01-26 01:00:39 -080087}
88
Gilad Arnold553b0ec2013-01-26 01:00:39 -080089apply_full_payload() {
90 payload_file=$1
Amin Hassanie20eb912018-02-21 12:39:42 -080091 out_dst_kern_part="$2/$3"
92 out_dst_root_part="$2/$4"
Gilad Arnold553b0ec2013-01-26 01:00:39 -080093
Amin Hassani52b60392017-12-19 10:53:24 -080094 time ${paycheck} ${payload_file} \
Amin Hassanie20eb912018-02-21 12:39:42 -080095 --out_dst_kern ${out_dst_kern_part} --out_dst_root ${out_dst_root_part}
Gilad Arnold553b0ec2013-01-26 01:00:39 -080096}
97
98apply_delta_payload() {
99 payload_file=$1
Amin Hassanie20eb912018-02-21 12:39:42 -0800100 out_dst_kern_part="$2/$3"
101 out_dst_root_part="$2/$4"
102 dst_kern_part="$2/$5"
103 dst_root_part="$2/$6"
104 src_kern_part="$2/$7"
105 src_root_part="$2/$8"
Gilad Arnold553b0ec2013-01-26 01:00:39 -0800106
Amin Hassani52b60392017-12-19 10:53:24 -0800107 time ${paycheck} ${payload_file} \
Amin Hassanie20eb912018-02-21 12:39:42 -0800108 --out_dst_kern ${out_dst_kern_part} --out_dst_root ${out_dst_root_part} \
Amin Hassani52b60392017-12-19 10:53:24 -0800109 --dst_kern ${dst_kern_part} --dst_root ${dst_root_part} \
Amin Hassaniddd335f2018-01-25 15:59:44 -0800110 --src_kern ${src_kern_part} --src_root ${src_root_part}
Gilad Arnold553b0ec2013-01-26 01:00:39 -0800111}
112
113main() {
114 # Read command-line arguments.
115 if [ $# == 1 ] && [ "$1" == "-h" ]; then
116 usage_and_exit
Gilad Arnoldd0130282013-05-13 08:12:39 -0700117 elif [ $# != 3 ]; then
Gilad Arnold553b0ec2013-01-26 01:00:39 -0800118 die "Error: unexpected number of arguments"
119 fi
Gilad Arnoldd0130282013-05-13 08:12:39 -0700120 old_full_payload="$1"
121 delta_payload="$2"
122 new_full_payload="$3"
Gilad Arnold553b0ec2013-01-26 01:00:39 -0800123
124 # Find paycheck.py
125 paycheck=${0%/*}/paycheck.py
126 if [ -z "${paycheck}" ] || [ ! -x ${paycheck} ]; then
Gilad Arnold2ca9f142013-05-13 12:29:58 -0700127 die "cannot find ${paycheck} or file is not executable"
Gilad Arnold553b0ec2013-01-26 01:00:39 -0800128 fi
129
Gilad Arnold9157a1a2013-04-30 15:40:01 -0700130 # Check the payloads statically.
Gilad Arnold553b0ec2013-01-26 01:00:39 -0800131 log "Checking payloads..."
Gilad Arnoldd0130282013-05-13 08:12:39 -0700132 check_payload "${old_full_payload}" full
133 check_payload "${new_full_payload}" full
134 check_payload "${delta_payload}" delta
Gilad Arnold553b0ec2013-01-26 01:00:39 -0800135 log "Done"
136
Gilad Arnold9157a1a2013-04-30 15:40:01 -0700137 # Apply full/delta payloads and verify results are identical.
138 tmpdir="$(mktemp -d --tmpdir test_paycheck.XXXXXXXX)"
139 log "Initiating application of payloads at $tmpdir"
140
141 log "Applying old full payload..."
142 apply_full_payload "${old_full_payload}" "${tmpdir}" "${OLD_KERN_PART}" \
143 "${OLD_ROOT_PART}"
Gilad Arnold553b0ec2013-01-26 01:00:39 -0800144 log "Done"
Gilad Arnold9157a1a2013-04-30 15:40:01 -0700145
Gilad Arnold9157a1a2013-04-30 15:40:01 -0700146 log "Applying new full payload..."
147 apply_full_payload "${new_full_payload}" "${tmpdir}" "${NEW_FULL_KERN_PART}" \
Gilad Arnold553b0ec2013-01-26 01:00:39 -0800148 "${NEW_FULL_ROOT_PART}"
149 log "Done"
Gilad Arnold9157a1a2013-04-30 15:40:01 -0700150
Amin Hassanie20eb912018-02-21 12:39:42 -0800151 log "Applying delta payload to old partitions..."
152 apply_delta_payload "${delta_payload}" "${tmpdir}" "${NEW_DELTA_KERN_PART}" \
153 "${NEW_DELTA_ROOT_PART}" "${NEW_FULL_KERN_PART}" \
154 "${NEW_FULL_ROOT_PART}" "${OLD_KERN_PART}" "${OLD_ROOT_PART}"
155 log "Done"
156
Gilad Arnold553b0ec2013-01-26 01:00:39 -0800157 log "Comparing results of delta and new full updates..."
Gilad Arnold9157a1a2013-04-30 15:40:01 -0700158 diff "${tmpdir}/${NEW_FULL_KERN_PART}" "${tmpdir}/${NEW_DELTA_KERN_PART}"
159 diff "${tmpdir}/${NEW_FULL_ROOT_PART}" "${tmpdir}/${NEW_DELTA_ROOT_PART}"
Gilad Arnold553b0ec2013-01-26 01:00:39 -0800160 log "Done"
Gilad Arnold9157a1a2013-04-30 15:40:01 -0700161
162 log "Cleaning up"
163 rm -fr "${tmpdir}"
Gilad Arnold553b0ec2013-01-26 01:00:39 -0800164}
165
166main "$@"