From 97871af7ae276249c8fe3d1380337c4a08436765 Mon Sep 17 00:00:00 2001 From: Will Song Date: Thu, 2 Nov 2023 00:01:47 +0000 Subject: [PATCH] thermal: Add JSON Schema Checker Added a protobuf based schema checker presubmit test for thermal configurations. Test: Manually test: atest thermal_info_config_husky.json Bug: 127794899 Change-Id: I2159bf2b3993a2af7f8a71670e8d36743fffcaea --- thermal/Android.bp | 61 ++++++++++++++++++++++++++++++ thermal/thermal_config_test.cpp | 55 +++++++++++++++++++++++++++ thermal/thermal_info_config_test.h | 58 ++++++++++++++++++++++++++++ 3 files changed, 174 insertions(+) create mode 100644 thermal/Android.bp create mode 100644 thermal/thermal_config_test.cpp create mode 100644 thermal/thermal_info_config_test.h diff --git a/thermal/Android.bp b/thermal/Android.bp new file mode 100644 index 0000000..fed2086 --- /dev/null +++ b/thermal/Android.bp @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2023 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. + */ + +package { + default_applicable_licenses: ["Android-Apache-2.0"], +} + +cc_library { + name: "thermal-config-cpp", + proto: { + type: "lite", + export_proto_headers: true, + include_dirs: [ + "external/protobuf/src", + "device/google/gs-common/thermal/thermal_hal/thermal_config_schemas" + ], + } +} + +cc_test_host { + name: "shusky-thermal-config-test", + srcs: [ + "thermal_config_test.cpp", + ], + static_libs: [ + "libbase", + "libgmock", + "liblog", + "libjsoncpp", + "libjsonpbverify", + "libjsonpbparse", + "thermal_HAL_info_config_proto", + ], + shared_libs: [ + "libprotobuf-cpp-full", + ], + cflags: [ + "-Wall", + "-Werror", + "-Wno-unused-parameter", + ], + data: [ + "*.json" + ], + test_suites: [ + "general-tests", + ], +} \ No newline at end of file diff --git a/thermal/thermal_config_test.cpp b/thermal/thermal_config_test.cpp new file mode 100644 index 0000000..7b01306 --- /dev/null +++ b/thermal/thermal_config_test.cpp @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2023 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 +#include +#include + +#include "thermal_info_config_test.h" + +using namespace ::android::jsonpb; +using ::android::base::GetExecutableDirectory; + +namespace devices { +namespace shusky { + +template +JsonSchemaTestConfigFactory MakeTestParam(const std::string &path) { + return android::jsonpb::MakeTestParam(GetExecutableDirectory() + path); +} + +// Make test suite for thermal info config schema. +INSTANTIATE_TEST_SUITE_P( + ThermalSuite, ThermalInfoConfigTest, + ::testing::Values( + MakeTestParam("/thermal_info_config_husky.json"), + MakeTestParam("/thermal_info_config_shiba.json"), + MakeTestParam("/thermal_info_config_charge_husky.json"), + MakeTestParam("/thermal_info_config_charge_shiba.json"), + MakeTestParam("/thermal_info_config_ripcurrent.json"), + MakeTestParam( + "/thermal_info_config_charge_ripcurrent.json"))); + +// Ignores a formatting check (b/c 0.0 != 0 textually) +GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(JsonSchemaTest); + +int main(int argc, char **argv) { + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} + +} // namespace shusky +} // namespace devices diff --git a/thermal/thermal_info_config_test.h b/thermal/thermal_info_config_test.h new file mode 100644 index 0000000..1864420 --- /dev/null +++ b/thermal/thermal_info_config_test.h @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2023 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. + */ + +#pragma once + +#include + +#include +#include + +#include "thermal_info_config.pb.h" + +namespace devices { +namespace shusky { + +// JSON schema test wrapper. +class ThermalInfoConfigTest : public android::jsonpb::JsonSchemaTest { +public: + void SetUp() override { + JsonSchemaTest::SetUp(); + thermalInfoConfig_ = static_cast(message()); + } + ThermalConfig *thermalInfoConfig_ = nullptr; +}; + +// Individual test checking for sensor name and type as required fields. +TEST_P(ThermalInfoConfigTest, ThermalConfigRequiredFields) { + std::string error; + + // Checks that no unknown fields are introduced. + EXPECT_TRUE(android::jsonpb::AllFieldsAreKnown(*object_, json_, &error)) + << "File: " << file_path_ << ": " << error; + + // Check all Sensors have a Name and Type. + for (int i = 0; i < thermalInfoConfig_->sensors_size(); ++i) { + auto &&sensor = thermalInfoConfig_->sensors(i); + EXPECT_FALSE(sensor.name().empty()) + << "No name for sensor #" << i << " in " << file_path_; + EXPECT_FALSE(sensor.type().empty()) + << "No type for sensor " << sensor.name() << " in " << file_path_; + } +}; + +} // namespace shusky +} // namespace devices \ No newline at end of file