lcameraDev: add resolve-only deviceSelector API and deduplicate resolve paths.
Export lcameraDev_resolveDeviceSelectorCReq for attach-identity consumers, factor live-camera snapshot helpers, and share resolveDeviceSelectorAgainstRecords with get-or-create session acquisition. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -71,6 +71,16 @@ sscl::co::NonViralNonPostingInvoker releaseCInd(
|
||||
co_return;
|
||||
}
|
||||
|
||||
sscl::co::NonViralNonPostingInvoker resolveSelectorCInd(
|
||||
std::exception_ptr &, std::function<void()>,
|
||||
const char *deviceSelector,
|
||||
lcamera_dev::CameraIdentityRecord& resolvedIdentity)
|
||||
{
|
||||
resolvedIdentity =
|
||||
co_await lcameraDev_resolveDeviceSelectorCReq(deviceSelector);
|
||||
co_return;
|
||||
}
|
||||
|
||||
void runLcameraDevMainAndNurseryTask(
|
||||
const std::function<void(
|
||||
const std::shared_ptr<sscl::ComponentThread>&)>& work)
|
||||
@@ -189,5 +199,62 @@ TEST_F(LcameraDevHilTest, GetOrCreateByBakedSelector)
|
||||
});
|
||||
}
|
||||
|
||||
TEST_F(LcameraDevHilTest, ResolveDeviceSelectorMatchesGetOrCreateIdentity)
|
||||
{
|
||||
runLcameraDevMainAndNurseryTask(
|
||||
[this](const std::shared_ptr<sscl::ComponentThread>& componentThread)
|
||||
{
|
||||
for (const test_fixtures::BakedCameraProfile *profile :
|
||||
requiredProfiles)
|
||||
{
|
||||
lcamera_dev::CameraIdentityRecord resolvedIdentity;
|
||||
lcamera_dev::LcameraDevGetOrCreateResult createResult;
|
||||
|
||||
sscl::tests::runNonViralNurseryOnComponentThread(
|
||||
componentThread,
|
||||
[profile, &resolvedIdentity](
|
||||
sscl::co::NonViralTaskNursery::Slot::Lease& lease)
|
||||
{
|
||||
return resolveSelectorCInd(
|
||||
lease.getExceptionStorage(),
|
||||
lease.getCallerLambda(),
|
||||
profile->exampleSelector,
|
||||
resolvedIdentity);
|
||||
});
|
||||
|
||||
EXPECT_EQ(resolvedIdentity.id, profile->libcameraId)
|
||||
<< profile->profileTag;
|
||||
|
||||
sscl::tests::runNonViralNurseryOnComponentThread(
|
||||
componentThread,
|
||||
[profile, &createResult](
|
||||
sscl::co::NonViralTaskNursery::Slot::Lease& lease)
|
||||
{
|
||||
return getOrCreateCInd(
|
||||
lease.getExceptionStorage(),
|
||||
lease.getCallerLambda(),
|
||||
profile->exampleSelector,
|
||||
createResult);
|
||||
});
|
||||
|
||||
EXPECT_EQ(
|
||||
createResult.resolvedIdentity.id,
|
||||
resolvedIdentity.id)
|
||||
<< profile->profileTag;
|
||||
|
||||
sscl::tests::runNonViralNurseryOnComponentThread(
|
||||
componentThread,
|
||||
[&createResult](
|
||||
sscl::co::NonViralTaskNursery::Slot::Lease& lease)
|
||||
{
|
||||
return releaseCInd(
|
||||
lease.getExceptionStorage(),
|
||||
lease.getCallerLambda(),
|
||||
createResult.deviceSession);
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
} // namespace
|
||||
} // namespace lcamera_dev
|
||||
|
||||
@@ -45,6 +45,22 @@ TEST(FormatCameraListForDiagnosticsTest, ListsIndexedCameras)
|
||||
EXPECT_NE(text.find("location=front"), std::string::npos);
|
||||
}
|
||||
|
||||
TEST(ResolveDeviceSelectorAgainstRecordsTest, BakedUsbHdmiCameraMatchesExampleSelector)
|
||||
{
|
||||
const std::vector<CameraIdentityRecord> records =
|
||||
tests::bakedProfilesAsRecords(dellLaptopMachineTag);
|
||||
|
||||
const CameraIdentityRecord resolved =
|
||||
resolveDeviceSelectorAgainstRecords(
|
||||
"model-substr:HDMI;location:EXTERNAL",
|
||||
records);
|
||||
|
||||
EXPECT_EQ(
|
||||
resolved.id,
|
||||
"\\_SB_.PCI0.XHC_.RHUB.HS01-1:1.0-32e4:9415");
|
||||
EXPECT_EQ(resolved.locationLabel, "external");
|
||||
}
|
||||
|
||||
TEST(ResolveSelectorAgainstRecordsTest, BakedUsbHdmiCameraMatchesExampleSelector)
|
||||
{
|
||||
const std::vector<CameraIdentityRecord> records =
|
||||
|
||||
Reference in New Issue
Block a user