test/openagents/forge/relup_package_test.exs

58e6347eeb72 · 2 KB

defmodule OpenAgents.Forge.RelupPackageTest do
  use ExUnit.Case, async: true

  alias OpenAgents.Forge.RelupPackage

  @from_sha String.duplicate("a", 40)
  @to_sha String.duplicate("b", 40)
  @system "x86_64-pc-linux-gnu"

  test "loads a package bound to the running revision and target system" do
    directory = package_directory()
    on_exit(fn -> File.rm_rf!(directory) end)

    assert {:ok, request} =
             RelupPackage.load(directory,
               current_revision: @from_sha,
               system_architecture: @system,
               expected_nodes: [:second@local, :first@local]
             )

    assert request.sha == @to_sha
    assert request.from_revision == @from_sha
    assert request.from_version == "0.2.0"
    assert request.to_version == "0.3.0"
    assert request.expected_nodes == [:first@local, :second@local]
    assert request.artifact_bytes == "target release"
    assert request.package_manifest_digest =~ ~r/\A[0-9a-f]{64}\z/
  end

  test "refuses a package for another revision, platform, or artifact" do
    directory = package_directory()
    on_exit(fn -> File.rm_rf!(directory) end)

    assert {:error, :running_revision_mismatch} =
             RelupPackage.load(directory,
               current_revision: String.duplicate("c", 40),
               system_architecture: @system
             )

    assert {:error, :target_system_mismatch} =
             RelupPackage.load(directory,
               current_revision: @from_sha,
               system_architecture: "aarch64-apple-darwin"
             )

    File.write!(Path.join(directory, "openagents-0.3.0.tar.gz"), "changed")

    assert {:error, :target_artifact_digest_mismatch} =
             RelupPackage.load(directory,
               current_revision: @from_sha,
               system_architecture: @system
             )
  end

  defp package_directory do
    directory =
      Path.join(
        System.tmp_dir!(),
        "openagents-relup-package-#{System.unique_integer([:positive])}"
      )

    File.mkdir_p!(directory)
    artifact = "target release"
    File.write!(Path.join(directory, "openagents-0.3.0.tar.gz"), artifact)

    manifest = %{
      "schema" => "openagents.relup-package.v1",
      "release_name" => "openagents",
      "from_revision" => @from_sha,
      "to_revision" => @to_sha,
      "from_version" => "0.2.0",
      "to_version" => "0.3.0",
      "from_state_version" => 2,
      "to_state_version" => 2,
      "from_artifact_digest" => String.duplicate("d", 64),
      "to_artifact_digest" => sha256(artifact),
      "relup_digest" => String.duplicate("e", 64),
      "target_system" => @system
    }

    File.write!(Path.join(directory, "package.json"), Jason.encode!(manifest))
    directory
  end

  defp sha256(bytes), do: :crypto.hash(:sha256, bytes) |> Base.encode16(case: :lower)
end