File: globalvars.cpp

package info (click to toggle)
bpftrace 0.24.1-1.1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 10,496 kB
  • sloc: cpp: 60,982; ansic: 10,952; python: 953; yacc: 665; sh: 536; lex: 295; makefile: 22
file content (86 lines) | stat: -rw-r--r-- 3,131 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include "globalvars.h"
#include "types.h"
#include "gmock/gmock-matchers.h"
#include "gtest/gtest.h"

namespace bpftrace::globalvars::test {

using ::testing::HasSubstr;

void test_named_param_error(globalvars::GlobalVars& global_vars,
                            const std::vector<std::string>& params,
                            const std::string& expected_error_substr)
{
  auto bad_values = global_vars.get_named_param_vals(params);
  EXPECT_FALSE(bad_values);
  bool has_named_param_error = false;
  auto ok = handleErrors(std::move(bad_values),
                         [&](const NamedParamError& uo_err) {
                           EXPECT_THAT(uo_err.err(),
                                       HasSubstr(expected_error_substr));
                           has_named_param_error = true;
                         });
  EXPECT_TRUE(has_named_param_error);
}

TEST(GlobalVars, get_named_param_vals)
{
  auto global_vars = globalvars::GlobalVars();
  global_vars.add_named_param("hello", "bye");
  global_vars.add_named_param("is_true", true);
  global_vars.add_named_param("will_be_true", false);
  global_vars.add_named_param("number", 5);

  auto good_values1 = global_vars.get_named_param_vals(
      { "hello=low", "number=10", "will_be_true" });
  auto hello_val = good_values1->at("hello");
  EXPECT_EQ("low", std::get<std::string>(hello_val));

  auto is_true_val = good_values1->at("is_true");
  EXPECT_EQ(true, std::get<bool>(is_true_val));

  auto is_also_true_val = good_values1->at("will_be_true");
  EXPECT_EQ(true, std::get<bool>(is_also_true_val));

  auto number_val = good_values1->at("number");
  EXPECT_EQ(10, std::get<int64_t>(number_val));

  auto good_values2 = global_vars.get_named_param_vals(
      { "number=-10", "is_true=false" });

  number_val = good_values2->at("number");
  EXPECT_EQ(-10, std::get<int64_t>(number_val));

  auto is_false_val = good_values2->at("is_true");
  EXPECT_EQ(false, std::get<bool>(is_false_val));

  auto good_values3 = global_vars.get_named_param_vals({ "number=1m" });

  number_val = good_values3->at("number");
  EXPECT_EQ(60000000000, std::get<int64_t>(number_val));

  // Test errors

  auto bad_values1 = global_vars.get_named_param_vals({ "random=low" });
  EXPECT_FALSE(bad_values1);
  bool has_unknown_opts_error = false;
  auto ok2 = handleErrors(
      std::move(bad_values1), [&](const UnknownParamError& uo_err) {
        EXPECT_THAT(uo_err.err(),
                    HasSubstr(
                        "unexpected program command line options: --random"));
        has_unknown_opts_error = true;
      });
  EXPECT_TRUE(has_unknown_opts_error);

  test_named_param_error(global_vars, { "number=tomato" }, "invalid integer");
  test_named_param_error(global_vars,
                         { "is_true=5" },
                         "expects a boolean (e.g. 'true')");
  test_named_param_error(global_vars, { "hello" }, "expects a string");
  test_named_param_error(global_vars,
                         { "number=1000000000000000000000000000000000000" },
                         "value is out of range");
}

} // namespace bpftrace::globalvars::test