本文整理匯總了Golang中camlistore/org/pkg/blob.ParseOrZero函數的典型用法代碼示例。如果您正苦於以下問題:Golang ParseOrZero函數的具體用法?Golang ParseOrZero怎麽用?Golang ParseOrZero使用的例子?那麽, 這裏精選的函數代碼示例或許可以為您提供幫助。
在下文中一共展示了ParseOrZero函數的15個代碼示例,這些例子默認根據受歡迎程度排序。您可以為喜歡或者感覺有用的代碼點讚,您的評價將有助於係統推薦出更棒的Golang代碼示例。
示例1: fromHTTP
// fromHTTP panics with an httputil value on failure
func (r *WithAttrRequest) fromHTTP(req *http.Request) {
r.Signer = blob.ParseOrZero(req.FormValue("signer"))
r.Value = req.FormValue("value")
fuzzy := req.FormValue("fuzzy") // exact match if empty
fuzzyMatch := false
if fuzzy != "" {
lowered := strings.ToLower(fuzzy)
if lowered == "true" || lowered == "t" {
fuzzyMatch = true
}
}
r.Attr = req.FormValue("attr") // all attributes if empty
if r.Attr == "" { // and force fuzzy in that case.
fuzzyMatch = true
}
r.Fuzzy = fuzzyMatch
r.ThumbnailSize = thumbnailSize(req)
max := req.FormValue("max")
if max != "" {
maxR, err := strconv.Atoi(max)
if err != nil {
panic(httputil.InvalidParameterError("max"))
}
r.N = maxR
}
r.N = r.n()
}
示例2: EnumerateBlobs
func (sto *appengineStorage) EnumerateBlobs(dest chan<- blob.SizedRef, after string, limit int, wait time.Duration) error {
defer close(dest)
ctx := sto.ctx
if ctx == nil {
loan := ctxPool.Get()
defer loan.Return()
ctx = loan
}
prefix := sto.namespace + "|"
keyBegin := datastore.NewKey(ctx, memKind, prefix+after, 0, nil)
keyEnd := datastore.NewKey(ctx, memKind, sto.namespace+"~", 0, nil)
q := datastore.NewQuery(memKind).Limit(int(limit)).Filter("__key__>", keyBegin).Filter("__key__<", keyEnd)
it := q.Run(ctx)
var row memEnt
for {
key, err := it.Next(&row)
if err == datastore.Done {
break
}
if err != nil {
return err
}
dest <- blob.SizedRef{blob.ParseOrZero(key.StringID()[len(prefix):]), row.Size}
}
return nil
}
示例3: EnumerateBlobs
func (sto *appengineStorage) EnumerateBlobs(ctx context.Context, dest chan<- blob.SizedRef, after string, limit int) error {
defer close(dest)
loan := ctxPool.Get()
defer loan.Return()
actx := loan
prefix := sto.namespace + "|"
keyBegin := datastore.NewKey(actx, memKind, prefix+after, 0, nil)
keyEnd := datastore.NewKey(actx, memKind, sto.namespace+"~", 0, nil)
q := datastore.NewQuery(memKind).Limit(int(limit)).Filter("__key__>", keyBegin).Filter("__key__<", keyEnd)
it := q.Run(actx)
var row memEnt
for {
key, err := it.Next(&row)
if err == datastore.Done {
break
}
if err != nil {
return err
}
select {
case dest <- blob.SizedRef{blob.ParseOrZero(key.StringID()[len(prefix):]), uint32(row.Size)}:
case <-ctx.Done():
return ctx.Err()
}
}
return nil
}
示例4: blobFromURLPath
func blobFromURLPath(path string) blob.Ref {
matches := kGetPattern.FindStringSubmatch(path)
if len(matches) != 3 {
return blob.Ref{}
}
return blob.ParseOrZero(strings.TrimPrefix(matches[0], "/camli/"))
}
示例5: NewFlatStatCache
func NewFlatStatCache(gen string) *FlatStatCache {
filename := filepath.Join(osutil.CacheDir(), "camput.statcache."+escapeGen(gen))
fc := &FlatStatCache{
filename: filename,
m: make(map[string]fileInfoPutRes),
}
f, err := os.Open(filename)
if os.IsNotExist(err) {
return fc
}
if err != nil {
log.Fatalf("opening camput stat cache: %v", filename, err)
}
defer f.Close()
br := bufio.NewReader(f)
for {
ln, err := br.ReadString('\n')
if err == io.EOF {
break
}
if err != nil {
log.Printf("Warning: (ignoring) reading stat cache: %v", err)
break
}
ln = strings.TrimSpace(ln)
f := strings.Split(ln, "\t")
if len(f) < 3 {
continue
}
filename, fp, putres := f[0], statFingerprint(f[1]), f[2]
f = strings.Split(putres, "/")
if len(f) != 2 {
continue
}
blobrefStr := f[0]
blobSize, err := strconv.ParseInt(f[1], 10, 64)
if err != nil {
continue
}
fc.m[filename] = fileInfoPutRes{
Fingerprint: fp,
Result: client.PutResult{
BlobRef: blob.ParseOrZero(blobrefStr),
Size: blobSize,
Skipped: true, // is this used?
},
}
}
vlog.Printf("Flatcache read %d entries from %s", len(fc.m), filename)
return fc
}
示例6: processEncryptedMetaBlob
// processEncryptedMetaBlob decrypts dat (the data for the br meta blob) and parses
// its meta lines, updating the index.
//
// processEncryptedMetaBlob is not thread-safe.
func (s *storage) processEncryptedMetaBlob(br blob.Ref, dat []byte) error {
mi := &metaBlobInfo{
br: br,
n: len(dat),
}
log.Printf("processing meta blob %v: %d bytes", br, len(dat))
ivSize := s.block.BlockSize()
if len(dat) < ivSize+sha1.Size {
return errors.New("data size is smaller than IV + SHA-1")
}
var (
iv = dat[:ivSize]
wantHash = dat[ivSize : ivSize+sha1.Size]
enc = dat[ivSize+sha1.Size:]
)
plain := bytes.NewBuffer(make([]byte, 0, len(dat)))
io.Copy(plain, cipher.StreamReader{
S: cipher.NewCTR(s.block, iv),
R: bytes.NewReader(enc),
})
s1 := sha1.New()
s1.Write(plain.Bytes())
if !bytes.Equal(wantHash, s1.Sum(nil)) {
return errors.New("hash of encrypted data doesn't match")
}
sc := bufio.NewScanner(plain)
if !sc.Scan() {
return errors.New("No first line")
}
if sc.Text() != "#camlistore/encmeta=1" {
line := sc.Text()
if len(line) > 80 {
line = line[:80]
}
return fmt.Errorf("unsupported first line %q", line)
}
for sc.Scan() {
line := sc.Text()
slash := strings.Index(line, "/")
if slash < 0 {
return errors.New("no slash in metaline")
}
plainBR, meta := line[:slash], line[slash+1:]
log.Printf("Adding meta: %q = %q", plainBR, meta)
mi.plains = append(mi.plains, blob.ParseOrZero(plainBR))
if err := s.index.Set(plainBR, meta); err != nil {
return err
}
}
return sc.Err()
}
示例7: PathsOfSignerTarget
func PathsOfSignerTarget(t *testing.T, initIdx func() *index.Index) {
id := NewIndexDeps(initIdx())
id.Fataler = t
pn := id.NewPermanode()
t.Logf("uploaded permanode %q", pn)
claim1 := id.SetAttribute(pn, "camliPath:somedir", "targ-123")
claim2 := id.SetAttribute(pn, "camliPath:with|pipe", "targ-124")
t.Logf("made path claims %q and %q", claim1, claim2)
id.dumpIndex(t)
type test struct {
blobref string
want int
}
tests := []test{
{"targ-123", 1},
{"targ-124", 1},
{"targ-125", 0},
}
for _, tt := range tests {
signer := id.SignerBlobRef
paths, err := id.Index.PathsOfSignerTarget(signer, blob.ParseOrZero(tt.blobref))
if err != nil {
t.Fatalf("PathsOfSignerTarget(%q): %v", tt.blobref, err)
}
if len(paths) != tt.want {
t.Fatalf("PathsOfSignerTarget(%q) got %d results; want %d",
tt.blobref, len(paths), tt.want)
}
if tt.blobref == "targ-123" {
p := paths[0]
want := fmt.Sprintf(
"Path{Claim: %s, 2011-11-28T01:32:37.000123456Z; Base: %s + Suffix \"somedir\" => Target targ-123}",
claim1, pn)
if g := p.String(); g != want {
t.Errorf("claim wrong.\n got: %s\nwant: %s", g, want)
}
}
}
path, err := id.Index.PathLookup(id.SignerBlobRef, pn, "with|pipe", time.Now())
if err != nil {
t.Fatalf("PathLookup = %v", err)
}
if g, e := path.Target.String(), "targ-124"; g != e {
t.Errorf("PathLookup = %q; want %q", g, e)
}
}
示例8: parent
// parent returns the base path and the blobRef of pr.subject's parent.
// It returns an error if pr.subject or pr.subjectBasePath were not set
// properly (with findSubject), or if the parent was not found.
func (pr *publishRequest) parent() (parentPath string, parentBlobRef blob.Ref, err error) {
if !pr.subject.Valid() {
return "", blob.Ref{}, errors.New("subject not set")
}
if pr.subjectBasePath == "" {
return "", blob.Ref{}, errors.New("subjectBasePath not set")
}
// TODO(mpl): this fails when the parent is the root. fix it.
hops := publishedPath(pr.subjectBasePath).splitHops()
if len(hops) == 0 {
return "", blob.Ref{}, errors.New("No subresource digest in subjectBasePath")
}
subjectDigest := hops[len(hops)-1]
if subjectDigest != pr.subject.DigestPrefix(digestLen) {
return "", blob.Ref{}, errors.New("subject digest not in subjectBasePath")
}
parentPath = strings.TrimSuffix(pr.subjectBasePath, "/"+digestPrefix+subjectDigest)
if len(hops) == 1 {
// the parent is the suffix, not one of the subresource hops
for br, _ := range pr.inSubjectChain {
if br != pr.subject.String() {
parentBlobRef = blob.ParseOrZero(br)
break
}
}
} else {
// nested collection(s)
parentDigest := hops[len(hops)-2]
for br, _ := range pr.inSubjectChain {
bref, ok := blob.Parse(br)
if !ok {
return "", blob.Ref{}, fmt.Errorf("Could not parse %q as blobRef", br)
}
if bref.DigestPrefix(10) == parentDigest {
parentBlobRef = bref
break
}
}
}
if !parentBlobRef.Valid() {
return "", blob.Ref{}, fmt.Errorf("No parent found for %v", pr.subjectBasePath)
}
return parentPath, parentBlobRef, nil
}
示例9: NewFromShareRoot
// NewFromShareRoot uses shareBlobURL to set up and return a client that
// will be used to fetch shared blobs.
func NewFromShareRoot(shareBlobURL string, opts ...ClientOption) (c *Client, target blob.Ref, err error) {
var root string
m := shareURLRx.FindStringSubmatch(shareBlobURL)
if m == nil {
return nil, blob.Ref{}, fmt.Errorf("Unkown share URL base")
}
c = New(m[1])
c.discoOnce.Do(func() { /* nothing */
})
c.prefixOnce.Do(func() { /* nothing */
})
c.prefixv = m[1]
c.isSharePrefix = true
c.authMode = auth.None{}
c.via = make(map[string]string)
root = m[2]
for _, v := range opts {
v.modifyClient(c)
}
c.SetHTTPClient(&http.Client{Transport: c.TransportForConfig(nil)})
req := c.newRequest("GET", shareBlobURL, nil)
res, err := c.doReqGated(req)
if err != nil {
return nil, blob.Ref{}, fmt.Errorf("Error fetching %s: %v", shareBlobURL, err)
}
defer res.Body.Close()
b, err := schema.BlobFromReader(blob.ParseOrZero(root), res.Body)
if err != nil {
return nil, blob.Ref{}, fmt.Errorf("Error parsing JSON from %s: %v", shareBlobURL, err)
}
if b.ShareAuthType() != schema.ShareHaveRef {
return nil, blob.Ref{}, fmt.Errorf("Unknown share authType of %q", b.ShareAuthType())
}
target = b.ShareTarget()
if !target.Valid() {
return nil, blob.Ref{}, fmt.Errorf("No target.")
}
c.via[target.String()] = root
return c, target, nil
}
示例10: pnCamliContent
func (c *Corpus) pnCamliContent(pn blob.Ref) (cc blob.Ref, t time.Time, ok bool) {
// TODO(bradfitz): keep this property cached
pm, ok := c.permanodes[pn]
if !ok {
return
}
for _, cl := range pm.Claims {
if cl.Attr != "camliContent" {
continue
}
// TODO: pass down the 'PermanodeConstraint.At' parameter, and then do: if cl.Date.After(at) { continue }
switch cl.Type {
case string(schema.DelAttributeClaim):
cc = blob.Ref{}
t = time.Time{}
case string(schema.SetAttributeClaim):
cc = blob.ParseOrZero(cl.Value)
t = cl.Date
}
}
return cc, t, cc.Valid()
}
示例11: NewFromShareRoot
// NewFromShareRoot uses shareBlobURL to set up and return a client that
// will be used to fetch shared blobs.
func NewFromShareRoot(shareBlobURL string, opts ...ClientOption) (c *Client, target blob.Ref, err error) {
var root string
m := shareURLRx.FindStringSubmatch(shareBlobURL)
if m == nil {
return nil, blob.Ref{}, fmt.Errorf("Unkown share URL base")
}
c = New(m[1], opts...)
c.discoOnce.Do(noop)
c.prefixOnce.Do(noop)
c.prefixv = m[1]
c.isSharePrefix = true
c.authMode = auth.None{}
c.via = make(map[string]string)
root = m[2]
req := c.newRequest("GET", shareBlobURL, nil)
res, err := c.expect2XX(req)
if err != nil {
return nil, blob.Ref{}, fmt.Errorf("error fetching %s: %v", shareBlobURL, err)
}
defer res.Body.Close()
var buf bytes.Buffer
b, err := schema.BlobFromReader(blob.ParseOrZero(root), io.TeeReader(res.Body, &buf))
if err != nil {
return nil, blob.Ref{}, fmt.Errorf("error parsing JSON from %s: %v , with response: %q", shareBlobURL, err, buf.Bytes())
}
if b.ShareAuthType() != schema.ShareHaveRef {
return nil, blob.Ref{}, fmt.Errorf("unknown share authType of %q", b.ShareAuthType())
}
target = b.ShareTarget()
if !target.Valid() {
return nil, blob.Ref{}, fmt.Errorf("no target.")
}
c.via[target.String()] = root
return c, target, nil
}
示例12: Index
//.........這裏部分代碼省略.........
// GetDirMembers
{
ch := make(chan blob.Ref, 10) // expect 2 results
err := id.Index.GetDirMembers(imagesDirRef, ch, 50)
if err != nil {
t.Fatalf("GetDirMembers = %v", err)
}
got := []blob.Ref{}
for r := range ch {
got = append(got, r)
}
want := []blob.Ref{jpegFileRef, exifFileRef}
if len(got) != len(want) {
t.Errorf("GetDirMembers results differ.\n got: %v\nwant: %v",
got, want)
}
for _, w := range want {
found := false
for _, g := range got {
if w.String() == g.String() {
found = true
break
}
}
if !found {
t.Errorf("GetDirMembers: %v was not found.", w)
}
}
}
// 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(blob.ParseOrZero("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)
}
}
}
}
示例13: populate
// populate hits the blobstore to populate map of child nodes.
func (n *mutDir) populate() error {
n.mu.Lock()
defer n.mu.Unlock()
// Only re-populate if we haven't done so recently.
now := time.Now()
if n.lastPop.Add(populateInterval).After(now) {
return nil
}
n.lastPop = now
res, err := n.fs.client.Describe(&search.DescribeRequest{
BlobRef: n.permanode,
Depth: 3,
})
if err != nil {
log.Println("mutDir.paths:", err)
return nil
}
db := res.Meta[n.permanode.String()]
if db == nil {
return errors.New("dir blobref not described")
}
// Find all child permanodes and stick them in n.children
if n.children == nil {
n.children = make(map[string]mutFileOrDir)
}
currentChildren := map[string]bool{}
for k, v := range db.Permanode.Attr {
const p = "camliPath:"
if !strings.HasPrefix(k, p) || len(v) < 1 {
continue
}
name := k[len(p):]
childRef := v[0]
child := res.Meta[childRef]
if child == nil {
log.Printf("child not described: %v", childRef)
continue
}
if child.Permanode == nil {
log.Printf("invalid child, not a permanode: %v", childRef)
continue
}
if target := child.Permanode.Attr.Get("camliSymlinkTarget"); target != "" {
// This is a symlink.
n.maybeAddChild(name, child.Permanode, &mutFile{
fs: n.fs,
permanode: blob.ParseOrZero(childRef),
parent: n,
name: name,
symLink: true,
target: target,
})
} else if isDir(child.Permanode) {
// This is a directory.
n.maybeAddChild(name, child.Permanode, &mutDir{
fs: n.fs,
permanode: blob.ParseOrZero(childRef),
parent: n,
name: name,
})
} else if contentRef := child.Permanode.Attr.Get("camliContent"); contentRef != "" {
// This is a file.
content := res.Meta[contentRef]
if content == nil {
log.Printf("child content not described: %v", childRef)
continue
}
if content.CamliType != "file" {
log.Printf("child not a file: %v", childRef)
continue
}
if content.File == nil {
log.Printf("camlitype \"file\" child %v has no described File member", childRef)
continue
}
n.maybeAddChild(name, child.Permanode, &mutFile{
fs: n.fs,
permanode: blob.ParseOrZero(childRef),
parent: n,
name: name,
content: blob.ParseOrZero(contentRef),
size: content.File.Size,
})
} else {
// unhandled type...
continue
}
currentChildren[name] = true
}
// Remove unreferenced children
for name, oldchild := range n.children {
if _, ok := currentChildren[name]; !ok {
if oldchild.eligibleToDelete() {
delete(n.children, name)
}
}
//.........這裏部分代碼省略.........
示例14: Index
//.........這裏部分代碼省略.........
got = append(got, r)
}
want := []blob.Ref{jpegFileRef, exifFileRef, mediaFileRef}
if len(got) != len(want) {
t.Errorf("GetDirMembers results differ.\n got: %v\nwant: %v",
got, want)
}
for _, w := range want {
found := false
for _, g := range got {
if w == g {
found = true
break
}
}
if !found {
t.Errorf("GetDirMembers: %v was not found.", w)
}
}
}
// GetBlobMeta
{
meta, err := id.Index.GetBlobMeta(pn)
if err != nil {
t.Errorf("GetBlobMeta(%q) = %v", pn, err)
} else {
if e := "permanode"; meta.CamliType != e {
t.Errorf("GetBlobMeta(%q) mime = %q, want %q", pn, meta.CamliType, e)
}
if meta.Size == 0 {
t.Errorf("GetBlobMeta(%q) size is zero", pn)
}
}
_, err = id.Index.GetBlobMeta(blob.ParseOrZero("abc-123"))
if err != os.ErrNotExist {
t.Errorf("GetBlobMeta(dummy blobref) = %v; want os.ErrNotExist", err)
}
}
// AppendClaims
{
claims, err := id.Index.AppendClaims(nil, pn, id.SignerBlobRef, "")
if err != nil {
t.Errorf("AppendClaims = %v", err)
} else {
want := []camtypes.Claim{
{
BlobRef: br1,
Permanode: pn,
Signer: id.SignerBlobRef,
Date: br1Time.UTC(),
Type: "set-attribute",
Attr: "tag",
Value: "foo1",
},
{
BlobRef: br2,
Permanode: pn,
Signer: id.SignerBlobRef,
Date: br2Time.UTC(),
Type: "set-attribute",
Attr: "tag",
Value: "foo2",
},
{
BlobRef: rootClaim,
Permanode: pn,
Signer: id.SignerBlobRef,
Date: rootClaimTime.UTC(),
Type: "set-attribute",
Attr: "camliRoot",
Value: "rootval",
},
{
BlobRef: memberRef,
Permanode: pn,
Signer: id.SignerBlobRef,
Date: memberRefTime.UTC(),
Type: "add-attribute",
Attr: "camliMember",
Value: pnChild.String(),
},
{
BlobRef: br4,
Permanode: pn,
Signer: id.SignerBlobRef,
Date: br4Time.UTC(),
Type: "del-attribute",
Attr: "title",
Value: "pony",
},
}
if !reflect.DeepEqual(claims, want) {
t.Errorf("AppendClaims results differ.\n got: %v\nwant: %v",
claims, want)
}
}
}
}
示例15: PathsOfSignerTarget
func PathsOfSignerTarget(t *testing.T, initIdx func() *index.Index) {
id := NewIndexDeps(initIdx())
id.Fataler = t
defer id.DumpIndex(t)
signer := id.SignerBlobRef
pn := id.NewPermanode()
t.Logf("uploaded permanode %q", pn)
claim1 := id.SetAttribute(pn, "camliPath:somedir", "targ-123")
claim1Time := id.LastTime().UTC()
claim2 := id.SetAttribute(pn, "camliPath:with|pipe", "targ-124")
claim2Time := id.LastTime().UTC()
t.Logf("made path claims %q and %q", claim1, claim2)
type test struct {
blobref string
want int
}
tests := []test{
{"targ-123", 1},
{"targ-124", 1},
{"targ-125", 0},
}
for _, tt := range tests {
paths, err := id.Index.PathsOfSignerTarget(signer, blob.ParseOrZero(tt.blobref))
if err != nil {
t.Fatalf("PathsOfSignerTarget(%q): %v", tt.blobref, err)
}
if len(paths) != tt.want {
t.Fatalf("PathsOfSignerTarget(%q) got %d results; want %d",
tt.blobref, len(paths), tt.want)
}
if tt.blobref == "targ-123" {
p := paths[0]
want := fmt.Sprintf(
"Path{Claim: %s, %v; Base: %s + Suffix \"somedir\" => Target targ-123}",
claim1, claim1Time, pn)
if g := p.String(); g != want {
t.Errorf("claim wrong.\n got: %s\nwant: %s", g, want)
}
}
}
tests = []test{
{"somedir", 1},
{"with|pipe", 1},
{"void", 0},
}
for _, tt := range tests {
paths, err := id.Index.PathsLookup(id.SignerBlobRef, pn, tt.blobref)
if err != nil {
t.Fatalf("PathsLookup(%q): %v", tt.blobref, err)
}
if len(paths) != tt.want {
t.Fatalf("PathsLookup(%q) got %d results; want %d",
tt.blobref, len(paths), tt.want)
}
if tt.blobref == "with|pipe" {
p := paths[0]
want := fmt.Sprintf(
"Path{Claim: %s, %s; Base: %s + Suffix \"with|pipe\" => Target targ-124}",
claim2, claim2Time, pn)
if g := p.String(); g != want {
t.Errorf("claim wrong.\n got: %s\nwant: %s", g, want)
}
}
}
// now test deletions
// Delete an existing value
claim3 := id.Delete(claim2)
t.Logf("claim %q deletes path claim %q", claim3, claim2)
tests = []test{
{"targ-123", 1},
{"targ-124", 0},
{"targ-125", 0},
}
for _, tt := range tests {
signer := id.SignerBlobRef
paths, err := id.Index.PathsOfSignerTarget(signer, blob.ParseOrZero(tt.blobref))
if err != nil {
t.Fatalf("PathsOfSignerTarget(%q): %v", tt.blobref, err)
}
if len(paths) != tt.want {
t.Fatalf("PathsOfSignerTarget(%q) got %d results; want %d",
tt.blobref, len(paths), tt.want)
}
}
tests = []test{
{"somedir", 1},
{"with|pipe", 0},
{"void", 0},
}
for _, tt := range tests {
paths, err := id.Index.PathsLookup(id.SignerBlobRef, pn, tt.blobref)
if err != nil {
t.Fatalf("PathsLookup(%q): %v", tt.blobref, err)
}
if len(paths) != tt.want {
t.Fatalf("PathsLookup(%q) got %d results; want %d",
tt.blobref, len(paths), tt.want)
//.........這裏部分代碼省略.........