Repository: fermyon/spin
Pull request #1114 (2023-02-06 22:02:28)

fix(tinygo): Regenerate canoncial_abi_* methods
This pulls in fixes backported to wit-bindgen-backports that should resolve issues with Tinygo's handling of zero-sized allocations.


Patch:
diff --git a/.dockerignore b/.dockerignore
deleted file mode 100644
index 8bfe8321..00000000
--- a/.dockerignore
+++ /dev/null
@@ -1,5 +0,0 @@
-**/target
-**/node_modules
-tests/testcases/*-generated
-**/spin-plugin-update.lock
-**/package-lock.json
\ No newline at end of file
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 3f16d33a..5579d464 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -77,13 +77,13 @@ jobs:
           shared-key: "${{ runner.os }}-full-${{ hashFiles('./Cargo.lock') }}"
 
       - name: Cargo Build
-        run: cargo build --workspace --release --all-targets --all-features ${{ matrix.config.extraArgs }}
+        run: cargo build --workspace --all-targets --all-features ${{ matrix.config.extraArgs }}
 
       - name: "Archive executable artifact"
         uses: actions/upload-artifact@v3
         with:
           name: spin-${{ matrix.config.os }}
-          path: target/release/spin${{ matrix.config.extension }}
+          path: target/debug/spin${{ matrix.config.extension }}
 
 
   test-rust:
@@ -250,25 +250,3 @@ jobs:
 
       - name: "Test Go SDK"
         run: make test-sdk-go
-
-  e2e-tests:
-    runs-on: ubuntu-22.04
-    needs: build-rust
-    concurrency:
-      group: e2e-tests
-    steps:
-      - uses: actions/checkout@v3
-
-      - name: Retrieve saved Spin Binary
-        uses: actions/download-artifact@v3
-        with:
-          name: spin-ubuntu-latest
-          path: target/release/
-
-      - name: Build e2e tests image
-        run: |
-          docker build -t spin-e2e-tests -f e2e-tests.Dockerfile .
-      - name: Run e2e tests
-        run: |
-          chmod +x `pwd`/target/release/spin
-          docker compose -f e2e-tests-docker-compose.yml run e2e-tests
diff --git a/.github/workflows/deploy-website.yml b/.github/workflows/deploy-website.yml
deleted file mode 100644
index fea15647..00000000
--- a/.github/workflows/deploy-website.yml
+++ /dev/null
@@ -1,141 +0,0 @@
-name: Deploy Spin Docs Website
-
-on:
-  push:
-    branches:
-      - 'main'
-
-  workflow_dispatch:
-    inputs:
-      ref:
-        description: 'Git ref to deploy from (refs/tags/v* for tag)'
-        default: 'refs/heads/main'
-      commit:
-        description: 'Commit SHA to deploy from (optional)'
-      environment:
-        type: choice
-        description: 'Environment to deploy to (Default: canary)'
-        options:
-          - canary
-          - prod
-
-# Construct a concurrency group to be shared across workflow runs.
-# The default behavior ensures that only one is running at a time, with
-# all others queuing and thus not interrupting runs that are in-flight.
-concurrency: ${{ github.workflow }}
-
-permissions:
-  contents: read
-  id-token: write # Allow the workflow to create a JWT for AWS auth
-
-env:
-  JOB: spin-docs
-
-jobs:
-  echo-inputs:
-    runs-on: ubuntu-latest
-    if: ${{ github.event_name == 'workflow_dispatch' }}
-    steps:
-      - name: Echo Inputs
-        run: |
-          echo ref: ${{ github.event.inputs.ref }}
-          echo commit: ${{ github.event.inputs.commit }}
-          echo environment: ${{ github.event.inputs.environment }}
-
-  deploy:
-    runs-on: ubuntu-latest
-    steps:
-      - uses: actions/checkout@v3
-
-      - name: Install Nomad
-        env:
-          NOMAD_VERSION: "1.4.3"
-        run: |
-          curl -Os https://releases.hashicorp.com/nomad/${NOMAD_VERSION}/nomad_${NOMAD_VERSION}_linux_$(dpkg --print-architecture).zip
-          unzip nomad_${NOMAD_VERSION}_linux_$(dpkg --print-architecture).zip -d /usr/local/bin
-          chmod +x /usr/local/bin/nomad
-
-      # This action currently generates a warning due to using deprecated features.
-      # https://github.com/aws-actions/configure-aws-credentials/issues/521 tracks the new behaviour.
-      - name: Configure AWS Credentials
-        uses: aws-actions/configure-aws-credentials@v1
-        with:
-          role-to-assume: arn:aws:iam::${{ secrets.AWS_ACCOUNT_ID }}:role/${{ secrets.INFRA_NAMESPACE }}-${{ secrets.AWS_REGION }}-gha-certs
-          role-session-name: fermyon-developer-deploy
-          aws-region: ${{ secrets.AWS_REGION }}
-
-      - name: Fetch Nomad Certs from S3
-        shell: bash
-        run: |
-          set -euo pipefail
-
-          for cert in infra_ca \
-            api_client_cert_private_key \
-            api_client_cert_public_key; do
-
-            aws s3api get-object \
-              --bucket "infra-certs-${{ secrets.INFRA_NAMESPACE }}-${{ secrets.AWS_REGION }}" \
-              --key "${cert}" \
-              "/tmp/${cert}"
-          done
-
-      - name: Configure Nomad
-        shell: bash
-        run: |
-          echo "NOMAD_CACERT=/tmp/infra_ca" >> $GITHUB_ENV
-          echo "NOMAD_CLIENT_CERT=/tmp/api_client_cert_public_key" >> $GITHUB_ENV
-          echo "NOMAD_CLIENT_KEY=/tmp/api_client_cert_private_key" >> $GITHUB_ENV
-          echo "NOMAD_ADDR=https://nomad.${{ secrets.INFRA_NAMESPACE }}.${{ secrets.AWS_REGION }}.fermyon.link:4646" >> $GITHUB_ENV
-
-      - name: Configure manual deploy
-        if: ${{ github.event_name == 'workflow_dispatch' }}
-        shell: bash
-        run: |
-          echo "GIT_REF=${{ github.event.inputs.ref }}" >> $GITHUB_ENV
-          echo "GIT_SHA=${{ github.event.inputs.commit }}" >> $GITHUB_ENV
-          
-          if [[ "${{ github.event.inputs.environment }}" == "prod" ]]; then
-            echo "PRODUCTION=true" >> $GITHUB_ENV
-            echo "NOMAD_NAMESPACE=prod" >> $GITHUB_ENV
-          else
-            echo "PRODUCTION=false" >> $GITHUB_ENV
-            echo "NOMAD_NAMESPACE=staging" >> $GITHUB_ENV
-          fi
-
-      - name: Configure auto-deploy
-        if: ${{ github.event_name == 'push' }}
-        shell: bash
-        run: |
-          echo "GIT_REF=${{ github.ref }}" >> $GITHUB_ENV
-          echo "GIT_SHA=${{ github.sha }}" >> $GITHUB_ENV
-
-          echo "PRODUCTION=true" >> $GITHUB_ENV
-          echo "NOMAD_NAMESPACE=prod" >> $GITHUB_ENV
-
-      - name: Deploy
-        shell: bash
-        run: |
-          set -euox pipefail
-
-          # purge any lingering/completed publish jobs
-          nomad job inspect publish-${{ env.JOB }} &>/dev/null && \
-            nomad stop -purge -yes publish-${{ env.JOB }}
-
-          # run the publish job
-          nomad run \
-            -var "region=${{ secrets.AWS_REGION }}" \
-            -var "git_ref=${{ env.GIT_REF }}" \
-            -var "commit_sha=${{ env.GIT_SHA }}" \
-            deploy/publish-${{ env.JOB }}.nomad
-
-          # wait for publish job to complete
-          timeout 300s bash -c 'until [[ "$(nomad job inspect publish-${{ env.JOB }} | jq -j '.Job.Status')" == "dead" ]]; do sleep 2; done'
-
-          readonly bindle_id="$(nomad logs -job publish-${{ env.JOB }} | sed -n 's/pushed: //p')"
-
-          # run/update the website job
-          nomad run \
-            -var "region=${{ secrets.AWS_REGION }}" \
-            -var "production=${{ env.PRODUCTION }}" \
-            -var "bindle_id=${bindle_id}" \
-            deploy/${{ env.JOB }}.nomad
diff --git a/.github/workflows/dispatch.yml b/.github/workflows/dispatch.yml
index f7db8bd9..0004e19c 100644
--- a/.github/workflows/dispatch.yml
+++ b/.github/workflows/dispatch.yml
@@ -6,6 +6,35 @@ on:
     tags: ["v*"]
 
 jobs:
+  changes:
+    name: Detect files changed
+    runs-on: ubuntu-latest
+    if: ${{ github.repository_owner == 'fermyon' }}
+    outputs:
+      docs: ${{ steps.filter.outputs.docs }}
+    steps:
+      - uses: actions/checkout@v3
+      - uses: dorny/paths-filter@v2
+        id: filter
+        with:
+          filters: |
+            docs:
+              - 'docs/**'
+
+  dispatch-spin-docs:
+    name: Dispatch spin-docs-updated event
+    needs: changes
+    if: ${{ needs.changes.outputs.docs == 'true' }}
+    runs-on: ubuntu-latest
+    steps:
+      - name: Repository Dispatch
+        uses: peter-evans/repository-dispatch@v2
+        with:
+          token: ${{ secrets.DEST_REPO_ACCESS_TOKEN }}
+          repository: ${{ secrets.DEST_REPO }}
+          event-type: spin-docs-updated
+          client-payload: '{"event_type": "spin-docs-updated", "ref": "${{ github.ref }}", "sha": "${{ github.sha }}"}'
+
   dispatch-rust-docs:
     name: Dispatch rust-docs spin-update event
     runs-on: ubuntu-latest
diff --git a/.gitignore b/.gitignore
index 4e52438e..446ae14d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,7 +8,3 @@ main.wasm
 .vscode/*.log
 tests/**/Cargo.lock
 crates/**/Cargo.lock
