Skip to content

Update mock paths to fix flakey android build Null Pointer Exception#911

Open
KetanReddy wants to merge 3 commits into
a2ui-docsfrom
a2ui-mocks
Open

Update mock paths to fix flakey android build Null Pointer Exception#911
KetanReddy wants to merge 3 commits into
a2ui-docsfrom
a2ui-mocks

Conversation

@KetanReddy

@KetanReddy KetanReddy commented Jul 20, 2026

Copy link
Copy Markdown
Member

Remove src from A2UI mocks path as it seems to cause an occasional NPE on Android

Change Type (required)

Indicate the type of change your pull request is:

  • patch
  • minor
  • major
  • N/A

Does your PR have any documentation updates?

  • Updated docs
  • No Update needed
  • Unable to update docs

Stack created with GitHub Stacks CLIGive Feedback 💬

@KetanReddy
KetanReddy marked this pull request as ready for review July 20, 2026 21:59
@KetanReddy
KetanReddy requested review from a team as code owners July 20, 2026 21:59
@intuit-svc

intuit-svc commented Jul 20, 2026

Copy link
Copy Markdown
Contributor

Benchmark Results

Comparison against baseline from main. ⚠️ = regression (>10% slower), ✅ = improvement (>5% faster)

core/player ⚠️

Benchmark Current Baseline Change
core/player/src/binding/__tests__/parser.bench.ts > parser benchmarks > Resolving binding: foo.bar 551.13K ops/s 498.13K ops/s +10.6% ✅
core/player/src/binding/__tests__/parser.bench.ts > parser benchmarks > Resolving binding: foo.pets.1.name 446.29K ops/s 298.47K ops/s +49.5% ✅
core/player/src/binding/__tests__/parser.bench.ts > parser benchmarks > Resolving binding: foo.pets.01.name 497.32K ops/s 322.55K ops/s +54.2% ✅
core/player/src/binding/__tests__/parser.bench.ts > parser benchmarks > Resolving binding: foo.pets['01'].name 460.78K ops/s 433.46K ops/s +6.3% ✅
core/player/src/binding/__tests__/parser.bench.ts > parser benchmarks > Resolving binding: foo.pets[01].name 369.24K ops/s 433.53K ops/s -14.8% ⚠️
core/player/src/binding/__tests__/parser.bench.ts > parser benchmarks > Resolving binding: foo.pets[name = "frodo"].type 280.37K ops/s 264.95K ops/s +5.8% ✅
core/player/src/binding/__tests__/parser.bench.ts > parser benchmarks > Resolving binding: foo.pets["name" = "sprinkles"].type 207.08K ops/s 224.33K ops/s -7.7%
core/player/src/binding/__tests__/parser.bench.ts > parser benchmarks > Resolving binding: foo.pets["isDog" = false].type 290.96K ops/s 275.54K ops/s +5.6% ✅
core/player/src/binding/__tests__/parser.bench.ts > parser benchmarks > Resolving binding: foo.pets["isDog" = true].type 295.49K ops/s 293.98K ops/s +0.5%
core/player/src/binding/__tests__/parser.bench.ts > binding creation benchmarks > Resolving binding: foo.bar 576.32K ops/s 606.45K ops/s -5.0%
core/player/src/binding/__tests__/parser.bench.ts > binding creation benchmarks > Resolving binding: foo.pets.1.name 370.04K ops/s 397.22K ops/s -6.8%
core/player/src/binding/__tests__/parser.bench.ts > binding creation benchmarks > Resolving binding: foo.pets.01.name 366.57K ops/s 388.79K ops/s -5.7%
core/player/src/binding/__tests__/parser.bench.ts > binding creation benchmarks > Resolving binding: foo.pets['01'].name 349.86K ops/s 342.25K ops/s +2.2%
core/player/src/binding/__tests__/parser.bench.ts > binding creation benchmarks > Resolving binding: foo.pets[01].name 389.35K ops/s 290.56K ops/s +34.0% ✅
core/player/src/binding/__tests__/parser.bench.ts > binding creation benchmarks > Resolving binding: foo.pets[name = "frodo"].type 245.43K ops/s 197.83K ops/s +24.1% ✅
core/player/src/binding/__tests__/parser.bench.ts > binding creation benchmarks > Resolving binding: foo.pets["name" = "sprinkles"].type 196.71K ops/s 134.56K ops/s +46.2% ✅
core/player/src/binding/__tests__/parser.bench.ts > binding creation benchmarks > Resolving binding: foo.pets["isDog" = false].type 245.85K ops/s 188.71K ops/s +30.3% ✅
core/player/src/binding/__tests__/parser.bench.ts > binding creation benchmarks > Resolving binding: foo.pets["isDog" = true].type 251.51K ops/s 209.10K ops/s +20.3% ✅
core/player/src/expressions/__tests__/performance.bench.ts > Expression Parsing/Execution Benchmark > Parsing: {{foo}} = 1 + 3 (sync) 267.83K ops/s 360.37K ops/s -25.7% ⚠️
core/player/src/expressions/__tests__/performance.bench.ts > Expression Parsing/Execution Benchmark > Parsing: {{foo}} = 1 + 3 (async) 241.47K ops/s 302.45K ops/s -20.2% ⚠️
core/player/src/expressions/__tests__/performance.bench.ts > Expression Parsing/Execution Benchmark > Parsing: conditional(true, true, false) (sync) 303.78K ops/s 299.54K ops/s +1.4%
core/player/src/expressions/__tests__/performance.bench.ts > Expression Parsing/Execution Benchmark > Parsing: conditional(true, true, false) (async) 271.45K ops/s 365.52K ops/s -25.7% ⚠️
core/player/src/expressions/__tests__/performance.bench.ts > Expression Parsing/Execution Benchmark > Parsing: {{foo}} = conditional({{bar}} > 0, true, false) (sync) 129.54K ops/s 199.36K ops/s -35.0% ⚠️
core/player/src/expressions/__tests__/performance.bench.ts > Expression Parsing/Execution Benchmark > Parsing: {{foo}} = conditional({{bar}} > 0, true, false) (async) 114.58K ops/s 160.97K ops/s -28.8% ⚠️
core/player/src/expressions/__tests__/performance.bench.ts > Expression Parsing/Execution Benchmark > Parsing: {{foo}} = conditional(conditional(true = false, false, true), conditional(false = false, true, false), conditional(true = true, false, true)) (sync) 110.00K ops/s 126.03K ops/s -12.7% ⚠️
core/player/src/expressions/__tests__/performance.bench.ts > Expression Parsing/Execution Benchmark > Parsing: {{foo}} = conditional(conditional(true = false, false, true), conditional(false = false, true, false), conditional(true = true, false, true)) (async) 96.90K ops/s 87.18K ops/s +11.1% ✅
core/player/src/expressions/__tests__/performance.bench.ts > Expression Parsing/Execution Benchmark > Parsing: {{foo}} = await(asyncTestFunction(1)) (sync) N/A N/A N/A
core/player/src/expressions/__tests__/performance.bench.ts > Expression Parsing/Execution Benchmark > Parsing: {{foo}} = await(asyncTestFunction(1)) (async) 188.92K ops/s 170.69K ops/s +10.7% ✅
core/player/src/expressions/__tests__/performance.bench.ts > Expression Parsing/Execution Benchmark > Parsing: {{foo}} = asyncTestFunction(1) (sync) 247.37K ops/s 250.80K ops/s -1.4%
core/player/src/expressions/__tests__/performance.bench.ts > Expression Parsing/Execution Benchmark > Parsing: {{foo}} = asyncTestFunction(1) (async) 196.57K ops/s 190.72K ops/s +3.1%
core/player/src/expressions/__tests__/performance.bench.ts > Expression Parsing/Execution Benchmark > Parsing: asyncTestFunction(1) (sync) 570.64K ops/s 491.49K ops/s +16.1% ✅
core/player/src/expressions/__tests__/performance.bench.ts > Expression Parsing/Execution Benchmark > Parsing: asyncTestFunction(1) (async) 466.47K ops/s 376.51K ops/s +23.9% ✅
core/player/src/expressions/__tests__/performance.bench.ts > Expression Parsing/Execution Benchmark > Parsing: {{foo}} = conditional(!{{bar}} == false, await(asyncTestFunction(1)), false) (sync) 119.00K ops/s 116.36K ops/s +2.3%
core/player/src/expressions/__tests__/performance.bench.ts > Expression Parsing/Execution Benchmark > Parsing: {{foo}} = conditional(!{{bar}} == false, await(asyncTestFunction(1)), false) (async) 113.01K ops/s 116.39K ops/s -2.9%
core/player/src/view/resolver/__tests__/index.bench.ts > resolver benchmarks > initial resolve 623.63 ops/s 465.08 ops/s +34.1% ✅
core/player/src/view/resolver/__tests__/index.bench.ts > resolver benchmarks > Resolving from cache 16.47K ops/s 15.40K ops/s +7.0% ✅
core/player/src/view/resolver/__tests__/index.bench.ts > resolver benchmarks > data changes 1.81K ops/s 2.68K ops/s -32.4% ⚠️
core/player/src/view/resolver/__tests__/index.bench.ts > resolver benchmarks > data changes slow 163.84 ops/s 524.50 ops/s -68.8% ⚠️

