packages feed

keiro-dsl-0.15.0.0: test/mapped-surface-mutation-test.sh

#!/usr/bin/env bash
set -euo pipefail

repo_root="$(git rev-parse --show-toplevel)"
cd "$repo_root"

bindings="keiro-dsl/test/conformance-projection-catalog/CatalogDemo/MappedBindings.hs"
queue="keiro-dsl/test/conformance-projection-catalog/Generated/CatalogDemo/QualificationJobs/Queue.hs"
query_contract="keiro-dsl/test/conformance-projection-catalog/Generated/CatalogDemo/OrderInline/QueryContract.hs"
projection_catalog="keiro-dsl/test/conformance-projection-catalog/Generated/CatalogDemo/ProjectionCatalog.hs"
semantic_impact="keiro-dsl/src/Keiro/Dsl/SemanticImpact.hs"
service_harness="keiro-dsl/src/Keiro/Dsl/ServiceHarness.hs"
targets=(
  "$bindings"
  "$queue"
  "$query_contract"
  "$projection_catalog"
  "$semantic_impact"
  "$service_harness"
)

backup_dir="$(mktemp -d "${TMPDIR:-/tmp}/keiro-mapped-surface-mutation.XXXXXX")"
case "$backup_dir" in
  *keiro-mapped-surface-mutation.*) ;;
  *) echo "FAIL: unexpected backup path: $backup_dir"; exit 1 ;;
esac

for target in "${targets[@]}"; do
  cp "$target" "$backup_dir/$(basename "$target").$(printf '%s' "$target" | shasum -a 256 | cut -c1-12)"
done

digest_targets() {
  shasum -a 256 "${targets[@]}"
}

baseline_digest="$(digest_targets)"

restore_all() {
  local target backup
  for target in "${targets[@]}"; do
    backup="$backup_dir/$(basename "$target").$(printf '%s' "$target" | shasum -a 256 | cut -c1-12)"
    cp "$backup" "$target"
  done
}

cleanup() {
  restore_all
  rm -f "$backup_dir"/*
  rmdir "$backup_dir"
}
trap cleanup EXIT

run_integrated() {
  cabal test -v0 keiro-dsl:keiro-dsl-conformance-projection-catalog
}

run_qualification() {
  cabal test -v0 keiro-dsl:keiro-dsl-test \
    --test-options='--match "mapped surface qualification"'
}

expect_red() {
  local label="$1"
  shift
  set +e
  "$@" >"$backup_dir/mutation.log" 2>&1
  local status=$?
  set -e
  if [[ "$status" -eq 0 ]]; then
    sed -n '1,240p' "$backup_dir/mutation.log"
    echo "FAIL: mutation stayed green: $label"
    exit 1
  fi
  echo "PASS: mutation turned its named gate red: $label"
  restore_all
}

echo "== baseline: integrated mapped surface is green =="
run_integrated >/dev/null
run_qualification >/dev/null

perl -0pi -e 's/import CatalogDemo\.MappedDomain\n/import CatalogDemo.MappedDomain\nimport CatalogDemo.MappedDomain qualified as Domain\n/' "$bindings"
perl -0pi -e 's/import Generated\.CatalogDemo\.Structural\.Shape\.QualificationPayload \(QualificationPayloadShape\)/import Generated.CatalogDemo.Structural.Shape.QualificationPayload (QualificationPayloadShape)\nimport Generated.CatalogDemo.Structural.Shape.QualificationPayload qualified as Shape/' "$bindings"
perl -0pi -e 's/Keiro\.Codec\.Structural \(FixtureCases \(\.\.\), StructuralBinding\)/Keiro.Codec.Structural (FixtureCases (..), StructuralBinding (..))/' "$bindings"
perl -0pi -e 's/qualificationPayloadBinding = genericStructuralBinding/qualificationPayloadBinding = StructuralBinding { bindingToShape = \\value -> Shape.QualificationPayload (Domain.qualificationId value <> "-mutated") (Domain.note value), bindingFromShape = \\shape -> Domain.QualificationPayload (Shape.qualificationId shape) (Shape.note shape) }/' "$bindings"
expect_red "transpose the structural binding authority" run_integrated

perl -0pi -e 's/, "payload" \.= encodeQualificationPayloadMapped payload\.qualification/, "payload_mutated" .= encodeQualificationPayloadMapped payload.qualification/' "$queue"
expect_red "remove the queue encoder arm from its canonical key" run_integrated

perl -0pi -e 's/explicitParseField \(parseQualificationPayloadMapped\) objectValue "payload"/explicitParseField (parseQualificationPayloadMapped) objectValue "payload_mutated"/' "$queue"
expect_red "remove the queue decoder arm from its canonical key" run_integrated

perl -0pi -e 's/explicitParseField \(\\value -> case value of Null -> pure Nothing; other -> Just <\$> parseJSON other\) objectValue "maybe_metadata"/explicitParseField (fmap Just . parseJSON) objectValue "maybe_metadata"/' "$queue"
expect_red "reject the declared queue null policy" run_integrated

perl -0pi -e 's/type OrderInlineQueryInput = QueryCriteria/type OrderInlineQueryInput = QualificationResult/' "$query_contract"
expect_red "stale the generated query input signature" run_integrated

perl -0pi -e 's/aggregate:Orders\/generated-codec\/v1\/mapped-132056a8f2ee095d/aggregate:Orders\/generated-codec\/v1\/stale-fingerprint/' "$projection_catalog"
expect_red "stale the aggregate projection source fingerprint" run_integrated

perl -0pi -e 's/mappedRootConsumer = WorkqueueConsumer workqueue/mappedRootConsumer = AggregateConsumer workqueue/' "$semantic_impact"
expect_red "misattribute a queue semantic consumer" run_qualification

perl -0pi -e 's/MappedWorkqueueHistory workqueue -> "workqueue-history:" <> workqueue/MappedWorkqueueHistory workqueue -> "private-event-history:" <> workqueue/' "$semantic_impact"
expect_red "misreport a queued-job consequence" run_qualification

perl -0pi -e 's/surfaceFactValues service <> concatMap valuesForNode/surfaceFactValues service <> surfaceFactValues service <> concatMap valuesForNode/' "$service_harness"
expect_red "duplicate a generated service conformance law" run_qualification

perl -0pi -e 's/parseMappedRootKind "workqueue-payload"/parseMappedRootKind "corrupt-workqueue-payload"/' "$semantic_impact"
expect_red "corrupt a known semantic-impact ledger tag" run_qualification

restore_all
if [[ "$(digest_targets)" != "$baseline_digest" ]]; then
  echo "FAIL: mapped surface mutation targets were not restored byte-for-byte"
  exit 1
fi

run_integrated >/dev/null
run_qualification >/dev/null
echo "PASS: all mapped surface mutations were caught and exact bytes restored"