Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
82 changes: 82 additions & 0 deletions sdk/bazel_tools/client_server/client_server_test.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -98,3 +98,85 @@ $$runner $$client "$$client_args" $$server "$$server_args" "$$runner_args"
),
**kwargs
)

def client_server_test_canton_sh(
name, data, src,
additional_canton_args = [],
server_files = [],
tags = [],
):
native.genrule(
name = name + "-client-sh",
outs = [name + "-client.sh"],
tools = data,
cmd = """\
cat >$(OUTS) <<'EOF'
#!/usr/bin/env bash
set -euo pipefail
canonicalize_rlocation() {{
# Note (MK): This is a fun one: Let's say $$TEST_WORKSPACE is "compatibility"
# and the argument points to a target from an external workspace, e.g.,
# @daml-sdk-0.0.0//:daml. Then the short path will point to
# ../daml-sdk-0.0.0/daml. Putting things together we end up with
# compatibility/../daml-sdk-0.0.0/daml. On Linux and MacOS this works
# just fine. However, on windows we need to normalize the path
# or rlocation will fail to find the path in the manifest file.
rlocation $$(realpath -L -s -m --relative-to=$$PWD $$TEST_WORKSPACE/$$1)
}}

get_exe() {{
if [[ %os% = windows ]]; then
for arg in "$$@"; do
if [[ $$arg = *.exe ]]; then
echo "$$arg"
return
fi
done
echo "$$1"
else
echo "$$1"
fi
}}

trap 'status=$$?; kill -TERM $$PID; wait $$PID; exit $$status' INT TERM

timeout=60
while [ ! -e _port_file ]; do
if [ "$$timeout" = 0 ]; then
echo "Timed out waiting for Canton startup" >&2
exit 1
fi
sleep 1
timeout=$$((timeout - 1))
done

{src}
EOF
chmod +x $(OUTS)
""".format(src = src),
)

native.sh_binary(
name = name + "-client",
srcs = [name + "-client.sh"],
data = data,
)

server = "@daml-sdk-0.0.0//:daml"
server_args = ["sandbox", "--canton-port-file", "_port_file"] + additional_canton_args
server_files_prefix = "--dar="

client_server_test(
name = name,
client = "{}-client".format(name),
client_args = [],
client_files = [],
data = [],
runner = "//bazel_tools/client_server:runner",
runner_args = ["6865"],
server = server,
server_args = server_args,
server_files = server_files,
server_files_prefix = server_files_prefix,
tags = tags + ["exclusive"],
)
28 changes: 19 additions & 9 deletions sdk/compatibility/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ load(
"data_dependencies_coins",
"data_dependencies_daml_script_test",
"data_dependencies_upgrade_test",
"data_dependencies_codegen_test",
)
load("//bazel_tools:versions.bzl", "versions")
load("//:versions.bzl", "platform_versions", "sdk_versions", "stable_versions")
Expand Down Expand Up @@ -108,7 +109,7 @@ head = "0.0.0"
# Test that the Daml script runner can run DARs built with an older SDK
# version. I.e. where the runner version is at least the SDK version or
# more recent.
if versions.is_at_least(sdk_version, platform_version)
if versions.is_at_least(sdk_version, platform_version) and versions.is_at_least("3.0.0", sdk_version)
] if not is_windows else None

[
Expand All @@ -130,19 +131,28 @@ head = "0.0.0"
if versions.is_at_least(old_sdk_version, new_sdk_version)
]

[
data_dependencies_codegen_test(
new_sdk_version = new_sdk_version,
old_sdk_version = old_sdk_version,
)
for new_sdk_version in sdk_versions
for old_sdk_version in sdk_versions
# Tests that we can build a package with a newer SDK version that has
# data-dependencies on packages built with an older SDK version.
if versions.is_at_least(old_sdk_version, new_sdk_version) and old_sdk_version != new_sdk_version
]

[
data_dependencies_daml_script_test(
new_sdk_version = new_sdk_version,
old_sdk_version = old_sdk_version,
)
for new_sdk_version in sdk_versions
for old_sdk_version in sdk_versions
# Tests that we can run a daml script from a package built with an older
# SDK version even when exposed through an import in a package built with
# the latest SDK version.
# (regression test for https://github.com/digital-asset/daml/issues/14291)
if old_sdk_version != "0.0.0"
# These tests use data-dependency reexports (#11147), so the earliest
# supported SDK is 1.18.0
if versions.is_at_least("3.0.0", old_sdk_version)
# Tests that we can build a package with a newer SDK version that has
# data-dependencies on packages built with an older SDK version.
if versions.is_at_least(old_sdk_version, new_sdk_version) and old_sdk_version != new_sdk_version
]

os_name = "linux" if not is_windows else "windows"
Expand Down
4 changes: 2 additions & 2 deletions sdk/compatibility/WORKSPACE
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ build_bazel_rules_nodejs_dependencies()
load("@build_bazel_rules_nodejs//:index.bzl", "node_repositories", "yarn_install")

node_repositories(
node_version = "18.12.1",
node_version = "18.17.0",
)

