267 lines
10 KiB
C++
267 lines
10 KiB
C++
/* Copyright (c) 2017, 2019, Oracle and/or its affiliates. All rights reserved.
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License, version 2.0,
|
|
as published by the Free Software Foundation.
|
|
|
|
This program is also distributed with certain software (including
|
|
but not limited to OpenSSL) that is licensed under separate terms,
|
|
as designated in a particular file or component or in included license
|
|
documentation. The authors of MySQL hereby grant you an additional
|
|
permission to link the program and your derivative works with the
|
|
separately licensed software that they have included with MySQL.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License, version 2.0, for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
|
|
|
|
/**
|
|
This file contains a test (example) component, which tests the apis of
|
|
"status_variable_registration" service provided by the
|
|
"mysql_server" component.
|
|
*/
|
|
|
|
#include <mysql/components/component_implementation.h>
|
|
#include <mysql/components/services/component_status_var_service.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <vector>
|
|
|
|
#define MAX_BUFFER_LENGTH 100
|
|
int log_text_len = 0;
|
|
char log_text[MAX_BUFFER_LENGTH];
|
|
FILE *outfile;
|
|
const char *filename = "test_component_status_var_service.log";
|
|
class THD;
|
|
|
|
#define WRITE_LOG(format, lit_log_text) \
|
|
log_text_len = sprintf(log_text, format, lit_log_text); \
|
|
fwrite((unsigned char *)log_text, sizeof(char), log_text_len, outfile)
|
|
|
|
REQUIRES_SERVICE_PLACEHOLDER(status_variable_registration);
|
|
|
|
static int int_variable_value = 7;
|
|
static bool bool_variable_value = true;
|
|
static long long_variable_value = 1234567;
|
|
static double double_variable_value = 8.0;
|
|
static long long longlong_variable_value = 123456789;
|
|
static char char_variable_value[] = "Testing CHAR status variable";
|
|
static char *char_ptr_variable_value = nullptr;
|
|
|
|
using std::swap;
|
|
static void char_ptr_foo() {
|
|
char char_buff[50];
|
|
char *char_ptr;
|
|
|
|
snprintf(char_buff, sizeof(char_buff), "Testing CHAR_PTR for status vars");
|
|
char_ptr = strdup(char_buff);
|
|
swap(char_ptr, char_ptr_variable_value);
|
|
|
|
if (char_ptr) free(char_ptr);
|
|
return;
|
|
}
|
|
|
|
/*
|
|
Constructing the status variable objects for different types, used to pass
|
|
as a parameter to register_variable()/unregister_variable() apis.
|
|
*/
|
|
static SHOW_VAR status_int_var[] = {
|
|
{"test_component.int_var", (char *)&int_variable_value, SHOW_INT,
|
|
SHOW_SCOPE_GLOBAL},
|
|
{0, 0, SHOW_UNDEF, SHOW_SCOPE_UNDEF} // null terminator required
|
|
};
|
|
static SHOW_VAR status_bool_var[] = {
|
|
{"test_component.bool_var", (char *)&bool_variable_value, SHOW_BOOL,
|
|
SHOW_SCOPE_GLOBAL},
|
|
{0, 0, SHOW_UNDEF, SHOW_SCOPE_UNDEF} // null terminator required
|
|
};
|
|
static SHOW_VAR status_long_var[] = {
|
|
{"test_component.long_var", (char *)&long_variable_value, SHOW_LONG,
|
|
SHOW_SCOPE_GLOBAL},
|
|
{0, 0, SHOW_UNDEF, SHOW_SCOPE_UNDEF} // null terminator required
|
|
};
|
|
static SHOW_VAR status_longlong_var[] = {
|
|
{"test_component.longlong_var", (char *)&longlong_variable_value,
|
|
SHOW_LONGLONG, SHOW_SCOPE_GLOBAL},
|
|
{0, 0, SHOW_UNDEF, SHOW_SCOPE_UNDEF} // null terminator required
|
|
};
|
|
static SHOW_VAR status_char_var[] = {
|
|
{"test_component.char_var", (char *)&char_variable_value, SHOW_CHAR,
|
|
SHOW_SCOPE_GLOBAL},
|
|
{0, 0, SHOW_UNDEF, SHOW_SCOPE_UNDEF} // null terminator required
|
|
};
|
|
static SHOW_VAR status_char_ptr_var[] = {
|
|
{"test_component.char_ptr_var", (char *)&char_ptr_variable_value,
|
|
SHOW_CHAR_PTR, SHOW_SCOPE_GLOBAL},
|
|
{0, 0, SHOW_UNDEF, SHOW_SCOPE_UNDEF} // null terminator required
|
|
};
|
|
static SHOW_VAR status_double_var[] = {
|
|
{"test_component.double_var", (char *)&double_variable_value, SHOW_DOUBLE,
|
|
SHOW_SCOPE_GLOBAL},
|
|
{0, 0, SHOW_UNDEF, SHOW_SCOPE_UNDEF} // null terminator required
|
|
};
|
|
|
|
static int show_func_example(THD *, SHOW_VAR *var, char *buf) {
|
|
var->type = SHOW_CHAR;
|
|
var->value = buf;
|
|
snprintf(buf, 100, "Testing SHOW_FUNC type for component status variables");
|
|
return 0;
|
|
}
|
|
static SHOW_VAR status_func_var[] = {
|
|
{"test_component.func_var", (char *)show_func_example, SHOW_FUNC,
|
|
SHOW_SCOPE_GLOBAL},
|
|
{0, 0, SHOW_UNDEF, SHOW_SCOPE_UNDEF} // null terminator required
|
|
};
|
|
|
|
struct example_vars_t {
|
|
char var1[10];
|
|
double var2;
|
|
};
|
|
example_vars_t example_vars = {"MySQL", 8.0};
|
|
static SHOW_VAR array_value[] = {
|
|
{"var1", (char *)&example_vars.var1, SHOW_CHAR, SHOW_SCOPE_GLOBAL},
|
|
{"var2", (char *)&example_vars.var2, SHOW_DOUBLE, SHOW_SCOPE_GLOBAL},
|
|
{0, 0, SHOW_UNDEF, SHOW_SCOPE_UNDEF} // null terminator required
|
|
};
|
|
static SHOW_VAR status_array_var[] = {
|
|
{"test_component.array", (char *)array_value, SHOW_ARRAY,
|
|
SHOW_SCOPE_GLOBAL},
|
|
{0, 0, SHOW_UNDEF, SHOW_SCOPE_UNDEF} // null terminator required
|
|
};
|
|
|
|
/**
|
|
Initialization entry method for test component. It executes the tests of
|
|
the service.
|
|
*/
|
|
static mysql_service_status_t test_component_status_var_service_init() {
|
|
outfile = fopen(filename, "w+");
|
|
char_ptr_variable_value = nullptr;
|
|
|
|
WRITE_LOG("%s\n", "test_component_status_var init:");
|
|
char_ptr_foo();
|
|
|
|
if (mysql_service_status_variable_registration->register_variable(
|
|
(SHOW_VAR *)&status_int_var)) {
|
|
WRITE_LOG("%s\n", "integer register_variable failed.");
|
|
}
|
|
if (mysql_service_status_variable_registration->register_variable(
|
|
(SHOW_VAR *)&status_bool_var)) {
|
|
WRITE_LOG("%s\n", "bool register_variable failed.");
|
|
}
|
|
if (mysql_service_status_variable_registration->register_variable(
|
|
(SHOW_VAR *)&status_long_var)) {
|
|
WRITE_LOG("%s\n", "long register_variable failed.");
|
|
}
|
|
if (mysql_service_status_variable_registration->register_variable(
|
|
(SHOW_VAR *)&status_longlong_var)) {
|
|
WRITE_LOG("%s\n", "longlong register_variable failed.");
|
|
}
|
|
if (mysql_service_status_variable_registration->register_variable(
|
|
(SHOW_VAR *)&status_char_var)) {
|
|
WRITE_LOG("%s\n", "char register_variable failed.");
|
|
}
|
|
if (mysql_service_status_variable_registration->register_variable(
|
|
(SHOW_VAR *)&status_char_ptr_var)) {
|
|
WRITE_LOG("%s\n", "char_ptr register_variable failed.");
|
|
}
|
|
if (mysql_service_status_variable_registration->register_variable(
|
|
(SHOW_VAR *)&status_double_var)) {
|
|
WRITE_LOG("%s\n", "double register_variable failed.");
|
|
}
|
|
if (mysql_service_status_variable_registration->register_variable(
|
|
(SHOW_VAR *)&status_func_var)) {
|
|
WRITE_LOG("%s\n", "func register_variable failed.");
|
|
}
|
|
if (mysql_service_status_variable_registration->register_variable(
|
|
(SHOW_VAR *)&status_array_var)) {
|
|
WRITE_LOG("%s\n", "array register_variable failed.");
|
|
}
|
|
WRITE_LOG("%s\n", "test_component_status_var end of init:");
|
|
fclose(outfile);
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
De-initialization method for Component.
|
|
*/
|
|
static mysql_service_status_t test_component_status_var_service_deinit() {
|
|
outfile = fopen(filename, "a+");
|
|
|
|
WRITE_LOG("%s\n", "test_component_status_var deinit:");
|
|
|
|
if (mysql_service_status_variable_registration->unregister_variable(
|
|
(SHOW_VAR *)&status_int_var)) {
|
|
WRITE_LOG("%s\n", "integer unregister_variable failed.");
|
|
}
|
|
if (mysql_service_status_variable_registration->unregister_variable(
|
|
(SHOW_VAR *)&status_bool_var)) {
|
|
WRITE_LOG("%s\n", "bool unregister_variable failed.");
|
|
}
|
|
if (mysql_service_status_variable_registration->unregister_variable(
|
|
(SHOW_VAR *)&status_long_var)) {
|
|
WRITE_LOG("%s\n", "long unregister_variable failed.");
|
|
}
|
|
if (mysql_service_status_variable_registration->unregister_variable(
|
|
(SHOW_VAR *)&status_longlong_var)) {
|
|
WRITE_LOG("%s\n", "longlong unregister_variable failed.");
|
|
}
|
|
if (mysql_service_status_variable_registration->unregister_variable(
|
|
(SHOW_VAR *)&status_char_var)) {
|
|
WRITE_LOG("%s\n", "char unregister_variable failed.");
|
|
}
|
|
if (mysql_service_status_variable_registration->unregister_variable(
|
|
(SHOW_VAR *)&status_char_ptr_var)) {
|
|
WRITE_LOG("%s\n", "char_ptr unregister_variable failed.");
|
|
}
|
|
free(char_ptr_variable_value);
|
|
if (mysql_service_status_variable_registration->unregister_variable(
|
|
(SHOW_VAR *)&status_double_var)) {
|
|
WRITE_LOG("%s\n", "double unregister_variable failed.");
|
|
}
|
|
if (mysql_service_status_variable_registration->unregister_variable(
|
|
(SHOW_VAR *)&status_func_var)) {
|
|
WRITE_LOG("%s\n", "func unregister_variable failed.");
|
|
}
|
|
if (mysql_service_status_variable_registration->unregister_variable(
|
|
(SHOW_VAR *)&status_array_var)) {
|
|
WRITE_LOG("%s\n", "array unregister_variable failed.");
|
|
}
|
|
WRITE_LOG("%s\n", "test_component_status_var_service end of deinit:");
|
|
|
|
fclose(outfile);
|
|
return false;
|
|
}
|
|
|
|
/* An empty list as no service is provided. */
|
|
BEGIN_COMPONENT_PROVIDES(test_component_status_var_service)
|
|
END_COMPONENT_PROVIDES();
|
|
|
|
/* A list of required services. */
|
|
BEGIN_COMPONENT_REQUIRES(test_component_status_var_service)
|
|
REQUIRES_SERVICE(status_variable_registration), END_COMPONENT_REQUIRES();
|
|
|
|
/* A list of metadata to describe the Component. */
|
|
BEGIN_COMPONENT_METADATA(test_component_status_var_service)
|
|
METADATA("mysql.author", "Oracle Corporation"),
|
|
METADATA("mysql.license", "GPL"),
|
|
METADATA("test_component_status_var_service", "1"),
|
|
END_COMPONENT_METADATA();
|
|
|
|
/* Declaration of the Component. */
|
|
DECLARE_COMPONENT(test_component_status_var_service,
|
|
"mysql:test_component_status_var_service")
|
|
test_component_status_var_service_init,
|
|
test_component_status_var_service_deinit END_DECLARE_COMPONENT();
|
|
|
|
/* Defines list of Components contained in this library. Note that for now
|
|
we assume that library will have exactly one Component. */
|
|
DECLARE_LIBRARY_COMPONENTS &COMPONENT_REF(test_component_status_var_service)
|
|
END_DECLARE_LIBRARY_COMPONENTS
|