-Cargo.lock
-tests/testcases/*-generated
-spin-plugin-update.lock
-package-lock.json
diff --git a/Cargo.lock b/Cargo.lock
index 6255c46e..f3daf2d9 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -97,9 +97,9 @@ dependencies = [
 
 [[package]]
 name = "async-trait"
-version = "0.1.64"
+version = "0.1.63"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1cd7fce9ba8c3c042128ce72d8b2ddbf3a05747efb67ea0313c635e10bda47a2"
+checksum = "eff18d764974428cf3a9328e23fc5c986f5fbed46e6cd4cdf42544df5d297ec1"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -375,9 +375,9 @@ checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"
 
 [[package]]
 name = "bytes"
-version = "1.4.0"
+version = "1.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be"
+checksum = "dfb24e866b15a1af2a1b663f10c6b6b8f397a84aadb828f12e5b289ec23a3a3c"
 
 [[package]]
 name = "cap-fs-ext"
@@ -460,9 +460,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5"
 
 [[package]]
 name = "cc"
-version = "1.0.79"
+version = "1.0.78"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f"
+checksum = "a20104e2335ce8a659d6dd92a51a767a0c062599c73b343fd152cb401e828c3d"
 dependencies = [
  "jobserver",
 ]
@@ -1241,20 +1241,6 @@ version = "1.0.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "0bd4b30a6560bbd9b4620f4de34c3f14f60848e58a9b7216801afcb4c7b31c3c"
 
-[[package]]
-name = "e2e-testing"
-version = "0.8.0"
-dependencies = [
- "anyhow",
- "async-trait",
- "hyper",
- "nix 0.26.2",
- "regex",
- "reqwest",
- "tokio",
- "url",
-]
-
 [[package]]
 name = "ed25519"
 version = "1.5.3"
@@ -1543,9 +1529,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c"
 
 [[package]]
 name = "futures"
-version = "0.3.26"
+version = "0.3.25"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "13e2792b0ff0340399d58445b88fd9770e3489eff258a4cbc1523418f12abf84"
+checksum = "38390104763dc37a5145a53c29c63c1290b5d316d6086ec32c293f6736051bb0"
 dependencies = [
  "futures-channel",
  "futures-core",
@@ -1558,9 +1544,9 @@ dependencies = [
 
 [[package]]
 name = "futures-channel"
-version = "0.3.26"
+version = "0.3.25"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2e5317663a9089767a1ec00a487df42e0ca174b61b4483213ac24448e4664df5"
+checksum = "52ba265a92256105f45b719605a571ffe2d1f0fea3807304b522c1d778f79eed"
 dependencies = [
  "futures-core",
  "futures-sink",
@@ -1568,15 +1554,15 @@ dependencies = [
 
 [[package]]
 name = "futures-core"
-version = "0.3.26"
+version = "0.3.25"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ec90ff4d0fe1f57d600049061dc6bb68ed03c7d2fbd697274c41805dcb3f8608"
+checksum = "04909a7a7e4633ae6c4a9ab280aeb86da1236243a77b694a49eacd659a4bd3ac"
 
 [[package]]
 name = "futures-executor"
-version = "0.3.26"
+version = "0.3.25"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e8de0a35a6ab97ec8869e32a2473f4b1324459e14c29275d14b10cb1fd19b50e"
+checksum = "7acc85df6714c176ab5edf386123fafe217be88c0840ec11f199441134a074e2"
 dependencies = [
  "futures-core",
  "futures-task",
@@ -1585,15 +1571,15 @@ dependencies = [
 
 [[package]]
 name = "futures-io"
-version = "0.3.26"
+version = "0.3.25"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bfb8371b6fb2aeb2d280374607aeabfc99d95c72edfe51692e42d3d7f0d08531"
+checksum = "00f5fb52a06bdcadeb54e8d3671f8888a39697dcb0b81b23b55174030427f4eb"
 
 [[package]]
 name = "futures-macro"
-version = "0.3.26"
+version = "0.3.25"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "95a73af87da33b5acf53acfebdc339fe592ecf5357ac7c0a7734ab9d8c876a70"
+checksum = "bdfb8ce053d86b91919aad980c220b1fb8401a9394410e1c289ed7e66b61835d"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -1602,21 +1588,21 @@ dependencies = [
 
 [[package]]
 name = "futures-sink"
-version = "0.3.26"
+version = "0.3.25"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f310820bb3e8cfd46c80db4d7fb8353e15dfff853a127158425f31e0be6c8364"
+checksum = "39c15cf1a4aa79df40f1bb462fb39676d0ad9e366c2a33b590d7c66f4f81fcf9"
 
 [[package]]
 name = "futures-task"
-version = "0.3.26"
+version = "0.3.25"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dcf79a1bf610b10f42aea489289c5a2c478a786509693b80cd39c44ccd936366"
+checksum = "2ffb393ac5d9a6eaa9d3fdf37ae2776656b706e200c8e16b1bdb227f5198e6ea"
 
 [[package]]
 name = "futures-util"
-version = "0.3.26"
+version = "0.3.25"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9c1d6de3acfef38d2be4b1f543f553131788603495be83da675e180c8d6b7bd1"
+checksum = "197676987abd2f9cadff84926f410af1c183608d36641465df73ae8211dc65d6"
 dependencies = [
  "futures-channel",
  "futures-core",
@@ -1857,9 +1843,9 @@ dependencies = [
 
 [[package]]
 name = "http-auth"
-version = "0.1.8"
+version = "0.1.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5430cacd7a1f9a02fbeb350dfc81a0e5ed42d81f3398cb0ba184017f85bdcfbc"
+checksum = "3d4ad8df7ddb631856ed3e5a385b781ae8d731727ae5dd7c5aa4784bfa878405"
 dependencies = [
  "memchr",
 ]
@@ -2621,8 +2607,6 @@ dependencies = [
  "bitflags",
  "cfg-if",
  "libc",
- "memoffset 0.7.1",
- "pin-utils",
  "static_assertions",
 ]
 
@@ -3811,9 +3795,9 @@ checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b"
 
 [[package]]
 name = "security-framework"
-version = "2.8.2"
+version = "2.8.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a332be01508d814fed64bf28f798a146d73792121129962fdf335bb3c49a4254"
+checksum = "7c4437699b6d34972de58652c68b98cb5b53a4199ab126db8e20ec8ded29a721"
 dependencies = [
  "bitflags",
  "core-foundation",
@@ -3912,9 +3896,9 @@ dependencies = [
 
 [[package]]
 name = "serde_spanned"
-version = "0.6.1"
+version = "0.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0efd8caf556a6cebd3b285caf480045fcc1ac04f6bd786b09a6f11af30c4fcf4"
+checksum = "2c68e921cef53841b8925c2abadd27c9b891d9613bdc43d6b823062866df38e8"
 dependencies = [
  "serde",
 ]
@@ -4183,7 +4167,6 @@ dependencies = [
  "dialoguer 0.10.3",
  "dirs 4.0.0",
  "dunce",
- "e2e-testing",
  "futures",
  "hippo",
  "hippo-openapi",
@@ -4783,9 +4766,9 @@ dependencies = [
 
 [[package]]
 name = "tokio"
-version = "1.25.0"
+version = "1.24.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c8e00990ebabbe4c14c08aca901caed183ecd5c09562a12c824bb53d3c3fd3af"
+checksum = "597a12a59981d9e3c38d216785b0c37399f6e415e8d0712047620f189371b0bb"
 dependencies = [
  "autocfg",
  "bytes",
@@ -4943,9 +4926,9 @@ dependencies = [
 
 [[package]]
 name = "toml_edit"
-version = "0.18.1"
+version = "0.18.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "56c59d8dd7d0dcbc6428bf7aa2f0e823e26e43b3c9aca15bbc9475d23e5fa12b"
+checksum = "729bfd096e40da9c001f778f5cdecbd2957929a24e10e5883d9392220a751581"
 dependencies = [
  "indexmap",
  "nom8",
@@ -5094,9 +5077,9 @@ dependencies = [
 
 [[package]]
 name = "unicode-segmentation"
-version = "1.10.1"
+version = "1.10.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36"
+checksum = "0fdbf052a0783de01e944a6ce7a8cb939e295b1e7be835a1112c3b9a7f047a5a"
 
 [[package]]
 name = "unicode-width"
@@ -5130,9 +5113,9 @@ dependencies = [
 
 [[package]]
 name = "uuid"
-version = "1.3.0"
+version = "1.2.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1674845326ee10d37ca60470760d4288a6f80f304007d92e5c53bab78c9cfd79"
+checksum = "422ee0de9031b5b948b97a8fc04e3aa35230001a722ddd27943e0be31564ce4c"
 dependencies = [
  "serde",
 ]
@@ -6060,9 +6043,9 @@ dependencies = [
 
 [[package]]
 name = "zstd-sys"
-version = "2.0.6+zstd.1.5.2"
+version = "2.0.5+zstd.1.5.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "68a3f9792c0c3dc6c165840a75f47ae1f4da402c2d006881129579f6597e801b"
+checksum = "edc50ffce891ad571e9f9afe5039c4837bede781ac4bb13052ed7ae695518596"
 dependencies = [
  "cc",
  "libc",
diff --git a/Cargo.toml b/Cargo.toml
index 99a6f495..f2c723bb 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -71,7 +71,6 @@ openssl = { version = "0.10" }
 hyper = { version = "0.14", features = ["full"] }
 sha2 = "0.10.1"
 which = "4.2.5"
-e2e-testing = { path = "crates/e2e-testing" }
 
 [build-dependencies]
 cargo-target-dep = { git = "https://github.com/fermyon/cargo-target-dep", rev = "b7b1989fe0984c0f7c4966398304c6538e52fe49" }
@@ -87,7 +86,6 @@ outbound-redis-tests = []
 config-provider-tests = []
 outbound-pg-tests = []
 outbound-mysql-tests = []
-new-e2e-tests = []
 
 [workspace]
 members = [
@@ -108,7 +106,6 @@ members = [
   "crates/trigger",
   "sdk/rust",
   "sdk/rust/macro",
-  "crates/e2e-testing"
 ]
 
 [workspace.dependencies]
diff --git a/Makefile b/Makefile
index 17783cd5..703a9717 100644
--- a/Makefile
+++ b/Makefile
@@ -22,16 +22,16 @@ check-rust-examples:
 
 .PHONY: test-unit
 test-unit:
-	RUST_LOG=$(LOG_LEVEL) cargo test --all --no-fail-fast -- --skip integration_tests --skip spinup_tests --skip cloud_tests --nocapture
+	RUST_LOG=$(LOG_LEVEL) cargo test --all --no-fail-fast -- --skip integration_tests --nocapture
 
 .PHONY: test-integration
 test-integration:
-	RUST_LOG=$(LOG_LEVEL) cargo test --test integration --no-fail-fast -- --skip spinup_tests --skip cloud_tests --nocapture
+	RUST_LOG=$(LOG_LEVEL) cargo test --test integration --no-fail-fast -- --nocapture
 
 .PHONY: test-e2e
 test-e2e:
-	RUST_LOG=$(LOG_LEVEL) cargo test --test integration --features e2e-tests --no-fail-fast  -- integration_tests::test_dependencies --skip spinup_tests --skip cloud_tests --nocapture
-	RUST_LOG=$(LOG_LEVEL) cargo test --test integration --features e2e-tests --no-fail-fast -- --skip integration_tests::test_dependencies --skip spinup_tests --skip cloud_tests --nocapture
+	RUST_LOG=$(LOG_LEVEL) cargo test --test integration --features e2e-tests --no-fail-fast  -- integration_tests::test_dependencies --nocapture
+	RUST_LOG=$(LOG_LEVEL) cargo test --test integration --features e2e-tests --no-fail-fast -- --skip integration_tests::test_dependencies --nocapture
 
 .PHONY: test-outbound-redis
 test-outbound-redis:
diff --git a/crates/templates/src/source.rs b/crates/templates/src/source.rs
index 2edd8703..593a32c8 100644
--- a/crates/templates/src/source.rs
+++ b/crates/templates/src/source.rs
@@ -74,16 +74,6 @@ impl TemplateSource {
             }
         }
     }
-
-    // Sorry I know this is a bit ugly
-    /// For a Git source, resolves the tag to use as the source.
-    /// For other sources, returns None.
-    pub async fn resolved_tag(&self) -> Option<String> {
-        match self {
-            Self::Git(g) => version_matched_tag(g.url.as_str(), &g.spin_version).await,
-            _ => None,
-        }
-    }
 }
 
 pub(crate) struct LocalTemplateSource {
diff --git a/crates/templates/src/template.rs b/crates/templates/src/template.rs
index 0ea422df..88aeda6c 100644
--- a/crates/templates/src/template.rs
+++ b/crates/templates/src/template.rs
@@ -66,14 +66,6 @@ impl TemplateVariantInfo {
             Self::AddComponent { .. } => "add component",
         }
     }
-
-    /// The noun that should be used for the variant in a prompt
-    pub fn prompt_noun(&self) -> &'static str {
-        match self {
-            Self::NewApplication => "application",
-            Self::AddComponent { .. } => "component",
-        }
-    }
 }
 
 #[derive(Clone, Debug, Default)]
@@ -171,17 +163,6 @@ impl Template {
         }
     }
 
-    /// The Git repository from which the template was installed, if
-    /// it was installed from Git; otherwise None.
-    pub fn source_repo(&self) -> Option<&str> {
-        // TODO: this is kind of specialised - should we do the discarding of
-        // non-Git sources at the application layer?
-        match &self.installed_from {
-            InstalledFrom::Git(url) => Some(url),
-            _ => None,
-        }
-    }
-
     /// A human-readable description of where the template was installed
     /// from.
     pub fn installed_from_or_empty(&self) -> &str {
diff --git a/deploy/README.md b/deploy/README.md
deleted file mode 100644
index dc32f8d3..00000000
--- a/deploy/README.md
+++ /dev/null
@@ -1,21 +0,0 @@
-# Deployments
-
-The [Spin Docs](https://spin.fermyon.dev) website is deployed via the [deploy-website.yaml](../.github/workflows/deploy-website.yml) GitHub workflow.
-
-(Note: currently this website consists of redirects to the Spin Docs hosted on Fermyon's [Developer site](https://developer.fermyon.com/spin))
-
-## Auto Deploys
-
-The production version of the website is deployed whenever commits are pushed to the `main` branch.
-
-## Manual Deploys
-
-Deployments may also be [triggered manually](https://github.com/fermyon/spin/actions/workflows/deploy-website.yml), providing a choice of `ref`, `sha` and `environment` (eg canary or prod).
-
-## Nomad jobs
-
-We currently deploy the website via its Nomad job directly. (In the future, we envision running the website as a Fermyon Cloud app.)
-
-The [publish-spin-docs](./publish-spin-docs.nomad) Nomad job checks out this repo's source code and publishes it to Bindle.
-
-The [spin-docs](./spin-docs.nomad) Nomad job contains configuration for the running website, including the bindle ID to run from.
\ No newline at end of file
diff --git a/deploy/publish-spin-docs.nomad b/deploy/publish-spin-docs.nomad
deleted file mode 100644
index a1052993..00000000
--- a/deploy/publish-spin-docs.nomad
+++ /dev/null
@@ -1,78 +0,0 @@
-variable "region" {
-  type    = string
-}
-
-variable "git_ref" {
-  type        = string
-  default     = "refs/heads/main"
-  description = "Git ref to use for the spin repo clone. Default: refs/heads/main"
-}
-
-variable "commit_sha" {
-  type        = string
-  default     = ""
-  description = "Specific commit SHA to check out. Default: empty/none"
-}
-
-job "publish-spin-docs" {
-  type        = "batch"
-  datacenters = [
-    "${var.region}a",
-    "${var.region}b",
-    "${var.region}c",
-    "${var.region}d",
-    "${var.region}e",
-    "${var.region}f"
-  ]
-
-  group "publish-spin-docs" {
-    count = 1
-
-    task "publish-spin-docs" {
-      driver = "exec"
-
-      artifact {
-        source = "https://github.com/fermyon/spin/releases/download/v0.8.0/spin-v0.8.0-linux-amd64.tar.gz"
-        options {
-          checksum = "sha256:0ef31fe6e2b4d34ddd089b01a1f88820f88c456276bfe4e1477836a6087654c1"
-        }
-      }
-
-      env {
-        BINDLE_URL = "http://bindle.service.consul:3030/v1"
-      }
-
-      template {
-        data = <<-EOF
-        #!/bin/bash
-        set -euo pipefail
-
-        readonly repo_dir="${NOMAD_ALLOC_DIR}/spin"
-
-        # Capture branch/tag name from full ref
-        readonly branch="$(echo ${var.git_ref} | cut -d'/' -f3-)"
-        
-        # Directory and contents may be non-empty if this job is retrying while the
-        # bindle server is still coming up. (git clone will complain)
-        rm -rf ${repo_dir}
-        git clone -b ${branch} https://github.com/fermyon/spin.git ${repo_dir}
-        cd ${repo_dir}/docs
-
-        # Check out commit if provided
-        [[ "${var.commit_sha}" == "" ]] || git checkout ${var.commit_sha}
-
-        ${NOMAD_TASK_DIR}/spin bindle push \
-          -f spin.toml \
-          -d ./staging_dir \
-          --buildinfo "g$(git rev-parse HEAD)-$(date '+%Y%m%d%M%H%M%S')"
-        EOF
-        destination = "${NOMAD_TASK_DIR}/publish.bash"
-        perms       = "700"
-      }
-
-      config {
-        command = "${NOMAD_TASK_DIR}/publish.bash"
-      }
-    }
-  }
-}
\ No newline at end of file
diff --git a/deploy/spin-docs.nomad b/deploy/spin-docs.nomad
deleted file mode 100644
index d1816610..00000000
--- a/deploy/spin-docs.nomad
+++ /dev/null
@@ -1,135 +0,0 @@
-variable "region" {
-  type    = string
-}
-
-variable "production" {
-  type        = bool
-  default     = false
-  description = "Whether or not this job should run in production mode. Default: false."
-}
-
-variable "dns_domain" {
-  type        = string
-  default     = "fermyon.dev"
-  description = "The root DNS domain for the Spin docs website, e.g. fermyon.dev, fermyon.link"
-}
-
-variable "hostname" {
-  type        = string
-  default     = null
-  description = "An alternative hostname to use (defaults are <canary>.spin.<dns_domain>})"
-}
-
-variable "letsencrypt_env" {
-  type    = string
-  default = "prod"
-  description = <<EOF
-The Let's Encrypt cert resolver to use. Options are 'staging' and 'prod'. (Default: prod)
-
-With the letsencrypt-prod cert resolver, we're limited to *5 requests per week* for a cert with matching domain and SANs.
-For testing/staging, it is recommended to use letsencrypt-staging, which has vastly increased limits.
-EOF
-
-  validation {
-    condition     = var.letsencrypt_env == "staging" || var.letsencrypt_env == "prod"
-    error_message = "The Let's Encrypt env must be either 'staging' or 'prod'."
-  }
-}
-
-variable "bindle_id" {
-  type        = string
-  default     = "spin-docs/0.1.0"
-  description = "A bindle id, such as foo/bar/1.2.3"
-}
-
-locals {
-  hostname = "${var.hostname == null ? "${var.production == true ? "spin.${var.dns_domain}" : "canary.spin.${var.dns_domain}"}" : var.hostname}"
-}
-
-job "spin-docs" {
-  type = "service"
-  datacenters = [
-    "${var.region}a",
-    "${var.region}b",
-    "${var.region}c",
-    "${var.region}d",
-    "${var.region}e",
-    "${var.region}f"
-  ]
-
-  group "spin-docs" {
-    count = 3
-
-    update {
-      max_parallel      = 1
-      canary            = 3
-      min_healthy_time  = "10s"
-      healthy_deadline  = "10m"
-      progress_deadline = "15m"
-      auto_revert       = true
-      auto_promote      = true
-    }
-
-    network {
-      port "http" {}
-    }
-
-    service {
-      name = "spin-docs-${NOMAD_NAMESPACE}"
-      port = "http"
-
-      tags = [
-        "traefik.enable=true",
-        "traefik.http.routers.spin-docs-${NOMAD_NAMESPACE}.rule=Host(`${local.hostname}`)",
-        "traefik.http.routers.spin-docs-${NOMAD_NAMESPACE}.entryPoints=websecure",
-        "traefik.http.routers.spin-docs-${NOMAD_NAMESPACE}.tls=true",
-        "traefik.http.routers.spin-docs-${NOMAD_NAMESPACE}.tls.certresolver=letsencrypt-cf-${var.letsencrypt_env}",
-        "traefik.http.routers.spin-docs-${NOMAD_NAMESPACE}.tls.domains[0].main=${local.hostname}"
-      ]
-
-      check {
-        type     = "http"
-        path     = "/.well-known/spin/health"
-        interval = "10s"
-        timeout  = "2s"
-      }
-    }
-
-    task "server" {
-      driver = "exec"
-
-      artifact {
-        source = "https://github.com/fermyon/spin/releases/download/v0.8.0/spin-v0.8.0-linux-amd64.tar.gz"
-        options {
-          checksum = "sha256:0ef31fe6e2b4d34ddd089b01a1f88820f88c456276bfe4e1477836a6087654c1"
-        }
-      }
-
-      # Canary spin binary for running the canary site
-      artifact {
-        source = "https://github.com/fermyon/spin/releases/download/canary/spin-canary-linux-amd64.tar.gz"
-        destination = "{NOMAD_ALLOC_DIR}/canary"
-      }
-
-      env {
-        RUST_LOG   = "spin=trace"
-        BINDLE_URL = "http://bindle.service.consul:3030/v1"
-        BASE_URL   = "https://${local.hostname}"
-      }
-
-      config {
-        command = var.production ? "spin" : "{NOMAD_ALLOC_DIR}/canary/spin"
-        args = [
-          "up",
-          "--listen", "${NOMAD_IP_http}:${NOMAD_PORT_http}",
-          "--bindle", var.bindle_id,
-          "--log-dir", "${NOMAD_ALLOC_DIR}/logs",
-          "--temp", "${NOMAD_ALLOC_DIR}/tmp",
-
-          # Set BASE_URL for Bartholomew to override default (localhost:3000)
-          "-e", "BASE_URL=${BASE_URL}",
-        ]
-      }
-    }
-  }
-}
diff --git a/sdk/go/config/spin-config.c b/sdk/go/config/spin-config.c
index c443cce0..b2d1ab02 100644
--- a/sdk/go/config/spin-config.c
+++ b/sdk/go/config/spin-config.c
@@ -5,9 +5,11 @@ __attribute__((weak, export_name("canonical_abi_realloc")))
 void *canonical_abi_realloc(
 void *ptr,
 size_t orig_size,
-size_t org_align,
+size_t align,
 size_t new_size
 ) {
+  if (new_size == 0)
+  return (void*) align;
   void *ret = realloc(ptr, new_size);
   if (!ret)
   abort();
@@ -20,6 +22,8 @@ void *ptr,
 size_t size,
 size_t align
 ) {
+  if (size == 0)
+  return;
   free(ptr);
 }
 #include <string.h>
diff --git a/sdk/go/http/spin-http.c b/sdk/go/http/spin-http.c
index 5f4a644b..780a4adf 100644
--- a/sdk/go/http/spin-http.c
+++ b/sdk/go/http/spin-http.c
@@ -5,9 +5,11 @@ __attribute__((weak, export_name("canonical_abi_realloc")))
 void *canonical_abi_realloc(
 void *ptr,
 size_t orig_size,
-size_t org_align,
+size_t align,
 size_t new_size
 ) {
+  if (new_size == 0)
+  return (void*) align;
   void *ret = realloc(ptr, new_size);
   if (!ret)
   abort();
@@ -20,6 +22,8 @@ void *ptr,
 size_t size,
 size_t align
 ) {
+  if (size == 0)
+  return;
   free(ptr);
 }
 #include <string.h>
diff --git a/sdk/go/http/wasi-outbound-http.c b/sdk/go/http/wasi-outbound-http.c
index d8d91963..f7675850 100644
--- a/sdk/go/http/wasi-outbound-http.c
+++ b/sdk/go/http/wasi-outbound-http.c
@@ -5,9 +5,11 @@ __attribute__((weak, export_name("canonical_abi_realloc")))
 void *canonical_abi_realloc(
 void *ptr,
 size_t orig_size,
-size_t org_align,
+size_t align,
 size_t new_size
 ) {
+  if (new_size == 0)
+  return (void*) align;
   void *ret = realloc(ptr, new_size);
   if (!ret)
   abort();
@@ -20,6 +22,8 @@ void *ptr,
 size_t size,
 size_t align
 ) {
+  if (size == 0)
+  return;
   free(ptr);
 }
 #include <string.h>
diff --git a/sdk/go/redis/outbound-redis.c b/sdk/go/redis/outbound-redis.c
index 54967500..b9e3958a 100644
--- a/sdk/go/redis/outbound-redis.c
+++ b/sdk/go/redis/outbound-redis.c
@@ -5,9 +5,11 @@ __attribute__((weak, export_name("canonical_abi_realloc")))
 void *canonical_abi_realloc(
 void *ptr,
 size_t orig_size,
-size_t org_align,
+size_t align,
 size_t new_size
 ) {
+  if (new_size == 0)
+  return (void*) align;
   void *ret = realloc(ptr, new_size);
   if (!ret)
   abort();
@@ -20,6 +22,8 @@ void *ptr,
 size_t size,
 size_t align
 ) {
+  if (size == 0)
+  return;
   free(ptr);
 }
 #include <string.h>
diff --git a/sdk/go/redis/spin-redis.c b/sdk/go/redis/spin-redis.c
index 9e7876b4..b9e0ea8e 100644
--- a/sdk/go/redis/spin-redis.c
+++ b/sdk/go/redis/spin-redis.c
@@ -5,9 +5,11 @@ __attribute__((weak, export_name("canonical_abi_realloc")))
 void *canonical_abi_realloc(
 void *ptr,
 size_t orig_size,
-size_t org_align,
+size_t align,
 size_t new_size
 ) {
+  if (new_size == 0)
+  return (void*) align;
   void *ret = realloc(ptr, new_size);
   if (!ret)
   abort();
@@ -20,6 +22,8 @@ void *ptr,
 size_t size,
 size_t align
 ) {
+  if (size == 0)
+  return;
   free(ptr);
 }
 void spin_redis_payload_free(spin_redis_payload_t *ptr) {
diff --git a/src/commands/new.rs b/src/commands/new.rs
index 4591f30f..5b581a47 100644
--- a/src/commands/new.rs
+++ b/src/commands/new.rs
@@ -116,7 +116,7 @@ impl TemplateNewCommandCore {
                     return Ok(());
                 }
             },
-            None => match prompt_template(&template_manager, &variant).await? {
+            None => match prompt_template(&template_manager).await? {
                 Some(template) => template,
                 None => return Ok(()),
             },
@@ -133,7 +133,7 @@ impl TemplateNewCommandCore {
 
         let name = match &self.name {
             Some(name) => name.to_owned(),
-            None => prompt_name(&variant).await?,
+            None => prompt_name().await?,
         };
 
         let output_path = self.output_path.clone().unwrap_or_else(|| path_safe(&name));
@@ -201,10 +201,7 @@ fn merge_values(from_file: &mut HashMap<String, String>, from_cli: &[ParameterVa
     }
 }
 
-async fn prompt_template(
-    template_manager: &TemplateManager,
-    variant: &TemplateVariantInfo,
-) -> anyhow::Result<Option<Template>> {
+async fn prompt_template(template_manager: &TemplateManager) -> anyhow::Result<Option<Template>> {
     let mut templates = match list_or_install_templates(template_manager).await? {
         Some(t) => t,
         None => return Ok(None),
@@ -213,10 +210,8 @@ async fn prompt_template(
         .iter()
         .map(|t| format!("{} ({})", t.id(), t.description_or_empty()))
         .collect::<Vec<_>>();
-    let noun = variant.prompt_noun();
-    let prompt = format!("Pick a template to start your {noun} with");
     let index = match dialoguer::Select::new()
-        .with_prompt(prompt)
+        .with_prompt("Pick a template to start your project with")
         .items(&opts)
         .default(0)
         .interact_opt()?
@@ -239,15 +234,14 @@ async fn list_or_install_templates(
     }
 }
 
-async fn prompt_name(variant: &TemplateVariantInfo) -> anyhow::Result<String> {
-    let noun = variant.prompt_noun();
-    let mut prompt = format!("Enter a name for your new {noun}");
+async fn prompt_name() -> anyhow::Result<String> {
+    let mut prompt = "Enter a name for your new project";
     loop {
         let result = dialoguer::Input::<String>::new()
             .with_prompt(prompt)
             .interact_text()?;
         if result.trim().is_empty() {
-            prompt = format!("Name is required. Try another {noun} name (or Crl+C to exit)");
+            prompt = "Name is required. Try another project name (or Ctrl+C to exit)";
             continue;
         } else {
             return Ok(result);
@@ -257,7 +251,7 @@ async fn prompt_name(variant: &TemplateVariantInfo) -> anyhow::Result<String> {
 
 lazy_static::lazy_static! {
     static ref PATH_UNSAFE_CHARACTERS: regex::Regex = regex::Regex::new("[^-_.a-zA-Z0-9]").expect("Invalid path safety regex");
-    static ref NAME: regex::Regex = regex::Regex::new("^[a-zA-Z].*").expect("Invalid name regex");
+    static ref PROJECT_NAME: regex::Regex = regex::Regex::new("^[a-zA-Z].*").expect("Invalid project name regex");
 }
 
 fn path_safe(text: &str) -> PathBuf {
@@ -266,7 +260,7 @@ fn path_safe(text: &str) -> PathBuf {
 }
 
 fn validate_name(name: &str) -> Result<String, String> {
-    if NAME.is_match(name) {
+    if PROJECT_NAME.is_match(name) {
         Ok(name.to_owned())
     } else {
         Err("Name must start with a letter".to_owned())
diff --git a/src/commands/templates.rs b/src/commands/templates.rs
index b9b1bcff..c1d01240 100644
--- a/src/commands/templates.rs
+++ b/src/commands/templates.rs
@@ -1,4 +1,4 @@
-use std::{collections::HashSet, path::PathBuf};
+use std::path::PathBuf;
 
 use anyhow::{Context, Result};
 use clap::{Parser, Subcommand, ValueEnum};
@@ -13,7 +13,6 @@ use spin_templates::{
 
 const INSTALL_FROM_DIR_OPT: &str = "FROM_DIR";
 const INSTALL_FROM_GIT_OPT: &str = "FROM_GIT";
-const UPGRADE_ONLY: &str = "GIT_URL";
 
 const DEFAULT_TEMPLATES_INSTALL_PROMPT: &str =
     "You don't have any templates yet. Would you like to install the default set?";
@@ -28,12 +27,6 @@ pub enum TemplateCommands {
     /// directory in your data or home directory.
     Install(Install),
 
-    /// Upgrade templates to match your current version of Spin.
-    ///
-    /// The files of the templates are copied to the local template store: a
-    /// directory in your data or home directory.
-    Upgrade(Upgrade),
-
     /// Remove a template from your installation.
     Uninstall(Uninstall),
 
@@ -45,7 +38,6 @@ impl TemplateCommands {
     pub async fn run(self) -> Result<()> {
         match self {
             TemplateCommands::Install(cmd) => cmd.run().await,
-            TemplateCommands::Upgrade(cmd) => cmd.run().await,
             TemplateCommands::Uninstall(cmd) => cmd.run().await,
             TemplateCommands::List(cmd) => cmd.run().await,
         }
@@ -77,34 +69,10 @@ pub struct Install {
     pub dir: Option<PathBuf>,
 
     /// If present, updates existing templates instead of skipping.
-    #[clap(long = "upgrade", alias = "update")]
+    #[structopt(long = "update")]
     pub update: bool,
 }
 
-/// Upgrade existing template repositories from their source.
-#[derive(Parser, Debug)]
-pub struct Upgrade {
-    /// By default, Spin displays the list of installed repositories and
-    /// prompts you to choose which to upgrade.  Pass this flag to
-    /// upgrade only the specified repository without prompting.
-    #[clap(
-        name = UPGRADE_ONLY,
-        long = "repo",
-    )]
-    pub git: Option<String>,
-
-    /// The optional branch of the git repository, if a specific
-    /// repository is given.
-    #[clap(long = "branch", requires = UPGRADE_ONLY)]
-    pub branch: Option<String>,
-
-    /// By default, Spin displays the list of installed repositories and
-    /// prompts you to choose which to upgrade.  Pass this flag to
-    /// upgrade all repositories without prompting.
-    #[clap(long = "all", conflicts_with = UPGRADE_ONLY)]
-    pub all: bool,
-}
-
 /// Remove a template from your installation.
 #[derive(Parser, Debug)]
 pub struct Uninstall {
@@ -179,200 +147,6 @@ impl Install {
     }
 }
 
-impl Upgrade {
-    pub async fn run(&self) -> Result<()> {
-        if self.git.is_some() {
-            // This is equivalent to `install --update`
-            let install = Install {
-                git: self.git.clone(),
-                branch: self.branch.clone(),
-                dir: None,
-                update: true,
-            };
-
-            install.run().await
-        } else {
-            let template_manager = TemplateManager::try_default()?;
-            let reporter = ConsoleProgressReporter;
-            let options = InstallOptions::default().update(true);
-
-            let selected_sources = match self.repos_to_upgrade(&template_manager).await? {
-                Some(sources) => sources,
-                None => return Ok(()),
-            };
-
-            let mut summary = UpgradeSummary::new();
-
-            for source in selected_sources {
-                println!("Upgrading templates from {}...", source.repo);
-
-                let installation_results = template_manager
-                    .install(&source.template_source, &options, &reporter)
-                    .await;
-
-                summary.extend_with(&source.repo, installation_results);
-
-                println!();
-            }
-
-            self.print_upgrade_summary(&summary);
-
-            Ok(())
-        }
-    }
-
-    async fn repos_to_upgrade(
-        &self,
-        template_manager: &TemplateManager,
-    ) -> anyhow::Result<Option<Vec<RepoSelection>>> {
-        let existing_templates = template_manager.list().await?.templates;
-        let repos = existing_templates
-            .iter()
-            .filter_map(|t| t.source_repo())
-            .collect::<HashSet<_>>();
-
-        let mut sources = vec![];
-        for repo in repos {
-            if let Some(source) = RepoSelection::from_repo(repo).await {
-                sources.push(source);
-            }
-        }
-
-        if sources.is_empty() {
-            eprintln!("No template repositories found to upgrade");
-            return Ok(None);
-        }
-
-        let selected_sources = if self.all {
-            sources
-        } else {
-            let selected_indexes = match dialoguer::MultiSelect::new()
-                .items(&sources)
-                .interact_opt()?
-            {
-                Some(indexes) => indexes,
-                None => return Ok(None),
-            };
-            elements_at(sources, selected_indexes)
-        };
-
-        if selected_sources.is_empty() {
-            eprintln!("No template repositories selected");
-            return Ok(None);
-        }
-        Ok(Some(selected_sources))
-    }
-
-    fn print_upgrade_summary(&self, summary: &UpgradeSummary) {
-        let templates = &summary.upgraded;
-        let errors = &summary.errored_repos;
-
-        if templates.is_empty() {
-            println!("No templates were installed");
-        } else {
-            println!("Upgraded {} template(s)", templates.len());
-
-            let mut table = Table::new();
-            table.set_header(vec!["Name", "Description"]);
-            table.load_preset(comfy_table::presets::ASCII_BORDERS_ONLY_CONDENSED);
-
-            for template in templates {
-                table.add_row(vec![template.id(), template.description_or_empty()]);
-            }
-
-            println!();
-            println!("{}", table);
-        }
-
-        println!();
-
-        if !errors.is_empty() {
-            // Thanks English
-            println!("Errors upgrading {} repository/ies", errors.len());
-
-            let mut table = Table::new();
-            table.set_header(vec!["URL", "Error"]);
-            table.load_preset(comfy_table::presets::ASCII_BORDERS_ONLY_CONDENSED);
-
-            for (url, error) in errors {
-                table.add_row(vec![url, error]);
-            }
-
-            println!();
-            println!("{}", table);
-            println!();
-        }
-    }
-}
-
-struct RepoSelection {
-    repo: String,
-    template_source: TemplateSource,
-    resolved_tag: Option<String>,
-}
-
-impl RepoSelection {
-    async fn from_repo(repo: &str) -> Option<Self> {
-        let template_source =
-            TemplateSource::try_from_git(repo, &None, env!("VERGEN_BUILD_SEMVER")).ok()?;
-        let resolved_tag = template_source.resolved_tag().await;
-        Some(Self {
-            repo: repo.to_owned(),
-            template_source,
-            resolved_tag,
-        })
-    }
-}
-
-impl std::fmt::Display for RepoSelection {
-    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        f.write_fmt(format_args!("{}", self.repo))?;
-        if let Some(tag) = &self.resolved_tag {
-            f.write_fmt(format_args!(" (at {tag})"))?;
-        };
-        Ok(())
-    }
-}
-
-fn elements_at<T>(source: Vec<T>, indexes: Vec<usize>) -> Vec<T> {
-    source
-        .into_iter()
-        .enumerate()
-        .filter_map(|(index, s)| {
-            if indexes.contains(&index) {
-                Some(s)
-            } else {
-                None
-            }
-        })
-        .collect()
-}
-
-struct UpgradeSummary {
-    upgraded: Vec<Template>,
-    errored_repos: Vec<(String, String)>,
-}
-
-impl UpgradeSummary {
-    fn new() -> Self {
-        Self {
-            upgraded: vec![],
-            errored_repos: vec![],
-        }
-    }
-
-    fn extend_with(
-        &mut self,
-        url: &str,
-        installation_results: anyhow::Result<InstallationResults>,
-    ) {
-        match installation_results {
-            Ok(list) => self.upgraded.extend(list.installed),
-            Err(e) => self.errored_repos.push((url.to_owned(), e.to_string())),
-        }
-    }
-}
-
 impl Uninstall {
     pub async fn run(self) -> Result<()> {
         let template_manager = TemplateManager::try_default()
diff --git a/templates/http-c/metadata/spin-template.toml b/templates/http-c/metadata/spin-template.toml
index 946e97a7..4a302879 100644
--- a/templates/http-c/metadata/spin-template.toml
+++ b/templates/http-c/metadata/spin-template.toml
@@ -3,6 +3,6 @@ id = "http-c"
 description = "HTTP request handler using C and the Zig toolchain"
 
 [parameters]
-project-description = { type = "string",  prompt = "Description", default = "" }
+project-description = { type = "string",  prompt = "Project description", default = "" }
 http-base = { type = "string", prompt = "HTTP base", default = "/", pattern = "^/\\S*$" }
 http-path = { type = "string", prompt = "HTTP path", default = "/...", pattern = "^/\\S*$" }
diff --git a/templates/http-empty/metadata/spin-template.toml b/templates/http-empty/metadata/spin-template.toml
index 559e6077..a97821bb 100644
--- a/templates/http-empty/metadata/spin-template.toml
+++ b/templates/http-empty/metadata/spin-template.toml
@@ -3,5 +3,5 @@ id = "http-empty"
 description = "HTTP application with no components"
 
 [parameters]
-project-description = { type = "string",  prompt = "Description", default = "" }
+project-description = { type = "string",  prompt = "Project description", default = "" }
 http-base = { type = "string", prompt = "HTTP base", default = "/", pattern = "^/\\S*$" }
diff --git a/templates/http-go/metadata/spin-template.toml b/templates/http-go/metadata/spin-template.toml
index 8d061950..894c1f5f 100644
--- a/templates/http-go/metadata/spin-template.toml
+++ b/templates/http-go/metadata/spin-template.toml
@@ -9,6 +9,6 @@ skip_parameters = ["http-base"]
 component = "component.txt"
 
 [parameters]
-project-description = { type = "string",  prompt = "Description", default = "" }
+project-description = { type = "string",  prompt = "Project description", default = "" }
 http-base = { type = "string", prompt = "HTTP base", default = "/", pattern = "^/\\S*$" }
 http-path = { type = "string", prompt = "HTTP path", default = "/...", pattern = "^/\\S*$" }
diff --git a/templates/http-grain/metadata/spin-template.toml b/templates/http-grain/metadata/spin-template.toml
index 36dbbc8e..74f8fffb 100644
--- a/templates/http-grain/metadata/spin-template.toml
+++ b/templates/http-grain/metadata/spin-template.toml
@@ -3,6 +3,6 @@ id = "http-grain"
 description = "HTTP request handler using Grain"
 
 [parameters]
-project-description = { type = "string",  prompt = "Description", default = "" }
+project-description = { type = "string",  prompt = "Project description", default = "" }
 http-base = { type = "string", prompt = "HTTP base", default = "/", pattern = "^/\\S*$" }
 http-path = { type = "string", prompt = "HTTP path", default = "/...", pattern = "^/\\S*$" }
diff --git a/templates/http-php/metadata/spin-template.toml b/templates/http-php/metadata/spin-template.toml
index 28bccf8f..9a8badca 100644
--- a/templates/http-php/metadata/spin-template.toml
+++ b/templates/http-php/metadata/spin-template.toml
@@ -3,6 +3,6 @@ id = "http-php"
 description = "HTTP request handler using PHP"
 
 [parameters]
-project-description = { type = "string",  prompt = "Description", default = "" }
+project-description = { type = "string",  prompt = "Project description", default = "" }
 http-base = { type = "string", prompt = "HTTP base", default = "/", pattern = "^/\\S*$" }
 http-path = { type = "string", prompt = "HTTP path", default = "/...", pattern = "^/\\S*$" }
diff --git a/templates/http-rust/metadata/spin-template.toml b/templates/http-rust/metadata/spin-template.toml
index 29b6903f..76b62f84 100644
--- a/templates/http-rust/metadata/spin-template.toml
+++ b/templates/http-rust/metadata/spin-template.toml
@@ -9,6 +9,6 @@ skip_parameters = ["http-base"]
 component = "component.txt"
 
 [parameters]
-project-description = { type = "string",  prompt = "Description", default = "" }
+project-description = { type = "string",  prompt = "Project description", default = "" }
 http-base = { type = "string", prompt = "HTTP base", default = "/", pattern = "^/\\S*$" }
 http-path = { type = "string", prompt = "HTTP path", default = "/...", pattern = "^/\\S*$" }
\ No newline at end of file
diff --git a/templates/http-swift/metadata/spin-template.toml b/templates/http-swift/metadata/spin-template.toml
index 3c7762b7..fda82f22 100644
--- a/templates/http-swift/metadata/spin-template.toml
+++ b/templates/http-swift/metadata/spin-template.toml
@@ -3,6 +3,6 @@ id = "http-swift"
 description = "HTTP request handler using SwiftWasm"
 
 [parameters]
-project-description = { type = "string",  prompt = "Description", default = "" }
+project-description = { type = "string",  prompt = "Project description", default = "" }
 http-base = { type = "string", prompt = "HTTP base", default = "/", pattern = "^/\\S*$" }
 http-path = { type = "string", prompt = "HTTP path", default = "/...", pattern = "^/\\S*$" }
diff --git a/templates/http-zig/metadata/spin-template.toml b/templates/http-zig/metadata/spin-template.toml
index b50150de..f1a3c743 100644
--- a/templates/http-zig/metadata/spin-template.toml
+++ b/templates/http-zig/metadata/spin-template.toml
@@ -3,6 +3,6 @@ id = "http-zig"
 description = "HTTP request handler using Zig"
 
 [parameters]
-project-description = { type = "string",  prompt = "Description", default = "" }
+project-description = { type = "string",  prompt = "Project description", default = "" }
 http-base = { type = "string", prompt = "HTTP base", default = "/", pattern = "^/\\S*$" }
 http-path = { type = "string", prompt = "HTTP path", default = "/...", pattern = "^/\\S*$" }
diff --git a/templates/redis-go/metadata/spin-template.toml b/templates/redis-go/metadata/spin-template.toml
index 330492ec..4bb979ba 100644
--- a/templates/redis-go/metadata/spin-template.toml
+++ b/templates/redis-go/metadata/spin-template.toml
@@ -3,6 +3,6 @@ id = "redis-go"
 description = "Redis message handler using (Tiny)Go"
 
 [parameters]
-project-description = { type = "string",  prompt = "Description", default = "" }
+project-description = { type = "string",  prompt = "Project description", default = "" }
 redis-address = { type = "string", prompt = "Redis address", default = "redis://localhost:6379" }
 redis-channel = { type = "string", prompt = "Redis channel" }
\ No newline at end of file
diff --git a/templates/redis-rust/metadata/spin-template.toml b/templates/redis-rust/metadata/spin-template.toml
index cd58fdfc..61bc9772 100644
--- a/templates/redis-rust/metadata/spin-template.toml
+++ b/templates/redis-rust/metadata/spin-template.toml
@@ -3,6 +3,6 @@ id = "redis-rust"
 description = "Redis message handler using Rust"
 
 [parameters]
-project-description = { type = "string",  prompt = "Description", default = "" }
+project-description = { type = "string",  prompt = "Project description", default = "" }
 redis-address = { type = "string", prompt = "Redis address", default = "redis://localhost:6379" }
 redis-channel = { type = "string", prompt = "Redis channel" }
\ No newline at end of file
diff --git a/templates/static-fileserver/metadata/spin-template.toml b/templates/static-fileserver/metadata/spin-template.toml
index 1bd8767e..34d8674b 100644
--- a/templates/static-fileserver/metadata/spin-template.toml
+++ b/templates/static-fileserver/metadata/spin-template.toml
@@ -10,7 +10,7 @@ skip_parameters = ["http-base", "project-description"]
 component = "component.txt"
 
 [parameters]
-project-description = { type = "string",  prompt = "Description", default = "" }
+project-description = { type = "string",  prompt = "Project description", default = "" }
 http-base = { type = "string", prompt = "HTTP base", default = "/", pattern = "^/\\S*$" }
 http-path = { type = "string", prompt = "HTTP path", default = "/static/...", pattern = "^/\\S*$" }
 files-path = { type = "string", prompt = "Directory containing the files to serve", default = "assets", pattern = "^\\S+$" }


Test patch:
diff --git a/crates/e2e-testing/Cargo.toml b/crates/e2e-testing/Cargo.toml
deleted file mode 100644
index 908bbe06..00000000
--- a/crates/e2e-testing/Cargo.toml
+++ /dev/null
@@ -1,18 +0,0 @@
-[package]
-name = "e2e-testing"
-version = { workspace = true }
-authors = { workspace = true }
-edition = { workspace = true }
-
-[lib]
-doctest = false
-
-[dependencies]
-anyhow = "1.0"
-async-trait = "0.1"
-tokio = { version = "1.23", features = [ "full" ] }
-hyper = { version = "0.14", features = [ "full" ] }
-regex = "1.5.5"
-reqwest = { version = "0.11", features = ["blocking"] }
-nix = "0.26.1"
-url = "2.2.2"
\ No newline at end of file
diff --git a/crates/e2e-testing/README.md b/crates/e2e-testing/README.md
deleted file mode 100644
index 831438e3..00000000
--- a/crates/e2e-testing/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-e2e-testing
-
-This crate provides functions and utilities to help with running e2e-tests for spin.
\ No newline at end of file
diff --git a/crates/e2e-testing/src/asserts.rs b/crates/e2e-testing/src/asserts.rs
deleted file mode 100644
index 5611befa..00000000
--- a/crates/e2e-testing/src/asserts.rs
+++ /dev/null
@@ -1,44 +0,0 @@
-use anyhow::Result;
-
-pub fn assert_status(url: &str, expected: u16) -> Result<()> {
-    let resp = req(url)?;
-    let status = resp.status();
-    let body = resp.text()?;
-    assert_eq!(status, expected, "{}", body);
-    Ok(())
-}
-
-pub fn assert_http_response(
-    url: &str,
-    expected: u16,
-    expected_headers: &[(&str, &str)],
-    expected_body: Option<&str>,
-) -> Result<()> {
-    let res = req(url)?;
-
-    let status = res.status();
-    assert_eq!(expected, status.as_u16());
-
-    let headers = res.headers();
-    for (k, v) in expected_headers {
-        assert_eq!(
-            &headers
-                .get(k.to_string())
-                .unwrap_or_else(|| panic!("cannot find header {}", k))
-                .to_str()?,
-            v
-        )
-    }
-
-    if let Some(expected_body_str) = expected_body {
-        let body = &res.text()?;
-        assert_eq!(expected_body_str, body);
-    }
-
-    Ok(())
-}
-
-fn req(url: &str) -> reqwest::Result<reqwest::blocking::Response> {
-    println!("{}", url);
-    reqwest::blocking::get(url)
-}
diff --git a/crates/e2e-testing/src/controller.rs b/crates/e2e-testing/src/controller.rs
deleted file mode 100644
index 5a3f103d..00000000
--- a/crates/e2e-testing/src/controller.rs
+++ /dev/null
@@ -1,46 +0,0 @@
-use crate::metadata_extractor::AppMetadata;
-use anyhow::Result;
-use async_trait::async_trait;
-use std::process::Output;
-
-/// defines crate::controller::Controller trait
-/// this is to enable running same set of tests
-/// using `spin up` or `Deploying to Fermyon Cloud`
-#[async_trait]
-pub trait Controller {
-    fn name(&self) -> String;
-    fn login(&self) -> Result<()>;
-    fn template_install(&self, args: Vec<&str>) -> Result<Output>;
-    fn new_app(&self, template_name: &str, app_name: &str) -> Result<Output>;
-    fn build_app(&self, app_name: &str) -> Result<Output>;
-    fn install_plugins(&self, plugins: Vec<&str>) -> Result<Output>;
-    async fn run_app(&self, app_name: &str) -> Result<AppInstance>;
-    async fn stop_app(
-        &self,
-        app_name: Option<&str>,
-        process: Option<tokio::process::Child>,
-    ) -> Result<()>;
-}
-/// This represents a running spin app.
-/// If it is running using `spin up`, it also has `process` field populated
-/// with handle to the `spin up` process
-pub struct AppInstance {
-    pub metadata: AppMetadata,
-    pub process: Option<tokio::process::Child>,
-}
-
-impl AppInstance {
-    pub fn new(metadata: AppMetadata) -> AppInstance {
-        AppInstance {
-            metadata,
-            process: None,
-        }
-    }
-
-    pub fn new_with_process(
-        metadata: AppMetadata,
-        process: Option<tokio::process::Child>,
-    ) -> AppInstance {
-        AppInstance { metadata, process }
-    }
-}
diff --git a/crates/e2e-testing/src/lib.rs b/crates/e2e-testing/src/lib.rs
deleted file mode 100644
index 3fde2b57..00000000
--- a/crates/e2e-testing/src/lib.rs
+++ /dev/null
@@ -1,7 +0,0 @@
-pub mod asserts;
-pub mod controller;
-pub mod metadata_extractor;
-pub mod spin;
-pub mod spin_controller;
-pub mod testcase;
-pub mod utils;
diff --git a/crates/e2e-testing/src/metadata_extractor.rs b/crates/e2e-testing/src/metadata_extractor.rs
deleted file mode 100644
index d4a7be6e..00000000
--- a/crates/e2e-testing/src/metadata_extractor.rs
+++ /dev/null
@@ -1,101 +0,0 @@
-use anyhow::Result;
-use regex::Regex;
-use url::Url;
-
-#[derive(Clone)]
-pub struct AppRoute {
-    pub name: String,
-    pub route_url: String,
-    pub wildcard: bool,
-}
-
-#[derive(Clone)]
-pub struct AppMetadata {
-    pub name: String,
-    pub base: String,
-    pub app_routes: Vec<AppRoute>,
-    pub version: String,
-}
-
-impl AppMetadata {
-    pub fn get_route_with_name(&self, name: String) -> Result<&AppRoute> {
-        for route in &self.app_routes {
-            if route.name == name {
-                return Ok(route);
-            }
-        }
-
-        Err("requested route not found").map_err(anyhow::Error::msg)
-    }
-}
-
-/// Extracts version of app being deployed by parsing logs
-pub fn extract_version_from_logs(appname: &str, logs: &str) -> String {
-    let re: Regex = Regex::new(format!("Uploading {} version (.*)...", appname).as_str()).unwrap();
-    let v = match re.find(logs) {
-        None => "",
-        Some(v) => v.as_str(),
-    };
-
-    v.to_string()
-}
-
-/// Extracts routes of app being deployed by parsing logs
-pub fn extract_routes_from_logs(logs: &str) -> Vec<AppRoute> {
-    let re: Regex = Regex::new(r##"^\s*(.*): (https?://[^\s^\\(]+)(.*)$"##).unwrap();
-    let mut route_start = false;
-    let lines = logs.split('\n');
-    println!("{:?}", lines);
-    let mut routes: Vec<AppRoute> = vec![];
-    for line in lines {
-        println!("line is {:?}", line);
-
-        if line.trim() == "" {
-            continue;
-        }
-
-        if !route_start && line.trim() != "Available Routes:" {
-            continue;
-        }
-
-        if !route_start {
-            route_start = true;
-            continue;
-        }
-
-        println!("line is before capturing {:?}", line);
-        let captures = re.captures(line).unwrap();
-
-        let route = AppRoute {
-            name: captures.get(1).unwrap().as_str().to_string(),
-            route_url: captures.get(2).unwrap().as_str().to_string(),
-            wildcard: captures.get(3).unwrap().as_str() == "(wildcard)",
-        };
-
-        routes.push(route)
-    }
-
-    routes
-}
-
-/// Extract metadata of app being deployed
-///
-/// name, base url, version and available app routes are extracted from logs
-pub fn extract_app_metadata_from_logs(appname: &str, logs: &str) -> AppMetadata {
-    let version = extract_version_from_logs(appname, logs);
-    let app_routes = extract_routes_from_logs(logs);
-    let mut base = "".to_string();
-    if !app_routes.is_empty() {
-        base = match Url::parse(&app_routes.first().unwrap().route_url) {
-            Err(err) => panic!("{}", err),
-            Ok(url) => format!("{}://{}", url.scheme(), url.host().unwrap()),
-        }
-    }
-
-    AppMetadata {
-        name: appname.to_string(),
-        base,
-        version,
-        app_routes,
-    }
-}
diff --git a/crates/e2e-testing/src/spin.rs b/crates/e2e-testing/src/spin.rs
deleted file mode 100644
index 7371358e..00000000
--- a/crates/e2e-testing/src/spin.rs
+++ /dev/null
@@ -1,86 +0,0 @@
-use crate::utils;
-use anyhow::Result;
-use std::path::Path;
-use std::process::Output;
-use std::sync::Mutex;
-
-#[cfg(target_family = "unix")]
-use {
-    nix::sys::signal::{kill, Signal},
-    nix::unistd::Pid,
-};
-
-static INSTALLING_TEMPLATES_MUTEX: Mutex<i32> = Mutex::new(0);
-static INSTALLING_PLUGINS_MUTEX: Mutex<i32> = Mutex::new(0);
-
-pub fn template_install(mut args: Vec<&str>) -> Result<Output> {
-    let mut cmd = vec!["spin", "templates", "install"];
-    cmd.append(&mut args);
-
-    let x = INSTALLING_TEMPLATES_MUTEX.lock().unwrap();
-    let result = utils::run(cmd, None, None);
-
-    //this ensure we have mutex lock until here
-    drop(x);
-
-    result
-}
-
-pub fn new_app(template_name: &str, app_name: &str) -> Result<Output> {
-    let basedir = utils::testcases_base_dir();
-
-    return utils::run(
-        vec!["spin", "new", template_name, app_name, "--accept-defaults"],
-        Some(basedir.as_str()),
-        None,
-    );
-}
-
-pub fn install_plugins(plugins: Vec<&str>) -> Result<Output> {
-    // lock mutex to ensure one install_plugins runs at a time
-    let x = INSTALLING_PLUGINS_MUTEX.lock().unwrap();
-
-    let mut output = utils::run(vec!["spin", "plugin", "update"], None, None)?;
-
-    for plugin in plugins {
-        output = utils::run(
-            vec!["spin", "plugin", "install", plugin, "--yes"],
-            None,
-            None,
-        )?;
-    }
-
-    //this ensure we have mutex lock until here
-    drop(x);
-
-    Ok(output)
-}
-
-pub fn build_app(appname: &str) -> Result<Output> {
-    let appdir = appdir(appname);
-    utils::run(vec!["spin", "build"], Some(&appdir), None)
-}
-
-pub fn appdir(appname: &str) -> String {
-    let dir = Path::new(utils::testcases_base_dir().as_str()).join(appname);
-    dir.into_os_string().into_string().unwrap()
-}
-
-#[cfg(target_family = "unix")]
-pub async fn stop_app_process(process: &mut tokio::process::Child) -> Result<(), anyhow::Error> {
-    let pid = process.id().unwrap();
-    println!("stopping app with pid {}", pid);
-    let pid = Pid::from_raw(pid as i32);
-    kill(pid, Signal::SIGINT).map_err(anyhow::Error::msg)
-}
-
-#[cfg(target_family = "windows")]
-pub async fn stop_app_process(process: &mut tokio::process::Child) -> Result<(), anyhow::Error> {
-    // stop the app at the end of testcase
-    let _ = &mut process.kill().await.map_err(anyhow::Error::msg);
-
-    match process.wait().await {
-        Ok(_) => Ok(()),
-        Err(e) => Err(anyhow::Error::msg(e)),
-    }
-}
diff --git a/crates/e2e-testing/src/spin_controller.rs b/crates/e2e-testing/src/spin_controller.rs
deleted file mode 100644
index 8fbcfe29..00000000
--- a/crates/e2e-testing/src/spin_controller.rs
+++ /dev/null
@@ -1,80 +0,0 @@
-use crate::controller::{AppInstance, Controller};
-use crate::metadata_extractor::AppMetadata;
-use crate::spin;
-use crate::utils;
-use anyhow::Result;
-use async_trait::async_trait;
-use std::process::Output;
-
-pub struct SpinUp {}
-
-/// implements crate::controller::Controller trait
-/// to run apps using `spin up`
-#[async_trait]
-impl Controller for SpinUp {
-    fn name(&self) -> String {
-        "spin-up".to_string()
-    }
-
-    fn login(&self) -> Result<()> {
-        Ok(())
-    }
-
-    fn template_install(&self, args: Vec<&str>) -> Result<Output> {
-        spin::template_install(args)
-    }
-
-    fn new_app(&self, template_name: &str, app_name: &str) -> Result<Output> {
-        spin::new_app(template_name, app_name)
-    }
-
-    fn install_plugins(&self, plugins: Vec<&str>) -> Result<Output> {
-        spin::install_plugins(plugins)
-    }
-
-    fn build_app(&self, app_name: &str) -> Result<Output> {
-        spin::build_app(app_name)
-    }
-
-    async fn run_app(&self, app_name: &str) -> Result<AppInstance> {
-        let appdir = spin::appdir(app_name);
-
-        let port = utils::get_random_port()?;
-        let address = format!("127.0.0.1:{}", port);
-
-        let mut child = utils::run_async(
-            vec!["spin", "up", "--listen", &address],
-            Some(&appdir),
-            None,
-        );
-
-        // ensure the server is accepting requests before continuing.
-        utils::wait_tcp(&address, &mut child, "spin").await?;
-
-        match utils::get_output(&mut child).await {
-            Ok(output) => print!("this output is {:?} until here", output),
-            Err(error) => panic!("problem running app {:?}", error),
-        };
-
-        Ok(AppInstance::new_with_process(
-            AppMetadata {
-                name: app_name.to_string(),
-                base: format!("http://{}", address),
-                app_routes: vec![],
-                version: "".to_string(),
-            },
-            Some(child),
-        ))
-    }
-
-    async fn stop_app(
-        &self,
-        _: Option<&str>,
-        process: Option<tokio::process::Child>,
-    ) -> Result<()> {
-        match process {
-            None => Ok(()),
-            Some(mut process) => spin::stop_app_process(&mut process).await,
-        }
-    }
-}
diff --git a/crates/e2e-testing/src/testcase.rs b/crates/e2e-testing/src/testcase.rs
deleted file mode 100644
index 3a99702f..00000000
--- a/crates/e2e-testing/src/testcase.rs
+++ /dev/null
@@ -1,120 +0,0 @@
-use crate::controller::Controller;
-use crate::metadata_extractor::AppMetadata;
-use crate::spin;
-use crate::utils;
-use anyhow::{Context, Result};
-use std::fs;
-use tokio::task;
-
-/// Represents a testcase
-pub struct TestCase {
-    /// name of the testcase
-    pub name: String,
-
-    /// name of the app under test
-    pub appname: Option<String>,
-
-    /// optional
-    /// template to use to create new app
-    pub template: Option<String>,
-
-    /// optional
-    /// template install args. appended to `spin install templates <template_install_args>
-    /// defaults to `--git https://github.com/fermyon/spin`
-    pub template_install_args: Option<Vec<String>>,
-
-    /// optional
-    /// plugins required for the testcase. e.g. js2wasm for js/ts tests
-    pub plugins: Option<Vec<String>>,
-
-    /// optional
-    /// if provided, appended to `spin deploy` command
-    pub deploy_args: Option<Vec<String>>,
-
-    /// optional
-    /// if provided, executed as command line before running `spin build`
-    /// useful if some external script or process needs to run before `spin build`
-    /// e.g. `npm install` before running `spin build` for `js/ts` tests
-    pub pre_build_hooks: Option<Vec<Vec<String>>>,
-
-    /// assertions to run once the app is running
-    pub assertions: fn(app: &AppMetadata) -> Result<()>,
-}
-
-impl TestCase {
-    pub async fn run(&self, controller: &dyn Controller) -> Result<()> {
-        controller.name();
-
-        // install spin plugins if requested in testcase config
-        if let Some(plugins) = &self.plugins {
-            controller
-                .install_plugins(plugins.iter().map(|s| s as &str).collect())
-                .context("installing plugins")?;
-        }
-
-        let appname = match &self.appname {
-            Some(appname) => appname.to_owned(),
-            None => format!("{}-generated", self.template.as_ref().unwrap()),
-        };
-
-        let appdir = spin::appdir(appname.as_str());
-
-        // cleanup existing dir for testcase project code. cleaned up only if testcase is a template based test
-        if self.template.is_some() {
-            // install spin templates from git repo. if template_install_args is provided uses that
-            // defaults to spin repo
-            let template_install_args = match &self.template_install_args {
-                Some(args) => args.iter().map(|s| s as &str).collect(),
-                None => vec!["--git", "https://github.com/fermyon/spin"],
-            };
-
-            controller
-                .template_install(template_install_args)
-                .context("installing templates")?;
-
-            if fs::remove_dir_all(&appdir).is_err() {};
-
-            controller
-                .new_app(self.template.as_ref().unwrap(), &appname)
-                .context("creating new app")?;
-        }
-
-        // run pre-build-steps. It is useful for running any steps required before running `spin build`.
-        // e.g. for js/ts tests, we need to run `npm install` before running `spin build`
-        if let Some(pre_build_hooks) = &self.pre_build_hooks {
-            for pre_build_hook in pre_build_hooks {
-                utils::run(pre_build_hook.to_vec(), Some(appdir.to_string()), None)?;
-            }
-        }
-
-        // run spin build
-        controller.build_app(&appname).context("building app")?;
-
-        // run `spin up` (or `spin deploy` for cloud).
-        // `AppInstance` has some basic info about the running app like base url, routes (only for cloud) etc.
-        let app = controller.run_app(&appname).await.context("running app")?;
-
-        // run test specific assertions
-        let metadata = app.metadata.clone();
-        let assert_fn = self.assertions;
-
-        let result = task::spawn_blocking(move || assert_fn(&metadata))
-            .await
-            .context("running testcase specific assertions")
-            .unwrap();
-
-        match controller
-            .stop_app(Some(app.metadata.clone().name.as_str()), None)
-            .await
-        {
-            Ok(_) => (),
-            Err(e) => println!(
-                "warn: failed to stop app {} with error {:?}",
-                app.metadata.clone().name.as_str(),
-                e
-            ),
-        }
-
-        result
-    }
-}
diff --git a/crates/e2e-testing/src/utils.rs b/crates/e2e-testing/src/utils.rs
deleted file mode 100644
index b614d5fd..00000000
--- a/crates/e2e-testing/src/utils.rs
+++ /dev/null
@@ -1,177 +0,0 @@
-use anyhow::Result;
-use std::path::PathBuf;
-use std::str;
-use std::{
-    collections::HashMap,
-    ffi::OsStr,
-    net::{Ipv4Addr, SocketAddrV4, TcpListener},
-    process::{self, Command, Output},
-    time::Duration,
-};
-
-use tokio::io::{AsyncBufReadExt, BufReader};
-use tokio::process::Command as TokioCommand;
-use tokio::time::timeout;
-use tokio::{net::TcpStream, time::sleep};
-
-/// run the command and returns the output
-pub fn run<S: Into<String> + AsRef<OsStr>>(
-    args: Vec<S>,
-    dir: Option<S>,
-    envs: Option<HashMap<&str, &str>>,
-) -> Result<Output> {
-    let mut cmd = Command::new(get_os_process());
-    cmd.stdout(process::Stdio::piped());
-    cmd.stderr(process::Stdio::piped());
-
-    if let Some(dir) = dir {
-        cmd.current_dir(dir.into());
-    };
-
-    cmd.arg("-c");
-    cmd.arg(
-        args.into_iter()
-            .map(Into::into)
-            .collect::<Vec<String>>()
-            .join(" "),
-    );
-    if let Some(envs) = envs {
-        for (k, v) in envs {
-            cmd.env(k, v);
-        }
-    }
-
-    let output = cmd.output()?;
-    let code = output.status.code().expect("should have status code");
-    if code != 0 {
-        println!("{:#?}", std::str::from_utf8(&output.stderr)?);
-        println!("{:#?}", std::str::from_utf8(&output.stdout)?);
-        panic!("command `{:?}` exited with code {}", cmd, code);
-    }
-
-    Ok(output)
-}
-
-fn get_os_process() -> String {
-    if cfg!(target_os = "windows") {
-        String::from("powershell.exe")
-    } else {
-        String::from("/bin/bash")
-    }
-}
-
-/// gets a free random port
-pub fn get_random_port() -> Result<u16> {
-    Ok(
-        TcpListener::bind(SocketAddrV4::new(Ipv4Addr::LOCALHOST, 0))?
-            .local_addr()?
-            .port(),
-    )
-}
-
-/// wait for tcp to work on a given port
-pub async fn wait_tcp(url: &str, process: &mut tokio::process::Child, target: &str) -> Result<()> {
-    let mut wait_count = 0;
-    loop {
-        if wait_count >= 240 {
-            panic!(
-                "Ran out of retries waiting for {} to start on URL {}",
-                target, url
-            );
-        }
-
-        if let Ok(Some(_)) = process.try_wait() {
-            panic!(
-                "Process exited before starting to serve {} to start on URL {}",
-                target, url
-            );
-        }
-
-        match TcpStream::connect(&url).await {
-            Ok(_) => break,
-            Err(e) => {
-                println!("connect {} error {}, retry {}", &url, e, wait_count);
-                wait_count += 1;
-                sleep(Duration::from_secs(1)).await;
-            }
-        }
-    }
-
-    Ok(())
-}
-
-/// run the process in background and returns a tokio::process::Child
-/// the caller can then call utils::get_output(&mut child).await
-/// to get logs from the stdout
-pub fn run_async<S: Into<String> + AsRef<OsStr>>(
-    args: Vec<S>,
-    dir: Option<S>,
-    envs: Option<HashMap<&str, &str>>,
-) -> tokio::process::Child {
-    let mut cmd = TokioCommand::new(get_os_process());
-    cmd.stdout(process::Stdio::piped());
-    cmd.stderr(process::Stdio::piped());
-
-    if let Some(dir) = dir {
-        cmd.current_dir(dir.into());
-    };
-
-    cmd.arg("-c");
-    cmd.arg(
-        args.into_iter()
-            .map(Into::into)
-            .collect::<Vec<String>>()
-            .join(" "),
-    );
-    if let Some(envs) = envs {
-        for (k, v) in envs {
-            cmd.env(k, v);
-        }
-    }
-
-    cmd.spawn().expect("failed to spawn command")
-}
-
-/// gets the stdout of the tokio::process::Child spawned in the background
-///
-/// it blocks for the first line of logs and then
-/// reads all the remaining lines of logs from stdout
-/// if no new logs are received in 5 seconds, it returns
-/// the logs collected so far
-pub async fn get_output(child: &mut tokio::process::Child) -> Result<Vec<String>> {
-    let stdout = child
-        .stdout
-        .take()
-        .expect("child did not have a handle to stdout");
-
-    let mut reader = BufReader::new(stdout).lines();
-
-    //get firstline in a blocking way to ensure we account for `spin up` delay
-    let firstline_future = reader.next_line();
-    let firstline = timeout(Duration::from_secs(20), firstline_future)
-        .await?
-        .unwrap()
-        .unwrap();
-    let mut output = vec![firstline];
-
-    loop {
-        let nextline = reader.next_line();
-        match timeout(Duration::from_secs(5), nextline).await {
-            Err(_) => break,
-            Ok(result) => match result {
-                Err(_) => break,
-                Ok(line) => output.push(line.unwrap()),
-            },
-        }
-    }
-
-    Ok(output)
-}
-
-pub fn testcases_base_dir() -> String {
-    let basedir: PathBuf = [env!("CARGO_MANIFEST_DIR"), "../../tests/testcases"]
-        .iter()
-        .collect();
-
-    basedir.to_str().unwrap().to_string()
-}
diff --git a/e2e-tests-aarch64.Dockerfile b/e2e-tests-aarch64.Dockerfile
deleted file mode 100644
index 023f83e1..00000000
--- a/e2e-tests-aarch64.Dockerfile
+++ /dev/null
@@ -1,62 +0,0 @@
-FROM ubuntu:22.04
-
-WORKDIR /root
-RUN apt-get update && apt-get install -y wget sudo xz-utils gcc git pkg-config
-
-# nodejs
-RUN curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash -
-RUN apt-get install -y nodejs npm
-
-# golang
-RUN wget https://go.dev/dl/go1.19.5.linux-arm64.tar.gz && \
-    rm -rf /usr/local/go && tar -C /usr/local -xzf go1.19.5.linux-arm64.tar.gz
-ENV PATH="$PATH:/usr/local/go/bin"
-
-# tinygo
-RUN wget https://github.com/tinygo-org/tinygo/releases/download/v0.25.0/tinygo_0.25.0_arm64.deb && \
-    sudo dpkg -i tinygo_0.25.0_arm64.deb && \
-    tinygo env
-
-RUN wget https://ziglang.org/download/0.10.0/zig-linux-aarch64-0.10.0.tar.xz && \
-    tar -xf zig-linux-aarch64-0.10.0.tar.xz
-ENV PATH="$PATH:/root/zig-linux-aarch64-0.10.0"
-
-# # grain
-# RUN wget https://github.com/grain-lang/grain/releases/download/grain-v0.5.4/grain-linux-x64 && \
-#     mv grain-linux-x64 /usr/local/bin/grain && chmod +x /usr/local/bin/grain
-
-# spin
-RUN wget https://github.com/fermyon/spin/releases/download/canary/spin-canary-linux-aarch64.tar.gz && \
-    tar -xvf spin-canary-linux-aarch64.tar.gz && \
-    ls -ltr && \
-    mv spin /usr/local/bin/spin
-
-# # rust
-ENV RUSTUP_HOME=/usr/local/rustup \
-    CARGO_HOME=/usr/local/cargo \
-    PATH=/usr/local/cargo/bin:$PATH
-
-RUN url="https://static.rust-lang.org/rustup/dist/aarch64-unknown-linux-gnu/rustup-init"; \
-    wget "$url"; \
-    chmod +x rustup-init; \
-    ./rustup-init -y --no-modify-path --default-toolchain 1.66 --default-host aarch64-unknown-linux-gnu; \
-    rm rustup-init; \
-    chmod -R a+w $RUSTUP_HOME $CARGO_HOME; \
-    rustup --version; \
-    cargo --version; \
-    rustc --version; \
-    rustup target add wasm32-wasi;
-
-## check versions
-RUN tinygo version
-RUN go version
-# RUN grain --version
-RUN spin --version
-RUN zig version
-RUN rustc --version
-RUN node --version
-
-WORKDIR /e2e-tests
-COPY . .
-
-CMD cargo test spinup_tests --features new-e2e-tests --no-fail-fast -- --nocapture
diff --git a/e2e-tests-docker-compose.yml b/e2e-tests-docker-compose.yml
deleted file mode 100644
index 24da3ad6..00000000
--- a/e2e-tests-docker-compose.yml
+++ /dev/null
@@ -1,25 +0,0 @@
-version: "3.9"
-
-services:
-  mysql:
-    image: mysql:8.0.22
-    ports:
-      - "3306:3306"
-    volumes:
-      - db_data:/var/lib/mysql
-    restart: always
-    environment:
-      MYSQL_ROOT_PASSWORD: spin
-      MYSQL_DATABASE: spin_dev
-      MYSQL_USER: spin
-      MYSQL_PASSWORD: spin
-
-  e2e-tests:
-    depends_on:
-      - mysql
-    image: spin-e2e-tests
-    volumes:
-      - ./target/release/spin:/usr/local/bin/spin
-
-volumes:
-  db_data: {}
diff --git a/e2e-tests.Dockerfile b/e2e-tests.Dockerfile
deleted file mode 100644
index 2417394e..00000000
--- a/e2e-tests.Dockerfile
+++ /dev/null
@@ -1,63 +0,0 @@
-FROM ubuntu:22.04
-
-WORKDIR /root
-RUN apt-get update && apt-get install -y wget sudo xz-utils gcc git pkg-config
-
-# nodejs
-RUN curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash -
-RUN apt-get install -y nodejs npm
-
-# golang
-RUN wget https://go.dev/dl/go1.19.5.linux-amd64.tar.gz && \
-    rm -rf /usr/local/go && tar -C /usr/local -xzf go1.19.5.linux-amd64.tar.gz
-ENV PATH="$PATH:/usr/local/go/bin"
-
-# tinygo
-RUN wget https://github.com/tinygo-org/tinygo/releases/download/v0.25.0/tinygo_0.25.0_amd64.deb && \
-    sudo dpkg -i tinygo_0.25.0_amd64.deb && \
-    tinygo env
-
-# zig
-RUN wget https://ziglang.org/download/0.10.0/zig-linux-x86_64-0.10.0.tar.xz && \
-    tar -xf zig-linux-x86_64-0.10.0.tar.xz
-ENV PATH="$PATH:/root/zig-linux-x86_64-0.10.0"
-
-# grain
-RUN wget https://github.com/grain-lang/grain/releases/download/grain-v0.5.4/grain-linux-x64 && \
-    mv grain-linux-x64 /usr/local/bin/grain && chmod +x /usr/local/bin/grain
-
-# spin
-RUN wget https://github.com/fermyon/spin/releases/download/canary/spin-canary-linux-amd64.tar.gz && \
-    tar -xvf spin-canary-linux-amd64.tar.gz && \
-    ls -ltr && \
-    mv spin /usr/local/bin/spin
-
-# # rust
-ENV RUSTUP_HOME=/usr/local/rustup \
-    CARGO_HOME=/usr/local/cargo \
-    PATH=/usr/local/cargo/bin:$PATH
-
-RUN url="https://static.rust-lang.org/rustup/dist/x86_64-unknown-linux-gnu/rustup-init"; \
-    wget "$url"; \
-    chmod +x rustup-init; \
-    ./rustup-init -y --no-modify-path --default-toolchain 1.66 --default-host x86_64-unknown-linux-gnu; \
-    rm rustup-init; \
-    chmod -R a+w $RUSTUP_HOME $CARGO_HOME; \
-    rustup --version; \
-    cargo --version; \
-    rustc --version; \
-    rustup target add wasm32-wasi;
-
-## check versions
-RUN tinygo version
-RUN go version
-RUN grain --version
-RUN spin --version
-RUN zig version
-RUN rustc --version
-RUN node --version
-
-WORKDIR /e2e-tests
-COPY . .
-
-CMD cargo test spinup_tests --features new-e2e-tests --no-fail-fast -- --nocapture
diff --git a/tests/README.md b/tests/README.md
index 5603ae1e..3d389473 100644
--- a/tests/README.md
+++ b/tests/README.md
@@ -7,136 +7,3 @@ Please add following dependencies to your PATH before running `make test-integra
 * [bindle-server](https://github.com/deislabs/bindle)
 * [nomad](https://github.com/hashicorp/nomad)
 * [Hippo.Web](https://github.com/deislabs/hippo)
-
-# E2E tests for spin
-
-The goal of these tests is to ensure that spin continues to work with existing apps/examples/templates and there are no regressions introduced as we add more functionality or refactor existing code.
-
-## How to run e2e tests
-
-```
-## go to root dir of the project, e2e-tests.Dockerfile is located there
-docker build -t spin-e2e-tests -f e2e-tests.Dockerfile .
-docker compose -f e2e-tests-docker-compose.yml run e2e-tests
-```
-
-## Important files and their function
-
-`crates/e2e-testing`     - All the test framework/utilities that are required for `e2e-tests`
-`tests/testcases/mod.rs` - All the testcase definitions should be added here.
-`tests/spinup_tests.rs`  - All tests that we want to run with `Spin Up` should be added here
-`tests/testcases/<dirs>` - The testcases which require corresponding `spin app` pre-created should be added here
-
-
-## Writing new testcase
-
-### using pre-existing code scenario
-
-Let us say we want to add a testcase `foo-env-test` for a specific scenario for which you have already created a `spin app`. Following steps are required to make this happen
-
-1. You can add the existing app code `tests/testcases/foo-env-test`.
-2. Add a new function `pub async fn foo_env_works(controller: &dyn Controller)` in `tests/testcases/mod.rs` as follows:
-
-```rust
-
-pub async fn foo_env_works(controller: &dyn Controller) {
-    fn checks(metadata: &AppMetadata) -> Result<()> {
-        assert_http_response(
-            get_url(metadata.base.as_str(), "/echo").as_str(),
-            200,
-            &[],
-            Some("foo-env"),
-        )?;
-
-        Ok(())
-    }
-
-    let tc = TestCase {
-        name: "foo-env-test".to_string(),
-        //the appname should be same as dir where this app exists
-        appname: Some("foo-env-test".to_string()),
-        template: None,
-        template_install_args: None,
-        assertions: checks,
-        plugins: None,
-        deploy_args: None,
-        pre_build_hooks: None,
-    };
-
-    tc.run(controller).await.unwrap()
-}
-
-```
-
-3. Add the testcase to `tests/spinup_tests.rs` as follows:
-
-
-```rust
-#[tokio::test]
-async fn foo_env_works() {
-    testcases::foo_env_works(CONTROLLER).await
-}
-```
-
-4. Run the tests locally to verify
-
-```
-## go to root dir of the project, e2e-tests.Dockerfile is located there
-docker build -t spin-e2e-tests -f e2e-tests.Dockerfile .
-docker compose -f e2e-tests-docker-compose.yml run e2e-tests
-```
-
-### using a template
----------------------
-
-Let us say we want to add a testcase for a new template `foo-bar`. Following steps are required to make this happen
-
-1. Write a function `pub async fn foo_bar_works(controller: &dyn Controller)` as follows:
-
-```rust
-pub async fn foo_bar_works(controller: &dyn Controller) {
-    fn checks(metadata: &AppMetadata) -> Result<()> {
-        return assert_http_response(
-            metadata.base.as_str(),
-            200,
-            &[],
-            Some("Hello foo-bar!\n"),
-        );
-    }
-
-    let tc = TestCase {
-        name: "foo-bar template".to_string(),
-        // for template based tests, appname is generated on the fly
-        appname: None,
-        // this should be the name of the template used to 
-        // create new app using `spin new <template-name> <app-name>
-        template: Some("foo-bar".to_string()),
-        template_install_args: None,
-        assertions: checks,
-        plugins: None,
-        deploy_args: None,
-        pre_build_hooks: None,
-    };
-
-    tc.run(controller).await.unwrap();
-}
-
-```
-
-
-2. Add the testcase to `tests/spinup_tests.rs` as follows:
-
-```rust
-#[tokio::test]
-async fn foo_bar_works() {
-    testcases::foo_bar_works(CONTROLLER).await
-}
-```
-
-3. Run the tests locally to verify
-
-```
-## go to root dir of the project, e2e-tests.Dockerfile is located there
-docker build -t spin-e2e-tests -f e2e-tests.Dockerfile .
-docker compose -f e2e-tests-docker-compose.yml run e2e-tests
-```
diff --git a/tests/spinup_tests.rs b/tests/spinup_tests.rs
deleted file mode 100644
index d2222873..00000000
--- a/tests/spinup_tests.rs
+++ /dev/null
@@ -1,73 +0,0 @@
-mod testcases;
-#[cfg(feature = "new-e2e-tests")]
-use {e2e_testing::controller::Controller, e2e_testing::spin_controller::SpinUp};
-
-#[cfg(feature = "new-e2e-tests")]
-const CONTROLLER: &dyn Controller = &SpinUp {};
-
-#[cfg(feature = "new-e2e-tests")]
-mod spinup_tests {
-    use super::testcases;
-    use super::CONTROLLER;
-
-    #[tokio::test]
-    async fn http_go_works() {
-        testcases::all::http_go_works(CONTROLLER).await
-    }
-
-    #[tokio::test]
-    async fn http_c_works() {
-        testcases::all::http_c_works(CONTROLLER).await
-    }
-
-    #[tokio::test]
-    async fn http_rust_works() {
-        testcases::all::http_rust_works(CONTROLLER).await
-    }
-
-    #[tokio::test]
-    async fn http_zig_works() {
-        testcases::all::http_zig_works(CONTROLLER).await
-    }
-
-    #[tokio::test]
-    #[cfg(target_arch = "x86_64")]
-    async fn http_grain_works() {
-        testcases::all::http_grain_works(CONTROLLER).await
-    }
-
-    #[tokio::test]
-    async fn http_ts_works() {
-        testcases::all::http_ts_works(CONTROLLER).await
-    }
-
-    #[tokio::test]
-    async fn http_js_works() {
-        testcases::all::http_js_works(CONTROLLER).await
-    }
-
-    #[tokio::test]
-    async fn assets_routing_works() {
-        testcases::all::assets_routing_works(CONTROLLER).await
-    }
-
-    #[tokio::test]
-    async fn simple_spin_rust_works() {
-        testcases::all::simple_spin_rust_works(CONTROLLER).await
-    }
-
-    #[tokio::test]
-    async fn header_env_routes_works() {
-        testcases::all::header_env_routes_works(CONTROLLER).await
-    }
-
-    #[tokio::test]
-    async fn header_dynamic_env_works() {
-        testcases::all::header_dynamic_env_works(CONTROLLER).await
-    }
-
-    #[tokio::test]
-    async fn http_rust_outbound_mysql_works() {
-        testcases::all::http_rust_outbound_mysql_works(CONTROLLER).await
-    }
-}
diff --git a/tests/testcases/assets-test/spin.toml b/tests/testcases/assets-test/spin.toml
deleted file mode 100644
index 7c34f9a8..00000000
--- a/tests/testcases/assets-test/spin.toml
+++ /dev/null
@@ -1,14 +0,0 @@
-spin_version = "1"
-authors = ["Fermyon Engineering <engineering@fermyon.com>"]
-name = "assets-test"
-trigger = {type = "http", base = "/"}
-version = "1.0.0"
-
-[[component]]
-id = "fs"
-source = { url = "https://github.com/fermyon/spin-fileserver/releases/download/v0.0.1/spin_static_fs.wasm", digest = "sha256:650376c33a0756b1a52cad7ca670f1126391b79050df0321407da9c741d32375" }
-files = [{source = "static/thisshouldbemounted", destination = "/thisshouldbemounted"}]
-exclude_files = ["static/thisshouldbemounted/thisshouldbeexcluded/*"]
-[component.trigger]
-executor = {type = "spin"}
-route = "/static/..."
diff --git a/tests/testcases/assets-test/static/donotmount/a b/tests/testcases/assets-test/static/donotmount/a
deleted file mode 100644
index 78981922..00000000
--- a/tests/testcases/assets-test/static/donotmount/a
+++ /dev/null
@@ -1,1 +0,0 @@
-a
diff --git a/tests/testcases/assets-test/static/thisshouldbemounted/1 b/tests/testcases/assets-test/static/thisshouldbemounted/1
deleted file mode 100644
index d00491fd..00000000
--- a/tests/testcases/assets-test/static/thisshouldbemounted/1
+++ /dev/null
@@ -1,1 +0,0 @@
-1
diff --git a/tests/testcases/assets-test/static/thisshouldbemounted/2 b/tests/testcases/assets-test/static/thisshouldbemounted/2
deleted file mode 100644
index 0cfbf088..00000000
--- a/tests/testcases/assets-test/static/thisshouldbemounted/2
+++ /dev/null
@@ -1,1 +0,0 @@
-2
diff --git a/tests/testcases/assets-test/static/thisshouldbemounted/3 b/tests/testcases/assets-test/static/thisshouldbemounted/3
deleted file mode 100644
index 00750edc..00000000
--- a/tests/testcases/assets-test/static/thisshouldbemounted/3
+++ /dev/null
@@ -1,1 +0,0 @@
-3
diff --git a/tests/testcases/assets-test/static/thisshouldbemounted/thisshouldbeexcluded/4 b/tests/testcases/assets-test/static/thisshouldbemounted/thisshouldbeexcluded/4
deleted file mode 100644
index e69de29b..00000000
diff --git a/tests/testcases/headers-dynamic-env-test/.cargo/config.toml b/tests/testcases/headers-dynamic-env-test/.cargo/config.toml
deleted file mode 100644
index 6b77899c..00000000
--- a/tests/testcases/headers-dynamic-env-test/.cargo/config.toml
+++ /dev/null
@@ -1,2 +0,0 @@
-[build]
-target = "wasm32-wasi"
diff --git a/tests/testcases/headers-dynamic-env-test/Cargo.toml b/tests/testcases/headers-dynamic-env-test/Cargo.toml
deleted file mode 100644
index b38cc622..00000000
--- a/tests/testcases/headers-dynamic-env-test/Cargo.toml
+++ /dev/null
@@ -1,24 +0,0 @@
-[package]
-name    = "env"
-version = "0.1.0"
-edition = "2021"
-
-[lib]
-crate-type = [ "cdylib" ]
-
-[dependencies]
-# Useful crate to handle errors.
-anyhow = "1"
-# Crate to simplify working with bytes.
-bytes = "1"
-# General-purpose crate with common HTTP types.
-http = "0.2"
-spin-sdk = { path = "../../../sdk/rust"}
-# The wit-bindgen-rust dependency generates bindings for interfaces.
-wit-bindgen-rust = { git = "https://github.com/bytecodealliance/wit-bindgen", rev = "cb871cfa1ee460b51eb1d144b175b9aab9c50aba" }
-
-[workspace]
-
-# Metadata about this component.
-[package.metadata.component]
-name = "spinhelloworld"
diff --git a/tests/testcases/headers-dynamic-env-test/spin.toml b/tests/testcases/headers-dynamic-env-test/spin.toml
deleted file mode 100644
index 24469724..00000000
--- a/tests/testcases/headers-dynamic-env-test/spin.toml
+++ /dev/null
@@ -1,15 +0,0 @@
-spin_version = "1"
-name = "headers-dynamic-env-test"
-version = "1.0.0"
-authors = ["Fermyon Engineering <engineering@fermyon.com>"]
-description = "A simple application that returns hello and goodbye."
-trigger = {type = "http", base = "/"}
-
-[[component]]
-id = "env"
-source = "target/wasm32-wasi/release/env.wasm"
-environment = { some_key = "some_value" }
-[component.build]
-command = "cargo build --target wasm32-wasi --release"
-[component.trigger]
-route = "/env/..."
diff --git a/tests/testcases/headers-dynamic-env-test/src/lib.rs b/tests/testcases/headers-dynamic-env-test/src/lib.rs
deleted file mode 100644
index 3cad5a73..00000000
--- a/tests/testcases/headers-dynamic-env-test/src/lib.rs
+++ /dev/null
@@ -1,29 +0,0 @@
-use anyhow::Result;
-use spin_sdk::{
-    http::{Request, Response},
-    http_component
-};
-
-// This handler does the following:
-// - returns all environment variables as headers with an ENV_ prefix
-// - returns all request headers as response headers.
-#[http_component]
-fn handle_http_request(req: Request) -> Result<Response> {
-    match append_headers(http::Response::builder(), &req) {
-        Err(e) => anyhow::bail!("Unable to append headers to response: {}", e),
-        Ok(resp) => Ok(resp
-            .status(200)
-            .body(Some("I'm a teapot".into()))?)
-    }
-}
-
-fn append_headers(mut resp: http::response::Builder, req: &Request) -> Result<http::response::Builder> {
-    for (k, v) in std::env::vars() {
-        resp = resp.header(format!("ENV_{}", k), v);
-    }
-    for (k, v) in req.headers().iter() {
-        resp = resp.header(k, v);
-    }
-
-    Ok(resp)
-}
diff --git a/tests/testcases/headers-env-routes-test/.cargo/config.toml b/tests/testcases/headers-env-routes-test/.cargo/config.toml
deleted file mode 100644
index 6b77899c..00000000
--- a/tests/testcases/headers-env-routes-test/.cargo/config.toml
+++ /dev/null
@@ -1,2 +0,0 @@
-[build]
-target = "wasm32-wasi"
diff --git a/tests/testcases/headers-env-routes-test/Cargo.toml b/tests/testcases/headers-env-routes-test/Cargo.toml
deleted file mode 100644
index b38cc622..00000000
--- a/tests/testcases/headers-env-routes-test/Cargo.toml
+++ /dev/null
@@ -1,24 +0,0 @@
-[package]
-name    = "env"
-version = "0.1.0"
-edition = "2021"
-
-[lib]
-crate-type = [ "cdylib" ]
-
-[dependencies]
-# Useful crate to handle errors.
-anyhow = "1"
-# Crate to simplify working with bytes.
-bytes = "1"
-# General-purpose crate with common HTTP types.
-http = "0.2"
-spin-sdk = { path = "../../../sdk/rust"}
-# The wit-bindgen-rust dependency generates bindings for interfaces.
-wit-bindgen-rust = { git = "https://github.com/bytecodealliance/wit-bindgen", rev = "cb871cfa1ee460b51eb1d144b175b9aab9c50aba" }
-
-[workspace]
-
-# Metadata about this component.
-[package.metadata.component]
-name = "spinhelloworld"
diff --git a/tests/testcases/headers-env-routes-test/spin.toml b/tests/testcases/headers-env-routes-test/spin.toml
deleted file mode 100644
index 919027b8..00000000
--- a/tests/testcases/headers-env-routes-test/spin.toml
+++ /dev/null
@@ -1,15 +0,0 @@
-spin_version = "1"
-name = "headers-env-routes-test"
-version = "1.0.0"
-authors = ["Fermyon Engineering <engineering@fermyon.com>"]
-description = "A simple application that returns hello and goodbye."
-trigger = {type = "http", base = "/"}
-
-[[component]]
-id = "env"
-source = "target/wasm32-wasi/release/env.wasm"
-environment = { some_key = "some_value" }
-[component.trigger]
-route = "/env/..."
-[component.build]
-command = "cargo build --target wasm32-wasi --release"
\ No newline at end of file
diff --git a/tests/testcases/headers-env-routes-test/src/lib.rs b/tests/testcases/headers-env-routes-test/src/lib.rs
deleted file mode 100644
index 3cad5a73..00000000
--- a/tests/testcases/headers-env-routes-test/src/lib.rs
+++ /dev/null
@@ -1,29 +0,0 @@
-use anyhow::Result;
-use spin_sdk::{
-    http::{Request, Response},
-    http_component
-};
-
-// This handler does the following:
-// - returns all environment variables as headers with an ENV_ prefix
-// - returns all request headers as response headers.
-#[http_component]
-fn handle_http_request(req: Request) -> Result<Response> {
-    match append_headers(http::Response::builder(), &req) {
-        Err(e) => anyhow::bail!("Unable to append headers to response: {}", e),
-        Ok(resp) => Ok(resp
-            .status(200)
-            .body(Some("I'm a teapot".into()))?)
-    }
-}
-
-fn append_headers(mut resp: http::response::Builder, req: &Request) -> Result<http::response::Builder> {
-    for (k, v) in std::env::vars() {
-        resp = resp.header(format!("ENV_{}", k), v);
-    }
-    for (k, v) in req.headers().iter() {
-        resp = resp.header(k, v);
-    }
-
-    Ok(resp)
-}
diff --git a/tests/testcases/http-rust-outbound-mysql/.cargo/config.toml b/tests/testcases/http-rust-outbound-mysql/.cargo/config.toml
deleted file mode 100644
index 6b77899c..00000000
--- a/tests/testcases/http-rust-outbound-mysql/.cargo/config.toml
+++ /dev/null
@@ -1,2 +0,0 @@
-[build]
-target = "wasm32-wasi"
diff --git a/tests/testcases/http-rust-outbound-mysql/Cargo.toml b/tests/testcases/http-rust-outbound-mysql/Cargo.toml
deleted file mode 100644
index cd56000c..00000000
--- a/tests/testcases/http-rust-outbound-mysql/Cargo.toml
+++ /dev/null
@@ -1,21 +0,0 @@
-[package]
-name = "http-rust-outbound-mysql"
-version = "0.1.0"
-edition = "2021"
-
-[lib]
-crate-type = [ "cdylib" ]
-
-[dependencies]
-# Useful crate to handle errors.
-anyhow = "1"
-# Crate to simplify working with bytes.
-bytes = "1"
-# General-purpose crate with common HTTP types.
-http = "0.2"
-# The Spin SDK.
-spin-sdk = { path = "../../../sdk/rust" }
-# Crate that generates Rust Wasm bindings from a WebAssembly interface.
-wit-bindgen-rust = { git = "https://github.com/bytecodealliance/wit-bindgen", rev = "cb871cfa1ee460b51eb1d144b175b9aab9c50aba" }
-
-[workspace]
diff --git a/tests/testcases/http-rust-outbound-mysql/spin.toml b/tests/testcases/http-rust-outbound-mysql/spin.toml
deleted file mode 100644
index 08df23e2..00000000
--- a/tests/testcases/http-rust-outbound-mysql/spin.toml
+++ /dev/null
@@ -1,14 +0,0 @@
-spin_version = "1"
-authors = ["Fermyon Engineering <engineering@fermyon.com>"]
-name = "http-rust-outbound-mysql"
-trigger = { type = "http", base = "/" }
-version = "0.1.0"
-
-[[component]]
-environment = { DB_URL = "mysql://spin:spin@mysql/spin_dev" }
-id = "outbound-mysql"
-source = "target/wasm32-wasi/release/http_rust_outbound_mysql.wasm"
-[component.trigger]
-route = "/..."
-[component.build]
-command = "cargo build --target wasm32-wasi --release"
diff --git a/tests/testcases/http-rust-outbound-mysql/src/lib.rs b/tests/testcases/http-rust-outbound-mysql/src/lib.rs
deleted file mode 100644
index 623d9c1d..00000000
--- a/tests/testcases/http-rust-outbound-mysql/src/lib.rs
+++ /dev/null
@@ -1,239 +0,0 @@
-#![allow(dead_code)]
-use anyhow::{anyhow, Result};
-use spin_sdk::{
-    http::{Request, Response},
-    http_component, mysql::{self, Decode},
-};
-
-// The environment variable set in `spin.toml` that points to the
-// address of the Pg server that the component will write to
-const DB_URL_ENV: &str = "DB_URL";
-
-#[derive(Debug, Clone)]
-struct NumericRow {
-    rtiny: i8,
-    rsmall: i16,
-    rmedium: i32,
-    rint: i32,
-    rbig: i64,
-    rfloat: f32,
-    rdouble: f64,
-    rutiny: u8,
-    rusmall: u16,
-    rumedium: u32,
-    ruint: u32,
-    rubig: u64,
-    rtinyint1: bool,
-    rbool: bool,
-}
-
-#[derive(Debug, Clone)]
-struct CharacterRow {
-    rvarchar: String,
-    rtext: String,
-    rchar: String,
-    rbinary: Vec<u8>,
-    rvarbinary: Vec<u8>,
-    rblob: Vec<u8>
-}
-
-#[http_component]
-fn process(req: Request) -> Result<Response> {
-    match req.uri().path() {
-        "/test_character_types" => test_character_types(req),
-        "/test_numeric_types" => test_numeric_types(req),
-        _ => Ok(http::Response::builder()
-            .status(404)
-            .body(Some("Not found".into()))?),
-    }
-}
-
-fn test_numeric_types(_req: Request) -> Result<Response> {
-    let address = std::env::var(DB_URL_ENV)?;
-
-    let create_table_sql = r#"
-        CREATE TEMPORARY TABLE test_numeric_types (
-            rtiny TINYINT NOT NULL,
-            rsmall SMALLINT NOT NULL,
-            rmedium MEDIUMINT NOT NULL,
-            rint INT NOT NULL,
-            rbig BIGINT NOT NULL,
-            rfloat FLOAT NOT NULL,
-            rdouble DOUBLE NOT NULL,
-            rutiny TINYINT UNSIGNED NOT NULL,
-            rusmall SMALLINT UNSIGNED NOT NULL,
-            rumedium MEDIUMINT UNSIGNED NOT NULL,
-            ruint INT UNSIGNED NOT NULL,
-            rubig BIGINT UNSIGNED NOT NULL,
-            rtinyint1 TINYINT(1) NOT NULL,
-            rbool BOOLEAN NOT NULL
-         );
-    "#;
-
-    mysql::execute(&address, create_table_sql, &[])?;
-
-    let insert_sql = r#"
-        INSERT INTO test_numeric_types
-            (rtiny, rsmall, rmedium, rint, rbig, rfloat, rdouble, rutiny, rusmall, rumedium, ruint, rubig, rtinyint1, rbool)
-        VALUES
-            (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1);
-    "#;
-
-    mysql::execute(&address, insert_sql, &[])?;
-
-    let sql = r#"
-        SELECT
-            rtiny,
-            rsmall,
-            rmedium,
-            rint,
-            rbig,
-            rfloat,
-            rdouble,
-            rutiny,
-            rusmall,
-            rumedium,
-            ruint,
-            rubig,
-            rtinyint1,
-            rbool
-        FROM test_numeric_types;
-    "#;
-
-    let rowset = mysql::query(&address, sql, &[])?;
-
-    let column_summary = rowset
-        .columns
-        .iter()
-        .map(format_col)
-        .collect::<Vec<_>>()
-        .join(", ");
-
-    let mut response_lines = vec![];
-
-    for row in rowset.rows {
-        let rtiny = i8::decode(&row[0])?;
-        let rsmall = i16::decode(&row[1])?;
-        let rmedium = i32::decode(&row[2])?;
-        let rint = i32::decode(&row[3])?;
-        let rbig = i64::decode(&row[4])?;
-        let rfloat = f32::decode(&row[5])?;
-        let rdouble = f64::decode(&row[6])?;
-        let rutiny = u8::decode(&row[7])?;
-        let rusmall = u16::decode(&row[8])?;
-        let rumedium = u32::decode(&row[9])?;
-        let ruint = u32::decode(&row[10])?;
-        let rubig = u64::decode(&row[11])?;
-        let rtinyint1 = bool::decode(&row[12])?;
-        let rbool = bool::decode(&row[13])?;
-
-        let row = NumericRow {
-            rtiny,
-            rsmall,
-            rmedium,
-            rint,
-            rbig,
-            rfloat,
-            rdouble,
-            rutiny,
-            rusmall,
-            rumedium,
-            ruint,
-            rubig,
-            rtinyint1,
-            rbool,
-        };
-
-        response_lines.push(format!("row: {:#?}", row));
-    }
-
-    let response = format!(
-        "Found {} rows(s) as follows:\n{}\n\n(Column info: {})\n",
-        response_lines.len(),
-        response_lines.join("\n"),
-        column_summary,
-    );
-
-    Ok(http::Response::builder()
-        .status(200)
-        .body(Some(response.into()))?)
-}
-
-fn test_character_types(_req: Request) -> Result<Response> {
-    let address = std::env::var(DB_URL_ENV)?;
-
-    let create_table_sql = r#"
-        CREATE TEMPORARY TABLE test_character_types (
-            rvarchar varchar(40) NOT NULL,
-            rtext text NOT NULL,
-            rchar char(10) NOT NULL,
-            rbinary binary(10) NOT NULL,
-            rvarbinary varbinary(10) NOT NULL,
-            rblob BLOB NOT NULL
-         );
-    "#;
-
-    mysql::execute(&address, create_table_sql, &[])
-        .map_err(|e| anyhow!("Error executing MySQL command: {:?}", e))?;
-
-    let insert_sql = r#"
-        INSERT INTO test_character_types
-            (rvarchar, rtext, rchar, rbinary, rvarbinary, rblob)
-        VALUES
-            ('rvarchar', 'rtext', 'rchar', 'a', 'a', 'a');
-    "#;
-
-    mysql::execute(&address, insert_sql, &[])?;
-
-    let sql = r#"
-        SELECT
-            rvarchar, rtext, rchar, rbinary, rvarbinary, rblob
-        FROM test_character_types;
-    "#;
-
-    let rowset = mysql::query(&address, sql, &[])?;
-
-    let column_summary = rowset
-        .columns
-        .iter()
-        .map(format_col)
-        .collect::<Vec<_>>()
-        .join(", ");
-
-    let mut response_lines = vec![];
-
-    for row in rowset.rows {
-        let rvarchar = String::decode(&row[0])?;
-        let rtext = String::decode(&row[1])?;
-        let rchar = String::decode(&row[2])?;
-        let rbinary = Vec::<u8>::decode(&row[3])?;
-        let rvarbinary = Vec::<u8>::decode(&row[4])?;
-        let rblob = Vec::<u8>::decode(&row[5])?;
-
-        let row = CharacterRow {
-            rvarchar,
-            rtext,
-            rchar,
-            rbinary,
-            rvarbinary,
-            rblob,
-        };
-
-        response_lines.push(format!("row: {:#?}", row));
-    }
-
-    let response = format!(
-        "Found {} rows(s) as follows:\n{}\n\n(Column info: {})\n",
-        response_lines.len(),
-        response_lines.join("\n"),
-        column_summary,
-    );
-
-    Ok(http::Response::builder()
-        .status(200)
-        .body(Some(response.into()))?)
-}
-
-fn format_col(column: &mysql::Column) -> String {
-    format!("{}: {:?}", column.name, column.data_type)
-}
diff --git a/tests/testcases/mod.rs b/tests/testcases/mod.rs
deleted file mode 100644
index 4a471a70..00000000
--- a/tests/testcases/mod.rs
+++ /dev/null
@@ -1,381 +0,0 @@
-#[cfg(feature = "new-e2e-tests")]
-pub mod all {
-    use anyhow::Result;
-    use e2e_testing::asserts::assert_http_response;
-    use e2e_testing::controller::Controller;
-    use e2e_testing::metadata_extractor::AppMetadata;
-    use e2e_testing::testcase::TestCase;
-
-    fn get_url(base: &str, path: &str) -> String {
-        format!("{}{}", base, path)
-    }
-
-    pub async fn http_go_works(controller: &dyn Controller) {
-        fn checks(metadata: &AppMetadata) -> Result<()> {
-            return assert_http_response(
-                metadata.base.as_str(),
-                200,
-                &[],
-                Some("Hello Fermyon!\n"),
-            );
-        }
-
-        let tc = TestCase {
-            name: "http-go template".to_string(),
-            appname: None,
-            template: Some("http-go".to_string()),
-            template_install_args: None,
-            assertions: checks,
-            plugins: None,
-            deploy_args: None,
-            pre_build_hooks: None,
-        };
-
-        tc.run(controller).await.unwrap();
-    }
-
-    pub async fn http_c_works(controller: &dyn Controller) {
-        fn checks(metadata: &AppMetadata) -> Result<()> {
-            return assert_http_response(
-                metadata.base.as_str(),
-                200,
-                &[],
-                Some("Hello from WAGI/1\n"),
-            );
-        }
-
-        let tc = TestCase {
-            name: "http-c template".to_string(),
-            appname: None,
-            template: Some("http-c".to_string()),
-            template_install_args: None,
-            assertions: checks,
-            plugins: None,
-            deploy_args: None,
-            pre_build_hooks: None,
-        };
-
-        tc.run(controller).await.unwrap()
-    }
-
-    pub async fn http_rust_works(controller: &dyn Controller) {
-        fn checks(metadata: &AppMetadata) -> Result<()> {
-            return assert_http_response(metadata.base.as_str(), 200, &[], Some("Hello, Fermyon"));
-        }
-
-        let tc = TestCase {
-            name: "http-rust-template".to_string(),
-            appname: None,
-            template: Some("http-rust".to_string()),
-            template_install_args: None,
-            assertions: checks,
-            plugins: None,
-            deploy_args: None,
-            pre_build_hooks: None,
-        };
-
-        tc.run(controller).await.unwrap()
-    }
-
-    pub async fn http_zig_works(controller: &dyn Controller) {
-        fn checks(metadata: &AppMetadata) -> Result<()> {
-            return assert_http_response(metadata.base.as_str(), 200, &[], Some("Hello World!\n"));
-        }
-
-        let tc = TestCase {
-            name: "http-zig-template".to_string(),
-            appname: None,
-            template: Some("http-zig".to_string()),
-            template_install_args: None,
-            assertions: checks,
-            plugins: None,
-            deploy_args: None,
-            pre_build_hooks: None,
-        };
-
-        tc.run(controller).await.unwrap()
-    }
-
-    pub async fn http_grain_works(controller: &dyn Controller) {
-        fn checks(metadata: &AppMetadata) -> Result<()> {
-            return assert_http_response(metadata.base.as_str(), 200, &[], Some("Hello, World\n"));
-        }
-
-        let tc = TestCase {
-            name: "http-grain-template".to_string(),
-            appname: None,
-            template: Some("http-grain".to_string()),
-            template_install_args: None,
-            assertions: checks,
-            plugins: None,
-            deploy_args: None,
-            pre_build_hooks: None,
-        };
-
-        tc.run(controller).await.unwrap()
-    }
-
-    pub async fn http_ts_works(controller: &dyn Controller) {
-        fn checks(metadata: &AppMetadata) -> Result<()> {
-            return assert_http_response(
-                metadata.base.as_str(),
-                200,
-                &[],
-                Some("Hello from TS-SDK"),
-            );
-        }
-
-        let tc = TestCase {
-            name: "http-ts-template".to_string(),
-            appname: None,
-            template: Some("http-ts".to_string()),
-            template_install_args: Some(vec![
-                "--git".to_string(),
-                "https://github.com/fermyon/spin-js-sdk".to_string(),
-                "--update".to_string(),
-            ]),
-            assertions: checks,
-            plugins: Some(vec!["js2wasm".to_string()]),
-            deploy_args: None,
-            pre_build_hooks: Some(vec![vec!["npm".to_string(), "install".to_string()]]),
-        };
-
-        tc.run(controller).await.unwrap()
-    }
-
-    pub async fn http_js_works(controller: &dyn Controller) {
-        fn checks(metadata: &AppMetadata) -> Result<()> {
-            return assert_http_response(
-                metadata.base.as_str(),
-                200,
-                &[],
-                Some("Hello from JS-SDK"),
-            );
-        }
-
-        let tc = TestCase {
-            name: "http-js-template".to_string(),
-            appname: None,
-            template: Some("http-js".to_string()),
-            template_install_args: Some(vec![
-                "--git".to_string(),
-                "https://github.com/fermyon/spin-js-sdk".to_string(),
-                "--update".to_string(),
-            ]),
-            assertions: checks,
-            plugins: Some(vec!["js2wasm".to_string()]),
-            deploy_args: None,
-            pre_build_hooks: Some(vec![vec!["npm".to_string(), "install".to_string()]]),
-        };
-
-        tc.run(controller).await.unwrap()
-    }
-
-    pub async fn assets_routing_works(controller: &dyn Controller) {
-        fn checks(metadata: &AppMetadata) -> Result<()> {
-            assert_http_response(
-                get_url(metadata.base.as_str(), "/static/thisshouldbemounted/1").as_str(),
-                200,
-                &[],
-                Some("1\n"),
-            )?;
-
-            assert_http_response(
-                get_url(metadata.base.as_str(), "/static/thisshouldbemounted/2").as_str(),
-                200,
-                &[],
-                Some("2\n"),
-            )?;
-
-            assert_http_response(
-                get_url(metadata.base.as_str(), "/static/thisshouldbemounted/3").as_str(),
-                200,
-                &[],
-                Some("3\n"),
-            )?;
-
-            assert_http_response(
-                get_url(metadata.base.as_str(), "/static/donotmount/a").as_str(),
-                404,
-                &[],
-                Some("Not Found"),
-            )?;
-
-            assert_http_response(
-                get_url(
-                    metadata.base.as_str(),
-                    "/static/thisshouldbemounted/thisshouldbeexcluded/4",
-                )
-                .as_str(),
-                404,
-                &[],
-                Some("Not Found"),
-            )?;
-
-            Ok(())
-        }
-
-        let tc = TestCase {
-            name: "assets-test".to_string(),
-            appname: Some("assets-test".to_string()),
-            template: None,
-            template_install_args: None,
-            assertions: checks,
-            plugins: None,
-            deploy_args: None,
-            pre_build_hooks: None,
-        };
-
-        tc.run(controller).await.unwrap()
-    }
-
-    pub async fn simple_spin_rust_works(controller: &dyn Controller) {
-        fn checks(metadata: &AppMetadata) -> Result<()> {
-            assert_http_response(
-                get_url(metadata.base.as_str(), "/test/hello").as_str(),
-                200,
-                &[],
-                Some("I'm a teapot"),
-            )?;
-
-            assert_http_response(
-                get_url(
-                    metadata.base.as_str(),
-                    "/test/hello/wildcards/should/be/handled",
-                )
-                .as_str(),
-                200,
-                &[],
-                Some("I'm a teapot"),
-            )?;
-
-            assert_http_response(
-                get_url(metadata.base.as_str(), "/thisshouldfail").as_str(),
-                404,
-                &[],
-                None,
-            )?;
-
-            assert_http_response(
-                get_url(metadata.base.as_str(), "/test/hello/test-placement").as_str(),
-                200,
-                &[],
-                Some("text for test"),
-            )?;
-
-            Ok(())
-        }
-
-        let tc = TestCase {
-            name: "simple-spin-rust-test".to_string(),
-            appname: Some("simple-spin-rust-test".to_string()),
-            template: None,
-            template_install_args: None,
-            assertions: checks,
-            plugins: None,
-            deploy_args: None,
-            pre_build_hooks: None,
-        };
-
-        tc.run(controller).await.unwrap()
-    }
-
-    pub async fn header_env_routes_works(controller: &dyn Controller) {
-        fn checks(metadata: &AppMetadata) -> Result<()> {
-            assert_http_response(
-                get_url(metadata.base.as_str(), "/env").as_str(),
-                200,
-                &[],
-                Some("I'm a teapot"),
-            )?;
-
-            assert_http_response(
-                get_url(metadata.base.as_str(), "/env/foo").as_str(),
-                200,
-                &[("env_some_key", "some_value")],
-                Some("I'm a teapot"),
-            )?;
-
-            Ok(())
-        }
-
-        let tc = TestCase {
-            name: "headers-env-routes-test".to_string(),
-            appname: Some("headers-env-routes-test".to_string()),
-            template: None,
-            template_install_args: None,
-            assertions: checks,
-            plugins: None,
-            deploy_args: None,
-            pre_build_hooks: None,
-        };
-
-        tc.run(controller).await.unwrap()
-    }
-
-    pub async fn header_dynamic_env_works(controller: &dyn Controller) {
-        fn checks(metadata: &AppMetadata) -> Result<()> {
-            assert_http_response(
-                get_url(metadata.base.as_str(), "/env").as_str(),
-                200,
-                &[],
-                Some("I'm a teapot"),
-            )?;
-
-            assert_http_response(
-                get_url(metadata.base.as_str(), "/env/foo").as_str(),
-                200,
-                &[("env_some_key", "some_value")],
-                Some("I'm a teapot"),
-            )?;
-
-            Ok(())
-        }
-
-        let tc = TestCase {
-            name: "headers-dynamic-env-test".to_string(),
-            appname: Some("headers-dynamic-env-test".to_string()),
-            template: None,
-            template_install_args: None,
-            assertions: checks,
-            plugins: None,
-            deploy_args: Some(vec!["--env".to_string(), "foo=bar".to_string()]),
-            pre_build_hooks: None,
-        };
-
-        tc.run(controller).await.unwrap()
-    }
-
-    pub async fn http_rust_outbound_mysql_works(controller: &dyn Controller) {
-        fn checks(metadata: &AppMetadata) -> Result<()> {
-            assert_http_response(
-                get_url(metadata.base.as_str(), "/test_numeric_types").as_str(),
-                200,
-                &[],
-                None,
-            )?;
-
-            assert_http_response(
-                get_url(metadata.base.as_str(), "/test_character_types").as_str(),
-                200,
-                &[],
-                None,
-            )?;
-
-            Ok(())
-        }
-
-        let tc = TestCase {
-            name: "http-rust-outbound-mysql".to_string(),
-            appname: Some("http-rust-outbound-mysql".to_string()),
-            template: None,
-            template_install_args: None,
-            assertions: checks,
-            plugins: None,
-            deploy_args: None,
-            pre_build_hooks: None,
-        };
-
-        tc.run(controller).await.unwrap()
-    }
-}
diff --git a/tests/testcases/simple-spin-rust-test/.cargo/config.toml b/tests/testcases/simple-spin-rust-test/.cargo/config.toml
deleted file mode 100644
index 6b77899c..00000000
--- a/tests/testcases/simple-spin-rust-test/.cargo/config.toml
+++ /dev/null
@@ -1,2 +0,0 @@
-[build]
-target = "wasm32-wasi"
diff --git a/tests/testcases/simple-spin-rust-test/Cargo.toml b/tests/testcases/simple-spin-rust-test/Cargo.toml
deleted file mode 100644
index 9b78c752..00000000
--- a/tests/testcases/simple-spin-rust-test/Cargo.toml
+++ /dev/null
@@ -1,25 +0,0 @@
-[package]
-name    = "simple-spin-rust"
-version = "0.1.0"
-edition = "2021"
-
-[lib]
-crate-type = [ "cdylib" ]
-
-[dependencies]
-# Useful crate to handle errors.
-anyhow = "1"
-# Crate to simplify working with bytes.
-bytes = "1"
-# General-purpose crate with common HTTP types.
-http = "0.2"
-# The Spin SDK.
-spin-sdk = { git = "https://github.com/fermyon/spin", tag = "v0.7.1" }
-# The wit-bindgen-rust dependency generates bindings for interfaces.
-wit-bindgen-rust = { git = "https://github.com/bytecodealliance/wit-bindgen", rev = "cb871cfa1ee460b51eb1d144b175b9aab9c50aba" }
-
-[workspace]
-
-# Metadata about this component.
-[package.metadata.component]
-name = "spinhelloworld"
diff --git a/tests/testcases/simple-spin-rust-test/assets/test.txt b/tests/testcases/simple-spin-rust-test/assets/test.txt
deleted file mode 100644
index 56ff8c93..00000000
--- a/tests/testcases/simple-spin-rust-test/assets/test.txt
+++ /dev/null
@@ -1,1 +0,0 @@
-text for test
\ No newline at end of file
diff --git a/tests/testcases/simple-spin-rust-test/spin.toml b/tests/testcases/simple-spin-rust-test/spin.toml
deleted file mode 100644
index 730dd809..00000000
--- a/tests/testcases/simple-spin-rust-test/spin.toml
+++ /dev/null
@@ -1,20 +0,0 @@
-spin_version = "1"
-authors = ["Fermyon Engineering <engineering@fermyon.com>"]
-description = "A simple application that returns hello and goodbye."
-name = "simple-spin-rust-test"
-trigger = {type = "http", base = "/test"}
-version = "1.0.0"
-
-[variables]
-object = { default = "teapot" }
-
-[[component]]
-id = "hello"
-source = "target/wasm32-wasi/release/simple_spin_rust.wasm"
-files = [ { source = "assets", destination = "/" } ]
-[component.trigger]
-route = "/hello/..."
-[component.config]
-message = "I'm a {{object}}"
-[component.build]
-command = "cargo build --target wasm32-wasi --release"
\ No newline at end of file
diff --git a/tests/testcases/simple-spin-rust-test/src/lib.rs b/tests/testcases/simple-spin-rust-test/src/lib.rs
deleted file mode 100644
index f40d5c2b..00000000
--- a/tests/testcases/simple-spin-rust-test/src/lib.rs
+++ /dev/null
@@ -1,26 +0,0 @@
-use anyhow::Result;
-use spin_sdk::{
-    config,
-    http::{Request, Response},
-    http_component,
-};
-
-#[http_component]
-fn hello_world(req: Request) -> Result<Response> {
-    let path = req.uri().path();
-
-    if path.contains("test-placement") {
-        match std::fs::read_to_string("/test.txt") {
-            Ok(txt) => Ok(http::Response::builder()
-                .status(200)
-                .body(Some(txt.into()))?),
-            Err(e) => anyhow::bail!("Error, could not access test.txt: {}", e),
-        }
-    } else {
-        let msg = config::get("message").expect("Failed to acquire message from spin.toml");
-
-        Ok(http::Response::builder()
-            .status(200)
-            .body(Some(msg.into()))?)
-    }
-}