return 0;
}
+
+int hal_api_cc_get_supported_interface_versions(enum hal_module module,
+ unsigned int **major_versions,
+ unsigned int **minor_versions,
+ int *num_versions)
+{
+ int ret;
+ int ret_num_versions = 0;
+ unsigned int *ret_major_versions = NULL;
+ unsigned int *ret_minor_versions = NULL;
+ struct compatibility_info info = { 0 , };
+
+ if (!major_versions || !minor_versions || !num_versions)
+ return -EINVAL;
+
+ ret = load_module_compatibility_info(module, &info);
+ if (ret < 0) {
+ ret = load_module_compatibility_info_fallback(module, &info, true);
+ if (ret < 0)
+ return ret;
+ }
+
+ ret_num_versions = info.num_version_list;
+ if (ret_num_versions == 0)
+ return -ENODATA;
+
+ ret_major_versions = calloc(ret_num_versions, sizeof(unsigned int));
+ if (!ret_major_versions)
+ return -ENOMEM;
+
+ ret_minor_versions = calloc(ret_num_versions, sizeof(unsigned int));
+ if (!ret_minor_versions) {
+ free(ret_major_versions);
+ return -ENOMEM;
+ }
+
+ for (int i = 0; i < ret_num_versions; ++i) {
+ ret_major_versions[i] = info.version_list[i][0];
+ ret_minor_versions[i] = info.version_list[i][1];
+ }
+
+ *major_versions = ret_major_versions;
+ ret_major_versions = NULL;
+
+ *minor_versions = ret_minor_versions;
+ ret_minor_versions = NULL;
+
+ *num_versions = ret_num_versions;
+ ret_num_versions = 0;
+
+ return 0;
+}
char* HalccObjectTest::g_compatibility_result_path = NULL;
char* HalccObjectTest::g_cwd = NULL;
-static bool have_exact_version(halcc_hal *hal, const char *version)
+static bool have_exact_version_within_halcc_hal(halcc_hal *hal, const char *version)
{
int version_list[HALCC_NUM_VERSION_LIST_MAX][2] = { 0 , };
int num_version_list = 0;
return false;
}
-MATCHER_P(HasExactVersion, version, "")
+struct versions_info {
+ unsigned int *major_versions;
+ unsigned int *minor_versions;
+ int num_versions;
+};
+
+static bool have_exact_version_within_array(const struct versions_info *vi, const char *version)
+{
+ unsigned int major, minor;
+ int ret;
+
+ if (!vi)
+ return false;
+
+ if (!vi->major_versions || !vi->minor_versions)
+ return false;
+
+ ret = sscanf(version, "%u.%u", &major, &minor);
+ if (ret != 2)
+ return false;
+
+ for (int i = 0; i < vi->num_versions; ++i) {
+ if (vi->major_versions[i] != major)
+ continue;
+ if (vi->minor_versions[i] != minor)
+ continue;
+ return true;
+ }
+
+ return false;
+}
+
+MATCHER_P(HasExactVersionHalccHal, version, "")
{
halcc_hal *hal = (halcc_hal *) arg;
- return have_exact_version(hal, version);
+ return have_exact_version_within_halcc_hal(hal, version);
}
-MATCHER_P(HasNoExactVersion, version, "")
+MATCHER_P(HasNoExactVersionHalccHal, version, "")
{
halcc_hal *hal = (halcc_hal *) arg;
- return !have_exact_version(hal, version);
+ return !have_exact_version_within_halcc_hal(hal, version);
+}
+
+MATCHER_P(HasExactVersionArray, version, "")
+{
+ const struct versions_info *vi = (const struct versions_info *) arg;
+
+ return have_exact_version_within_array(vi, version);
}
TEST_F(HalccObjectTest, manifest_find_hal_success)
ret = halcc_manifest_find_hal(g_manifest, "HAL_MODULE_DEVICE_DISPLAY", &hal);
ASSERT_EQ(ret, 0);
- ASSERT_THAT(hal, HasExactVersion("1.2"));
+ ASSERT_THAT(hal, HasExactVersionHalccHal("1.2"));
/* This 2.0 is specified but replaced with and covered by 2.1 */
- ASSERT_THAT(hal, HasNoExactVersion("2.0"));
- ASSERT_THAT(hal, HasExactVersion("2.1"));
- ASSERT_THAT(hal, HasExactVersion("3.0"));
+ ASSERT_THAT(hal, HasNoExactVersionHalccHal("2.0"));
+ ASSERT_THAT(hal, HasExactVersionHalccHal("2.1"));
+ ASSERT_THAT(hal, HasExactVersionHalccHal("3.0"));
}
TEST_F(HalccObjectTest, hal_is_compatible_with_version)
unset_compatibility_result_path();
unsetenv("SYSTEMD_SCOPE");
}
+
+TEST_F(HalccObjectTest, hal_get_manifest_version_success_with_result_file)
+{
+ int ret;
+ enum hal_common_backend_compatibility compatibility;
+ struct versions_info vi = { 0 , };
+
+ setenv("SYSTEMD_SCOPE", "system", 1);
+ set_compatibility_result_path(g_compatibility_result_path);
+
+ ret = hal_api_cc_check_backend_compatibility(HAL_MODULE_DEVICE_DISPLAY, &compatibility);
+ ASSERT_EQ(ret, 0);
+
+ ret = access(g_compatibility_result_path, F_OK | ACCESS_DO_NOT_HOOK);
+ ASSERT_EQ(ret, 0);
+
+ ret = hal_common_get_supported_interface_versions(HAL_MODULE_DEVICE_DISPLAY,
+ &vi.major_versions, &vi.minor_versions, &vi.num_versions);
+ ASSERT_EQ(ret, 0);
+
+ ASSERT_THAT(&vi, HasExactVersionArray("1.2"));
+ ASSERT_THAT(&vi, HasExactVersionArray("2.1"));
+ ASSERT_THAT(&vi, HasExactVersionArray("3.0"));
+
+ free(vi.major_versions);
+ vi.major_versions = NULL;
+
+ free(vi.minor_versions);
+ vi.minor_versions = NULL;
+
+ unlink(g_compatibility_result_path);
+ unset_compatibility_result_path();
+ unsetenv("SYSTEMD_SCOPE");
+}
+
+TEST_F(HalccObjectTest, hal_get_manifest_version_success_without_result_file)
+{
+ int ret;
+ struct versions_info vi = { 0 , };
+
+ ret = access(g_compatibility_result_path, F_OK | ACCESS_DO_NOT_HOOK);
+ ASSERT_EQ(ret, -1);
+
+ ret = hal_common_get_supported_interface_versions(HAL_MODULE_DEVICE_DISPLAY,
+ &vi.major_versions, &vi.minor_versions, &vi.num_versions);
+ ASSERT_EQ(ret, 0);
+
+ ASSERT_THAT(&vi, HasExactVersionArray("1.2"));
+ ASSERT_THAT(&vi, HasExactVersionArray("2.1"));
+ ASSERT_THAT(&vi, HasExactVersionArray("3.0"));
+
+ free(vi.major_versions);
+ vi.major_versions = NULL;
+
+ free(vi.minor_versions);
+ vi.minor_versions = NULL;
+}