qemu/tests/qtest/libqos/qgraph_internal.h
<<
>>
Prefs
   1/*
   2 * libqos driver framework
   3 *
   4 * Copyright (c) 2018 Emanuele Giuseppe Esposito <e.emanuelegiuseppe@gmail.com>
   5 *
   6 * This library is free software; you can redistribute it and/or
   7 * modify it under the terms of the GNU Lesser General Public
   8 * License version 2.1 as published by the Free Software Foundation.
   9 *
  10 * This library is distributed in the hope that it will be useful,
  11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13 * Lesser General Public License for more details.
  14 *
  15 * You should have received a copy of the GNU Lesser General Public
  16 * License along with this library; if not, see <http://www.gnu.org/licenses/>
  17 */
  18
  19#ifndef QGRAPH_INTERNAL_H
  20#define QGRAPH_INTERNAL_H
  21
  22/* This header is declaring additional helper functions defined in
  23 * qgraph.c
  24 * It should not be included in tests
  25 */
  26
  27#include "qgraph.h"
  28
  29typedef struct QOSGraphMachine QOSGraphMachine;
  30typedef enum QOSEdgeType QOSEdgeType;
  31typedef enum QOSNodeType QOSNodeType;
  32
  33/* callback called when the walk path algorithm found a
  34 * valid path
  35 */
  36typedef void (*QOSTestCallback) (QOSGraphNode *path, int len);
  37
  38/* edge types*/
  39enum QOSEdgeType {
  40    QEDGE_CONTAINS,
  41    QEDGE_PRODUCES,
  42    QEDGE_CONSUMED_BY
  43};
  44
  45/* node types*/
  46enum QOSNodeType {
  47    QNODE_MACHINE,
  48    QNODE_DRIVER,
  49    QNODE_INTERFACE,
  50    QNODE_TEST
  51};
  52
  53/* Graph Node */
  54struct QOSGraphNode {
  55    QOSNodeType type;
  56    bool available;     /* set by QEMU via QMP, used during graph walk */
  57    bool visited;       /* used during graph walk */
  58    char *name;         /* used to identify the node */
  59    char *qemu_name;    /* optional: see qos_node_create_driver_named() */
  60    char *command_line; /* used to start QEMU at test execution */
  61    union {
  62        struct {
  63            QOSCreateDriverFunc constructor;
  64        } driver;
  65        struct {
  66            QOSCreateMachineFunc constructor;
  67        } machine;
  68        struct {
  69            QOSTestFunc function;
  70            void *arg;
  71            QOSBeforeTest before;
  72            bool subprocess;
  73        } test;
  74    } u;
  75
  76    /**
  77     * only used when traversing the path, never rely on that except in the
  78     * qos_traverse_graph callback function
  79     */
  80    QOSGraphEdge *path_edge;
  81};
  82
  83/**
  84 * qos_graph_get_node(): returns the node mapped to that @key.
  85 * It performs an hash map search O(1)
  86 *
  87 * Returns: on success: the %QOSGraphNode
  88 *          otherwise: #NULL
  89 */
  90QOSGraphNode *qos_graph_get_node(const char *key);
  91
  92/**
  93 * qos_graph_has_node(): returns #TRUE if the node
  94 * has map has a node mapped to that @key.
  95 */
  96bool qos_graph_has_node(const char *node);
  97
  98/**
  99 * qos_graph_get_node_type(): returns the %QOSNodeType
 100 * of the node @node.
 101 * It performs an hash map search O(1)
 102 * Returns: on success: the %QOSNodeType
 103 *          otherwise: #-1
 104 */
 105QOSNodeType qos_graph_get_node_type(const char *node);
 106
 107/**
 108 * qos_graph_get_node_availability(): returns the availability (boolean)
 109 * of the node @node.
 110 */
 111bool qos_graph_get_node_availability(const char *node);
 112
 113/**
 114 * qos_graph_get_edge(): returns the edge
 115 * linking of the node @node with @dest.
 116 *
 117 * Returns: on success: the %QOSGraphEdge
 118 *          otherwise: #NULL
 119 */
 120QOSGraphEdge *qos_graph_get_edge(const char *node, const char *dest);
 121
 122/**
 123 * qos_graph_edge_get_type(): returns the edge type
 124 * of the edge @edge.
 125 *
 126 * Returns: on success: the %QOSEdgeType
 127 *          otherwise: #-1
 128 */
 129QOSEdgeType qos_graph_edge_get_type(QOSGraphEdge *edge);
 130
 131/**
 132 * qos_graph_edge_get_dest(): returns the name of the node
 133 * pointed as destination of edge @edge.
 134 *
 135 * Returns: on success: the destination
 136 *          otherwise: #NULL
 137 */
 138char *qos_graph_edge_get_dest(QOSGraphEdge *edge);
 139
 140/**
 141 * qos_graph_has_edge(): returns #TRUE if there
 142 * exists an edge from @start to @dest.
 143 */
 144bool qos_graph_has_edge(const char *start, const char *dest);
 145
 146/**
 147 * qos_graph_edge_get_arg(): returns the args assigned
 148 * to that @edge.
 149 *
 150 * Returns: on success: the arg
 151 *          otherwise: #NULL
 152 */
 153void *qos_graph_edge_get_arg(QOSGraphEdge *edge);
 154
 155/**
 156 * qos_graph_edge_get_after_cmd_line(): returns the edge
 157 * command line that will be added after all the node arguments
 158 * and all the before_cmd_line arguments.
 159 *
 160 * Returns: on success: the char* arg
 161 *          otherwise: #NULL
 162 */
 163char *qos_graph_edge_get_after_cmd_line(QOSGraphEdge *edge);
 164
 165/**
 166 * qos_graph_edge_get_before_cmd_line(): returns the edge
 167 * command line that will be added before the node command
 168 * line argument.
 169 *
 170 * Returns: on success: the char* arg
 171 *          otherwise: #NULL
 172 */
 173char *qos_graph_edge_get_before_cmd_line(QOSGraphEdge *edge);
 174
 175/**
 176 * qos_graph_edge_get_extra_device_opts(): returns the arg
 177 * command line that will be added to the node command
 178 * line argument.
 179 *
 180 * Returns: on success: the char* arg
 181 *          otherwise: #NULL
 182 */
 183char *qos_graph_edge_get_extra_device_opts(QOSGraphEdge *edge);
 184
 185/**
 186 * qos_graph_edge_get_name(): returns the name
 187 * assigned to the destination node (different only)
 188 * if there are multiple devices with the same node name
 189 * e.g. a node has two "generic-sdhci", "emmc" and "sdcard"
 190 * there will be two edges with edge_name ="emmc" and "sdcard"
 191 *
 192 * Returns always the char* edge_name
 193 */
 194char *qos_graph_edge_get_name(QOSGraphEdge *edge);
 195
 196/**
 197 * qos_graph_get_machine(): returns the machine assigned
 198 * to that @node name.
 199 *
 200 * It performs a search only trough the list of machines
 201 * (i.e. the QOS_ROOT child).
 202 *
 203 * Returns: on success: the %QOSGraphNode
 204 *          otherwise: #NULL
 205 */
 206QOSGraphNode *qos_graph_get_machine(const char *node);
 207
 208/**
 209 * qos_graph_has_machine(): returns #TRUE if the node
 210 * has map has a node mapped to that @node.
 211 */
 212bool qos_graph_has_machine(const char *node);
 213
 214
 215/**
 216 * qos_print_graph(): walks the graph and prints
 217 * all machine-to-test paths.
 218 */
 219void qos_print_graph(void);
 220
 221/**
 222 * qos_graph_foreach_test_path(): executes the Depth First search
 223 * algorithm and applies @fn to all discovered paths.
 224 *
 225 * See qos_traverse_graph() in qgraph.c for more info on
 226 * how it works.
 227 */
 228void qos_graph_foreach_test_path(QOSTestCallback fn);
 229
 230/**
 231 * qos_get_machine_type(): return QEMU machine type for a machine node.
 232 * This function requires every machine @name to be in the form
 233 * <arch>/<machine_name>, like "arm/raspi2b" or "x86_64/pc".
 234 *
 235 * The function will validate the format and return a pointer to
 236 * @machine to <machine_name>.  For example, when passed "x86_64/pc"
 237 * it will return "pc".
 238 *
 239 * Note that this function *does not* allocate any new string.
 240 */
 241char *qos_get_machine_type(char *name);
 242
 243/**
 244 * qos_delete_cmd_line(): delete the
 245 * command line present in node mapped with key @name.
 246 *
 247 * This function is called when the QMP query returns a node with
 248 * { "abstract" : true } attribute.
 249 */
 250void qos_delete_cmd_line(const char *name);
 251
 252/**
 253 * qos_graph_node_set_availability(): sets the node identified
 254 * by @node with availability @av.
 255 */
 256void qos_graph_node_set_availability(const char *node, bool av);
 257
 258/*
 259 * Prepends a '#' character in front for not breaking TAP output format.
 260 */
 261#define qos_printf(...) printf("# " __VA_ARGS__)
 262
 263/*
 264 * Intended for printing something literally, i.e. for appending text as is
 265 * to a line already been started by qos_printf() before.
 266 */
 267#define qos_printf_literal printf
 268
 269#endif
 270