You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
202 lines
4.6 KiB
202 lines
4.6 KiB
/*
|
|
* Copyright (C) 2019 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#include <string>
|
|
|
|
#include <android-base/test_utils.h>
|
|
#include <gtest/gtest.h>
|
|
|
|
#include "ApiChecker.h"
|
|
#include "Common.h"
|
|
|
|
namespace {
|
|
|
|
constexpr const char* kLatestApi =
|
|
R"(
|
|
props {
|
|
owner: Platform
|
|
module: "android.all_dep"
|
|
prop {
|
|
api_name: "dep1"
|
|
type: Integer
|
|
scope: Public
|
|
access: ReadWrite
|
|
prop_name: "dep1_int"
|
|
deprecated: true
|
|
}
|
|
}
|
|
props {
|
|
owner: Platform
|
|
module: "android.legacy"
|
|
prop {
|
|
api_name: "legacy_prop"
|
|
type: String
|
|
scope: Public
|
|
access: Readonly
|
|
prop_name: "legacy_prop"
|
|
}
|
|
}
|
|
props {
|
|
owner: Platform
|
|
module: "android.platprop"
|
|
prop {
|
|
api_name: "prop1"
|
|
type: Long
|
|
scope: Public
|
|
access: ReadWrite
|
|
prop_name: "prop1"
|
|
}
|
|
prop {
|
|
api_name: "prop3"
|
|
type: Boolean
|
|
scope: Public
|
|
access: ReadWrite
|
|
prop_name: "ctl.start$prop3"
|
|
}
|
|
prop {
|
|
api_name: "prop4"
|
|
type: String
|
|
scope: Public
|
|
access: Readonly
|
|
prop_name: "ro.prop4"
|
|
}
|
|
}
|
|
)";
|
|
|
|
constexpr const char* kCurrentApi =
|
|
R"(
|
|
props {
|
|
owner: Platform
|
|
module: "android.legacy"
|
|
prop {
|
|
api_name: "new_prop"
|
|
type: String
|
|
scope: Public
|
|
access: Readonly
|
|
prop_name: "new_prop"
|
|
legacy_prop_name: "legacy_prop"
|
|
}
|
|
}
|
|
props {
|
|
owner: Platform
|
|
module: "android.platprop"
|
|
prop {
|
|
api_name: "prop1"
|
|
type: Long
|
|
scope: Public
|
|
access: ReadWrite
|
|
prop_name: "prop1"
|
|
}
|
|
prop {
|
|
api_name: "prop2"
|
|
type: Integer
|
|
scope: Public
|
|
access: Writeonce
|
|
prop_name: "ro.public.prop2"
|
|
}
|
|
prop {
|
|
api_name: "prop3"
|
|
type: Boolean
|
|
scope: Public
|
|
access: ReadWrite
|
|
prop_name: "ctl.start$prop3"
|
|
}
|
|
prop {
|
|
api_name: "prop4"
|
|
type: String
|
|
scope: Public
|
|
access: Readonly
|
|
prop_name: "ro.prop4"
|
|
deprecated: true
|
|
}
|
|
|
|
}
|
|
)";
|
|
|
|
constexpr const char* kInvalidCurrentApi =
|
|
R"(
|
|
props {
|
|
owner: Platform
|
|
module: "android.legacy"
|
|
prop {
|
|
api_name: "legacy_prop"
|
|
type: String
|
|
scope: Public
|
|
access: Readonly
|
|
prop_name: "legacy_prop"
|
|
}
|
|
}
|
|
props {
|
|
prop {
|
|
api_name: "prop1"
|
|
type: Integer
|
|
scope: Public
|
|
access: Readonly
|
|
prop_name: "prop1"
|
|
}
|
|
owner: Platform
|
|
module: "android.platprop"
|
|
prop {
|
|
api_name: "prop3"
|
|
type: Boolean
|
|
scope: Public
|
|
access: ReadWrite
|
|
integer_as_bool: true
|
|
prop_name: "ctl.start$prop3"
|
|
}
|
|
}
|
|
)";
|
|
|
|
} // namespace
|
|
|
|
TEST(SyspropTest, ApiCheckerTest) {
|
|
TemporaryFile latest_file;
|
|
close(latest_file.fd);
|
|
latest_file.fd = -1;
|
|
ASSERT_TRUE(android::base::WriteStringToFile(kLatestApi, latest_file.path));
|
|
|
|
std::string err;
|
|
auto latest_api = ParseApiFile(latest_file.path);
|
|
ASSERT_RESULT_OK(latest_api);
|
|
|
|
TemporaryFile current_file;
|
|
close(current_file.fd);
|
|
current_file.fd = -1;
|
|
ASSERT_TRUE(android::base::WriteStringToFile(kCurrentApi, current_file.path));
|
|
|
|
auto current_api = ParseApiFile(current_file.path);
|
|
ASSERT_RESULT_OK(current_api);
|
|
EXPECT_RESULT_OK(CompareApis(*latest_api, *current_api));
|
|
|
|
TemporaryFile invalid_current_file;
|
|
close(invalid_current_file.fd);
|
|
invalid_current_file.fd = -1;
|
|
ASSERT_TRUE(android::base::WriteStringToFile(kInvalidCurrentApi,
|
|
invalid_current_file.path));
|
|
|
|
auto invalid_current_api = ParseApiFile(invalid_current_file.path);
|
|
ASSERT_RESULT_OK(invalid_current_api);
|
|
|
|
auto res = CompareApis(*latest_api, *invalid_current_api);
|
|
EXPECT_FALSE(res.ok());
|
|
|
|
EXPECT_EQ(res.error().message(),
|
|
"Type of prop prop1 has been changed\n"
|
|
"Accessibility of prop prop1 has become more restrictive\n"
|
|
"Integer-as-bool of prop prop3 has been changed\n"
|
|
"Prop prop4 has been removed\n");
|
|
}
|