plugins/async-node/core

Benchmark Current Baseline Change
plugins/async-node/core/src/__tests__/index.bench.ts > async node benchmarks > Resolve Async Node 1 times 13.32K ops/s 8.43K ops/s +58.0% ✅
plugins/async-node/core/src/__tests__/index.bench.ts > async node benchmarks > Resolve Async Node 5 times 13.75K ops/s 7.76K ops/s +77.2% ✅
plugins/async-node/core/src/__tests__/index.bench.ts > async node benchmarks > Resolve Async Node 10 times 9.60K ops/s 7.05K ops/s +36.3% ✅
plugins/async-node/core/src/__tests__/index.bench.ts > async node benchmarks > Resolve Async Node 50 times 2.98K ops/s 2.12K ops/s +41.1% ✅
plugins/async-node/core/src/__tests__/index.bench.ts > async node benchmarks > Resolve Async Node 100 times 1.62K ops/s 1.21K ops/s +33.8% ✅
plugins/async-node/core/src/__tests__/transform.bench.ts > async transform benchmarks > Resolve Async Node 1 times 5.39K ops/s 4.53K ops/s +19.1% ✅
plugins/async-node/core/src/__tests__/transform.bench.ts > async transform benchmarks > Resolve Async Node 5 times 6.52K ops/s 6.37K ops/s +2.3%
plugins/async-node/core/src/__tests__/transform.bench.ts > async transform benchmarks > Resolve Async Node 10 times 5.55K ops/s 4.49K ops/s +23.7% ✅
plugins/async-node/core/src/__tests__/transform.bench.ts > async transform benchmarks > Resolve Async Node 50 times 2.07K ops/s 1.81K ops/s +13.9% ✅
plugins/async-node/core/src/__tests__/transform.bench.ts > async transform benchmarks > Resolve Async Node 100 times 1.55K ops/s 1.12K ops/s +38.3% ✅

