blob: 614b812b2ed6bd2d7c0994d10197c11dbecec8e4 [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#
Gilad Arnold553b0ec2013-01-26 01:00:39 -080024# - It applies old_full_payload to yield old kernel (old_kern.part) and rootfs
25# (old_root.part) partitions.
26#
27# - It applies delta_payload to old_{kern,root}.part to yield new kernel
28# (new_delta_kern.part) and rootfs (new_delta_root.part) partitions.
29#
30# - It applies new_full_payload to yield reference new kernel
31# (new_full_kern.part) and rootfs (new_full_root.part) partitions.
32#
33# - It compares new_{delta,full}_kern.part and new_{delta,full}_root.part to
34# ensure that they are binary identical.
35#
36# If all steps have completed successfully we know with high certainty that
Amin Hassania5489022018-01-26 11:23:26 -080037# paycheck.py (and hence update_payload.py) correctly parses both full and delta
38# payloads, and applies them to yield the expected result. Finally, each
39# paycheck.py execution is timed.
Gilad Arnold553b0ec2013-01-26 01:00:39 -080040
41
Gilad Arnold9157a1a2013-04-30 15:40:01 -070042# Stop on errors, unset variables.
43set -e
44set -u
45
46# Temporary image files.
Gilad Arnold553b0ec2013-01-26 01:00:39 -080047OLD_KERN_PART=old_kern.part
48OLD_ROOT_PART=old_root.part
49NEW_DELTA_KERN_PART=new_delta_kern.part
50NEW_DELTA_ROOT_PART=new_delta_root.part
51NEW_FULL_KERN_PART=new_full_kern.part
52NEW_FULL_ROOT_PART=new_full_root.part
53
Gilad Arnold553b0ec2013-01-26 01:00:39 -080054
55log() {
56 echo "$@" >&2
57}
58
59die() {
60 log "$@"
61 exit 1
62}
63
64usage_and_exit() {
65 cat >&2 <<EOF
Gilad Arnoldd0130282013-05-13 08:12:39 -070066Usage: ${0##*/} old_full_payload delta_payload new_full_payload
Gilad Arnold553b0ec2013-01-26 01:00:39 -080067EOF
68 exit
69}
70
71check_payload() {
72 payload_file=$1
Gilad Arnoldd0130282013-05-13 08:12:39 -070073 payload_type=$2
Gilad Arnold553b0ec2013-01-26 01:00:39 -080074
Gilad Arnoldd0130282013-05-13 08:12:39 -070075 time ${paycheck} -t ${payload_type} ${payload_file}
Gilad Arnold553b0ec2013-01-26 01:00:39 -080076}
77
Gilad Arnold553b0ec2013-01-26 01:00:39 -080078apply_full_payload() {
79 payload_file=$1
Gilad Arnold9157a1a2013-04-30 15:40:01 -070080 dst_kern_part="$2/$3"
81 dst_root_part="$2/$4"
Gilad Arnold553b0ec2013-01-26 01:00:39 -080082
Amin Hassani52b60392017-12-19 10:53:24 -080083 time ${paycheck} ${payload_file} \
84 --dst_kern ${dst_kern_part} --dst_root ${dst_root_part}
Gilad Arnold553b0ec2013-01-26 01:00:39 -080085}
86
87apply_delta_payload() {
88 payload_file=$1
Gilad Arnold9157a1a2013-04-30 15:40:01 -070089 dst_kern_part="$2/$3"
90 dst_root_part="$2/$4"
91 src_kern_part="$2/$5"
92 src_root_part="$2/$6"
Gilad Arnold553b0ec2013-01-26 01:00:39 -080093
Amin Hassani52b60392017-12-19 10:53:24 -080094 time ${paycheck} ${payload_file} \
95 --dst_kern ${dst_kern_part} --dst_root ${dst_root_part} \
Amin Hassaniddd335f2018-01-25 15:59:44 -080096 --src_kern ${src_kern_part} --src_root ${src_root_part}
Gilad Arnold553b0ec2013-01-26 01:00:39 -080097}
98
99main() {
100 # Read command-line arguments.
101 if [ $# == 1 ] && [ "$1" == "-h" ]; then
102 usage_and_exit
Gilad Arnoldd0130282013-05-13 08:12:39 -0700103 elif [ $# != 3 ]; then
Gilad Arnold553b0ec2013-01-26 01:00:39 -0800104 die "Error: unexpected number of arguments"
105 fi
Gilad Arnoldd0130282013-05-13 08:12:39 -0700106 old_full_payload="$1"
107 delta_payload="$2"
108 new_full_payload="$3"
Gilad Arnold553b0ec2013-01-26 01:00:39 -0800109
110 # Find paycheck.py
111 paycheck=${0%/*}/paycheck.py
112 if [ -z "${paycheck}" ] || [ ! -x ${paycheck} ]; then
Gilad Arnold2ca9f142013-05-13 12:29:58 -0700113 die "cannot find ${paycheck} or file is not executable"
Gilad Arnold553b0ec2013-01-26 01:00:39 -0800114 fi
115
Gilad Arnold9157a1a2013-04-30 15:40:01 -0700116 # Check the payloads statically.
Gilad Arnold553b0ec2013-01-26 01:00:39 -0800117 log "Checking payloads..."
Gilad Arnoldd0130282013-05-13 08:12:39 -0700118 check_payload "${old_full_payload}" full
119 check_payload "${new_full_payload}" full
120 check_payload "${delta_payload}" delta
Gilad Arnold553b0ec2013-01-26 01:00:39 -0800121 log "Done"
122
Gilad Arnold9157a1a2013-04-30 15:40:01 -0700123 # Apply full/delta payloads and verify results are identical.
124 tmpdir="$(mktemp -d --tmpdir test_paycheck.XXXXXXXX)"
125 log "Initiating application of payloads at $tmpdir"
126
127 log "Applying old full payload..."
128 apply_full_payload "${old_full_payload}" "${tmpdir}" "${OLD_KERN_PART}" \
129 "${OLD_ROOT_PART}"
Gilad Arnold553b0ec2013-01-26 01:00:39 -0800130 log "Done"
Gilad Arnold9157a1a2013-04-30 15:40:01 -0700131
132 log "Applying delta payload to old partitions..."
133 apply_delta_payload "${delta_payload}" "${tmpdir}" "${NEW_DELTA_KERN_PART}" \
Gilad Arnold553b0ec2013-01-26 01:00:39 -0800134 "${NEW_DELTA_ROOT_PART}" "${OLD_KERN_PART}" "${OLD_ROOT_PART}"
135 log "Done"
Gilad Arnold9157a1a2013-04-30 15:40:01 -0700136
137 log "Applying new full payload..."
138 apply_full_payload "${new_full_payload}" "${tmpdir}" "${NEW_FULL_KERN_PART}" \
Gilad Arnold553b0ec2013-01-26 01:00:39 -0800139 "${NEW_FULL_ROOT_PART}"
140 log "Done"
Gilad Arnold9157a1a2013-04-30 15:40:01 -0700141
Gilad Arnold553b0ec2013-01-26 01:00:39 -0800142 log "Comparing results of delta and new full updates..."
Gilad Arnold9157a1a2013-04-30 15:40:01 -0700143 diff "${tmpdir}/${NEW_FULL_KERN_PART}" "${tmpdir}/${NEW_DELTA_KERN_PART}"
144 diff "${tmpdir}/${NEW_FULL_ROOT_PART}" "${tmpdir}/${NEW_DELTA_ROOT_PART}"
Gilad Arnold553b0ec2013-01-26 01:00:39 -0800145 log "Done"
Gilad Arnold9157a1a2013-04-30 15:40:01 -0700146
147 log "Cleaning up"
148 rm -fr "${tmpdir}"
Gilad Arnold553b0ec2013-01-26 01:00:39 -0800149}
150
151main "$@"