Testing APIAPI's Interaction Kit

Run the kit's own automation suite in your project.

Assumes you have finished quick-start.

What ships

The kit ships its own automation suite in the UKInteractionTests module (UncookedOnly, so it is never compiled into a cooked game, client or server target). You can run it against your own project to verify the kit behaves as documented in your engine version and configuration.

Running it is safe: the suite leaves your project byte-identical. See Your settings are left untouched.

Running the suite

Every kit test name begins with UK.Interaction., followed by the owning module segment (Core., Client., Debug., Editor., GAS., CommonUI.), so one command runs the whole suite:

UnrealEditor-Cmd <YourProject>.uproject -nullrhi -unattended -nosplash
    -ExecCmds="Automation RunTests UK.Interaction; Quit"

In the editor, the same tests appear under Tools → Session Frontend → Automation.

Expect the run to be green on any supported engine, in the demo project or your own, in well under 20 minutes. Some tests will report that they were skipped — that is the designed behaviour, not a problem. The next two sections explain which ones, and why.

The three partitions

The suite is partitioned by what a test depends on. The partition is visible in the test name.

PartitionName shapeWhat it assertsIn your project
Behavioreverything elseBehaviour only — "does the kit do the right thing"Always runs.
CalibrationUK.Interaction.<M>.Calibration.*Exact cycle counts, byte layouts, tick orderRuns when your configuration matches the kit's pinned one; otherwise skips.
GateUK.Interaction.<M>.Gate.*The kit's own internal release gatesAlways skips in your project — see below.

Why Gate tests skip for you. Gate tests read internal fixture files that are deliberately not shipped in the Fab archive. They check things that only matter to us before we publish — descriptor invariants, CI lane tables, coverage ledgers. In your project there is nothing for them to check, so they report:

UK.Interaction.<M>.Gate.*: skipped — repo fixtures not found (internal release gate)

That line is the correct, expected outcome. A Gate test that fails instead of skipping is a bug in the kit — please report it.

Why Calibration tests may skip. These assert numbers that are only meaningful under a specific configuration (fixed time step, seeded RNG, pinned networking cvars, a specific replication path). If your project resolves a different configuration, the number would be wrong for reasons that have nothing to do with the kit's correctness, so the test skips rather than reporting a false failure.

At the end of a run the suite prints one line of counts — how many tests ran and how many skipped, per partition and per reason. The skips are never silent.

Skip reasons

Every skip names exactly one reason from this closed list, emitted as UK_SKIP_REASON=<reason>.

ReasonMeaningWhat, if anything, you should do
fixture_missingA Gate test needed the kit's internal fixtures, which do not ship.Nothing — expected in every customer project.
session_unavailableThe test needs an in-process networked session, and this run has no editor (-game / -server).Nothing — run the suite in the editor (or UnrealEditor-Cmd) to include these.
content_missingThe test needs a map or preset from Content/UKInteraction/Tests/, and that folder is not installed.Nothing, if you removed the test content on purpose. Reinstall it to include these tests.
calibration_mismatchThe resolved configuration differs from the one the number was calibrated against.Nothing — the behavioural coverage still ran.
iris_legacy_onlyIris replication is enabled, and this test measures the legacy replication path specifically.Nothing — the kit supports both paths; only this measurement is path-specific.
adapter_inactiveThe test covers an optional adapter (for example GAS or CommonUI) that is not enabled in your project.Nothing, unless you expected that adapter to be active.
tier_gatedThe test belongs to a maturity tier above the one this run executes.Nothing.
fallback_multiprocessThis engine version could not host an in-process session, so the test belongs to the kit's separate multi-process runner.Nothing.

Your settings are left untouched

The networked tests must pin process-wide state to be deterministic — fixed time step, RNG seeds, several net.* console variables, a test net driver. All of it is snapshotted before the suite touches anything and restored afterwards by a single RAII object, plus a shutdown guard that restores even if the editor is closed mid-run.

Concretely, after a suite run:

  • Config/DefaultEngine.ini and Config/DefaultEditorPerProjectUserSettings.ini in your project are byte-identical to what they were before — the kit never writes to them,
  • every console variable the suite touched is back at the value it had,
  • the kit's own Config/*.ini files are unchanged.

The kit asserts this on itself: it hashes those files and dumps those variables before and after every run and fails if a single byte moved. If you ever see the suite change a setting in your project, that is a bug of the highest severity — please report it.

Test kinds

KindWhereWhat it covers
Spec testsSource/UKInteractionTests/Private/<Area>/*.spec.cpplogic: state machines, formulas, validation
Functional testsdemo maps under Content/UKInteraction/Tests/integration in a running world
Networked functional teststhe same, under listen-server and dedicated-server PIEreplication, join-in-progress, ownership

If your "cook everything" reaches the kit's Tests/ content

The kit's functional-test maps live under Content/UKInteraction/Tests/, and the kit never puts that folder in a cook list: the plugin's DirectoriesToAlwaysCook names exactly three folders — Client/, Core/Detection/ and Core/Presets/ — because those three hold assets your project reaches only through a soft path in the kit's settings, which the cooker cannot follow on its own. Core/Maps/, Core/Demo/ and Tests/ are never in that list.

If your project cooks everything — a DirectoriesToAlwaysCook entry that covers the plugin, or a "cook all content" switch — the test maps can be pulled into your package anyway. That is dead bytes, not an error. The maps load nothing at runtime unless something opens them, and nothing in a shipped game does; the only cost is package size (single-digit MB). It is not a bug report, and the kit does not gate on it, because what your project chooses to cook is your project's decision. If you want them gone, add /UKInteraction/UKInteraction/Tests to your project's Directories to never cook (Project Settings → Packaging), which takes precedence.

One thing you will not see from those maps is a missing-class failure in a Shipping build: the functional-test actors they contain come from a developer-only engine module, so the kit keeps them out of every customer-cookable map by construction. The demo map ships with zero of them.

Structural gates

Some of the kit's guarantees are checked without an engine at all — descriptor invariants, per-module dependency ceilings, forbidden tokens. Those checks run before every release as part of the kit's own build pipeline and are not part of the shipped archive, like the Gate partition above.

Reporting a failure

A failing kit test is a bug report we want. Include:

  • engine version and hotfix, platform, and build configuration,
  • the full test name,
  • the UK_FAIL_CLASS=<class> token on the failure line — every kit failure carries one, and it tells us immediately what kind of failure it was (assertion, timeout, leak, budget, session_start_timeout, measurement_invalid, infrastructure, …),
  • the log excerpt containing the LogUKInteraction* / LogUKHarness lines around the failure,
  • the printed partition/skip counts line from the end of the run.

A skip is not a failure and does not need reporting. A Gate test that fails rather than skips, or any change to your project's settings, always does.