diff --git a/e2e/tests-dfx/upgrade_assets_canister.bash b/e2e/tests-dfx/upgrade_assets_canister.bash new file mode 100644 index 0000000000..b27c3a77ce --- /dev/null +++ b/e2e/tests-dfx/upgrade_assets_canister.bash @@ -0,0 +1,51 @@ +#!/usr/bin/env bats + +load ../utils/_ +load ../utils/releases + +setup() { + standard_setup + + dfx_new +} + +teardown() { + dfx_stop + + standard_teardown +} + +# The e2e matrix should ensure that this test is not run on ic-ref, as the Wasm does +# heavy computation +@test "asset canister can be upgraded from the latest release version when storing a lot of data" { + # As a starting point for the load, we looked at OpenChat's usage. + # As of 2023-02-10, they had 40MB of assets spread over 135 files. + # We'll use a bigger example (~3x in number of files, ~20x in total size) to add a safety margin. + local -r total_files=400 + local file_size + if [ "$(uname)" == "Darwin" ]; then + file_size="2m" + else + file_size="2M" + fi + + local -r canister_name=e2e_project_frontend + + local -r asset_dir="src/${canister_name}/assets" + for a in $(seq 1 $total_files); do + dd if=/dev/urandom of="${asset_dir}/large-asset-${a}.bin" bs="$file_size" count=1 1>/dev/null + done + + dfx_start + dfx canister create --all + dfx build + + # Install the canister using the Wasm from the latest release + local -r release_asset_wasm_dir=$(mktemp -d) + get_from_latest_release_tarball src/distributed/assetstorage.wasm.gz "$release_asset_wasm_dir" + export DFX_ASSETS_WASM="${release_asset_wasm_dir}/assetstorage.wasm.gz" + assert_command dfx canister install $canister_name + + use_default_asset_wasm + assert_command dfx deploy $canister_name --upgrade-unchanged +} diff --git a/e2e/utils/releases.bash b/e2e/utils/releases.bash new file mode 100644 index 0000000000..3e93efd781 --- /dev/null +++ b/e2e/utils/releases.bash @@ -0,0 +1,26 @@ +# Print the latest dfx version available on GitHub releases +get_latest_dfx_version() { + latest_version=$(curl -sL --retry 5 --retry-all-errors "https://api.github.com/repos/dfinity/sdk/releases/latest" | jq -r ".tag_name") + echo "$latest_version" +} + +# Extract a particular file from the latest release tarball, and save it to the specified destination +# Usage: get_from_latest_release_tarball +get_from_latest_release_tarball() { + local -r file_path=$1 + local -r destination=$2 + local -r tarball_url=$(curl -sL --retry 5 --retry-all-errors "https://api.github.com/repos/dfinity/sdk/releases/latest" | jq -r ".tarball_url") + + local -r temp_dir=$(mktemp -d) + curl -sL --retry 5 --retry-all-errors "$tarball_url" -o "${temp_dir}/release.tar.gz" || (echo "It's really curl that failed" && return 1) + + if [ "$(uname)" == "Darwin" ]; then + tar -xzf "$temp_dir/release.tar.gz" -C "$temp_dir" "*/$file_path" + elif [ "$(uname)" == "Linux" ]; then + tar -xzf "$temp_dir/release.tar.gz" -C "$temp_dir" --wildcards "*/$file_path" + fi + + local -r file_name=$(basename "$file_path") + local -r extracted_file=$(find "$temp_dir" -type f -name "$file_name") + mv "$extracted_file" "$destination" +} diff --git a/scripts/workflows/e2e-matrix.py b/scripts/workflows/e2e-matrix.py index 8c894a6dad..5b9becd6d2 100755 --- a/scripts/workflows/e2e-matrix.py +++ b/scripts/workflows/e2e-matrix.py @@ -27,6 +27,7 @@ def test_scripts(prefix): {"backend": "ic-ref", "test": "dfx/new"}, {"backend": "ic-ref", "test": "dfx/print"}, {"backend": "ic-ref", "test": "dfx/signals"}, + {"backend": "ic-ref", "test": "dfx/upgrade_assets_canister"}, ], }