Skip to main content
Version: 2.1

Intents Tests

Version 1.2 Intents Tests 1.2

NB: Intents received a lot of work in 2.0 version of the specification, so by and large the tests for these are now completely different.

Setup

You will need to pre-populate the AppDirectory with the following items:

AppRequired Metadata
AA’s AppD Record contains: aTestingIntent (with context type testContextX, testContextZ) and sharedTestingIntent1 (with context type testContextX)
BB’s AppD Record contains bTestingIntent (with context type testContextY) and sharedTestingIntent1 (with context types testContextX and testContextY)
CC’s AppD Record contains cTestingIntent (with context type testContextX)

Also we assume a fourth app D that is going to discover the intents in the other 3.

Find Intent From AppD

  • IntentAppD: Calls fdc3.findIntent(‘aTestingIntent’). Receives promise containing an appIntent with metadata containing aTestingIntent and only A app metadata.
  • WrongIntentAppD: Calls fdc3.findIntent(‘nonExistentIntent’). Rejects with no apps found error https://fdc3.finos.org/docs/api/ref/Errors#resolveerror
  • IntentAppDRightContext: Calls fdc3.findIntent(‘aTestingIntent’, ‘testContextX’). Receives promise containing an appIntent with metadata containing aTestingIntent and only A app metadata.
  • IntentAppDWrongContext: Calls fdc3.findIntent(‘aTestingIntent’, ‘testContextY’). Rejects with no apps found error https://fdc3.finos.org/docs/api/ref/Errors#resolveerror
  • IntentAppDMultiple1: Calls fdc3.findIntent(‘sharedTestingIntent1’). Receives promise containing an appIntent with metadata containing sharedTestingIntent and only A and B app metadata.
  • IntentAppDMultiple2: Calls fdc3.findIntent(‘sharedTestingIntent1’, 'testContextX'). Receives promise containing an appIntent with metadata containing sharedTestingIntent and only A and B app metadata.
  • IntentAppDMultiple3: Calls fdc3.findIntent(‘sharedTestingIntent1’, 'testContextY'). Receives promise containing an appIntent with metadata containing sharedTestingIntent and only B app metadata.

Find Intents By Context

  • SingleContext: Call fdc3.findIntentsByContext(‘testContextX’). Should return aTestingIntent (app A), sharedTestingIntent1 (A, B) and cTestingIntent (C) AND nothing else.
  • NoContext: Call fdc3.findIntentsByContext(). Throws error of NoAppsFound

Raise Intent

AppStepDetails
D1. Raisefdc3.raiseIntent(‘sharedTestingIntent1’, {testContextY})
starts app B.
B2. Gather Contextfdc.addIntentListener(‘sharedTestingIntent1’)
Receives testContextY, matching that sent by D
  • SingleResolve1: Perform above test
  • TargetedResolve1: Use fdc3.raiseIntent(‘aTestingIntent’, {testContextX}, <A’s App Name>) to start app A, otherwise, as above
  • TargetedResolve2: Use fdc3.raiseIntent(‘aTestingIntent’, {testContextX}, {name: "<A's App Name>"}) to start app A, otherwise, as above
  • TargetedResolve3: Use fdc3.raiseIntent(‘aTestingIntent’, {testContextX}, {name: “<app B Name>”, appId: “<app B ID>”}) to start app B, otherwise, as above
  • FailedResolve1-3 As with TargetedResolve1-3, but use fdc3.raiseIntent(‘aTestingIntent’, {testContextY}, <A’s App Name>) and variations. You will receive NoAppsFound Error
  • FailedResolve4 As above, but use fdc3.raiseIntent(‘aTestingIntent’, {testContextX}, <C’s App Name>). You will receive NoAppsFound Error

Current Intents Tests 2.0

Please note that API calls (and associated test cases) relating to API calls based on the name property of an appD record (used to specify a target application) were deprecated in FDC3 2.0 in favour of those based on AppIdentifier. Hence, those API calls have become optional and test cases related to them have been removed.

Setup

