github.com/janelia-flyem/dvid@v1.0.0/datatype/labelvol/push_test.go (about)

     1  package labelvol
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/json"
     6  	"fmt"
     7  	"io"
     8  	"log"
     9  	"testing"
    10  
    11  	"github.com/janelia-flyem/dvid/datastore"
    12  	"github.com/janelia-flyem/dvid/dvid"
    13  	"github.com/janelia-flyem/dvid/server"
    14  	"github.com/janelia-flyem/dvid/storage"
    15  )
    16  
    17  // test ROI has offset (32, 32, 32) and size (64, 64, 64)
    18  var testSpans = []dvid.Span{
    19  	dvid.Span{1, 1, 1, 2}, dvid.Span{1, 2, 1, 2},
    20  	dvid.Span{2, 1, 1, 2}, dvid.Span{2, 2, 1, 2},
    21  }
    22  
    23  func getROIReader() io.Reader {
    24  	jsonBytes, err := json.Marshal(testSpans)
    25  	if err != nil {
    26  		log.Fatalf("Can't encode spans into JSON: %v\n", err)
    27  	}
    28  	return bytes.NewReader(jsonBytes)
    29  }
    30  
    31  func TestFilter(t *testing.T) {
    32  	if err := server.OpenTest(); err != nil {
    33  		t.Fatalf("can't open test server: %v\n", err)
    34  	}
    35  	defer server.CloseTest()
    36  
    37  	// Create testbed volume and data instances
    38  	uuid, _ := initTestRepo()
    39  	var config dvid.Config
    40  
    41  	server.CreateTestInstance(t, uuid, "labelblk", "labels", config)
    42  	d, err := datastore.NewData(uuid, labelvolT, "bodies", config)
    43  	if err != nil {
    44  		t.Fatalf("Unable to create labelvol instance: %s\n", err)
    45  	}
    46  	server.CreateTestSync(t, uuid, "labels", "bodies")
    47  	server.CreateTestSync(t, uuid, "bodies", "labels")
    48  
    49  	// Populate the labels, which should automatically populate the labelvol
    50  	_ = createLabelTestVolume(t, uuid, "labels")
    51  
    52  	if err := datastore.BlockOnUpdating(uuid, "bodies"); err != nil {
    53  		t.Fatalf("Error blocking on sync of labels -> bodies: %v\n", err)
    54  	}
    55  
    56  	// Create a ROI that will be used for filter test.
    57  	server.CreateTestInstance(t, uuid, "roi", "myroi", config)
    58  	roiRequest := fmt.Sprintf("%snode/%s/myroi/roi", server.WebAPIPath, uuid)
    59  	server.TestHTTP(t, "POST", roiRequest, getROIReader())
    60  
    61  	// Create the filter spec
    62  	fs := storage.FilterSpec(fmt.Sprintf("roi:myroi,%s", uuid))
    63  	var filter storage.Filter
    64  	filterer, ok := d.(storage.Filterer)
    65  	if !ok {
    66  		t.Fatalf("labelvol instance does not implement storage.Filterer\n")
    67  	}
    68  	filter, err = filterer.NewFilter(fs)
    69  	if err != nil {
    70  		t.Fatalf("Can't create filter from spec %q: %v\n", fs, err)
    71  	}
    72  	if filter == nil {
    73  		t.Fatalf("No filter could be created from spec %q\n", fs)
    74  	}
    75  
    76  	// Test the filter.
    77  	tkv := storage.TKeyValue{K: NewTKey(23, dvid.ChunkPoint3d{0, 0, 0}.ToIZYXString())}
    78  	skip, err := filter.Check(&tkv)
    79  	if !skip {
    80  		t.Errorf("Expected filter check 1 to skip, instead filter.Check() returned not skip")
    81  	}
    82  	tkv = storage.TKeyValue{K: NewTKey(23, dvid.ChunkPoint3d{1, 1, 1}.ToIZYXString())}
    83  	skip, err = filter.Check(&tkv)
    84  	if skip {
    85  		t.Errorf("Expected filter check 2 to not skip!")
    86  	}
    87  	tkv = storage.TKeyValue{K: NewTKey(23, dvid.ChunkPoint3d{2, 1, 2}.ToIZYXString())}
    88  	skip, err = filter.Check(&tkv)
    89  	if skip {
    90  		t.Errorf("Expected filter check 2 to not skip!")
    91  	}
    92  	tkv = storage.TKeyValue{K: NewTKey(23, dvid.ChunkPoint3d{3, 1, 1}.ToIZYXString())}
    93  	skip, err = filter.Check(&tkv)
    94  	if !skip {
    95  		t.Errorf("Expected filter check 3 to skip!")
    96  	}
    97  }