| // Copyright 2018 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef RUNTIME_PROBE_PROBE_RESULT_CHECKER_H_ |
| #define RUNTIME_PROBE_PROBE_RESULT_CHECKER_H_ |
| |
| #include "runtime_probe/field_converter.h" |
| |
| #include <map> |
| #include <memory> |
| #include <string> |
| #include <vector> |
| |
| #include <base/values.h> |
| #include <gtest/gtest.h> |
| |
| namespace runtime_probe { |
| |
| class ProbeResultChecker { |
| public: |
| static std::unique_ptr<ProbeResultChecker> FromValue( |
| const base::Value& value); |
| |
| virtual bool Apply(base::Value* probe_result) const = 0; |
| |
| virtual ~ProbeResultChecker() = default; |
| }; |
| |
| // Holds |expect| attribute of a |ProbeStatement|. |
| // |
| // |expect| attribute should be a |Value| with following format: |
| // { |
| // <key_of_probe_result>: [<required:bool>, <expected_type:string>, |
| // <optional_validate_rule:string>] |
| // } |
| // |
| // Currently, we support the following expected types: |
| // - "int" (use |IntegerFieldConverter|) |
| // - "hex" (use |HexFieldConverter|) |
| // - "double" (use |DoubleFieldConverter|) |
| // - "str" (use |StringFieldConverter|) |
| // |
| // |ProbeResultChecker| will first try to convert each field to |expected_type|. |
| // Then, if |optional_validate_rule| is given, will check if converted value |
| // match the rule. |
| // |
| // TODO(b/121354690): Handle |optional_validate_rule|. |
| class ProbeResultCheckerDict : public ProbeResultChecker { |
| public: |
| static std::unique_ptr<ProbeResultCheckerDict> FromValue( |
| const base::Value& dict_value); |
| |
| // Apply |expect| rules to |probe_result| |
| // |
| // @return |true| if all required fields are converted successfully. |
| bool Apply(base::Value* probe_result) const override; |
| |
| private: |
| std::map<std::string, std::unique_ptr<FieldConverter>> required_fields_; |
| std::map<std::string, std::unique_ptr<FieldConverter>> optional_fields_; |
| |
| FRIEND_TEST(ProbeResultCheckerDictTest, TestFromValue); |
| FRIEND_TEST(ProbeResultCheckerListTest, TestFromValue); |
| }; |
| |
| class ProbeResultCheckerList : public ProbeResultChecker { |
| public: |
| static std::unique_ptr<ProbeResultCheckerList> FromValue( |
| const base::Value& list_value); |
| |
| // Apply |expect| rules to |probe_result| |
| // |
| // @return |true| if all required fields are converted successfully. |
| bool Apply(base::Value* probe_result) const override; |
| |
| private: |
| std::vector<std::unique_ptr<ProbeResultChecker>> checkers; |
| |
| FRIEND_TEST(ProbeResultCheckerListTest, TestFromValue); |
| FRIEND_TEST(ProbeResultCheckerListTest, TestApply); |
| FRIEND_TEST(ProbeResultCheckerListTest, TestApplyShortCircuit); |
| }; |
| |
| } // namespace runtime_probe |
| |
| #endif // RUNTIME_PROBE_PROBE_RESULT_CHECKER_H_ |