kythe.io@v0.0.68-0.20240422202219-7225dbc01741/kythe/go/serving/xrefs/columnar/columnar_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 columnar
    18  
    19  import (
    20  	"fmt"
    21  	"testing"
    22  
    23  	"kythe.io/kythe/go/util/compare"
    24  	"kythe.io/kythe/go/util/keys"
    25  
    26  	cpb "kythe.io/kythe/proto/common_go_proto"
    27  	scpb "kythe.io/kythe/proto/schema_go_proto"
    28  	srvpb "kythe.io/kythe/proto/serving_go_proto"
    29  	spb "kythe.io/kythe/proto/storage_go_proto"
    30  	xspb "kythe.io/kythe/proto/xref_serving_go_proto"
    31  )
    32  
    33  func TestDecorationsEncodingRoundtrip(t *testing.T) {
    34  	file := &spb.VName{Corpus: "corpus", Root: "root", Path: "path"}
    35  	tests := []*xspb.FileDecorations{{
    36  		File: file,
    37  		Entry: &xspb.FileDecorations_Index_{&xspb.FileDecorations_Index{
    38  			TextEncoding: "some_encoding",
    39  		}},
    40  	}, {
    41  		File: file,
    42  		Entry: &xspb.FileDecorations_Text_{&xspb.FileDecorations_Text{
    43  			Text: []byte("some file text\n"),
    44  		}},
    45  	}, {
    46  		File: file,
    47  		Entry: &xspb.FileDecorations_Target_{&xspb.FileDecorations_Target{
    48  			StartOffset: 64,
    49  			EndOffset:   128,
    50  			Kind:        &xspb.FileDecorations_Target_GenericKind{"generic"},
    51  			Target:      &spb.VName{Corpus: "c", Root: "r", Signature: "target"},
    52  		}},
    53  	}, {
    54  		File: file,
    55  		Entry: &xspb.FileDecorations_Target_{&xspb.FileDecorations_Target{
    56  			StartOffset: 64,
    57  			EndOffset:   128,
    58  			Kind:        &xspb.FileDecorations_Target_KytheKind{scpb.EdgeKind_CHILD_OF},
    59  			Target:      &spb.VName{Signature: "target"},
    60  		}},
    61  	}, {
    62  		File: file,
    63  		Entry: &xspb.FileDecorations_TargetOverride_{&xspb.FileDecorations_TargetOverride{
    64  			Kind:       srvpb.FileDecorations_Override_EXTENDS,
    65  			Overridden: &spb.VName{Signature: "overridden"},
    66  			Overriding: &spb.VName{Signature: "overriding"},
    67  		}},
    68  	}, {
    69  		File: file,
    70  		Entry: &xspb.FileDecorations_TargetNode_{&xspb.FileDecorations_TargetNode{
    71  			Node: &scpb.Node{
    72  				Source: &spb.VName{Signature: "nodeSignature"},
    73  			},
    74  		}},
    75  	}, {
    76  		File: file,
    77  		Entry: &xspb.FileDecorations_TargetDefinition_{&xspb.FileDecorations_TargetDefinition{
    78  			Target:     &spb.VName{Signature: "target"},
    79  			Definition: &spb.VName{Signature: "def"},
    80  		}},
    81  	}, {
    82  		File: file,
    83  		Entry: &xspb.FileDecorations_DefinitionLocation_{&xspb.FileDecorations_DefinitionLocation{
    84  			Location: &srvpb.ExpandedAnchor{
    85  				Ticket: "kythe://corpus#someSignature",
    86  				Span: &cpb.Span{
    87  					Start: &cpb.Point{ByteOffset: 32},
    88  					End:   &cpb.Point{ByteOffset: 256},
    89  				},
    90  				Text: "some anchor text",
    91  			},
    92  		}},
    93  	}, {
    94  		File: file,
    95  		Entry: &xspb.FileDecorations_Override_{&xspb.FileDecorations_Override{
    96  			Override: &spb.VName{Signature: "target"},
    97  			MarkedSource: &cpb.MarkedSource{
    98  				Kind:    cpb.MarkedSource_IDENTIFIER,
    99  				PreText: "ident",
   100  			},
   101  		}},
   102  	}, {
   103  		File: file,
   104  		Entry: &xspb.FileDecorations_Diagnostic_{&xspb.FileDecorations_Diagnostic{
   105  			Diagnostic: &cpb.Diagnostic{
   106  				Message: "diagnostic message",
   107  			},
   108  		}},
   109  	}, {
   110  		File: file,
   111  		Entry: &xspb.FileDecorations_Diagnostic_{&xspb.FileDecorations_Diagnostic{
   112  			Diagnostic: &cpb.Diagnostic{
   113  				Span: &cpb.Span{
   114  					Start: &cpb.Point{ByteOffset: 32},
   115  					End:   &cpb.Point{ByteOffset: 256},
   116  				},
   117  				Message: "span diagnostic message",
   118  			},
   119  		}},
   120  	}}
   121  
   122  	for _, test := range tests {
   123  		t.Run(fmt.Sprintf("%T", test.Entry), func(t *testing.T) {
   124  			kv, err := EncodeDecorationsEntry(nil, test)
   125  			if err != nil {
   126  				t.Errorf("Error encoding %T: %v", test.Entry, err)
   127  				return
   128  			}
   129  			var file spb.VName
   130  			key, err := keys.Parse(string(kv.Key), &file)
   131  			if err != nil {
   132  				t.Errorf("Error decoding file for %T: %v", test.Entry, err)
   133  				return
   134  			}
   135  			found, err := DecodeDecorationsEntry(&file, string(key), kv.Value)
   136  			if err != nil {
   137  				t.Errorf("Error decoding %T: %v", test.Entry, err)
   138  			} else if diff := compare.ProtoDiff(test, found); diff != "" {
   139  				t.Errorf("%T roundtrip differences: (- expected; + found)\n%s", test.Entry, diff)
   140  			}
   141  		})
   142  	}
   143  }
   144  
   145  func TestCrossReferencesEncodingRoundtrip(t *testing.T) {
   146  	src := &spb.VName{Corpus: "corpus", Root: "root", Path: "path", Signature: "sig"}
   147  	tests := []*xspb.CrossReferences{{
   148  		Source: src,
   149  		Entry: &xspb.CrossReferences_Index_{&xspb.CrossReferences_Index{
   150  			Node:         &scpb.Node{},
   151  			MarkedSource: &cpb.MarkedSource{Kind: cpb.MarkedSource_IDENTIFIER},
   152  			MergeWith:    []*spb.VName{{Signature: "anything"}},
   153  		}},
   154  	}, {
   155  		Source: src,
   156  		Entry: &xspb.CrossReferences_Reference_{&xspb.CrossReferences_Reference{
   157  			Kind: &xspb.CrossReferences_Reference_KytheKind{scpb.EdgeKind_REF},
   158  			Location: &srvpb.ExpandedAnchor{
   159  				Ticket: "kythe:#reference",
   160  				Text:   "ref",
   161  				Span: &cpb.Span{
   162  					Start: &cpb.Point{ByteOffset: 16},
   163  					End:   &cpb.Point{ByteOffset: 128},
   164  				},
   165  			},
   166  		}},
   167  	}, {
   168  		Source: src,
   169  		Entry: &xspb.CrossReferences_Relation_{&xspb.CrossReferences_Relation{
   170  			Node:    &spb.VName{Signature: "relatedNode"},
   171  			Kind:    &xspb.CrossReferences_Relation_KytheKind{scpb.EdgeKind_EXTENDS},
   172  			Ordinal: 4,
   173  		}},
   174  	}, {
   175  		Source: src,
   176  		Entry: &xspb.CrossReferences_Relation_{&xspb.CrossReferences_Relation{
   177  			Node:    &spb.VName{Signature: "relatedNode"},
   178  			Kind:    &xspb.CrossReferences_Relation_KytheKind{scpb.EdgeKind_EXTENDS},
   179  			Ordinal: 2,
   180  			Reverse: true,
   181  		}},
   182  	}, {
   183  		Source: src,
   184  		Entry: &xspb.CrossReferences_Caller_{&xspb.CrossReferences_Caller{
   185  			Caller: &spb.VName{Signature: "caller"},
   186  		}},
   187  	}, {
   188  		Source: src,
   189  		Entry: &xspb.CrossReferences_Callsite_{&xspb.CrossReferences_Callsite{
   190  			Caller: &spb.VName{Signature: "caller"},
   191  			Location: &srvpb.ExpandedAnchor{
   192  				Ticket: "kythe:#callsite",
   193  				Text:   "callsite",
   194  				Span: &cpb.Span{
   195  					Start: &cpb.Point{ByteOffset: 32},
   196  					End:   &cpb.Point{ByteOffset: 256},
   197  				},
   198  			},
   199  		}},
   200  	}, {
   201  		Source: src,
   202  		Entry: &xspb.CrossReferences_Callsite_{&xspb.CrossReferences_Callsite{
   203  			Caller: &spb.VName{Signature: "caller"},
   204  			Kind:   xspb.CrossReferences_Callsite_OVERRIDE,
   205  			Location: &srvpb.ExpandedAnchor{
   206  				Ticket: "kythe:#callsite2",
   207  				Span: &cpb.Span{
   208  					Start: &cpb.Point{ByteOffset: 32},
   209  					End:   &cpb.Point{ByteOffset: 256},
   210  				},
   211  			},
   212  		}},
   213  	}, {
   214  		Source: src,
   215  		Entry: &xspb.CrossReferences_RelatedNode_{&xspb.CrossReferences_RelatedNode{
   216  			Node: &scpb.Node{
   217  				Source: &spb.VName{Signature: "relatedNode"},
   218  			},
   219  		}},
   220  	}, {
   221  		Source: src,
   222  		Entry: &xspb.CrossReferences_NodeDefinition_{&xspb.CrossReferences_NodeDefinition{
   223  			Node: &spb.VName{Signature: "relatedNode"},
   224  			Location: &srvpb.ExpandedAnchor{
   225  				Ticket: "kythe:#relatedNodeDef",
   226  				Span: &cpb.Span{
   227  					Start: &cpb.Point{ByteOffset: 32},
   228  					End:   &cpb.Point{ByteOffset: 256},
   229  				},
   230  			},
   231  		}},
   232  	}}
   233  
   234  	for _, test := range tests {
   235  		t.Run(fmt.Sprintf("%T", test.Entry), func(t *testing.T) {
   236  			kv, err := EncodeCrossReferencesEntry(nil, test)
   237  			if err != nil {
   238  				t.Errorf("Error encoding %T: %v", test.Entry, err)
   239  				return
   240  			}
   241  			var src spb.VName
   242  			key, err := keys.Parse(string(kv.Key), &src)
   243  			if err != nil {
   244  				t.Errorf("Error decoding file for %T: %v", test.Entry, err)
   245  				return
   246  			}
   247  			found, err := DecodeCrossReferencesEntry(&src, string(key), kv.Value)
   248  			if err != nil {
   249  				t.Errorf("Error decoding %T: %v", test.Entry, err)
   250  			} else if diff := compare.ProtoDiff(test, found); diff != "" {
   251  				t.Errorf("%T roundtrip differences: (- expected; + found)\n%s", test.Entry, diff)
   252  			}
   253  		})
   254  	}
   255  }