summaryrefslogtreecommitdiffstats
path: root/tools/update-verify/release/common/check_updates.sh
blob: f03d8a069d6ef35ec9e3be4bd766ce2fbaf966ae (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
#!/bin/bash

check_updates () {
  # called with 10 args - platform, source package, target package, update package, old updater boolean,
  # a path to the updater binary to use for the tests, a file to write diffs to, the update channel,
  # update-settings.ini values, and a flag to indicate the target is dep-signed
  update_platform=$1
  source_package=$2
  target_package=$3
  locale=$4
  updater=$5
  diff_file=$6
  channel=$7
  mar_channel_IDs=$8
  update_to_dep=$9
  local mac_update_settings_dir_override
  mac_update_settings_dir_override=${10}
  local product
  product=${11}

  # cleanup
  rm -rf source/*
  rm -rf target/*

  # $mac_update_settings_dir_override allows unpack_build to find a host platform appropriate
  # `update-settings.ini` file, which is needed to successfully run the updater later in this
  # function.
  if ! unpack_build "$update_platform" source "$source_package" "$locale" '' "$mar_channel_IDs" "$mac_update_settings_dir_override" "$product"; then
    echo "FAILED: cannot unpack_build $update_platform source $source_package"
    return 1
  fi
  # Unlike unpacking the `source` build, we don't actually _need_ $mac_update_settings_dir_override
  # here to succesfully apply the update, but its usage in `source` causes an `update-settings.ini`
  # file to be present in the directory we diff, which means we either also need it present in the
  # `target` directory, or to remove it after the update is applied. The latter was chosen
  # because it keeps the workaround close together (as opposed to just above this, and then much
  # further down).
  if ! unpack_build "$update_platform" target "$target_package" "$locale" '' '' "$mac_update_settings_dir_override" "$product"; then
    echo "FAILED: cannot unpack_build $update_platform target $target_package"
    return 1
  fi

  case $update_platform in
      Darwin_ppc-gcc | Darwin_Universal-gcc3 | Darwin_x86_64-gcc3 | Darwin_x86-gcc3-u-ppc-i386 | Darwin_x86-gcc3-u-i386-x86_64 | Darwin_x86_64-gcc3-u-i386-x86_64 | Darwin_aarch64-gcc3)
          platform_dirname="*.app"
          ;;
      WINNT*)
          platform_dirname="bin"
          ;;
      Linux_x86-gcc | Linux_x86-gcc3 | Linux_x86_64-gcc3)
          platform_dirname=$(echo "$product" | tr '[:upper:]' '[:lower:]')
          ;;
  esac

  if [ -f update/update.status ]; then rm update/update.status; fi
  if [ -f update/update.log ]; then rm update/update.log; fi

  # This check is disabled because we rely on glob expansion here
  # shellcheck disable=SC2086
  if [ -d source/$platform_dirname ]; then
    if [ "$(uname | cut -c-5)" == "MINGW" ]; then
      # windows
      # change /c/path/to/pwd to c:\\path\\to\\pwd
      two_backslash_pwd=$(echo "$PWD" | sed -e 's,^/\([a-zA-Z]\)/,\1:/,' | sed -e 's,/,\\,g')
      cwd="$two_backslash_pwd\\source\\$platform_dirname"
      update_abspath="$two_backslash_pwd\\update"
    else
      # not windows
      # use ls here, because mac uses *.app, and we need to expand it
      # This check is disabled because we rely on glob expansion here
      # shellcheck disable=SC2086
      cwd=$(ls -d $PWD/source/$platform_dirname)
      update_abspath="$PWD/update"
    fi

    # This check is disabled because we rely on glob expansion here
    # shellcheck disable=SC2086
    cd_dir=$(ls -d ${PWD}/source/${platform_dirname})
    cd "${cd_dir}" || (echo "TEST-UNEXPECTED-FAIL: couldn't cd to ${cd_dir}" && return 1)
    set -x
    "$updater" "$update_abspath" "$cwd" "$cwd" 0
    set +x
    cd ../..
  else
    echo "TEST-UNEXPECTED-FAIL: no dir in source/$platform_dirname"
    return 1
  fi

  cat update/update.log
  update_status=$(cat update/update.status)

  if [ "$update_status" != "succeeded" ]
  then
    echo "TEST-UNEXPECTED-FAIL: update status was not successful: $update_status"
    return 1
  fi

  # If we were testing an OS X mar on Linux, the unpack step copied the
  # precomplete file from Contents/Resources to the root of the install
  # to ensure the Linux updater binary could find it. However, only the
  # precomplete file in Contents/Resources was updated, which means
  # the copied version in the root of the install will usually have some
  # differences between the source and target. To prevent this false
  # positive from failing the tests, we simply remove it before diffing.
  # The precomplete file in Contents/Resources is still diffed, so we
  # don't lose any coverage by doing this.
  # This check is disabled because we rely on glob expansion here
  # shellcheck disable=SC2086
  cd source/$platform_dirname || (echo "TEST-UNEXPECTED-FAIL: couldn't cd to source/${platform_dirname}" && exit 1)
  if [[ -f "Contents/Resources/precomplete" && -f "precomplete" ]]
  then
    rm "precomplete"
  fi
  cd ../..
  # This check is disabled because we rely on glob expansion here
  # shellcheck disable=SC2086
  cd target/$platform_dirname || (echo "TEST-UNEXPECTED-FAIL: couldn't cd to target/${platform_dirname}" && exit 1)
  if [[ -f "Contents/Resources/precomplete" && -f "precomplete" ]]
  then
    rm "precomplete"
  fi
  cd ../..

  # If we are testing an OSX mar to update from a production-signed/notarized
  # build to a dep-signed one, ignore Contents/CodeResources which won't be
  # present in the target, to avoid spurious failures
  # Same applies to provisioning profiles, since we don't have them outside of prod
  if ${update_to_dep}; then
    ignore_coderesources="--ignore-missing=Contents/CodeResources --ignore-missing=Contents/embedded.provisionprofile"
  else
    ignore_coderesources=
  fi

  # On Mac, there are two Frameworks that are not included with updates, and
  # which change with every build. Because of this, we ignore differences in
  # them in `compare-directories.py`. The best verification we can do for them
  # is that they still exist.
  if [[ $update_platform == Darwin_* ]]; then
    # This check is disabled because we rely on glob expansion here
    # shellcheck disable=SC2086
    if ! compgen -G source/${platform_dirname}/Contents/MacOS/updater.app/Contents/Frameworks/UpdateSettings.framework >/dev/null; then
      echo "TEST-UNEXPECTED-FAIL: UpdateSettings.framework doesn't exist after update"
      return 4
    fi
    # This check is disabled because we rely on glob expansion here
    # shellcheck disable=SC2086
    if ! compgen -G source/${platform_dirname}/Contents/Frameworks/ChannelPrefs.framework >/dev/null; then
      echo "TEST-UNEXPECTED-FAIL: ChannelPrefs.framework doesn't exist after update"
      return 5
    fi
  fi

  # This check is disabled because we rely on glob expansion here
  # shellcheck disable=SC2086
  ../compare-directories.py source/${platform_dirname} target/${platform_dirname} "${channel}" ${ignore_coderesources} > "${diff_file}"
  diffErr=$?
  cat "${diff_file}"
  if [ $diffErr == 2 ]
  then
    echo "TEST-UNEXPECTED-FAIL: differences found after update"
    return 1
  elif [ $diffErr != 0 ]
  then
    echo "TEST-UNEXPECTED-FAIL: unknown error from diff: $diffErr"
    return 3
  fi
}