react/player

Benchmark Current Baseline Change
react/player/src/asset/__tests__/index.bench.tsx > ReactAsset benchmarks > Render asset nested in 1 ReactAssets 602.84 ops/s 464.64 ops/s +29.7% ✅
react/player/src/asset/__tests__/index.bench.tsx > ReactAsset benchmarks > Bubble errors nested in 1 ReactAssets 892.88 ops/s 744.86 ops/s +19.9% ✅
react/player/src/asset/__tests__/index.bench.tsx > ReactAsset benchmarks > Render asset nested in 5 ReactAssets 564.73 ops/s 461.46 ops/s +22.4% ✅
react/player/src/asset/__tests__/index.bench.tsx > ReactAsset benchmarks > Bubble errors nested in 5 ReactAssets 969.64 ops/s 679.18 ops/s +42.8% ✅
react/player/src/asset/__tests__/index.bench.tsx > ReactAsset benchmarks > Render asset nested in 10 ReactAssets 618.00 ops/s 468.50 ops/s +31.9% ✅
react/player/src/asset/__tests__/index.bench.tsx > ReactAsset benchmarks > Bubble errors nested in 10 ReactAssets 856.54 ops/s 563.74 ops/s +51.9% ✅
react/player/src/asset/__tests__/index.bench.tsx > ReactAsset benchmarks > Render asset nested in 50 ReactAssets 498.41 ops/s 379.43 ops/s +31.4% ✅
react/player/src/asset/__tests__/index.bench.tsx > ReactAsset benchmarks > Bubble errors nested in 50 ReactAssets 256.66 ops/s 190.07 ops/s +35.0% ✅
react/player/src/asset/__tests__/index.bench.tsx > ReactAsset benchmarks > Render asset nested in 100 ReactAssets 358.28 ops/s 289.68 ops/s +23.7% ✅
react/player/src/asset/__tests__/index.bench.tsx > ReactAsset benchmarks > Bubble errors nested in 100 ReactAssets 81.89 ops/s 80.66 ops/s +1.5%

@KetanReddy
KetanReddy marked this pull request as draft July 21, 2026 16:59
@KetanReddy
KetanReddy marked this pull request as ready for review July 21, 2026 23:28
@KetanReddy
KetanReddy requested a review from a team as a code owner July 21, 2026 23:28
@codecov

codecov Bot commented Jul 21, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 0.00%. Comparing base (869f44c) to head (0e0d065).

Additional details and impacted files
@@       Coverage Diff        @@
##   a2ui-docs   #911   +/-   ##
================================
================================

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

abstract val flow: String

/** Content format for [flow] (e.g. "a2ui"); null uses the default Player Flow format. */
open val format: String? get() = null

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

maybe make this an official enum

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IMO we shouldn't because we don't want to be prescriptive of what content formats we support on the ingestion side. We support A2UI and Player's internal format out of the box but if any consumer wants to add support for their own format we shouldn't have to explicitly support it.

@KVSRoyal KVSRoyal left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good from ios perspective


// When set (e.g. "a2ui"), flows are started in that content format so the
// registered content plugin adapts them; null keeps the default Player Flow format.
override val contentFormat: String? = format

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm trying to understand why we should care about format type when loading mocks, I am seeing the start API cares about contentVersion? So, the idea is that whoever is loading content understands the shape of the content rather than testing for content spec within the adapter plugin itself?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There was an issue where every mock that was getting loaded went through makeFlow which was causing issues with A2UI content. This was to allow that step to be skipped.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, fair enough — alternatively, can we just trigger makeFlow as a content transform the same way A2UI content is handled?

We can frame as a follow-up to unblock if necessary

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah I think that would actually be a good follow up ticket. Might make sense to ship that as a default plugin for Player?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants