kythe.io@v0.0.68-0.20240422202219-7225dbc01741/kythe/go/serving/pipeline/nodes/nodes_test.go (about) 1 /* 2 * Copyright 2018 The Kythe Authors. All rights reserved. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package nodes 18 19 import ( 20 "testing" 21 22 "kythe.io/kythe/go/util/schema/edges" 23 "kythe.io/kythe/go/util/schema/facts" 24 "kythe.io/kythe/go/util/schema/nodes" 25 26 "github.com/apache/beam/sdks/go/pkg/beam" 27 "github.com/apache/beam/sdks/go/pkg/beam/testing/passert" 28 "github.com/apache/beam/sdks/go/pkg/beam/testing/ptest" 29 "github.com/apache/beam/sdks/go/pkg/beam/x/debug" 30 31 scpb "kythe.io/kythe/proto/schema_go_proto" 32 spb "kythe.io/kythe/proto/storage_go_proto" 33 ) 34 35 func TestFromEntries(t *testing.T) { 36 entries := []*spb.Entry{{ 37 Source: &spb.VName{Signature: "node1"}, 38 FactName: facts.NodeKind, 39 FactValue: []byte(nodes.Record), 40 }, { 41 Source: &spb.VName{Signature: "node1"}, 42 FactName: facts.Subkind, 43 FactValue: []byte(nodes.Class), 44 }, { 45 Source: &spb.VName{Signature: "node2"}, 46 FactName: facts.NodeKind, 47 FactValue: []byte("unknown_nodekind"), 48 }, { 49 Source: &spb.VName{Signature: "node2"}, 50 FactName: facts.Subkind, 51 FactValue: []byte("unknown_subkind"), 52 }, { 53 Source: &spb.VName{Signature: "node2"}, 54 FactName: facts.Text, // schema-known fact name 55 FactValue: []byte("text"), 56 }, { 57 // Duplicate fact 58 Source: &spb.VName{Signature: "node2"}, 59 FactName: facts.Text, 60 FactValue: []byte("text"), 61 }, { 62 Source: &spb.VName{Signature: "node2"}, 63 FactName: "/unknown/fact/name", 64 FactValue: []byte("blah"), 65 }, { 66 Source: &spb.VName{Signature: "node2"}, 67 EdgeKind: edges.Typed, // schema-known edge kind 68 Target: &spb.VName{Signature: "node1"}, 69 }, { 70 // Duplicate edge 71 Source: &spb.VName{Signature: "node2"}, 72 EdgeKind: edges.Typed, 73 Target: &spb.VName{Signature: "node1"}, 74 }, { 75 Source: &spb.VName{Signature: "node2"}, 76 EdgeKind: "/unknown/edge/kind", 77 Target: &spb.VName{Signature: "node2"}, 78 }, { 79 Source: &spb.VName{Signature: "node2"}, 80 EdgeKind: "/unknown/edge/kind2", 81 Target: &spb.VName{Signature: "node2"}, 82 }, { 83 Source: &spb.VName{Signature: "node2"}, 84 EdgeKind: "/unknown/edge/kind3", 85 Target: &spb.VName{Signature: "node2"}, 86 }, { 87 Source: &spb.VName{Signature: "anchor"}, 88 FactName: facts.NodeKind, 89 FactValue: []byte(nodes.Anchor), 90 }, { 91 Source: &spb.VName{Signature: "anchor"}, 92 FactName: facts.AnchorStart, 93 FactValue: []byte("1"), 94 }, { 95 Source: &spb.VName{Signature: "anchor"}, 96 FactName: facts.SnippetEnd, 97 FactValue: []byte("5"), 98 }, { 99 Source: &spb.VName{Signature: "anchor"}, 100 FactName: facts.SnippetStart, 101 FactValue: []byte("0"), 102 }, { 103 Source: &spb.VName{Signature: "anchor"}, 104 FactName: facts.AnchorEnd, 105 FactValue: []byte("2"), 106 }} 107 expected := []*scpb.Node{{ 108 Source: &spb.VName{Signature: "node1"}, 109 Kind: &scpb.Node_KytheKind{scpb.NodeKind_RECORD}, 110 Subkind: &scpb.Node_KytheSubkind{scpb.Subkind_CLASS}, 111 }, { 112 Source: &spb.VName{Signature: "node2"}, 113 Kind: &scpb.Node_GenericKind{"unknown_nodekind"}, 114 Subkind: &scpb.Node_GenericSubkind{"unknown_subkind"}, 115 Fact: []*scpb.Fact{{ 116 Name: &scpb.Fact_GenericName{"/unknown/fact/name"}, 117 Value: []byte("blah"), 118 }, { 119 Name: &scpb.Fact_KytheName{scpb.FactName_TEXT}, 120 Value: []byte("text"), 121 }}, 122 Edge: []*scpb.Edge{{ 123 Kind: &scpb.Edge_GenericKind{"/unknown/edge/kind"}, 124 Target: &spb.VName{Signature: "node2"}, 125 }, { 126 Kind: &scpb.Edge_GenericKind{"/unknown/edge/kind2"}, 127 Target: &spb.VName{Signature: "node2"}, 128 }, { 129 Kind: &scpb.Edge_GenericKind{"/unknown/edge/kind3"}, 130 Target: &spb.VName{Signature: "node2"}, 131 }, { 132 Kind: &scpb.Edge_KytheKind{scpb.EdgeKind_TYPED}, 133 Target: &spb.VName{Signature: "node1"}, 134 }}, 135 }, { 136 Source: &spb.VName{Signature: "anchor"}, 137 Kind: &scpb.Node_KytheKind{scpb.NodeKind_ANCHOR}, 138 Fact: []*scpb.Fact{{ 139 Name: &scpb.Fact_KytheName{scpb.FactName_LOC_END}, 140 Value: []byte("2"), 141 }, { 142 Name: &scpb.Fact_KytheName{scpb.FactName_LOC_START}, 143 Value: []byte("1"), 144 }, { 145 Name: &scpb.Fact_KytheName{scpb.FactName_SNIPPET_END}, 146 Value: []byte("5"), 147 }, { 148 Name: &scpb.Fact_KytheName{scpb.FactName_SNIPPET_START}, 149 Value: []byte("0"), 150 }}, 151 }} 152 153 p, s := beam.NewPipelineWithRoot() 154 nodes := FromEntries(s, beam.CreateList(s, entries)) 155 debug.Print(s, nodes) 156 passert.Equals(s, nodes, beam.CreateList(s, expected)) 157 158 if err := ptest.Run(p); err != nil { 159 t.Fatalf("Pipeline error: %+v", err) 160 } 161 } 162 163 func TestFilter(t *testing.T) { 164 nodes := []*scpb.Node{{ 165 Source: &spb.VName{Signature: "node1"}, 166 Kind: &scpb.Node_KytheKind{scpb.NodeKind_RECORD}, 167 Subkind: &scpb.Node_KytheSubkind{scpb.Subkind_CLASS}, 168 }, { 169 Source: &spb.VName{Signature: "node2"}, 170 Kind: &scpb.Node_GenericKind{"unknown_nodekind"}, 171 Subkind: &scpb.Node_GenericSubkind{"unknown_subkind"}, 172 Fact: []*scpb.Fact{{ 173 Name: &scpb.Fact_KytheName{scpb.FactName_TEXT}, 174 Value: []byte("text"), 175 }, { 176 Name: &scpb.Fact_GenericName{"/unknown/fact/name"}, 177 Value: []byte("blah"), 178 }}, 179 Edge: []*scpb.Edge{{ 180 Kind: &scpb.Edge_KytheKind{scpb.EdgeKind_TYPED}, 181 Target: &spb.VName{Signature: "node1"}, 182 }, { 183 Kind: &scpb.Edge_GenericKind{"/unknown/edge/kind"}, 184 Target: &spb.VName{Signature: "node2"}, 185 }}, 186 }} 187 188 tests := []struct { 189 filter Filter 190 expected []*scpb.Node 191 }{ 192 {Filter{}, nodes}, 193 {Filter{FilterByKind: []string{"record", "unknown_nodekind"}}, nodes}, 194 {Filter{FilterBySubkind: []string{"class", "unknown_subkind"}}, nodes}, 195 196 {Filter{FilterByKind: []string{"record"}}, []*scpb.Node{nodes[0]}}, 197 {Filter{FilterByKind: []string{"unknown_nodekind"}}, []*scpb.Node{nodes[1]}}, 198 {Filter{FilterBySubkind: []string{"class"}}, []*scpb.Node{nodes[0]}}, 199 {Filter{FilterBySubkind: []string{"unknown_subkind"}}, []*scpb.Node{nodes[1]}}, 200 201 {Filter{ 202 FilterByKind: []string{"unknown_nodekind"}, 203 IncludeFacts: []string{}, // exclude all facts 204 }, []*scpb.Node{{ 205 Source: nodes[1].Source, 206 Kind: nodes[1].Kind, 207 Subkind: nodes[1].Subkind, 208 Edge: nodes[1].Edge, 209 }}}, 210 {Filter{ 211 FilterByKind: []string{"unknown_nodekind"}, 212 IncludeEdges: []string{}, // exclude all edges 213 }, []*scpb.Node{{ 214 Source: nodes[1].Source, 215 Kind: nodes[1].Kind, 216 Subkind: nodes[1].Subkind, 217 Fact: nodes[1].Fact, 218 }}}, 219 220 {Filter{ 221 FilterByKind: []string{"unknown_nodekind"}, 222 IncludeFacts: []string{"/kythe/text"}, 223 IncludeEdges: []string{}, 224 }, []*scpb.Node{{ 225 Source: nodes[1].Source, 226 Kind: nodes[1].Kind, 227 Subkind: nodes[1].Subkind, 228 Fact: []*scpb.Fact{{ 229 Name: &scpb.Fact_KytheName{scpb.FactName_TEXT}, 230 Value: []byte("text"), 231 }}, 232 }}}, 233 {Filter{ 234 FilterByKind: []string{"unknown_nodekind"}, 235 IncludeFacts: []string{"/unknown/fact/name"}, 236 IncludeEdges: []string{}, 237 }, []*scpb.Node{{ 238 Source: nodes[1].Source, 239 Kind: nodes[1].Kind, 240 Subkind: nodes[1].Subkind, 241 Fact: []*scpb.Fact{{ 242 Name: &scpb.Fact_GenericName{"/unknown/fact/name"}, 243 Value: []byte("blah"), 244 }}, 245 }}}, 246 247 {Filter{ 248 FilterByKind: []string{"unknown_nodekind"}, 249 IncludeFacts: []string{}, 250 IncludeEdges: []string{"/kythe/edge/typed"}, 251 }, []*scpb.Node{{ 252 Source: nodes[1].Source, 253 Kind: nodes[1].Kind, 254 Subkind: nodes[1].Subkind, 255 Edge: []*scpb.Edge{{ 256 Kind: &scpb.Edge_KytheKind{scpb.EdgeKind_TYPED}, 257 Target: &spb.VName{Signature: "node1"}, 258 }}, 259 }}}, 260 {Filter{ 261 FilterByKind: []string{"unknown_nodekind"}, 262 IncludeFacts: []string{}, 263 IncludeEdges: []string{"/unknown/edge/kind"}, 264 }, []*scpb.Node{{ 265 Source: nodes[1].Source, 266 Kind: nodes[1].Kind, 267 Subkind: nodes[1].Subkind, 268 Edge: []*scpb.Edge{{ 269 Kind: &scpb.Edge_GenericKind{"/unknown/edge/kind"}, 270 Target: &spb.VName{Signature: "node2"}, 271 }}, 272 }}}, 273 } 274 275 for _, test := range tests { 276 p, s, coll := ptest.CreateList(nodes) 277 filtered := beam.ParDo(s, &test.filter, coll) 278 debug.Print(s, filtered) 279 passert.Equals(s, filtered, beam.CreateList(s, test.expected)) 280 281 if err := ptest.Run(p); err != nil { 282 t.Fatalf("Pipeline error: %+v", err) 283 } 284 } 285 }