Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -191,14 +191,14 @@ fun getAllAIGeneratedValidators(): Map<Validator, OptionValueInformation> {
Validator("config_parse_route_prefix_preference", "0") to ConfigParseRoutePrefixPreferenceOptionValue() as OptionValueInformation,
Validator("config_parse_route_section", "ROUTE_GATEWAY") to ConfigParseRouteSectionGatewayOptionValue() as OptionValueInformation,
Validator("config_parse_route_section", "ROUTE_GATEWAY_NETWORK") to ConfigParseRouteSectionGatewayNetworkOptionValue() as OptionValueInformation,
Validator("config_parse_route_section", "ROUTE_METRIC_FASTOPEN_NO_COOKIE") to ConfigParseRouteSectionOptionValue() as OptionValueInformation,
Validator("config_parse_route_section", "ROUTE_METRIC_HOPLIMIT") to ConfigParseRouteSectionOptionValue() as OptionValueInformation,
Validator("config_parse_route_section", "ROUTE_METRIC_INITRWND") to ConfigParseRouteSectionOptionValue() as OptionValueInformation,
Validator("config_parse_route_section", "ROUTE_METRIC_QUICKACK") to ConfigParseRouteSectionOptionValue() as OptionValueInformation,
Validator("config_parse_route_section", "ROUTE_NEXTHOP") to ConfigParseRouteSectionOptionValue() as OptionValueInformation,
Validator("config_parse_route_section", "ROUTE_PREFERENCE") to ConfigParseRouteSectionOptionValue() as OptionValueInformation,
Validator("config_parse_route_section", "ROUTE_PRIORITY") to ConfigParseRouteSectionOptionValue() as OptionValueInformation,
Validator("config_parse_route_section", "ROUTE_PROTOCOL") to ConfigParseRouteSectionOptionValue() as OptionValueInformation,
Validator("config_parse_route_section", "ROUTE_METRIC_FASTOPEN_NO_COOKIE") to ConfigParseRouteSectionBooleanOptionValue() as OptionValueInformation,
Validator("config_parse_route_section", "ROUTE_METRIC_HOPLIMIT") to ConfigParseRouteSectionHopLimitOptionValue() as OptionValueInformation,
Validator("config_parse_route_section", "ROUTE_METRIC_INITRWND") to ConfigParseRouteSectionInitRwndOptionValue() as OptionValueInformation,
Validator("config_parse_route_section", "ROUTE_METRIC_QUICKACK") to ConfigParseRouteSectionBooleanOptionValue() as OptionValueInformation,
Validator("config_parse_route_section", "ROUTE_NEXTHOP") to ConfigParseRouteSectionUint32OptionValue() as OptionValueInformation,
Validator("config_parse_route_section", "ROUTE_PREFERENCE") to ConfigParseRouteSectionPreferenceOptionValue() as OptionValueInformation,
Validator("config_parse_route_section", "ROUTE_PRIORITY") to ConfigParseRouteSectionUint32OptionValue() as OptionValueInformation,
Validator("config_parse_route_section", "ROUTE_PROTOCOL") to ConfigParseRouteSectionProtocolOptionValue() as OptionValueInformation,
Validator("config_parse_route_section", "ROUTE_TYPE") to ConfigParseRouteSectionOptionValue() as OptionValueInformation,
Validator("config_parse_router_preference", "0") to ConfigParseRouterPreferenceOptionValue() as OptionValueInformation,
Validator("config_parse_rx_tx_queues", "0") to ConfigParseRxTxQueuesOptionValue() as OptionValueInformation,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
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.*

/**
* Boolean route metrics: Route.QuickAck and Route.FastOpenNoCookie
* (config_parse_route_metric_boolean).
*/
class ConfigParseRouteSectionBooleanOptionValue : SimpleGrammarOptionValues(
"config_parse_route_section",
SequenceCombinator(BOOLEAN, EOF())
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
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.*

/**
* Route.HopLimit: an unsigned integer in 1..255 (config_parse_route_metric_hop_limit rejects 0 and
* values above 255).
*/
class ConfigParseRouteSectionHopLimitOptionValue : SimpleGrammarOptionValues(
"config_parse_route_section",
SequenceCombinator(IntegerTerminal(1, 256), EOF())
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
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.*

/**
* Route.InitialAdvertisedReceiveWindow: a TCP window in 1..1023 (config_parse_tcp_window rejects 0
* and values of 1024 or more).
*/
class ConfigParseRouteSectionInitRwndOptionValue : SimpleGrammarOptionValues(
"config_parse_route_section",
SequenceCombinator(IntegerTerminal(1, 1024), EOF())
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
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.*

/**
* Route.IPv6Preference: one of low, medium, high (config_parse_route_preference).
*/
class ConfigParseRouteSectionPreferenceOptionValue : SimpleGrammarOptionValues(
"config_parse_route_section",
SequenceCombinator(LiteralChoiceTerminal("low", "medium", "high"), EOF())
)
Original file line number Diff line number Diff line change
@@ -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.*

/**
* Route.Protocol: "kernel", "boot", "static", or a number 0-255. systemd uses
* route_protocol_from_string — a small string table with a numeric fallback up to UINT8_MAX.
*/
class ConfigParseRouteSectionProtocolOptionValue : SimpleGrammarOptionValues(
"config_parse_route_section",
SequenceCombinator(
AlternativeCombinator(
LiteralChoiceTerminal("kernel", "boot", "static"),
IntegerTerminal(0, 256)
),
EOF()
)
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
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.*

/**
* Route-section options taking an unsigned 32-bit integer: Route.Metric (config_parse_route_priority,
* safe_atou32) and Route.NextHop (config_parse_route_nexthop, a nexthop id).
*/
class ConfigParseRouteSectionUint32OptionValue : SimpleGrammarOptionValues(
"config_parse_route_section",
SequenceCombinator(IntegerTerminal(0, 4_294_967_296), EOF())
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
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

/**
* [Route] section options under config_parse_route_section (#476). These were all mis-registered to
* the route-Type enum grammar, so valid integers/booleans/enums were wrongly flagged. Each ltype now
* has its correct grammar.
*/
class ConfigParseRouteSectionOptionsTest : AbstractUnitFileTest() {

@Test
fun testValidRouteOptions() {
// language="unit file (systemd)"
val file = """
[Route]
Type=unicast
Metric=100
Protocol=static
Protocol=42
IPv6Preference=high
NextHop=5
HopLimit=64
InitialAdvertisedReceiveWindow=10
QuickAck=true
FastOpenNoCookie=yes
""".trimIndent()

setupFileInEditor("file.network", file)
enableInspection(InvalidValueInspection::class.java)

assertSize(0, myFixture.doHighlighting())
}

@Test
fun testInvalidRouteOptions() {
// One bad value per line: non-number metric, bad preference, out-of-range protocol/hoplimit,
// non-boolean quickack -> one highlight each.
// language="unit file (systemd)"
val file = """
[Route]
Metric=notanumber
IPv6Preference=sideways
Protocol=999
HopLimit=0
QuickAck=perhaps
""".trimIndent()

setupFileInEditor("file.network", file)
enableInspection(InvalidValueInspection::class.java)

assertSize(5, myFixture.doHighlighting())
}
}
Loading