blob: 92f7de24ed14f9f045abf1c24e15323a3f63ef29 [file] [log] [blame]
Gilad Arnold553b0ec2013-01-26 01:00:39 -08001#!/bin/bash
2#
3# Copyright (c) 2013 The Chromium OS 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# A test script for paycheck.py and the update_payload.py library.
8#
9# This script requires three payload files, along with a metadata signature for
10# each, and a public key for verifying signatures. Payload include:
11#
12# - A full payload for release X (old_full_payload)
13#
14# - A full payload for release Y (new_full_payload), where Y > X
15#
16# - A delta payload from X to Y (delta_payload)
17#
18# The test performs the following:
19#
20# - It verifies each payload against its metadata signature, also asserting the
21# payload type. Another artifact is a human-readable payload report, which
22# is output to stdout to be inspected by the user.
23#
24# - It performs a random block trace on the delta payload (both kernel and
25# rootfs blocks), dumping the traces to stdout for the user to inspect.
26#
27# - It applies old_full_payload to yield old kernel (old_kern.part) and rootfs
28# (old_root.part) partitions.
29#
30# - It applies delta_payload to old_{kern,root}.part to yield new kernel
31# (new_delta_kern.part) and rootfs (new_delta_root.part) partitions.
32#
33# - It applies new_full_payload to yield reference new kernel
34# (new_full_kern.part) and rootfs (new_full_root.part) partitions.
35#
36# - It compares new_{delta,full}_kern.part and new_{delta,full}_root.part to
37# ensure that they are binary identical.
38#
39# If all steps have completed successfully we know with high certainty that
40# paycheck.py (and hence update_payload.py) correctly parses both full and
41# delta payloads, and applies them to yield the expected result. We also know
42# that tracing works, to the extent it does not crash. Manual inspection of
43# payload reports and block traces will improve this our confidence and are
44# strongly encouraged. Finally, each paycheck.py execution is timed.
45
46
Gilad Arnold9157a1a2013-04-30 15:40:01 -070047# Stop on errors, unset variables.
48set -e
49set -u
50
51# Temporary image files.
Gilad Arnold553b0ec2013-01-26 01:00:39 -080052OLD_KERN_PART=old_kern.part
53OLD_ROOT_PART=old_root.part
54NEW_DELTA_KERN_PART=new_delta_kern.part
55NEW_DELTA_ROOT_PART=new_delta_root.part
56NEW_FULL_KERN_PART=new_full_kern.part
57NEW_FULL_ROOT_PART=new_full_root.part
58
Gilad Arnold553b0ec2013-01-26 01:00:39 -080059
60log() {
61 echo "$@" >&2
62}
63
64die() {
65 log "$@"
66 exit 1
67}
68
69usage_and_exit() {
70 cat >&2 <<EOF
Gilad Arnoldd0130282013-05-13 08:12:39 -070071Usage: ${0##*/} old_full_payload delta_payload new_full_payload
Gilad Arnold553b0ec2013-01-26 01:00:39 -080072EOF
73 exit
74}
75
76check_payload() {
77 payload_file=$1
Gilad Arnoldd0130282013-05-13 08:12:39 -070078 payload_type=$2
Gilad Arnold553b0ec2013-01-26 01:00:39 -080079
Gilad Arnoldd0130282013-05-13 08:12:39 -070080 time ${paycheck} -t ${payload_type} ${payload_file}
Gilad Arnold553b0ec2013-01-26 01:00:39 -080081}
82
83trace_kern_block() {
84 payload_file=$1
85 block=$2
86 time ${paycheck} -B ${block} ${payload_file}
87}
88
89trace_root_block() {
90 payload_file=$1
91 block=$2
92 time ${paycheck} -b ${block} ${payload_file}
93}
94
95apply_full_payload() {
96 payload_file=$1
Gilad Arnold9157a1a2013-04-30 15:40:01 -070097 dst_kern_part="$2/$3"
98 dst_root_part="$2/$4"
Gilad Arnold553b0ec2013-01-26 01:00:39 -080099
Amin Hassani52b60392017-12-19 10:53:24 -0800100 time ${paycheck} ${payload_file} \
101 --dst_kern ${dst_kern_part} --dst_root ${dst_root_part}
Gilad Arnold553b0ec2013-01-26 01:00:39 -0800102}
103
104apply_delta_payload() {
105 payload_file=$1
Gilad Arnold9157a1a2013-04-30 15:40:01 -0700106 dst_kern_part="$2/$3"
107 dst_root_part="$2/$4"
108 src_kern_part="$2/$5"
109 src_root_part="$2/$6"
Gilad Arnold553b0ec2013-01-26 01:00:39 -0800110
Amin Hassani52b60392017-12-19 10:53:24 -0800111 time ${paycheck} ${payload_file} \
112 --dst_kern ${dst_kern_part} --dst_root ${dst_root_part} \
113 --src_kern ${src_kern_part} --dst_kern ${src_root_part}
Gilad Arnold553b0ec2013-01-26 01:00:39 -0800114}
115
116main() {
117 # Read command-line arguments.
118 if [ $# == 1 ] && [ "$1" == "-h" ]; then
119 usage_and_exit
Gilad Arnoldd0130282013-05-13 08:12:39 -0700120 elif [ $# != 3 ]; then
Gilad Arnold553b0ec2013-01-26 01:00:39 -0800121 die "Error: unexpected number of arguments"
122 fi
Gilad Arnoldd0130282013-05-13 08:12:39 -0700123 old_full_payload="$1"
124 delta_payload="$2"
125 new_full_payload="$3"
Gilad Arnold553b0ec2013-01-26 01:00:39 -0800126
127 # Find paycheck.py
128 paycheck=${0%/*}/paycheck.py
129 if [ -z "${paycheck}" ] || [ ! -x ${paycheck} ]; then
Gilad Arnold2ca9f142013-05-13 12:29:58 -0700130 die "cannot find ${paycheck} or file is not executable"
Gilad Arnold553b0ec2013-01-26 01:00:39 -0800131 fi
132
Gilad Arnold9157a1a2013-04-30 15:40:01 -0700133 # Check the payloads statically.
Gilad Arnold553b0ec2013-01-26 01:00:39 -0800134 log "Checking payloads..."
Gilad Arnoldd0130282013-05-13 08:12:39 -0700135 check_payload "${old_full_payload}" full
136 check_payload "${new_full_payload}" full
137 check_payload "${delta_payload}" delta
Gilad Arnold553b0ec2013-01-26 01:00:39 -0800138 log "Done"
139
Gilad Arnold9157a1a2013-04-30 15:40:01 -0700140 # Trace a random block between 0-1024 on all payloads.
Gilad Arnold553b0ec2013-01-26 01:00:39 -0800141 block=$((RANDOM * 1024 / 32767))
142 log "Tracing a random block (${block}) in full/delta payloads..."
143 trace_kern_block "${new_full_payload}" ${block}
144 trace_root_block "${new_full_payload}" ${block}
145 trace_kern_block "${delta_payload}" ${block}
146 trace_root_block "${delta_payload}" ${block}
147 log "Done"
148
Gilad Arnold9157a1a2013-04-30 15:40:01 -0700149 # Apply full/delta payloads and verify results are identical.
150 tmpdir="$(mktemp -d --tmpdir test_paycheck.XXXXXXXX)"
151 log "Initiating application of payloads at $tmpdir"
152
153 log "Applying old full payload..."
154 apply_full_payload "${old_full_payload}" "${tmpdir}" "${OLD_KERN_PART}" \
155 "${OLD_ROOT_PART}"
Gilad Arnold553b0ec2013-01-26 01:00:39 -0800156 log "Done"
Gilad Arnold9157a1a2013-04-30 15:40:01 -0700157
158 log "Applying delta payload to old partitions..."
159 apply_delta_payload "${delta_payload}" "${tmpdir}" "${NEW_DELTA_KERN_PART}" \
Gilad Arnold553b0ec2013-01-26 01:00:39 -0800160 "${NEW_DELTA_ROOT_PART}" "${OLD_KERN_PART}" "${OLD_ROOT_PART}"
161 log "Done"
Gilad Arnold9157a1a2013-04-30 15:40:01 -0700162
163 log "Applying new full payload..."
164 apply_full_payload "${new_full_payload}" "${tmpdir}" "${NEW_FULL_KERN_PART}" \
Gilad Arnold553b0ec2013-01-26 01:00:39 -0800165 "${NEW_FULL_ROOT_PART}"
166 log "Done"
Gilad Arnold9157a1a2013-04-30 15:40:01 -0700167
Gilad Arnold553b0ec2013-01-26 01:00:39 -0800168 log "Comparing results of delta and new full updates..."
Gilad Arnold9157a1a2013-04-30 15:40:01 -0700169 diff "${tmpdir}/${NEW_FULL_KERN_PART}" "${tmpdir}/${NEW_DELTA_KERN_PART}"
170 diff "${tmpdir}/${NEW_FULL_ROOT_PART}" "${tmpdir}/${NEW_DELTA_ROOT_PART}"
Gilad Arnold553b0ec2013-01-26 01:00:39 -0800171 log "Done"
Gilad Arnold9157a1a2013-04-30 15:40:01 -0700172
173 log "Cleaning up"
174 rm -fr "${tmpdir}"
Gilad Arnold553b0ec2013-01-26 01:00:39 -0800175}
176
177main "$@"