func Index(t *testing.T, initIdx func() *index.Index) { id := NewIndexDeps(initIdx()) id.Fataler = t pn := id.NewPermanode() t.Logf("uploaded permanode %q", pn) br1 := id.SetAttribute(pn, "tag", "foo1") br1Time := id.lastTime() t.Logf("set attribute %q", br1) br2 := id.SetAttribute(pn, "tag", "foo2") br2Time := id.lastTime() t.Logf("set attribute %q", br2) rootClaim := id.SetAttribute(pn, "camliRoot", "rootval") rootClaimTime := id.lastTime() t.Logf("set attribute %q", rootClaim) pnChild := id.NewPermanode() br3 := id.SetAttribute(pnChild, "tag", "bar") br3Time := id.lastTime() t.Logf("set attribute %q", br3) memberRef := id.AddAttribute(pn, "camliMember", pnChild.String()) t.Logf("add-attribute claim %q points to member permanode %q", memberRef, pnChild) memberRefTime := id.lastTime() // TODO(bradfitz): add EXIF tests here, once that stuff is ready. if false { camliRootPath, err := osutil.GoPackagePath("camlistore.org") if err != nil { t.Fatal("Package camlistore.org no found in $GOPATH or $GOPATH not defined") } for i := 1; i <= 8; i++ { fileBase := fmt.Sprintf("f%d-exif.jpg", i) fileName := filepath.Join(camliRootPath, "pkg", "images", "testdata", fileBase) contents, err := ioutil.ReadFile(fileName) if err != nil { t.Fatal(err) } id.UploadFile(fileBase, string(contents)) } } // Upload a basic image. var jpegFileRef *blobref.BlobRef { camliRootPath, err := osutil.GoPackagePath("camlistore.org") if err != nil { t.Fatal("Package camlistore.org no found in $GOPATH or $GOPATH not defined") } fileName := filepath.Join(camliRootPath, "pkg", "index", "indextest", "testdata", "dude.jpg") contents, err := ioutil.ReadFile(fileName) if err != nil { t.Fatal(err) } jpegFileRef, _ = id.UploadFile("dude.jpg", string(contents)) } lastPermanodeMutation := id.lastTime() id.dumpIndex(t) key := "signerkeyid:sha1-ad87ca5c78bd0ce1195c46f7c98e6025abbaf007" if g, e := id.Get(key), "2931A67C26F5ABDA"; g != e { t.Fatalf("%q = %q, want %q", key, g, e) } key = "imagesize|" + jpegFileRef.String() if g, e := id.Get(key), "50|100"; g != e { t.Errorf("JPEG dude.jpg key %q = %q; want %q", key, g, e) } key = "have:" + pn.String() pnSizeStr := id.Get(key) if pnSizeStr == "" { t.Fatalf("missing key %q", key) } key = "meta:" + pn.String() if g, e := id.Get(key), pnSizeStr+"|application/json; camliType=permanode"; g != e { t.Errorf("key %q = %q, want %q", key, g, e) } key = "recpn|2931A67C26F5ABDA|rt7988-88-71T98:67:62.999876543Z|" + br1.String() if g, e := id.Get(key), pn.String(); g != e { t.Fatalf("%q = %q, want %q (permanode)", key, g, e) } key = "recpn|2931A67C26F5ABDA|rt7988-88-71T98:67:61.999876543Z|" + br2.String() if g, e := id.Get(key), pn.String(); g != e { t.Fatalf("%q = %q, want %q (permanode)", key, g, e) } key = fmt.Sprintf("edgeback|%s|%s|%s", pnChild, pn, memberRef) if g, e := id.Get(key), "permanode|"; g != e { t.Fatalf("edgeback row %q = %q, want %q", key, g, e) } // PermanodeOfSignerAttrValue { gotPN, err := id.Index.PermanodeOfSignerAttrValue(id.SignerBlobRef, "camliRoot", "rootval") if err != nil { t.Fatalf("id.Index.PermanodeOfSignerAttrValue = %v", err) } if gotPN.String() != pn.String() { t.Errorf("id.Index.PermanodeOfSignerAttrValue = %q, want %q", gotPN, pn) } _, err = id.Index.PermanodeOfSignerAttrValue(id.SignerBlobRef, "camliRoot", "MISSING") if err == nil { t.Errorf("expected an error from PermanodeOfSignerAttrValue on missing value") } } // SearchPermanodesWithAttr - match attr type "tag" and value "foo1" { ch := make(chan *blobref.BlobRef, 10) req := &search.PermanodeByAttrRequest{ Signer: id.SignerBlobRef, Attribute: "tag", Query: "foo1"} err := id.Index.SearchPermanodesWithAttr(ch, req) if err != nil { t.Fatalf("SearchPermanodesWithAttr = %v", err) } var got []*blobref.BlobRef for r := range ch { got = append(got, r) } want := []*blobref.BlobRef{pn} if len(got) < 1 || got[0].String() != want[0].String() { t.Errorf("id.Index.SearchPermanodesWithAttr gives %q, want %q", got, want) } } // SearchPermanodesWithAttr - match all with attr type "tag" { ch := make(chan *blobref.BlobRef, 10) req := &search.PermanodeByAttrRequest{ Signer: id.SignerBlobRef, Attribute: "tag"} err := id.Index.SearchPermanodesWithAttr(ch, req) if err != nil { t.Fatalf("SearchPermanodesWithAttr = %v", err) } var got []*blobref.BlobRef for r := range ch { got = append(got, r) } want := []*blobref.BlobRef{pn, pnChild} if len(got) != len(want) { t.Errorf("SearchPermanodesWithAttr results differ.\n got: %q\nwant: %q", got, want) } for _, w := range want { found := false for _, g := range got { if g.String() == w.String() { found = true break } } if !found { t.Errorf("SearchPermanodesWithAttr: %v was not found.\n", w) } } } // GetRecentPermanodes { ch := make(chan *search.Result, 10) // expect 2 results, but maybe more if buggy. err := id.Index.GetRecentPermanodes(ch, id.SignerBlobRef, 50) if err != nil { t.Fatalf("GetRecentPermanodes = %v", err) } got := []*search.Result{} for r := range ch { got = append(got, r) } want := []*search.Result{ &search.Result{ BlobRef: pn, Signer: id.SignerBlobRef, LastModTime: lastPermanodeMutation.Unix(), }, &search.Result{ BlobRef: pnChild, Signer: id.SignerBlobRef, LastModTime: br3Time.Unix(), }, } if len(got) != len(want) { t.Errorf("GetRecentPermanode results differ.\n got: %v\nwant: %v", search.Results(got), search.Results(want)) } for _, w := range want { found := false for _, g := range got { if reflect.DeepEqual(g, w) { found = true break } } if !found { t.Errorf("GetRecentPermanode: %v was not found.\n got: %v\nwant: %v", w, search.Results(got), search.Results(want)) } } } // GetBlobMimeType { mime, size, err := id.Index.GetBlobMimeType(pn) if err != nil { t.Errorf("GetBlobMimeType(%q) = %v", pn, err) } else { if e := "application/json; camliType=permanode"; mime != e { t.Errorf("GetBlobMimeType(%q) mime = %q, want %q", pn, mime, e) } if size == 0 { t.Errorf("GetBlobMimeType(%q) size is zero", pn) } } _, _, err = id.Index.GetBlobMimeType(blobref.Parse("abc-123")) if err != os.ErrNotExist { t.Errorf("GetBlobMimeType(dummy blobref) = %v; want os.ErrNotExist", err) } } // GetOwnerClaims { claims, err := id.Index.GetOwnerClaims(pn, id.SignerBlobRef) if err != nil { t.Errorf("GetOwnerClaims = %v", err) } else { want := search.ClaimList([]*search.Claim{ &search.Claim{ BlobRef: br1, Permanode: pn, Signer: id.SignerBlobRef, Date: br1Time.UTC(), Type: "set-attribute", Attr: "tag", Value: "foo1", }, &search.Claim{ BlobRef: br2, Permanode: pn, Signer: id.SignerBlobRef, Date: br2Time.UTC(), Type: "set-attribute", Attr: "tag", Value: "foo2", }, &search.Claim{ BlobRef: rootClaim, Permanode: pn, Signer: id.SignerBlobRef, Date: rootClaimTime.UTC(), Type: "set-attribute", Attr: "camliRoot", Value: "rootval", }, &search.Claim{ BlobRef: memberRef, Permanode: pn, Signer: id.SignerBlobRef, Date: memberRefTime.UTC(), Type: "add-attribute", Attr: "camliMember", Value: pnChild.String(), }, }) if !reflect.DeepEqual(claims, want) { t.Errorf("GetOwnerClaims results differ.\n got: %v\nwant: %v", claims, want) } } } }
func Index(t *testing.T, initIdx func() *index.Index) { id := NewIndexDeps(initIdx()) pn := id.NewPermanode() t.Logf("uploaded permanode %q", pn) br1 := id.SetAttribute(pn, "foo", "foo1") br1Time := id.lastTime() t.Logf("set attribute %q", br1) br2 := id.SetAttribute(pn, "foo", "foo2") br2Time := id.lastTime() t.Logf("set attribute %q", br2) rootClaim := id.SetAttribute(pn, "camliRoot", "rootval") rootClaimTime := id.lastTime() t.Logf("set attribute %q", rootClaim) id.dumpIndex(t) key := "signerkeyid:sha1-ad87ca5c78bd0ce1195c46f7c98e6025abbaf007" if g, e := id.Get(key), "2931A67C26F5ABDA"; g != e { t.Fatalf("%q = %q, want %q", key, g, e) } key = "have:" + pn.String() pnSizeStr := id.Get(key) if pnSizeStr == "" { t.Fatalf("missing key %q", key) } key = "meta:" + pn.String() if g, e := id.Get(key), pnSizeStr+"|application/json; camliType=permanode"; g != e { t.Errorf("key %q = %q, want %q", key, g, e) } key = "recpn|2931A67C26F5ABDA|rt7988-88-71T98:67:62.999876543Z|" + br1.String() if g, e := id.Get(key), pn.String(); g != e { t.Fatalf("%q = %q, want %q (permanode)", key, g, e) } key = "recpn|2931A67C26F5ABDA|rt7988-88-71T98:67:61.999876543Z|" + br2.String() if g, e := id.Get(key), pn.String(); g != e { t.Fatalf("%q = %q, want %q (permanode)", key, g, e) } // PermanodeOfSignerAttrValue { gotPN, err := id.Index.PermanodeOfSignerAttrValue(id.SignerBlobRef, "camliRoot", "rootval") if err != nil { t.Fatalf("id.Index.PermanodeOfSignerAttrValue = %v", err) } if gotPN.String() != pn.String() { t.Errorf("id.Index.PermanodeOfSignerAttrValue = %q, want %q", gotPN, pn) } _, err = id.Index.PermanodeOfSignerAttrValue(id.SignerBlobRef, "camliRoot", "MISSING") if err == nil { t.Errorf("expected an error from PermanodeOfSignerAttrValue on missing value") } } // GetRecentPermanodes { ch := make(chan *search.Result, 10) // only expect 1 result, but 3 if buggy. err := id.Index.GetRecentPermanodes(ch, id.SignerBlobRef, 50) if err != nil { t.Fatalf("GetRecentPermanodes = %v", err) } got := []*search.Result{} for r := range ch { got = append(got, r) } want := []*search.Result{ &search.Result{ BlobRef: pn, Signer: id.SignerBlobRef, LastModTime: 1322443959, }, } if !reflect.DeepEqual(got, want) { t.Errorf("GetRecentPermanode results differ.\n got: %v\nwant: %v", search.Results(got), search.Results(want)) } } // GetBlobMimeType { mime, size, err := id.Index.GetBlobMimeType(pn) if err != nil { t.Errorf("GetBlobMimeType(%q) = %v", pn, err) } else { if e := "application/json; camliType=permanode"; mime != e { t.Errorf("GetBlobMimeType(%q) mime = %q, want %q", pn, mime, e) } if size == 0 { t.Errorf("GetBlobMimeType(%q) size is zero", pn) } } _, _, err = id.Index.GetBlobMimeType(blobref.Parse("abc-123")) if err != os.ErrNotExist { t.Errorf("GetBlobMimeType(dummy blobref) = %v; want os.ErrNotExist", err) } } // GetOwnerClaims { claims, err := id.Index.GetOwnerClaims(pn, id.SignerBlobRef) if err != nil { t.Errorf("GetOwnerClaims = %v", err) } else { want := search.ClaimList([]*search.Claim{ &search.Claim{ BlobRef: br1, Permanode: pn, Signer: id.SignerBlobRef, Date: br1Time.UTC(), Type: "set-attribute", Attr: "foo", Value: "foo1", }, &search.Claim{ BlobRef: br2, Permanode: pn, Signer: id.SignerBlobRef, Date: br2Time.UTC(), Type: "set-attribute", Attr: "foo", Value: "foo2", }, &search.Claim{ BlobRef: rootClaim, Permanode: pn, Signer: id.SignerBlobRef, Date: rootClaimTime.UTC(), Type: "set-attribute", Attr: "camliRoot", Value: "rootval", }, }) if !reflect.DeepEqual(claims, want) { t.Errorf("GetOwnerClaims results differ.\n got: %v\nwant: %v", claims, want) } } } }