load(
Expand Down Expand Up @@ -307,7 +307,7 @@ nixpkgs_package(
) if not is_windows else None

node_repositories(
node_version = "18.12.1",
node_version = "18.17.0",
)

nixpkgs_package(
Expand Down
103 changes: 22 additions & 81 deletions sdk/compatibility/bazel_tools/daml_script/daml_script.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

load(
"@daml//bazel_tools/client_server:client_server_test.bzl",
"client_server_test",
"client_server_test_canton_sh",
)
load("//bazel_tools:versions.bzl", "version_to_name", "versions")
load("//bazel_tools:testing.bzl", "extra_tags")
Expand Down Expand Up @@ -62,44 +62,17 @@ def daml_script_test(
daml_runner = "@daml-sdk-{version}//:daml".format(
version = runner_version,
)

server = daml_runner
server_args = ["sandbox", "--canton-port-file", "_port_file"]
server_files = ["$(rootpath {})".format(compiled_dar)]
server_files_prefix = "--dar="

native.genrule(
name = "{}-client-sh".format(name),
outs = ["{}-client.sh".format(name)],
cmd = """\
cat >$(OUTS) <<'EOF'
#!/usr/bin/env bash
set -euo pipefail
canonicalize_rlocation() {{
# Note (MK): This is a fun one: Let's say $$TEST_WORKSPACE is "compatibility"
# and the argument points to a target from an external workspace, e.g.,
# @daml-sdk-0.0.0//:daml. Then the short path will point to
# ../daml-sdk-0.0.0/daml. Putting things together we end up with
# compatibility/../daml-sdk-0.0.0/daml. On Linux and MacOS this works
# just fine. However, on windows we need to normalize the path
# or rlocation will fail to find the path in the manifest file.
rlocation $$(realpath -L -s -m --relative-to=$$PWD $$TEST_WORKSPACE/$$1)
}}
client_server_test_canton_sh(
name = name,
data = [
compiled_dar,
daml_runner,
],
server_files = ["$(rootpath {})".format(compiled_dar)],
tags = extra_tags(compiler_version, runner_version),
src = """\
runner=$$(canonicalize_rlocation $(rootpath {runner}))
# Cleanup the trigger runner process but maintain the script runner exit code.
trap 'status=$$?; kill -TERM $$PID; wait $$PID; exit $$status' INT TERM

if [ {wait_for_port_file} -eq 1 ]; then
timeout=60
while [ ! -e _port_file ]; do
if [ "$$timeout" = 0 ]; then
echo "Timed out waiting for Canton startup" >&2
exit 1
fi
sleep 1
timeout=$$((timeout - 1))
done
fi
if [ {upload_dar} -eq 1 ] ; then
$$runner ledger upload-dar \\
--host localhost \\
Expand All @@ -113,57 +86,25 @@ $$runner script \\
--wall-clock-time \\
--dar $$(canonicalize_rlocation $(rootpath {dar})) \\
--script-name {script_name}
EOF
chmod +x $(OUTS)
""".format(
dar = compiled_dar,
runner = daml_runner,
script_name = script_name,
upload_dar = "0",
wait_for_port_file = "1",
),
tools = [
compiled_dar,
daml_runner,
],
)
native.sh_binary(
name = "{}-client".format(name),
srcs = ["{}-client.sh".format(name)],
data = [
compiled_dar,
daml_runner,
],
)

client_server_test(
name = name,
client = "{}-client".format(name),
client_args = [],
client_files = [],
data = [
compiled_dar,
],
runner = "//bazel_tools/client_server:runner",
runner_args = ["6865"],
server = server,
server_args = server_args,
server_files = server_files,
server_files_prefix = server_files_prefix,
tags = extra_tags(compiler_version, runner_version) + ["exclusive"],
)

def daml_script_example_test(compiler_version, runner_version):
if versions.is_at_least("3.0.0", compiler_version):
daml_script_test(
name = "daml-script-test-compiler-{compiler_version}-runner-{runner_version}".format(
compiler_version = version_to_name(compiler_version),
runner_version = version_to_name(runner_version),
),
compiler_version = compiler_version,
runner_version = runner_version,
compiled_dar = "//:script-example-dar-{version}".format(
version = version_to_name(compiler_version),
),
script_name = "ScriptExample:test",
)
daml_script_test(
name = "daml-script-test-compiler-{compiler_version}-runner-{runner_version}".format(
compiler_version = version_to_name(compiler_version),
runner_version = version_to_name(runner_version),
),
compiler_version = compiler_version,
runner_version = runner_version,
compiled_dar = "//:script-example-dar-{version}".format(
version = version_to_name(compiler_version),
),
script_name = "ScriptExample:test",
)
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,5 @@ exports_files(glob([
"validate_dar.sh",
"example/**",
"daml_script_test/**",
"codegen_test/**",
]))
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
-- Copyright (c) 2025 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.
-- SPDX-License-Identifier: Apache-2.0

module Dep where

template DepData with
depParty: Party
value: Int
where
signatory depParty

choice Consume : Int
controller depParty
do
pure value

Loading
Loading