From 80147c7045d5de8fd36d4d503593b9cbaf63a194 Mon Sep 17 00:00:00 2001 From: Steve Ramage Date: Sun, 27 Jul 2025 09:45:22 -0700 Subject: [PATCH] feat: add support for LogsDirectoryQuota=,StateDirectoryQuota=,CacheDirectoryQuota= --- .../optionvalues/SimpleGrammarOptionValues.kt | 14 ++++++ ...ueInspectionForSimpleGrammarOptionValue.kt | 50 +++++++++++++++++++ .../optionvalues/OptionValueTest.kt | 13 +++-- 3 files changed, 72 insertions(+), 5 deletions(-) diff --git a/src/main/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/semanticdata/optionvalues/SimpleGrammarOptionValues.kt b/src/main/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/semanticdata/optionvalues/SimpleGrammarOptionValues.kt index 5fd3d245..6c292c23 100644 --- a/src/main/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/semanticdata/optionvalues/SimpleGrammarOptionValues.kt +++ b/src/main/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/semanticdata/optionvalues/SimpleGrammarOptionValues.kt @@ -74,6 +74,20 @@ class SimpleGrammarOptionValues(validatorName: String, grammar: Combinator) : Gr FlexibleLiteralChoiceTerminal("~"), ), EOF())), + + Validator("config_parse_exec_quota", "0") to SimpleGrammarOptionValues("config_parse_exec_quota", + SequenceCombinator( + AlternativeCombinator( + OptionalWhitespacePrefix( + SequenceCombinator(IntegerTerminal(0, 4_294_967_296), OptionalWhitespacePrefix(FlexibleLiteralChoiceTerminal("K","M","G", "T")) + )), + SequenceCombinator(IntegerTerminal(0, 101), FlexibleLiteralChoiceTerminal("%")), + OptionalWhitespacePrefix(IntegerTerminal(0, 4_294_967_296)), + FlexibleLiteralChoiceTerminal("off"), + ), + EOF() + )) + ) } diff --git a/src/test/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/inspections/InvalidValueInspectionForSimpleGrammarOptionValue.kt b/src/test/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/inspections/InvalidValueInspectionForSimpleGrammarOptionValue.kt index 00ee1cb3..5ede3dc0 100644 --- a/src/test/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/inspections/InvalidValueInspectionForSimpleGrammarOptionValue.kt +++ b/src/test/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/inspections/InvalidValueInspectionForSimpleGrammarOptionValue.kt @@ -129,4 +129,54 @@ class InvalidValueInspectionForSimpleGrammarOptionValue : AbstractUnitFileTest() assertSize(4, highlights) } + + fun testNoWarningWhenValidQuotasAreSet() { + // Fixture Setup + // language="unit file (systemd)" + val file=""" + [Service] + StateDirectoryQuota=1K + StateDirectoryQuota=1 M + StateDirectoryQuota=1T + StateDirectoryQuota=1 G + StateDirectoryQuota=0 + StateDirectoryQuota=4294967295 + StateDirecotryQuota=1% + StateDirecotryQuota=off + StateDirecotryQuota=100% + StateDirecotryQuota=0% + """.trimIndent() + + // Execute SUT + setupFileInEditor("file.service", file) + enableInspection(InvalidValueInspection::class.java) + val highlights = myFixture.doHighlighting() + + // Verification + assertSize(0, highlights) + } + + fun testWarningWhenInvalidQuotasAreSet() { + // Fixture Setup + // language="unit file (systemd)" + val file=""" + [Service] + StateDirectoryQuota=1P + StateDirectoryQuota=-1 + StateDirectoryQuota=on + StateDirectoryQuota=allo + StateDirectoryQuota=4294967296 + StateDirectoryQuota=500% + StateDirectoryQuota=5.52% + """.trimIndent() + + // Execute SUT + setupFileInEditor("file.service", file) + enableInspection(InvalidValueInspection::class.java) + val highlights = myFixture.doHighlighting() + + // Verification + assertSize(7, highlights) + } + } diff --git a/src/test/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/semanticdata/optionvalues/OptionValueTest.kt b/src/test/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/semanticdata/optionvalues/OptionValueTest.kt index 28bc3ae8..4e15e111 100644 --- a/src/test/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/semanticdata/optionvalues/OptionValueTest.kt +++ b/src/test/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/semanticdata/optionvalues/OptionValueTest.kt @@ -16,6 +16,7 @@ class OptionValueTest : AbstractUnitFileTest() { val missingValidators = hashMapOf() var totalMissingValidators = 0 var totalFoundValidators = 0 + val foundValidators = mutableSetOf() for (fileClass in FileClass.entries) { for (sectionName in SemanticDataRepository.instance.getSectionNamesForFile(fileClass.fileClass)) { for (key in SemanticDataRepository.instance.getAllowedKeywordsInSectionFromValidators(fileClass, sectionName)) { @@ -26,6 +27,7 @@ class OptionValueTest : AbstractUnitFileTest() { missingValidators[validator] = (missingValidators[validator] ?: 0) + 1 totalMissingValidators++ } else { + foundValidators.add(validator) totalFoundValidators++ } } @@ -36,17 +38,18 @@ class OptionValueTest : AbstractUnitFileTest() { val sortedList = missingValidatorList.sortedDescending().joinToString("\n") println("Missing:$totalMissingValidators") + println("Missing Functions:${missingValidators.size}") println("Found:$totalFoundValidators") - val startDate = LocalDate.of(2025, 7, 12) // Today's date - val startingCount = 1183 // Your current undocumented options count + val startDate = LocalDate.of(2025, 7, 27) // Today's date + val startingCount = 612 // Your current undocumented options count val currentDate = LocalDate.now() val daysSinceStart = ChronoUnit.DAYS.between(startDate, currentDate) - val reductionPerDay = 4 + val reductionPerDay = 1 val allowed = maxOf(0, startingCount - (daysSinceStart * reductionPerDay)) - if (totalMissingValidators >= allowed) { - assertEquals("Number of missing validators is too high at ${totalMissingValidators} > $allowed vs. found ${totalFoundValidators}", sortedList, "") + if (missingValidators.size >= allowed) { + assertEquals("Number of missing functions is too high at ${missingValidators.size} > $allowed vs. found ${foundValidators.size} ${totalFoundValidators}", sortedList, "") } if (totalFoundValidators == 0) {