diff --git a/src/main/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/semanticdata/optionvalues/AiGenerated.kt b/src/main/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/semanticdata/optionvalues/AiGenerated.kt index ca31a46..e2ed319 100644 --- a/src/main/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/semanticdata/optionvalues/AiGenerated.kt +++ b/src/main/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/semanticdata/optionvalues/AiGenerated.kt @@ -94,6 +94,7 @@ fun getAllAIGeneratedValidators(): Map { Validator("config_parse_flow_label", "0") to ConfigParseFlowLabelOptionValue() as OptionValueInformation, Validator("config_parse_fou_encap_type", "0") to ConfigParseFouEncapTypeOptionValue() as OptionValueInformation, Validator("config_parse_fou_tunnel_address", "0") to ConfigParseFouTunnelAddressOptionValue() as OptionValueInformation, + Validator("config_parse_fq_codel_size", "QDISC_KIND_FQ_CODEL") to ConfigParseFqCodelSizeOptionValue() as OptionValueInformation, Validator("config_parse_fq_pie_packet_limit", "QDISC_KIND_FQ_PIE") to ConfigParseFqPiePacketLimitOptionValue() as OptionValueInformation, Validator("config_parse_geneve_df", "0") to ConfigParseGeneveDfOptionValue() as OptionValueInformation, Validator("config_parse_geneve_flow_label", "0") to ConfigParseGeneveFlowLabelOptionValue() as OptionValueInformation, @@ -103,6 +104,8 @@ fun getAllAIGeneratedValidators(): Map { Validator("config_parse_htb_class_size", "TCLASS_KIND_HTB") to ConfigParseHtbClassSizeOptionValue() as OptionValueInformation, Validator("config_parse_iaid", "AF_INET6") to ConfigParseIaidOptionValue() as OptionValueInformation, Validator("config_parse_iaid", "AF_INET") to ConfigParseIaidOptionValue() as OptionValueInformation, + Validator("config_parse_iec_size", "0") to ConfigParseIecSizeOptionValue() as OptionValueInformation, + Validator("config_parse_int", "0") to ConfigParseIntOptionValue() as OptionValueInformation, Validator("config_parse_in_addr_non_null", "AF_INET") to ConfigParseInAddrNonNullOptionValue() as OptionValueInformation, Validator("config_parse_ip_masquerade", "0") to ConfigParseIpMasqueradeOptionValue() as OptionValueInformation, Validator("config_parse_ip_protocol", "true") to ConfigParseIpProtocolOptionValue() as OptionValueInformation, @@ -113,6 +116,7 @@ fun getAllAIGeneratedValidators(): Map { Validator("config_parse_ipv6_privacy_extensions", "0") to ConfigParseIpv6PrivacyExtensionsOptionValue() as OptionValueInformation, Validator("config_parse_ipvlan_flags", "0") to ConfigParseIpvlanFlagsOptionValue() as OptionValueInformation, Validator("config_parse_ipvlan_mode", "0") to ConfigParseIpvlanModeOptionValue() as OptionValueInformation, + Validator("config_parse_job_mode", "0") to ConfigParseJobModeOptionValue() as OptionValueInformation, Validator("config_parse_job_mode_isolate", "0") to ConfigParseJobModeIsolateOptionValue() as OptionValueInformation, Validator("config_parse_keep_configuration", "0") to ConfigParseKeepConfigurationOptionValue() as OptionValueInformation, Validator("config_parse_l2tp_encap_type", "0") to ConfigParseL2tpEncapTypeOptionValue() as OptionValueInformation, @@ -162,6 +166,7 @@ fun getAllAIGeneratedValidators(): Map { Validator("config_parse_protect_home", "0") to ConfigParseProtectHomeOptionValue() as OptionValueInformation, Validator("config_parse_protect_system", "0") to ConfigParseProtectSystemOptionValue() as OptionValueInformation, Validator("config_parse_qfq_weight", "TCLASS_KIND_QFQ") to ConfigParseQfqWeightOptionValue() as OptionValueInformation, + Validator("config_parse_reboot_parameter", "0") to ConfigParseRebootParameterOptionValue() as OptionValueInformation, Validator("config_parse_restrict_network_interfaces", "0") to ConfigParseRestrictNetworkInterfacesOptionValue() as OptionValueInformation, Validator("config_parse_ring_buffer_or_channel", "0") to ConfigParseRingBufferOrChannelOptionValue() as OptionValueInformation, Validator("config_parse_route_prefix_preference", "0") to ConfigParseRoutePrefixPreferenceOptionValue() as OptionValueInformation, @@ -197,6 +202,7 @@ fun getAllAIGeneratedValidators(): Map { Validator("config_parse_unit_condition_string", "CONDITION_CPU_FEATURE") to ConfigParseUnitConditionStringOptionValue() as OptionValueInformation, Validator("config_parse_unit_condition_string", "CONDITION_FIRST_BOOT") to ConfigParseUnitConditionStringOptionValue() as OptionValueInformation, Validator("config_parse_unit_env_file", "0") to ConfigParseUnitEnvFileOptionValue() as OptionValueInformation, + Validator("config_parse_unit_mounts_for", "0") to ConfigParseUnitMountsForOptionValue() as OptionValueInformation, Validator("config_parse_unit_slice", "0") to ConfigParseUnitSliceOptionValue() as OptionValueInformation, Validator("config_parse_use_domains", "0") to ConfigParseUseDomainsOptionValue() as OptionValueInformation, Validator("config_parse_userns_chown", "0") to ConfigParseUsernsChownOptionValue() as OptionValueInformation, diff --git a/src/main/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/semanticdata/optionvalues/ai/ConfigParseFqCodelSizeOptionValue.kt b/src/main/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/semanticdata/optionvalues/ai/ConfigParseFqCodelSizeOptionValue.kt new file mode 100644 index 0000000..19add4d --- /dev/null +++ b/src/main/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/semanticdata/optionvalues/ai/ConfigParseFqCodelSizeOptionValue.kt @@ -0,0 +1,20 @@ +package net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.ai + +import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.SimpleGrammarOptionValues +import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.grammar.* + +/** + * Validator for the [FairQueueingControlledDelay] size-style options: MemoryLimitBytes=, + * QuantumBytes= (and the deprecated MemoryLimit / Quantum aliases). + * + * C function: config_parse_fq_codel_size(QDISC_KIND_FQ_CODEL) in src/network/tc/fq-codel.c. + * After branching on the lvalue it calls parse_size(rvalue, 1024, &sz). Same IEC byte shape + * as the other parse_size-based validators. + */ +class ConfigParseFqCodelSizeOptionValue : SimpleGrammarOptionValues( + "config_parse_fq_codel_size", + SequenceCombinator( + OptionalWhitespacePrefix(BYTES), + EOF() + ) +) diff --git a/src/main/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/semanticdata/optionvalues/ai/ConfigParseIecSizeOptionValue.kt b/src/main/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/semanticdata/optionvalues/ai/ConfigParseIecSizeOptionValue.kt new file mode 100644 index 0000000..7739bc4 --- /dev/null +++ b/src/main/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/semanticdata/optionvalues/ai/ConfigParseIecSizeOptionValue.kt @@ -0,0 +1,19 @@ +package net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.ai + +import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.SimpleGrammarOptionValues +import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.grammar.* + +/** + * Validator for generic IEC byte-size options parsed by config_parse_iec_size. + * + * C function: config_parse_iec_size in src/shared/conf-parser.c. Delegates to + * parse_size(rvalue, 1024, &v) and additionally requires the result to fit in a size_t. + * Same IEC byte syntax used by tbf_size / fq_size / htb_class_size. + */ +class ConfigParseIecSizeOptionValue : SimpleGrammarOptionValues( + "config_parse_iec_size", + SequenceCombinator( + OptionalWhitespacePrefix(BYTES), + EOF() + ) +) diff --git a/src/main/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/semanticdata/optionvalues/ai/ConfigParseIntOptionValue.kt b/src/main/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/semanticdata/optionvalues/ai/ConfigParseIntOptionValue.kt new file mode 100644 index 0000000..78db652 --- /dev/null +++ b/src/main/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/semanticdata/optionvalues/ai/ConfigParseIntOptionValue.kt @@ -0,0 +1,18 @@ +package net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.ai + +import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.SimpleGrammarOptionValues +import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.grammar.* + +/** + * Validator for generic signed-integer options parsed by config_parse_int. + * + * C function: defined via DEFINE_PARSER(int, int, safe_atoi) in src/shared/conf-parser.c. + * Accepts a signed 32-bit integer. + */ +class ConfigParseIntOptionValue : SimpleGrammarOptionValues( + "config_parse_int", + SequenceCombinator( + IntegerTerminal(Int.MIN_VALUE.toLong(), Int.MAX_VALUE.toLong() + 1L), + EOF() + ) +) diff --git a/src/main/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/semanticdata/optionvalues/ai/ConfigParseJobModeOptionValue.kt b/src/main/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/semanticdata/optionvalues/ai/ConfigParseJobModeOptionValue.kt new file mode 100644 index 0000000..19a5037 --- /dev/null +++ b/src/main/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/semanticdata/optionvalues/ai/ConfigParseJobModeOptionValue.kt @@ -0,0 +1,30 @@ +package net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.ai + +import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.SimpleGrammarOptionValues +import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.grammar.* + +/** + * Validator for job-mode options (e.g. OnFailureJobMode=, OnSuccessJobMode=). + * + * C function: config_parse_job_mode, expanded via DEFINE_CONFIG_PARSE_ENUM in + * src/core/load-fragment.c. Accepts exactly the entries of job_mode_table in + * src/basic/unit-def.c. + */ +class ConfigParseJobModeOptionValue : SimpleGrammarOptionValues( + "config_parse_job_mode", + SequenceCombinator( + LiteralChoiceTerminal( + "fail", + "lenient", + "replace", + "replace-irreversibly", + "isolate", + "flush", + "ignore-dependencies", + "ignore-requirements", + "triggering", + "restart-dependencies" + ), + EOF() + ) +) diff --git a/src/main/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/semanticdata/optionvalues/ai/ConfigParseRebootParameterOptionValue.kt b/src/main/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/semanticdata/optionvalues/ai/ConfigParseRebootParameterOptionValue.kt new file mode 100644 index 0000000..c5e23d4 --- /dev/null +++ b/src/main/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/semanticdata/optionvalues/ai/ConfigParseRebootParameterOptionValue.kt @@ -0,0 +1,23 @@ +package net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.ai + +import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.SimpleGrammarOptionValues +import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.grammar.* + +/** + * Validator for RebootArgument= / RebootParameter= keys. + * + * C function: config_parse_reboot_parameter in src/core/load-fragment.c → reboot_parameter_is_valid + * in src/shared/reboot-util.c. After unit_full_printf specifier expansion, the result must: + * - pass ascii_is_valid (printable ASCII) + * - have length ≤ NAME_MAX (255) + * + * Grammar allows printable ASCII (0x20..0x7E) including "%" for specifier syntax; length cap + * of 255 is enforced via a regex quantifier. + */ +class ConfigParseRebootParameterOptionValue : SimpleGrammarOptionValues( + "config_parse_reboot_parameter", + SequenceCombinator( + RegexTerminal("[\\x20-\\x7E]{1,255}", "[\\x20-\\x7E]{1,255}"), + EOF() + ) +) diff --git a/src/main/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/semanticdata/optionvalues/ai/ConfigParseUnitMountsForOptionValue.kt b/src/main/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/semanticdata/optionvalues/ai/ConfigParseUnitMountsForOptionValue.kt new file mode 100644 index 0000000..c4450a0 --- /dev/null +++ b/src/main/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/semanticdata/optionvalues/ai/ConfigParseUnitMountsForOptionValue.kt @@ -0,0 +1,27 @@ +package net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.ai + +import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.SimpleGrammarOptionValues +import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.grammar.* + +/** + * Validator for RequiresMountsFor= / WantsMountsFor=. + * + * C function: config_parse_unit_mounts_for in src/core/load-fragment.c. Tokenizes rvalue with + * extract_first_word (whitespace-separated, EXTRACT_UNQUOTE), expands unit specifiers via + * unit_path_printf, then requires each path to be absolute via path_simplify_and_warn with + * PATH_CHECK_ABSOLUTE. + * + * The grammar allows any non-whitespace path that starts with "/", and accepts "%X" specifiers + * inline since the C parser expands them before the absolute-path check. + */ +class ConfigParseUnitMountsForOptionValue : SimpleGrammarOptionValues( + "config_parse_unit_mounts_for", + SequenceCombinator( + RegexTerminal("/\\S*", "/\\S*"), + ZeroOrMore(SequenceCombinator( + WhitespaceTerminal(), + RegexTerminal("/\\S*", "/\\S*") + )), + EOF() + ) +) diff --git a/src/test/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/inspections/ai/ConfigParseFqCodelSizeOptionValueTest.kt b/src/test/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/inspections/ai/ConfigParseFqCodelSizeOptionValueTest.kt new file mode 100644 index 0000000..30b4a73 --- /dev/null +++ b/src/test/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/inspections/ai/ConfigParseFqCodelSizeOptionValueTest.kt @@ -0,0 +1,43 @@ +package net.sjrx.intellij.plugins.systemdunitfiles.inspections.ai + +import net.sjrx.intellij.plugins.systemdunitfiles.AbstractUnitFileTest +import net.sjrx.intellij.plugins.systemdunitfiles.inspections.InvalidValueInspection +import org.junit.Test + +class ConfigParseFqCodelSizeOptionValueTest : AbstractUnitFileTest() { + + @Test + fun testValidValues() { + // language="unit file (systemd)" + val file = """ + [FairQueueingControlledDelay] + MemoryLimitBytes=32M + QuantumBytes=1500 + MemoryLimit=64M + Quantum=2K + """.trimIndent() + + setupFileInEditor("file.network", file) + enableInspection(InvalidValueInspection::class.java) + val highlights = myFixture.doHighlighting() + + assertSize(0, highlights) + } + + @Test + fun testInvalidValues() { + // language="unit file (systemd)" + val file = """ + [FairQueueingControlledDelay] + MemoryLimitBytes=abc + QuantumBytes=-1 + MemoryLimit=10X + """.trimIndent() + + setupFileInEditor("file.network", file) + enableInspection(InvalidValueInspection::class.java) + val highlights = myFixture.doHighlighting() + + assertSize(3, highlights) + } +} diff --git a/src/test/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/inspections/ai/ConfigParseIecSizeOptionValueTest.kt b/src/test/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/inspections/ai/ConfigParseIecSizeOptionValueTest.kt new file mode 100644 index 0000000..81e9ac3 --- /dev/null +++ b/src/test/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/inspections/ai/ConfigParseIecSizeOptionValueTest.kt @@ -0,0 +1,43 @@ +package net.sjrx.intellij.plugins.systemdunitfiles.inspections.ai + +import net.sjrx.intellij.plugins.systemdunitfiles.AbstractUnitFileTest +import net.sjrx.intellij.plugins.systemdunitfiles.inspections.InvalidValueInspection +import org.junit.Test + +class ConfigParseIecSizeOptionValueTest : AbstractUnitFileTest() { + + @Test + fun testValidValues() { + // language="unit file (systemd)" + val file = """ + [Socket] + ReceiveBuffer=4096 + SendBuffer=64K + PipeSize=1M + ReceiveBuffer=2G + """.trimIndent() + + setupFileInEditor("file.socket", file) + enableInspection(InvalidValueInspection::class.java) + val highlights = myFixture.doHighlighting() + + assertSize(0, highlights) + } + + @Test + fun testInvalidValues() { + // language="unit file (systemd)" + val file = """ + [Socket] + ReceiveBuffer=abc + SendBuffer=-1 + PipeSize=10X + """.trimIndent() + + setupFileInEditor("file.socket", file) + enableInspection(InvalidValueInspection::class.java) + val highlights = myFixture.doHighlighting() + + assertSize(3, highlights) + } +} diff --git a/src/test/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/inspections/ai/ConfigParseIntOptionValueTest.kt b/src/test/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/inspections/ai/ConfigParseIntOptionValueTest.kt new file mode 100644 index 0000000..f94d089 --- /dev/null +++ b/src/test/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/inspections/ai/ConfigParseIntOptionValueTest.kt @@ -0,0 +1,45 @@ +package net.sjrx.intellij.plugins.systemdunitfiles.inspections.ai + +import net.sjrx.intellij.plugins.systemdunitfiles.AbstractUnitFileTest +import net.sjrx.intellij.plugins.systemdunitfiles.inspections.InvalidValueInspection +import org.junit.Test + +class ConfigParseIntOptionValueTest : AbstractUnitFileTest() { + + @Test + fun testValidValues() { + // language="unit file (systemd)" + val file = """ + [Socket] + Priority=0 + IPTTL=64 + Mark=-1 + Priority=2147483647 + IPTTL=-2147483648 + """.trimIndent() + + setupFileInEditor("file.socket", file) + enableInspection(InvalidValueInspection::class.java) + val highlights = myFixture.doHighlighting() + + assertSize(0, highlights) + } + + @Test + fun testInvalidValues() { + // language="unit file (systemd)" + val file = """ + [Socket] + Priority=abc + IPTTL=1.5 + Mark=2147483648 + Priority=10 20 + """.trimIndent() + + setupFileInEditor("file.socket", file) + enableInspection(InvalidValueInspection::class.java) + val highlights = myFixture.doHighlighting() + + assertSize(4, highlights) + } +} diff --git a/src/test/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/inspections/ai/ConfigParseJobModeOptionValueTest.kt b/src/test/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/inspections/ai/ConfigParseJobModeOptionValueTest.kt new file mode 100644 index 0000000..034a58a --- /dev/null +++ b/src/test/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/inspections/ai/ConfigParseJobModeOptionValueTest.kt @@ -0,0 +1,50 @@ +package net.sjrx.intellij.plugins.systemdunitfiles.inspections.ai + +import net.sjrx.intellij.plugins.systemdunitfiles.AbstractUnitFileTest +import net.sjrx.intellij.plugins.systemdunitfiles.inspections.InvalidValueInspection +import org.junit.Test + +class ConfigParseJobModeOptionValueTest : AbstractUnitFileTest() { + + @Test + fun testValidValues() { + // language="unit file (systemd)" + val file = """ + [Unit] + OnSuccessJobMode=fail + OnFailureJobMode=replace + OnSuccessJobMode=replace-irreversibly + OnFailureJobMode=isolate + OnSuccessJobMode=flush + OnFailureJobMode=ignore-dependencies + OnSuccessJobMode=ignore-requirements + OnFailureJobMode=triggering + OnSuccessJobMode=restart-dependencies + OnFailureJobMode=lenient + """.trimIndent() + + setupFileInEditor("file.service", file) + enableInspection(InvalidValueInspection::class.java) + val highlights = myFixture.doHighlighting() + + assertSize(0, highlights) + } + + @Test + fun testInvalidValues() { + // language="unit file (systemd)" + val file = """ + [Unit] + OnSuccessJobMode=unknown + OnFailureJobMode=Replace + OnSuccessJobMode=fail isolate + OnFailureJobMode=replace_irreversibly + """.trimIndent() + + setupFileInEditor("file.service", file) + enableInspection(InvalidValueInspection::class.java) + val highlights = myFixture.doHighlighting() + + assertSize(4, highlights) + } +} diff --git a/src/test/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/inspections/ai/ConfigParseRebootParameterOptionValueTest.kt b/src/test/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/inspections/ai/ConfigParseRebootParameterOptionValueTest.kt new file mode 100644 index 0000000..1532273 --- /dev/null +++ b/src/test/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/inspections/ai/ConfigParseRebootParameterOptionValueTest.kt @@ -0,0 +1,42 @@ +package net.sjrx.intellij.plugins.systemdunitfiles.inspections.ai + +import net.sjrx.intellij.plugins.systemdunitfiles.AbstractUnitFileTest +import net.sjrx.intellij.plugins.systemdunitfiles.inspections.InvalidValueInspection +import org.junit.Test + +class ConfigParseRebootParameterOptionValueTest : AbstractUnitFileTest() { + + @Test + fun testValidValues() { + // language="unit file (systemd)" + val file = """ + [Unit] + RebootArgument=recovery + JobTimeoutRebootArgument=panic + RebootArgument=bootloader + JobTimeoutRebootArgument=arg with spaces + """.trimIndent() + + setupFileInEditor("file.service", file) + enableInspection(InvalidValueInspection::class.java) + val highlights = myFixture.doHighlighting() + + assertSize(0, highlights) + } + + @Test + fun testInvalidValues() { + // language="unit file (systemd)" + val file = """ + [Unit] + RebootArgument=café + JobTimeoutRebootArgument=日本 + """.trimIndent() + + setupFileInEditor("file.service", file) + enableInspection(InvalidValueInspection::class.java) + val highlights = myFixture.doHighlighting() + + assertSize(2, highlights) + } +} diff --git a/src/test/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/inspections/ai/ConfigParseUnitMountsForOptionValueTest.kt b/src/test/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/inspections/ai/ConfigParseUnitMountsForOptionValueTest.kt new file mode 100644 index 0000000..d58eabe --- /dev/null +++ b/src/test/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/inspections/ai/ConfigParseUnitMountsForOptionValueTest.kt @@ -0,0 +1,43 @@ +package net.sjrx.intellij.plugins.systemdunitfiles.inspections.ai + +import net.sjrx.intellij.plugins.systemdunitfiles.AbstractUnitFileTest +import net.sjrx.intellij.plugins.systemdunitfiles.inspections.InvalidValueInspection +import org.junit.Test + +class ConfigParseUnitMountsForOptionValueTest : AbstractUnitFileTest() { + + @Test + fun testValidValues() { + // language="unit file (systemd)" + val file = """ + [Unit] + RequiresMountsFor=/var/lib/myapp + WantsMountsFor=/tmp /var/cache + RequiresMountsFor=/srv /opt/app /home/user + WantsMountsFor=/var/log/%n + """.trimIndent() + + setupFileInEditor("file.service", file) + enableInspection(InvalidValueInspection::class.java) + val highlights = myFixture.doHighlighting() + + assertSize(0, highlights) + } + + @Test + fun testInvalidValues() { + // language="unit file (systemd)" + val file = """ + [Unit] + RequiresMountsFor=relative/path + WantsMountsFor=no-leading-slash + RequiresMountsFor=/valid relative/path + """.trimIndent() + + setupFileInEditor("file.service", file) + enableInspection(InvalidValueInspection::class.java) + val highlights = myFixture.doHighlighting() + + assertSize(3, highlights) + } +}