We assume 6 context types in the below tests (and associated AppD records):

  • testContextX
  • testContextY
  • testContextZ
  • nonExistentContext (context object with a unique type that does NOT appear in any of the apps (metadata or otherwise).
  • privateChannelDetails
  • privateChannelIsPrivateResult

These may be used in a test as a context object { "type": "<typeName>" } or just the base type name. Where the base type name is used it is surround with "quotes". If not wrapped in quotes assume it is an instance of that context type (generally just an object with a type field set to the type name - but occasionally with other data).

You will need to pre-populate the AppDirectory with the following items (some of which will never be started, but must be configured to confirm correct behavior from various API functions):

AppUsageListensFor (pattern: intent([context-types…]) (=> result-type))On Startup
ARaise Intent tests without resultsaTestingIntent(testContextX,testContextZ)
sharedTestingIntent1(testContextX)
addIntentListener() for given intents
BRaise Intent tests with Context resultsbTestingIntent(testContextY)
sharedTestingIntent1(testContextX, testContextY) => testContextY
addIntentListener() for given intents
CFind Intent tests (never started)cTestingIntent(testContextX) => testContextZaddIntentListener() for given intents
DFind Intent tests (never started)sharedTestingIntent2(testContextX) => testContextZaddIntentListener() for given intents
EFind Intent & Raise Intent with Channel resultsharedTestingIntent2(testContextY) => channeladdIntentListener() for given intents
FFind Intent & Raise Intent with PrivateChannel resultsharedTestingIntent2(testContextY) => channel<testContextZ> *addIntentListener() for given intents
GFind Intent tests (never started)sharedTestingIntent2(testContextY)addIntentListener() for given intents
HRaise Intent (bad config/behavior)sharedTestingIntent2(testContextY) => testContextZ- no action
IRaise Intent (bad config/behavior)sharedTestingIntent2(testContextY) => testContextZaddIntentListener(‘MadeUpIntent’, handler)
JPrivateChannels are privateprivateChannelIsPrivate(privateChannelDetails) => privateChannelIsPrivateResultTries to retrieve privateChannel sent in the privateChannelDetails context, fails
KPrivateChannel lifecycle eventskTestingIntent(testContextX) => channel<testContextZ>addIntentListener() for given intents

NB:

  • There is no way to indicate in the app directory the difference between a private channel and app channel.
  • We assume a final test app Test that will discover the Intent support in the others using the API.

Finally, please note that this is a larger set of apps than were required for 1.2 tests. This is due to an increased number of parameters to API calls and AppD records, which multiplies the number of apps required. The apps are all specified here (rather than broken down over multiple issues) to ensure that clashes between test case sets can be worked out here. For example, adding one additional app that works with a particular intent/context pair might corrupt the results of multiple findIntent or raiseIntent tests. Hence, please stick to the defined type and report any issues you find so that they can be rectified in these definitions.

Find Intent basic usage

  • 2.0-FindIntentAppD: Calls fdc3.findIntent("aTestingIntent"). Receives promise containing an appIntent with metadata containing aTestingIntent and only A AppMetadata.
  • 2.0-FindNonExistentIntentAppD: Calls fdc3.findIntent("nonExistentIntent"). Rejects with an Error whose message is ResolveError.NoAppsFound https://fdc3.finos.org/docs/api/ref/Errors#resolveerror
  • 2.0-FindIntentAppDRightContext: Calls fdc3.findIntent("aTestingIntent", "testContextX"). Receives promise containing an AppIntent with metadata containing aTestingIntent and only metadata for app A.
  • 2.0-FindIntentAppDWrongContext: Calls fdc3.findIntent("aTestingIntent", "testContextY"). Rejects with an Error whose message is ResolveError.NoAppsFound https://fdc3.finos.org/docs/api/ref/Errors#resolveerror
  • 2.0-FindIntentAppDMultiple1: Calls fdc3.findIntent("sharedTestingIntent2"). Receives promise containing an AppIntent with metadata containing sharedTestingIntent2 and metadata for apps D, E, F, G, H and I only.
  • 2.0-FindIntentAppDMultiple2: Calls fdc3.findIntent("sharedTestingIntent2", "testContextY"). Receives promise containing an AppIntent with metadata containing sharedTestingIntent2 and AppMetadata for apps E, F, G, H and I only.

Find Intents By Context

  • 2.0-FindIntentByContextSingleContext: Call fdc3.findIntentsByContext(testContextX). Should return:
    • aTestingIntent (app A),
    • sharedTestingIntent1 (A, B)
    • cTestingIntent (C),
    • sharedTestingIntent2 (D)
    • kTestingIntent (K),
    • AND nothing else.
  • 2.0FindIntentByContextWrongIntentAppD: Calls fdc3.findIntentsByContext(nonExistentContext). Rejects with an Error whose message is ResolveError.NoAppsFound https://fdc3.finos.org/docs/api/ref/Errors#resolveerror

Find Intents By Result Type

  • 2.0-FindIntentAppDByResultSingle: Calls fdc3.findIntent("cTestingIntent", testContextX, "testContextZ"). Receives promise containing an AppIntent with metadata containing cTestingIntent and only C app metadata.
  • 2.0-FindIntentAppDByResultSingleNullContext: Calls fdc3.findIntent("cTestingIntent", null, "testContextZ"). Receives promise containing an AppIntent with metadata containing cTestingIntent and only C app metadata.
  • 2.0-FindIntentAppDByResultMultiple: Calls fdc3.findIntent("sharedTestingIntent1", testContextX, "testContextY"). Receives promise containing an AppIntent with metadata containing sharedTestingIntent1 and only B app metadata.
  • 2.0-FindIntentAppDByResultChannel1: Calls fdc3.findIntent("sharedTestingIntent2", testContextY, "channel"). Receives promise containing an AppIntent with metadata containing sharedTestingIntent2 and only E and F app metadata.
  • 2.0-FindIntentAppDByResultChannel2: Calls fdc3.findIntent("sharedTestingIntent2", testContextY, "channel<testContextZ>"). Receives promise containing an AppIntent with metadata containing sharedTestingIntent1 and only F app metadata.

Raise Intent (Ignoring any result)

AppStepDetails
Test1. Raisefdc3.raiseIntent("aTestingIntent", testContextX)
starts app A.
A2. Receive Intent & ContextAfter starting up, A runs fdc3.addIntentListener("aTestingIntent1") to register its listener.
It then receives testContextX, matching that sent by Test
Test3. IntentResolutionThe raiseIntent call returns an IntentResolution Object with an AppIdentifier as the source field with App A's appId and instanceId set.**
  • 2.0-RaiseIntentSingleResolve: Perform above test
  • 2.0-RaiseIntentTargetedAppResolve: Repeat the above test, but:
    • In the first step use fdc3.raiseIntent("sharedTestingIntent1", testContextX, {"appID": "<B’s appId>"}) to start app B,
    • Otherwise, as above.
  • 2.0-RaiseIntentTargetedInstanceResolveOpen: Repeat the above test, but:
    • Before the first step, use let appIdentifier = await fdc3.open({appId: "<A's appId>"}) to start A and retrieve its AppIdentifier with instance details.
    • Then in the first step, use fdc3.raiseIntent("aTestingIntent", testContextX, appIdentifier) to target the running instance of app A.
    • Confirm that the intent is delivered to the correct instance and that another instance is NOT started. Otherwise, as above.
  • 2.0-RaiseIntentTargetedInstanceResolveFindInstances: Repeat the above test, but:
    • Before the first step, use let appIdentifier = await fdc3.open({appId: "<A's appId>"}) to start A.
    • Then use const instances = await fdc3.findInstances({appId: "<A's appId>"}) to retrieve a list of instances of app A. Confirm that only one is present and retrieve its AppIdentifier, confirming that it contains an instanceId field that matches that returned by the fdc3.open call.
    • Then in the first step, use fdc3.raiseIntent("aTestingIntent", testContextX, appIdentifier) to target the running instance of app A.
    • Confirm that the intent is delivered to the correct instance and that another instance is NOT started. Otherwise, as above.
  • 2.0-RaiseIntentFailedResolve: Perform above test, but:
    • Use fdc3.raiseIntent("aTestingIntent", testContextY). Note that no app supports this intent and context combination.**
    • You should receive a JavaScript Error with the message ResolveError.NoAppsFound.
  • 2.0-RaiseIntentFailTargetedAppResolve1: Perform above test, but:
    • Use fdc3.raiseIntent("aTestingIntent", testContextY, {appId: "<A's appId>"}).
    • You should receive a JavaScript Error with the message ResolveError.NoAppsFound.
  • 2.0-RaiseIntentFailTargetedAppResolve2: Perform above test, but:
    • Use fdc3.raiseIntent("aTestingIntent", testContextX, {appId: "NonExistentApp"}).
    • You should receive a JavaScript Error with the message ResolveError.TargetAppUnavailable.
  • 2.0-RaiseIntentFailTargetedAppResolve3: Perform above test, but:
    • Use fdc3.raiseIntent("sharedTestingIntent2", testContextY, {appId: "<H's appId>"}).
    • You should receive a JavaScript Error with the message ResolveError.IntentDeliveryFailed (as this app is configured for the intent and context pair, but does not add any intent listeners).
    • Note: Test will need an extended timeout to allow for this to be returned in time by the desktop agent, which will have a vendor-defined timeout.
  • 2.0-RaiseIntentFailTargetedAppResolve4: Perform above test, but:
    • fdc3.raiseIntent("sharedTestingIntent2", testContextY, {appId: "<I's appId>"})
    • You should receive a JavaScript Error with the message ResolveError.IntentDeliveryFailed (as this app is configured for the intent and context pair, but adds intent listeners of the wrong type.
    • Note: Test will need an extended timeout to allow for this to be returned in time by the desktop agent, which will have a vendor-defined timeout.
  • 2.0-RaiseIntentFailTargetedAppInstanceResolve1: Perform above test, but:
    • First spawn an instance of App A and collect its AppIdentifier with const appIdentifier = await fdc3.open({appId: "<A's appId>"}).
    • Then use fdc3.raiseIntent("aTestingIntent", testContextY, appIdentifier) to target that instance.
    • You should receive a JavaScript Error with the message ResolveError.NoAppsFound (since A doesn't support this context type).
  • 2.0-RaiseIntentFailTargetedAppInstanceResolve2: Perform above test, but:
    • Use fdc3.raiseIntent("aTestingIntent", testContextX, {appId: "<A's appId>", instanceId "NonExistentInstanceId"}).
    • You should receive a JavaScript Error with the message ResolveError.TargetInstanceUnavailable.

Raise Intent Result (void result)

AppStepDetails
Test1. Raisefdc3.raiseIntent("aTestingIntent", testContextX)
starts app A.
A2. Receive Intent & ContextAfter starting up, A runs fdc3.addIntentListener("aTestingIntent") to register its listener.
It then receives testContextX, matching that sent by Test
Test3. IntentResolutionThe raiseIntent call returns an IntentResolution Object with an AppIdentifier as the source field with App A's appId and instanceId set.
Test4. await resultsTest should await resolution.getResult() on the IntentResolution object returned in the previous step. A promise should be returned quickly.
A5. return voidA should return void after a short delay (e.g. 5 seconds).
Test6. receive void resultThe promise received by Test from resolution.getResult() should resolve to void. Confirm that the promise could be retrieved before the handler function returned and that the result was received after the result was returned by A, NOT before. I.e. confirm that resolution.getResult() does NOT block until the result is returned, but rather returns a promise that can be awaited.
  • 2.0-RaiseIntentVoidResult5secs: Perform above test
  • 2.0-RaiseIntentVoidResult0secs: Perform above test, but A should return its result immediately (no delay). Ignore test step 6 (as there is too little time between the IntentResolution and IntentHandler completing).
  • 2.0-RaiseIntentVoidResult61secs: Perform above test, but A should return its result after 61 seconds (arbitrary delay to test timeout does NOT occur)

Raise Intent Result (Context result)

AppStepDetails
Test1. Raisefdc3.raiseIntent("sharedTestingIntent1", testContextY)
starts app B.
B2. Receive Intent & ContextAfter starting up, B runs fdc3.addIntentListener("sharedTestingIntent1") to register its listener.
It then receives testContextY, matching that sent by Test
Test3. IntentResolutionThe raiseIntent call returns an IntentResolution Object with an AppIdentifier as the source field with App B's appId and instanceId set.
Test4. await resultsTest should await resolution.getResult() on the IntentResolution object returned in the previous step. A promise should be returned quickly.
B5. return testContextYB should return a testContextY instance after a short delay (e.g. 5 seconds).
Test6. receive context resultThe promise received by Test from resolution.getResult() should resolve to the testContextY instance. Confirm that the promise could be retrieved before the handler function returned and that the result was received after the result was returned by B, NOT before. I.e. confirm that resolution.getResult() does NOT block until the result is returned, but rather returns a promise that can be awaited.
  • 2.0-RaiseIntentContextResult5secs: Perform the above test.
  • 2.0-RaiseIntentContextResult0secs: Perform the previous test but B should return its result immediately (no delay).
  • 2.0-RaiseIntentContextResult61secs: As above, but B should return its result after 61 seconds (arbitrary delay to test timeout does NOT occur)

Raise Intent Result (Channel results)

AppStepDetails
Test1. Raise IntentTest raises an intent with fdc3.raiseIntent("sharedTestingIntent2", testContextY, {appId: "<E's appId>"})
starts app E.
E2. Receive Intent & ContextAfter starting up, E runs fdc3.addIntentListener("sharedTestingIntent2") to register its listener.
It them receives testContextY, matching that sent by Test
Test3. IntentResolutionThe raiseIntent call returns an IntentResolution Object with an AppIdentifier as the source field with App E's appId and instanceId set.
Test4. await resultsTest should await resolution.getResult() on the IntentResolution object returned in the previous step. A promise should be returned quickly.
E5. return ChannelE should retrieve a Channel object via fdc3.getOrCreateChannel("someChannelName") and return it immediately.
Test6. receive Channel resultThe promise received by Test from resolution.getResult() should resolve to a Channel object with the expected id. Confirm that the type of the Channel object is "app".
Test7. addContextListenerAdd a context listener to the Channel object via channelObj.addContextListener("testContextZ", handler)
E8. broadcast contextAfter a short delay (of a few seconds) E should broadcast a testContextZ context object over the channel, including an id field with a unique identifier set (e.g. a uuid).
Test9. receive contextTest should receive the context broadcast by E and confirm that it contains the expected id value.
  • 2.0-RaiseIntentChannelResult: Perform the above test
  • 2.0-RaiseIntentPrivateChannelResult: Perform the above test, but:
    • Substitute app F throughout - which returns a PrivateChannel result instead of channel.
    • At step 5, the PrivateChannel should be created viafdc3.createPrivateChannel().
    • At step 6 confirm that the type of the channel is "private".

PrivateChannels cannot be accessed as app channels

AppStepDetails
Test1. Create a private channelTest creates a PrivateChannel with const privChan = await fdc3.createPrivateChannel(). Confirm that the Channel has an id.
Test2. Confirm private channel id is uniqueTest creates a second PrivateChannel with const privChan = await fdc3.createPrivateChannel();. Confirm that the Channel has an id and that it is distinct from the first channel created.
Test3. Retrieve as app channelAttempt to retrieve the channels as App Channels with const appChan = await fdc3.getOrCreateChannel(privChan.id) this should fail with ChannelError.AccessDenied
Test4. Raise Intent & await resultStart app J and pass it the id of the second PrivateChannel with fdc3.raiseIntent("privateChannelIsPrivate", privateChannelDetails), where the context object contains the id of the channel to attempt to retrieve. An IntentResolution should be returned and App J should start. Wait for a result to be returned via await resolution.getResult().
J5. Receive Intent & ContextJ should add an Intent Listener and receive the context with fdc3.addIntentListener("privateChannelIsPrivate", handler)
J6. Retrieve as app channelJ should attempt to retrieve the channel as an App Channel by id with const appChan = await fdc3.getOrCreateChannel("<idPassedInContext>") this should fail with ChannelError.AccessDenied. Return a privateChannelisPrivateResult back to Test to complete the test.
Test7. Receive resultTest receives the result back from J and confirms that the test was passed.
  • 2.0-PrivateChannelsAreNotAppChannels: Perform the above test

PrivateChannel Lifecycle Events

AppStepDetails
Test1. Raise intentTest raises an intent with fdc3.raiseIntent(‘"kTestingIntent", testContextX, {appId: "<K's appId>"})
starts app K.
K2. Receive Intent & ContextAfter starting up, K runs fdc3.addIntentListener("kTestingIntent") to register its listener.
It them receives testContextX, matching that sent by Test
Test3. IntentResolutionThe raiseIntent call returns an IntentResolution Object with an AppIdentifier as the source field with App K's appId and instanceId set.
Test4. await resultsTest should await resolution.getResult() on the IntentResolution object returned in the previous step. A promise should be returned quickly.
K5. Create PrivateChannel and setup event listenersK should create a PrivateChannel object via const privChan = await fdc3.createPrivateChannel(),
it should then add listeners for the 3 events offered + a context listener via:
- const listener1 = await privChan.onAddContextListener(handler1);
- const listener2 = await privChan.onUnsubscribe(handler2);
- const listener3 = await privChan.onDisconnect(handler3);
- const listener4 = await privChan.addContextListener("testContextX", handler4)
it should then return the PrivateChannel.
Test6. receive PrivateChannelThe promise received by Test from resolution.getResult() should resolve to a PrivateChannel object. Confirm that the type of the Channel object is "private".
Test7. addContextListenerTest should add a context listener to the PrivateChannel object via const listener1 = privChan.addContextListener("testContextZ", handler)
K8. Receive event & broadcast contextThe onAddContextListener handler (listener1) added in step 5 should fire after Test adds its listener. Once it has, K should broadcast a short stream of testContextZ objects, with consecutive integer values in them (e.g. 1-5).
Test9. Unsubscribe listenerTest should confirm receipt of the expected context objects, in the expected order, broadcast by K. It should then remove its context listener with listener1.unsubscribe().
K10. Receive unsubscribe eventThe event handler registered by K via onUnsubscribe should fire. If it does not and the test moves to a subsequent step, K should indicate this to the test runner (failing the test).
Test11. Broadcast contextTest should broadcast at least one testContextX object via the PrivateChannel (back to K).
K12. Receive contextK should confirm receipt of the expected context. If it does not and the test moves to a subsequent step K should indicate this to the test runner (failing the test).
Test13. re-run addContextListenerTest should (again) add a context listener to the PrivateChannel object via const listener2 = privChan.addContextListener("testContextZ", handler)
K14. Receive event & broadcast contextThe onAddContextListener handler added in step 5 should (again) fire after Test adds its listener. Once it has, K should again broadcast a short stream of testContextZ objects, with consecutive integer values in them (e.g. 6-10).
Test15. DisconnectTest should (again) confirm receipt of the expected context objects, in the expected order, broadcast by K. It should then disconnect from the channel with privChan.disconnect().
K16. Receive events & cleanupThe onUnsubscribe handler added in step 5 should (again) fire after Test calls privChan.disconnect(). Subsequently, the onDisconect handler also added in step 5 should fire. Once it has, K can unsubscribe its listeners, indicate to the test runner that all steps were completed and close.
  • 2.0-PrivateChannelsLifecycleEvents: Perform the above test.

Resolving Ambiguous Intents

FDC3 Desktop Agent MUST provide a method of resolving ambiguous intents (i.e. those that might be resolved by multiple applications) or unspecified intents (calls to raiseIntentForContext that return multiple options). This is often accomplished by providing a user interface allowing the user to select the desired target application or intent and application.

As the methods of resolving ambiguous intents are often user interactive, it is either difficult or impossible to implement an automated test for this. Hence, manual tests should be performed as a final step in a conformance test. These tests are based on the same applications defined for and used in other intent tests - however a separate manual test app should be provided to enable the test.

AppStepDetails
Test1. Raise Ambiguous Intentfdc3.raiseIntent("sharedTestingIntent2", testContextY)
User2. Chooser InteractionA method of resolving the ambiguous request is provided (such as a User Interface allowing the user to choose an application or instance) for choosing one of E,F,G,H and I.
  • 2.0-ResolveAmbiguousIntentTarget: Perform above steps to invoke intent resolution for an unspecified target with multiple options. Confirm that test is able to complete successfully.
AppStepDetails
Test1. Raise Ambiguous Intentfdc3.raiseIntentForContext(testContextY)
User2. Chooser InteractionChooser Interaction
  • 2.0-ResolveAmbiguousContextTarget: Perform above steps to invoke intent resolution for an unspecified target with multiple options. Confirm that test is able to complete successfully.
AppStepDetails
Test1. Open 4 AppsUse fdc3.open() to open 2 instances of App E and 2 instances of F.
Test2. Raise Ambiguous Intentfdc3.raiseIntent("sharedTestingIntent2", testContextY)
User3. Chooser InteractionChooser Interaction
  • 2.0-ResolveAmbiguousIntentTargetMultiInstance: Perform above steps to invoke intent resolution for an unspecified target with multiple options. Confirm that test is able to complete successfully.
AppStepDetails
Test1. Open 4 AppsUse fdc3.open() to open 2 instances of App E and 2 instances of F.
Test2. Raise Ambiguous Intentfdc3.raiseIntentForContext(testContextY)
User3. Chooser InteractionChooser Interaction
  • 2.0-ResolveAmbiguousContextTargetMultiInstance: Perform above steps to invoke intent resolution for an unspecified target with multiple options. Confirm that test is able to complete successfully.