diff --git a/rules/aip0121/no_mutable_cycles.go b/rules/aip0121/no_mutable_cycles.go index 51d19ae1a..3d87500a2 100644 --- a/rules/aip0121/no_mutable_cycles.go +++ b/rules/aip0121/no_mutable_cycles.go @@ -51,6 +51,10 @@ func findCycles(start string, node *desc.MessageDescriptor, seen stringset.Set, continue } if ref.GetType() == start { + // Allow for mutable self-reference to support taxonomy cases. + if len(chain) == 1 { + continue + } cycle := strings.Join(append(chain, start), " > ") problems = append(problems, lint.Problem{ Message: "mutable resource reference introduces a reference cycle:\n" + cycle, diff --git a/rules/aip0121/no_mutable_cycles_test.go b/rules/aip0121/no_mutable_cycles_test.go index 2d055008a..70dcb2b09 100644 --- a/rules/aip0121/no_mutable_cycles_test.go +++ b/rules/aip0121/no_mutable_cycles_test.go @@ -36,19 +36,17 @@ func TestNoMutableCycles(t *testing.T) { nil, }, { - "InvalidCycle", + "ValidSelfReferenceCycle", + "", `[(google.api.resource_reference).type = "library.googleapis.com/Publisher"]`, - `[(google.api.resource_reference).type = "library.googleapis.com/Book"]`, "", "", - testutils.Problems{{ - Message: "cycle", - }}, + nil, }, { - "InvalidSelfReferenceCycle", - "", + "InvalidCycle", `[(google.api.resource_reference).type = "library.googleapis.com/Publisher"]`, + `[(google.api.resource_reference).type = "library.googleapis.com/Book"]`, "", "", testutils.Problems{{ @@ -65,21 +63,6 @@ func TestNoMutableCycles(t *testing.T) { Message: "cycle", }}, }, - { - "InvalidDeepAndShallowCycles", - `[(google.api.resource_reference).type = "library.googleapis.com/Publisher"]`, - `[(google.api.resource_reference).type = "library.googleapis.com/Library"]`, - `[(google.api.resource_reference).type = "library.googleapis.com/Book"]`, - `[(google.api.resource_reference).type = "library.googleapis.com/Book"]`, - testutils.Problems{ - { - Message: "cycle", - }, - { - Message: "cycle", - }, - }, - }, { "ValidOutputOnlyCyclicReference", `[(google.api.resource_reference).type = "library.googleapis.com/Publisher"]`,