blob: b4ba3a20d031b02e75a32784985bfe3916aa896e [file] [log] [blame]
/* 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_FUNCTIONS_SEQUENCE_H_
#define RUNTIME_PROBE_FUNCTIONS_SEQUENCE_H_
#include <memory>
#include <vector>
#include <base/values.h>
#include <gtest/gtest.h>
#include "runtime_probe/probe_function.h"
namespace runtime_probe {
/* Execute multiple probe functions sequentially and merge their outputs.
*
* Each subfunction must create one result, it will be merged to previous
* results. If there are common keys, the later one will override previous one.
*
* For example, function_1 and function_2 outputs the following respectively::
* { "a": true, "common": false }
* { "b": true, "common": true }
*
* The final result will be { "a": true, "b": true, "common": true }
*
* If any subfunction returns 0 or more than 1 results, the final result will be
* empty (vector size will be empty).
*/
class SequenceFunction : public ProbeFunction {
public:
static constexpr auto function_name = "sequence";
static std::unique_ptr<ProbeFunction> FromDictionaryValue(
const base::DictionaryValue& dict_value) {
std::unique_ptr<SequenceFunction> instance{new SequenceFunction()};
bool result = true;
result &= PARSE_ARGUMENT(functions);
if (result)
return instance;
return nullptr;
}
DataType Eval() const override;
private:
static Register<SequenceFunction> register_;
std::vector<std::unique_ptr<ProbeFunction>> functions_;
FRIEND_TEST(SequenceFunctionTest, TestEvalFailTooManyResults);
FRIEND_TEST(SequenceFunctionTest, TestEvalSuccess);
FRIEND_TEST(SequenceFunctionTest, TestParserEmptyList);
FRIEND_TEST(SequenceFunctionTest, TestParseFunctions);
};
REGISTER_PROBE_FUNCTION(SequenceFunction);
} // namespace runtime_probe
#endif // RUNTIME_PROBE_FUNCTIONS_SEQUENCE_H_