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 }