blob: b6b57cd81d6a738c833cc1c1c4e1b7e7bd9aec41 [file] [log] [blame]
// Copyright 2016 Google Inc. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package zoekt
import (
"bytes"
"flag"
"fmt"
"io/fs"
"os"
"path"
"reflect"
"testing"
)
var update = flag.Bool("update", false, "update the golden files of this test")
func TestReadWrite(t *testing.T) {
b, err := NewIndexBuilder(nil)
if err != nil {
t.Fatalf("NewIndexBuilder: %v", err)
}
if err := b.AddFile("filename", []byte("abcde")); err != nil {
t.Fatalf("AddFile: %v", err)
}
var buf bytes.Buffer
b.Write(&buf)
f := &memSeeker{buf.Bytes()}
r := reader{r: f}
var toc indexTOC
err = r.readTOC(&toc)
if err != nil {
t.Errorf("got read error %v", err)
}
if toc.fileContents.data.sz != 5 {
t.Errorf("got contents size %d, want 5", toc.fileContents.data.sz)
}
data, err := r.readIndexData(&toc)
if err != nil {
t.Fatalf("readIndexData: %v", err)
}
if got := data.fileName(0); string(got) != "filename" {
t.Errorf("got filename %q, want %q", got, "filename")
}
if len(data.ngrams) != 3 {
t.Fatalf("got ngrams %v, want 3 ngrams", data.ngrams)
}
if _, ok := data.ngrams[stringToNGram("bcq")]; ok {
t.Errorf("found ngram bcd in %v", data.ngrams)
}
}
func TestReadWriteNames(t *testing.T) {
b, err := NewIndexBuilder(nil)
if err != nil {
t.Fatalf("NewIndexBuilder: %v", err)
}
if err := b.AddFile("abCd", []byte("")); err != nil {
t.Fatalf("AddFile: %v", err)
}
var buf bytes.Buffer
b.Write(&buf)
f := &memSeeker{buf.Bytes()}
r := reader{r: f}
var toc indexTOC
if err := r.readTOC(&toc); err != nil {
t.Errorf("got read error %v", err)
}
if toc.fileNames.data.sz != 4 {
t.Errorf("got contents size %d, want 4", toc.fileNames.data.sz)
}
data, err := r.readIndexData(&toc)
if err != nil {
t.Fatalf("readIndexData: %v", err)
}
if !reflect.DeepEqual([]uint32{0, 4}, data.fileNameIndex) {
t.Errorf("got index %v, want {0,4}", data.fileNameIndex)
}
if got := data.fileNameNgrams[stringToNGram("bCd")]; !reflect.DeepEqual(got, []uint32{1}) {
t.Errorf("got trigram bcd at bits %v, want sz 2", data.fileNameNgrams)
}
}
func TestBackwardsCompat(t *testing.T) {
if *update {
b, err := NewIndexBuilder(nil)
if err != nil {
t.Fatalf("NewIndexBuilder: %v", err)
}
if err := b.AddFile("filename", []byte("abcde")); err != nil {
t.Fatalf("AddFile: %v", err)
}
var buf bytes.Buffer
b.Write(&buf)
outname := fmt.Sprintf("testdata/backcompat/new_v%d.%05d.zoekt", IndexFormatVersion, 0)
t.Log("writing new file", outname)
err = os.WriteFile(outname, buf.Bytes(), 0644)
if err != nil {
t.Fatalf("Creating output file: %v", err)
}
}
compatibleFiles, err := fs.Glob(os.DirFS("."), "testdata/backcompat/*.zoekt")
if err != nil {
t.Fatalf("fs.Glob: %v", err)
}
for _, fname := range compatibleFiles {
t.Run(path.Base(fname),
func(t *testing.T) {
f, err := os.Open(fname)
if err != nil {
t.Fatal("os.Open", err)
}
idx, err := NewIndexFile(f)
if err != nil {
t.Fatal("NewIndexFile", err)
}
r := reader{r: idx}
var toc indexTOC
err = r.readTOC(&toc)
if err != nil {
t.Errorf("got read error %v", err)
}
if toc.fileContents.data.sz != 5 {
t.Errorf("got contents size %d, want 5", toc.fileContents.data.sz)
}
data, err := r.readIndexData(&toc)
if err != nil {
t.Fatalf("readIndexData: %v", err)
}
if got := data.fileName(0); string(got) != "filename" {
t.Errorf("got filename %q, want %q", got, "filename")
}
if len(data.ngrams) != 3 {
t.Fatalf("got ngrams %v, want 3 ngrams", data.ngrams)
}
if _, ok := data.ngrams[stringToNGram("bcq")]; ok {
t.Errorf("found ngram bcd in %v", data.ngrams)
}
},
)
}
}