| // Copyright 2018 The Fuchsia 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 GARNET_BIN_CPUPERF_TESTS_VERIFY_TEST_H_ |
| #define GARNET_BIN_CPUPERF_TESTS_VERIFY_TEST_H_ |
| |
| #include <cstddef> |
| #include <cstdint> |
| #include <memory> |
| |
| #include "garnet/bin/cpuperf/session_result_spec.h" |
| #include "garnet/lib/perfmon/events.h" |
| #include "garnet/lib/perfmon/records.h" |
| |
| class Verifier { |
| public: |
| // Statistics on collected records. |
| struct RecordCounts { |
| size_t time_records; |
| size_t tick_records; |
| size_t count_records; |
| size_t value_records; |
| size_t pc_records; |
| size_t last_branch_records; |
| }; |
| |
| virtual ~Verifier() = default; |
| |
| bool VerifyIteration(uint32_t iter); |
| void Verify(); |
| |
| protected: |
| Verifier(const cpuperf::SessionResultSpec* session_result_spec) |
| : session_result_spec_(session_result_spec) { |
| } |
| |
| virtual bool VerifyRecord(const perfmon::SampleRecord& record) = 0; |
| virtual bool VerifyTrace(const RecordCounts& counts) = 0; |
| |
| // Kernel pcs are guaranteed to have this bit set. |
| // Userspace pcs are guaranteed to not have this bit set. |
| static constexpr uint64_t kKernelPcMask = 1ul << 63; |
| static bool IsKernelPc(uint64_t pc) { return !!(pc & kKernelPcMask); } |
| static bool IsUserPc(uint64_t pc) { return !(pc & kKernelPcMask); } |
| |
| // Wrappers on ModelEventManager that first we ensure we have a model |
| // event manager. |
| bool LookupEventByName(const char* group_name, const char* event_name, |
| const perfmon::EventDetails** out_details); |
| |
| const cpuperf::SessionResultSpec* const session_result_spec_; |
| |
| private: |
| void GetModelEventManager(); |
| |
| std::unique_ptr<perfmon::ModelEventManager> model_event_manager_; |
| }; |
| |
| using MakeVerifier = std::unique_ptr<Verifier>( |
| const cpuperf::SessionResultSpec* spec); |
| |
| struct TestSpec { |
| const char* config_name; |
| MakeVerifier* make_verifier; |
| }; |
| |
| // These are provided by each arch's subdirectory of tests. |
| extern const TestSpec* const kTestSpecs[]; |
| extern const size_t kTestSpecCount; |
| |
| // Common routine for verifying the result of a test run. |
| // |spec_file_path| is the path to the cpspec file. |
| void VerifySpec(const std::string& spec_file_path); |
| |
| #endif // GARNET_BIN_CPUPERF_TESTS_VERIFY_TEST_H_ |