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  }