From 282e7135ba4f200c1cd3d13f2f77ef67efea89ca Mon Sep 17 00:00:00 2001 From: Tom Hromatka Date: Wed, 22 Jan 2025 17:42:59 +0530 Subject: [PATCH] gunit: Add unit tests for get_next_rule_field() [----------] 10 tests from GetNextRuleField [ RUN ] GetNextRuleField.InvalidParameters [ OK ] GetNextRuleField.InvalidParameters (0 ms) [ RUN ] GetNextRuleField.FieldLenTooSmall [ OK ] GetNextRuleField.FieldLenTooSmall (0 ms) [ RUN ] GetNextRuleField.FieldLenTooSmallWithQuotes [ OK ] GetNextRuleField.FieldLenTooSmallWithQuotes (0 ms) [ RUN ] GetNextRuleField.FieldLenTooSmallWithQuotes2 [ OK ] GetNextRuleField.FieldLenTooSmallWithQuotes2 (0 ms) [ RUN ] GetNextRuleField.UserAndProcess [ OK ] GetNextRuleField.UserAndProcess (0 ms) [ RUN ] GetNextRuleField.UserOnly [ OK ] GetNextRuleField.UserOnly (0 ms) [ RUN ] GetNextRuleField.KeyWithQuotesAndSpaces [ OK ] GetNextRuleField.KeyWithQuotesAndSpaces (0 ms) [ RUN ] GetNextRuleField.DestinationWithQuotes [ OK ] GetNextRuleField.DestinationWithQuotes (0 ms) [ RUN ] GetNextRuleField.TabsAsDelimiters [ OK ] GetNextRuleField.TabsAsDelimiters (0 ms) [ RUN ] GetNextRuleField.RuleWithOptions [ OK ] GetNextRuleField.RuleWithOptions (0 ms) [----------] 10 tests from GetNextRuleField (0 ms total) Signed-off-by: Tom Hromatka --- tests/gunit/018-get_next_rule_field.cpp | 255 ++++++++++++++++++++++++ tests/gunit/Makefile.am | 3 +- 2 files changed, 257 insertions(+), 1 deletion(-) create mode 100644 tests/gunit/018-get_next_rule_field.cpp diff --git a/tests/gunit/018-get_next_rule_field.cpp b/tests/gunit/018-get_next_rule_field.cpp new file mode 100644 index 00000000..efcba4ea --- /dev/null +++ b/tests/gunit/018-get_next_rule_field.cpp @@ -0,0 +1,255 @@ +/* SPDX-License-Identifier: LGPL-2.1-only */ +/** + * libcgroup googletest for get_next_rule_field() + * + * Copyright (c) 2025 Oracle and/or its affiliates. + * Author: Tom Hromatka + */ + +#include +#include +#include + +#include "gtest/gtest.h" + +#include "libcgroup-internal.h" + +class GetNextRuleField : public ::testing::Test { + protected: +}; + +TEST_F(GetNextRuleField, InvalidParameters) +{ + char str[] = "abc123"; + int ret; + + ret = get_next_rule_field(NULL, str, ARRAY_SIZE(str), false); + ASSERT_EQ(ret, ECGINVAL); + + ret = get_next_rule_field(str, NULL, 0, false); + ASSERT_EQ(ret, ECGINVAL); +} + +TEST_F(GetNextRuleField, FieldLenTooSmall) +{ + char *rule = "123456789 abc 123"; + char field[9] = { '\0' }; + int ret; + + ret = get_next_rule_field(rule, field, ARRAY_SIZE(field), false); + ASSERT_STREQ(field, ""); + ASSERT_EQ(ret, ECGINVAL); +} + +TEST_F(GetNextRuleField, FieldLenTooSmallWithQuotes) +{ + char *rule = "\"12345678\" abc 123"; + char field[] = "7654321"; + int ret; + + ret = get_next_rule_field(rule, field, ARRAY_SIZE(field), true); + ASSERT_STREQ(field, "7654321"); + ASSERT_EQ(ret, ECGINVAL); +} + +TEST_F(GetNextRuleField, FieldLenTooSmallWithQuotes2) +{ + char *rule = "\"1234 5678\" abc 123"; + char field[] = "7654321"; + int ret; + + ret = get_next_rule_field(rule, field, ARRAY_SIZE(field), true); + ASSERT_STREQ(field, "7654321"); + ASSERT_EQ(ret, ECGINVAL); +} + +TEST_F(GetNextRuleField, NoTrailingQuotationMark) +{ + char *rule = "\"This is an invalid rule"; + char field[] = "hello world"; + int ret; + + ret = get_next_rule_field(rule, field, ARRAY_SIZE(field), true); + ASSERT_STREQ(field, "hello world"); + ASSERT_EQ(ret, ECGINVAL); +} + +TEST_F(GetNextRuleField, UnexpectedQuotationMark) +{ + char *rule = "\"valid but unexpected\""; + char field[] = "goodbye world"; + int ret; + + ret = get_next_rule_field(rule, field, ARRAY_SIZE(field), false); + ASSERT_STREQ(field, "goodbye world"); + ASSERT_EQ(ret, ECGINVAL); +} + +TEST_F(GetNextRuleField, UserAndProcess) +{ + char key[CGRP_RULE_MAXKEY] = { '\0' }; + char controllers[CG_CONTROLLER_MAX] = { '\0' }; + char destination[FILENAME_MAX] = { '\0' }; + + char *rule = "WillieMays:/usr/bin/homerun cpu SanFrancisco/Giants/"; + char *iter; + int ret; + + ret = get_next_rule_field(rule, key, ARRAY_SIZE(key), true); + ASSERT_STREQ(key, "WillieMays:/usr/bin/homerun"); + ASSERT_EQ(ret, strlen("WillieMays:/usr/bin/homerun")); + + iter = &rule[ret]; + + ret = get_next_rule_field(iter, controllers, ARRAY_SIZE(controllers), false); + ASSERT_STREQ(controllers, "cpu"); + ASSERT_EQ(ret, strlen(" cpu")); + + iter += ret; + + ret = get_next_rule_field(iter, destination, ARRAY_SIZE(destination), true); + ASSERT_STREQ(destination, "SanFrancisco/Giants/"); + ASSERT_EQ(ret, strlen(" SanFrancisco/Giants/")); +} + +TEST_F(GetNextRuleField, UserOnly) +{ + char key[CGRP_RULE_MAXKEY] = { '\0' }; + char controllers[CG_CONTROLLER_MAX] = { '\0' }; + char destination[FILENAME_MAX] = { '\0' }; + + char *rule = "LuisAparicio freezer Chicago/WhiteSox"; + char *iter; + int ret; + + ret = get_next_rule_field(rule, key, ARRAY_SIZE(key), true); + ASSERT_STREQ(key, "LuisAparicio"); + ASSERT_EQ(ret, strlen("LuisAparicio")); + + iter = &rule[ret]; + + ret = get_next_rule_field(iter, controllers, ARRAY_SIZE(controllers), false); + ASSERT_STREQ(controllers, "freezer"); + ASSERT_EQ(ret, strlen(" freezer")); + + iter += ret; + + ret = get_next_rule_field(iter, destination, ARRAY_SIZE(destination), true); + ASSERT_STREQ(destination, "Chicago/WhiteSox"); + ASSERT_EQ(ret, strlen(" Chicago/WhiteSox")); +} + +TEST_F(GetNextRuleField, KeyWithQuotesAndSpaces) +{ + char key[CGRP_RULE_MAXKEY] = { '\0' }; + char controllers[CG_CONTROLLER_MAX] = { '\0' }; + char destination[FILENAME_MAX] = { '\0' }; + + char *rule = "\"Sandy Koufax:/bin/fast ball\" memory Brooklyn/Dodgers"; + char *iter; + int ret; + + ret = get_next_rule_field(rule, key, ARRAY_SIZE(key), true); + ASSERT_STREQ(key, "Sandy Koufax:/bin/fast ball"); + ASSERT_EQ(ret, strlen("\"Sandy Koufax:/bin/fast ball\"")); + + iter = &rule[ret]; + + ret = get_next_rule_field(iter, controllers, ARRAY_SIZE(controllers), false); + ASSERT_STREQ(controllers, "memory"); + ASSERT_EQ(ret, strlen(" memory")); + + iter += ret; + + ret = get_next_rule_field(iter, destination, ARRAY_SIZE(destination), true); + ASSERT_STREQ(destination, "Brooklyn/Dodgers"); + ASSERT_EQ(ret, strlen(" Brooklyn/Dodgers")); +} + +TEST_F(GetNextRuleField, DestinationWithQuotes) +{ + char key[CGRP_RULE_MAXKEY] = { '\0' }; + char controllers[CG_CONTROLLER_MAX] = { '\0' }; + char destination[FILENAME_MAX] = { '\0' }; + + char *rule = "JoshGibson:/homerun/king io,memory,cpu \"Homestead Grays\""; + char *iter; + int ret; + + ret = get_next_rule_field(rule, key, ARRAY_SIZE(key), true); + ASSERT_STREQ(key, "JoshGibson:/homerun/king"); + ASSERT_EQ(ret, strlen("JoshGibson:/homerun/king")); + + iter = &rule[ret]; + + ret = get_next_rule_field(iter, controllers, ARRAY_SIZE(controllers), false); + ASSERT_STREQ(controllers, "io,memory,cpu"); + ASSERT_EQ(ret, strlen(" io,memory,cpu")); + + iter += ret; + + ret = get_next_rule_field(iter, destination, ARRAY_SIZE(destination), true); + ASSERT_STREQ(destination, "Homestead Grays"); + ASSERT_EQ(ret, strlen(" \"Homestead Grays\"")); +} + +TEST_F(GetNextRuleField, TabsAsDelimiters) +{ + char key[CGRP_RULE_MAXKEY] = { '\0' }; + char controllers[CG_CONTROLLER_MAX] = { '\0' }; + char destination[FILENAME_MAX] = { '\0' }; + + char *rule = "\t\tSatchelPaige\tcpuset\t\"Kansas City/Monarchs\""; + char *iter; + int ret; + + ret = get_next_rule_field(rule, key, ARRAY_SIZE(key), true); + ASSERT_STREQ(key, "SatchelPaige"); + ASSERT_EQ(ret, strlen("\t\tSatchelPaige")); + + iter = &rule[ret]; + + ret = get_next_rule_field(iter, controllers, ARRAY_SIZE(controllers), false); + ASSERT_STREQ(controllers, "cpuset"); + ASSERT_EQ(ret, strlen("\tcpuset")); + + iter += ret; + + ret = get_next_rule_field(iter, destination, ARRAY_SIZE(destination), true); + ASSERT_STREQ(destination, "Kansas City/Monarchs"); + ASSERT_EQ(ret, strlen(" \"Kansas City/Monarchs\"")); +} + +TEST_F(GetNextRuleField, RuleWithOptions) +{ + char key[CGRP_RULE_MAXKEY] = { '\0' }; + char controllers[CG_CONTROLLER_MAX] = { '\0' }; + char destination[FILENAME_MAX] = { '\0' }; + char options[CG_OPTIONS_MAX] = { '\0' }; + + char *rule = "\t\t\"Roberto Clemente\"\t\tpids\t\"Pittsburgh/Pirates\"\tignore"; + char *iter; + int ret; + + ret = get_next_rule_field(rule, key, ARRAY_SIZE(key), true); + ASSERT_STREQ(key, "Roberto Clemente"); + ASSERT_EQ(ret, strlen("\t\t\"Roberto Clemente\"")); + + iter = &rule[ret]; + + ret = get_next_rule_field(iter, controllers, ARRAY_SIZE(controllers), false); + ASSERT_STREQ(controllers, "pids"); + ASSERT_EQ(ret, strlen("\t\tpids")); + + iter += ret; + + ret = get_next_rule_field(iter, destination, ARRAY_SIZE(destination), true); + ASSERT_STREQ(destination, "Pittsburgh/Pirates"); + ASSERT_EQ(ret, strlen(" \"Pittsburgh/Pirates\"")); + + iter += ret; + + ret = get_next_rule_field(iter, options, ARRAY_SIZE(options), false); + ASSERT_STREQ(options, "ignore"); + ASSERT_EQ(ret, strlen("\tignore")); +} diff --git a/tests/gunit/Makefile.am b/tests/gunit/Makefile.am index 353567b4..ae97a8b4 100644 --- a/tests/gunit/Makefile.am +++ b/tests/gunit/Makefile.am @@ -43,7 +43,8 @@ gtest_SOURCES = gtest.cpp \ 014-cgroupv2_get_subtree_control.cpp \ 015-cgroupv2_controller_enabled.cpp \ 016-cgset_parse_r_flag.cpp \ - 017-API_fuzz_test.cpp + 017-API_fuzz_test.cpp \ + 018-get_next_rule_field.cpp gtest_LDFLAGS = -L$(top_srcdir)/googletest/googletest -l:libgtest.so \ -rpath $(abs_top_srcdir)/googletest/googletest -- 2.47.3