test_cgroups_plugin.c 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. // SPDX-License-Identifier: GPL-3.0-or-later
  2. #include "test_cgroups_plugin.h"
  3. #include "libnetdata/required_dummies.h"
  4. RRDHOST *localhost;
  5. int netdata_zero_metrics_enabled = 1;
  6. struct config netdata_config;
  7. char *netdata_configured_primary_plugins_dir = NULL;
  8. struct k8s_test_data {
  9. char *data;
  10. char *name;
  11. char *key[3];
  12. char *value[3];
  13. const char *result_key[3];
  14. const char *result_value[3];
  15. int result_ls[3];
  16. int i;
  17. };
  18. static int read_label_callback(const char *name, const char *value, RRDLABEL_SRC ls, void *data)
  19. {
  20. struct k8s_test_data *test_data = (struct k8s_test_data *)data;
  21. test_data->result_key[test_data->i] = name;
  22. test_data->result_value[test_data->i] = value;
  23. test_data->result_ls[test_data->i] = ls;
  24. test_data->i++;
  25. return 1;
  26. }
  27. static void test_cgroup_parse_resolved_name(void **state)
  28. {
  29. UNUSED(state);
  30. DICTIONARY *labels = rrdlabels_create();
  31. struct k8s_test_data test_data[] = {
  32. // One label
  33. { .data = "name label1=\"value1\"",
  34. .name = "name",
  35. .key[0] = "label1", .value[0] = "value1" },
  36. // Three labels
  37. { .data = "name label1=\"value1\",label2=\"value2\",label3=\"value3\"",
  38. .name = "name",
  39. .key[0] = "label1", .value[0] = "value1",
  40. .key[1] = "label2", .value[1] = "value2",
  41. .key[2] = "label3", .value[2] = "value3" },
  42. // Comma at the end of the data string
  43. { .data = "name label1=\"value1\",",
  44. .name = "name",
  45. .key[0] = "label1", .value[0] = "value1" },
  46. // Equals sign in the value
  47. // { .data = "name label1=\"value=1\"",
  48. // .name = "name",
  49. // .key[0] = "label1", .value[0] = "value=1" },
  50. // Double quotation mark in the value
  51. // { .data = "name label1=\"value\"1\"",
  52. // .name = "name",
  53. // .key[0] = "label1", .value[0] = "value" },
  54. // Escaped double quotation mark in the value
  55. // { .data = "name label1=\"value\\\"1\"",
  56. // .name = "name",
  57. // .key[0] = "label1", .value[0] = "value\\\"1" },
  58. // Equals sign in the key
  59. // { .data = "name label=1=\"value1\"",
  60. // .name = "name",
  61. // .key[0] = "label", .value[0] = "1=\"value1\"" },
  62. // Skipped value
  63. // { .data = "name label1=,label2=\"value2\"",
  64. // .name = "name",
  65. // .key[0] = "label2", .value[0] = "value2" },
  66. // A pair of equals signs
  67. { .data = "name= =",
  68. .name = "name=" },
  69. // A pair of commas
  70. { .data = "name, ,",
  71. .name = "name," },
  72. { .data = NULL }
  73. };
  74. for (int i = 0; test_data[i].data != NULL; i++) {
  75. char *data = strdup(test_data[i].data);
  76. char *name = cgroup_parse_resolved_name_and_labels(labels, data);
  77. assert_string_equal(name, test_data[i].name);
  78. rrdlabels_walkthrough_read(labels, read_label_callback, &test_data[i]);
  79. for (int l = 0; l < 3 && test_data[i].key[l] != NULL; l++) {
  80. char *key = test_data[i].key[l];
  81. char *value = test_data[i].value[l];
  82. const char *result_key = test_data[i].result_key[l];
  83. const char *result_value = test_data[i].result_value[l];
  84. int ls = test_data[i].result_ls[l];
  85. assert_string_equal(key, result_key);
  86. assert_string_equal(value, result_value);
  87. assert_int_equal(RRDLABEL_SRC_AUTO | RRDLABEL_SRC_K8S, ls);
  88. }
  89. free(data);
  90. }
  91. }
  92. int main(void)
  93. {
  94. const struct CMUnitTest tests[] = {
  95. cmocka_unit_test(test_cgroup_parse_resolved_name),
  96. };
  97. int test_res = cmocka_run_group_tests_name("test_cgroup_parse_resolved_name", tests, NULL, NULL);
  98. return test_res;
  99. }