mirror of
https://github.com/DingTalk-Real-AI/dingtalk-workspace-cli.git
synced 2026-09-28 13:14:08 +08:00
237 lines
7.1 KiB
Bash
Executable File
237 lines
7.1 KiB
Bash
Executable File
#!/bin/sh
|
|
set -eu
|
|
|
|
DEFAULT_ROOT="$(CDPATH= cd -- "$(dirname -- "$0")/../.." && pwd)"
|
|
ROOT="${DWS_TEST_PACKAGES_ROOT:-$DEFAULT_ROOT}"
|
|
MODULE="$(cd "$ROOT" && go list -m)"
|
|
|
|
usage() {
|
|
printf '%s\n' \
|
|
"usage: $0 list <app|generators|helpers|cli|smoke|remaining|release-scripts>" \
|
|
" $0 list-coverage <app|cli|generators|helpers|remaining>" \
|
|
" $0 verify" >&2
|
|
exit 2
|
|
}
|
|
|
|
list_shard() {
|
|
shard="$1"
|
|
cd "$ROOT"
|
|
|
|
case "$shard" in
|
|
app)
|
|
go list ./internal/app/...
|
|
;;
|
|
generators)
|
|
go list ./internal/generator/...
|
|
;;
|
|
helpers)
|
|
go list ./internal/helpers/...
|
|
;;
|
|
cli)
|
|
# Owns package-cli Schema TestMain assembly (cmd_schema_catalog dump).
|
|
go list ./internal/cli/...
|
|
;;
|
|
smoke)
|
|
# Owns app.NewRootCommand public-tree smoke under -race (heavy assembly).
|
|
go list ./test/smoke/...
|
|
;;
|
|
release-scripts)
|
|
go list ./test/scripts/...
|
|
;;
|
|
remaining)
|
|
all_packages="$(go list ./...)"
|
|
printf '%s\n' "$all_packages" | while IFS= read -r package; do
|
|
case "$package" in
|
|
"$MODULE/internal/app"|"$MODULE/internal/app/"*) ;;
|
|
"$MODULE/internal/generator"|"$MODULE/internal/generator/"*) ;;
|
|
"$MODULE/internal/helpers"|"$MODULE/internal/helpers/"*) ;;
|
|
"$MODULE/internal/cli"|"$MODULE/internal/cli/"*) ;;
|
|
"$MODULE/test/smoke"|"$MODULE/test/smoke/"*) ;;
|
|
"$MODULE/test/scripts"|"$MODULE/test/scripts/"*) ;;
|
|
*) printf '%s\n' "$package" ;;
|
|
esac
|
|
done
|
|
;;
|
|
*)
|
|
printf 'unknown test package shard: %s\n' "$shard" >&2
|
|
exit 2
|
|
;;
|
|
esac
|
|
}
|
|
|
|
# Full-suite coverage measurement shards the same authoritative package set the
|
|
# single serial run used: ./ ./cmd/... ./internal/... ./skills/... plus the
|
|
# runtime payload and Linux ABI build helpers. Other pkg/ and scripts/ packages belong to the
|
|
# supporting profile; test/ suites carry no production statements for the
|
|
# candidate profile. Shards stay disjoint so their merged profile is
|
|
# block-for-block equivalent to one serial invocation.
|
|
list_coverage_scope() {
|
|
cd "$ROOT"
|
|
go list ./ ./cmd/... ./internal/... ./skills/... ./scripts/build/runtime-payload ./scripts/build/linux-abi
|
|
}
|
|
|
|
list_coverage_shard() {
|
|
shard="$1"
|
|
cd "$ROOT"
|
|
|
|
case "$shard" in
|
|
app)
|
|
go list ./internal/app/...
|
|
;;
|
|
cli)
|
|
go list ./internal/cli/...
|
|
;;
|
|
generators)
|
|
go list ./internal/generator/...
|
|
;;
|
|
helpers)
|
|
go list ./internal/helpers/...
|
|
;;
|
|
remaining)
|
|
scope_packages="$(list_coverage_scope)"
|
|
printf '%s\n' "$scope_packages" | while IFS= read -r package; do
|
|
case "$package" in
|
|
"$MODULE/internal/app"|"$MODULE/internal/app/"*) ;;
|
|
"$MODULE/internal/cli"|"$MODULE/internal/cli/"*) ;;
|
|
"$MODULE/internal/generator"|"$MODULE/internal/generator/"*) ;;
|
|
"$MODULE/internal/helpers"|"$MODULE/internal/helpers/"*) ;;
|
|
*) printf '%s\n' "$package" ;;
|
|
esac
|
|
done
|
|
;;
|
|
*)
|
|
printf 'unknown coverage package shard: %s\n' "$shard" >&2
|
|
exit 2
|
|
;;
|
|
esac
|
|
}
|
|
|
|
verify_plan() {
|
|
workdir="$(mktemp -d "${TMPDIR:-/tmp}/dws-test-packages.XXXXXX")"
|
|
trap 'rm -rf "$workdir"' EXIT HUP INT TERM
|
|
|
|
expected="$workdir/expected"
|
|
assigned="$workdir/assigned"
|
|
unique="$workdir/unique"
|
|
duplicates="$workdir/duplicates"
|
|
missing="$workdir/missing"
|
|
unexpected="$workdir/unexpected"
|
|
all_packages="$workdir/all-packages"
|
|
|
|
cd "$ROOT"
|
|
go list ./... > "$all_packages"
|
|
LC_ALL=C sort -u "$all_packages" > "$expected"
|
|
: > "$assigned"
|
|
|
|
for shard in app generators helpers cli smoke remaining release-scripts; do
|
|
shard_packages="$workdir/$shard"
|
|
unsorted_shard_packages="$workdir/$shard.unsorted"
|
|
list_shard "$shard" > "$unsorted_shard_packages"
|
|
LC_ALL=C sort "$unsorted_shard_packages" > "$shard_packages"
|
|
if [ ! -s "$shard_packages" ]; then
|
|
printf 'test package shard is empty: %s\n' "$shard" >&2
|
|
exit 1
|
|
fi
|
|
cat "$shard_packages" >> "$assigned"
|
|
done
|
|
|
|
LC_ALL=C sort "$assigned" -o "$assigned"
|
|
uniq -d "$assigned" > "$duplicates"
|
|
LC_ALL=C sort -u "$assigned" > "$unique"
|
|
comm -23 "$expected" "$unique" > "$missing"
|
|
comm -13 "$expected" "$unique" > "$unexpected"
|
|
|
|
failed=0
|
|
if [ -s "$duplicates" ]; then
|
|
printf '%s\n' 'test packages assigned to more than one shard:' >&2
|
|
sed 's/^/ /' "$duplicates" >&2
|
|
failed=1
|
|
fi
|
|
if [ -s "$missing" ]; then
|
|
printf '%s\n' 'default Go packages missing from the CI test plan:' >&2
|
|
sed 's/^/ /' "$missing" >&2
|
|
failed=1
|
|
fi
|
|
if [ -s "$unexpected" ]; then
|
|
printf '%s\n' 'CI test plan contains packages outside go list ./...:' >&2
|
|
sed 's/^/ /' "$unexpected" >&2
|
|
failed=1
|
|
fi
|
|
if [ "$failed" -ne 0 ]; then
|
|
exit 1
|
|
fi
|
|
|
|
package_count="$(wc -l < "$expected" | tr -d ' ')"
|
|
printf 'test package plan covers %s default packages exactly once\n' "$package_count"
|
|
|
|
coverage_expected="$workdir/coverage-expected"
|
|
coverage_assigned="$workdir/coverage-assigned"
|
|
coverage_unique="$workdir/coverage-unique"
|
|
coverage_duplicates="$workdir/coverage-duplicates"
|
|
coverage_missing="$workdir/coverage-missing"
|
|
coverage_unexpected="$workdir/coverage-unexpected"
|
|
|
|
list_coverage_scope > "$workdir/coverage-scope"
|
|
LC_ALL=C sort -u "$workdir/coverage-scope" > "$coverage_expected"
|
|
: > "$coverage_assigned"
|
|
|
|
for shard in app cli generators helpers remaining; do
|
|
shard_packages="$workdir/coverage-$shard"
|
|
unsorted_shard_packages="$workdir/coverage-$shard.unsorted"
|
|
list_coverage_shard "$shard" > "$unsorted_shard_packages"
|
|
LC_ALL=C sort "$unsorted_shard_packages" > "$shard_packages"
|
|
if [ ! -s "$shard_packages" ]; then
|
|
printf 'coverage package shard is empty: %s\n' "$shard" >&2
|
|
exit 1
|
|
fi
|
|
cat "$shard_packages" >> "$coverage_assigned"
|
|
done
|
|
|
|
LC_ALL=C sort "$coverage_assigned" -o "$coverage_assigned"
|
|
uniq -d "$coverage_assigned" > "$coverage_duplicates"
|
|
LC_ALL=C sort -u "$coverage_assigned" > "$coverage_unique"
|
|
comm -23 "$coverage_expected" "$coverage_unique" > "$coverage_missing"
|
|
comm -13 "$coverage_expected" "$coverage_unique" > "$coverage_unexpected"
|
|
|
|
coverage_failed=0
|
|
if [ -s "$coverage_duplicates" ]; then
|
|
printf '%s\n' 'coverage packages assigned to more than one shard:' >&2
|
|
sed 's/^/ /' "$coverage_duplicates" >&2
|
|
coverage_failed=1
|
|
fi
|
|
if [ -s "$coverage_missing" ]; then
|
|
printf '%s\n' 'full-suite coverage packages missing from the CI coverage plan:' >&2
|
|
sed 's/^/ /' "$coverage_missing" >&2
|
|
coverage_failed=1
|
|
fi
|
|
if [ -s "$coverage_unexpected" ]; then
|
|
printf '%s\n' 'CI coverage plan contains packages outside its scope:' >&2
|
|
sed 's/^/ /' "$coverage_unexpected" >&2
|
|
coverage_failed=1
|
|
fi
|
|
if [ "$coverage_failed" -ne 0 ]; then
|
|
exit 1
|
|
fi
|
|
|
|
coverage_count="$(wc -l < "$coverage_expected" | tr -d ' ')"
|
|
printf 'coverage package plan covers %s full-suite packages exactly once\n' "$coverage_count"
|
|
}
|
|
|
|
case "${1:-}" in
|
|
list)
|
|
[ "$#" -eq 2 ] || usage
|
|
list_shard "$2"
|
|
;;
|
|
list-coverage)
|
|
[ "$#" -eq 2 ] || usage
|
|
list_coverage_shard "$2"
|
|
;;
|
|
verify)
|
|
[ "$#" -eq 1 ] || usage
|
|
verify_plan
|
|
;;
|
|
*)
|
|
usage
|
|
;;
|
|
esac
|