File: test-utils.hpp

package info (click to toggle)
gdbuspp 3-2
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 1,116 kB
  • sloc: cpp: 9,462; python: 477; sh: 215; makefile: 5
file content (144 lines) | stat: -rw-r--r-- 5,064 bytes parent folder | download | duplicates (2)
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
//  GDBus++ - glib2 GDBus C++ wrapper
//
//  SPDX-License-Identifier: AGPL-3.0-only
//
//  Copyright (C)  OpenVPN Inc <sales@openvpn.net>
//  Copyright (C)  David Sommerseth <davids@openvpn.net>
//

/**
 * @file   test-utils.hpp
 *
 * @brief  Shared classes and functions used by various test utilities
 *         and tools
 */

#pragma once

#include <string>
#include <vector>
#include <glib.h>

namespace TestUtils {

class Exception : public std::exception
{
  public:
    Exception(const std::string &group, const std::string &err);

    virtual const char *what() const noexcept;

  private:
    const std::string errormsg;
};


/**
 *  Provide a simple tool for generating --help screen via
 *  getopt() based implementations
 */
class OptionParser
{
  public:
    OptionParser() = default;
    virtual ~OptionParser() noexcept = default;

  protected:
    void help(const std::string argv0, struct option options[]);
};


/**
 *  Dumps a human readable string of both the data type and value
 *  contained in a GVariant object.  This is just a wrapper around
 *  a couple of helper functions found in the glib2 library
 *
 * @param log     std::ostringstream where to the generated output is put
 * @param prefix  std::string containing a prefix before each written line of text
 * @param data    GVariant * to object to parse
 */
void dump_gvariant(std::ostringstream &log, const std::string &prefix, GVariant *data);

/**
 *  Checks the data type of a GVariant object against an expected data type
 *
 * @param expect_type  std::string with the complete representation of the
 *                     D-Bus data type which is expected to be found
 * @param  data        GVariant * to object to check
 * @returns Returns true when the expected type string is found, otherwise false
 */
bool check_data_type(const std::string expect_type, GVariant *data);

/**
 *  Checks the data contents of a GVariant object against an expected
 *  value.  The format of this string must be formatted in the same way
 *  g_variant_print() formats the data.
 *
 * @param expect_value std::string with the complete representation of the
 *                     value which is expected to be found
 * @param  data        GVariant * to object to check
 * @returns Returns true when the expected value is found, otherwise false
 */
bool check_data_value(const std::string expect_value, GVariant *data);

/**
 *  Test and log the data type and value of a GVariant object.
 *  This calls @check_data_type() and @check_data_value() under the hood.
 *  See those functions for details on the expected format of the type and
 *  value arguments.
 *
 * @param log    std::ostringstream where the results are written
 * @param type   std::string with the expected data type string
 * @param value  std::string with the expected data value
 * @param data   GVariant * to object to validate
 * @returns On successful validation, true is returned. Otherwise false
 */
bool log_data_type_value_check(std::ostringstream &log,
                               const std::string &type,
                               const std::string &value,
                               GVariant *data);

/**
 *  Convert a single input string to the a GVariant object using the
 *  declared D-Bus data type
 *
 * @param type        std::string with the D-Bus data type for the value
 * @param value       std::string with the value to convert
 * @return GVariant* with the converted value
 */
GVariant *convert_to_gvariant(const std::string &type, const std::string &value);

/**
 *  Convert a GVariant result of more values into a basic std::vector<std::string>
 *  All data types are converted into a std::string reprentation, regardless
 *  of their initial data type.
 *
 * @param values   GVariant with all the values to process
 * @return std::vector<std::string>
 */
std::vector<std::string> convert_from_gvariant(GVariant *values);

/**
 *  Generate a full GVariant object from a set of input strings and list
 *  of data types.
 *
 *  The data_values are provided through an array of strings and the
 *  number of elements must match the data type list (a single string)
 *
 *  If just a single value is present in the list, the output will be
 *  a single value in a GVariant * unless the wrap_single_value flag is
 *  true, then the single value will be inside a tuple container.
 *
 * @param log                std::ostringstream where to put log data
 * @param data_type          std::string of the complete data type of the data set
 * @param data_values        std::vector<string> with all the data to parse
 * @param wrap_single_value  bool flag, enables tuple wrapping if only a single
 *                           variable is being processed
 * @return GVariant* with all the data values converted in proper D-Bus values
 */
GVariant *generate_gvariant(std::ostringstream &log,
                            const std::string &data_type,
                            const std::vector<std::string> &data_values,
                            bool wrap_single_value);

}; // namespace TestUtils