123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 |
- /*
- * EliasDB
- *
- * Copyright 2016 Matthias Ladkau. All rights reserved.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- */
- package graph
- import (
- "testing"
- "devt.de/krotik/eliasdb/graph/data"
- "devt.de/krotik/eliasdb/graph/graphstorage"
- "devt.de/krotik/eliasdb/storage"
- )
- func TestNodeKeyIterator(t *testing.T) {
- mgs := graphstorage.NewMemoryGraphStorage("iterator test")
- gm := newGraphManagerNoRules(mgs)
- node1 := data.NewGraphNode()
- node1.SetAttr("key", "123")
- node1.SetAttr("kind", "mykind")
- node1.SetAttr("Name", "Node1")
- gm.StoreNode("main", node1)
- node2 := data.NewGraphNode()
- node2.SetAttr("key", "456")
- node2.SetAttr("kind", "mykind2")
- node2.SetAttr("Name", "Node2")
- gm.StoreNode("main", node2)
- node3 := data.NewGraphNode()
- node3.SetAttr("key", "789")
- node3.SetAttr("kind", "mykind")
- node3.SetAttr("Name", "Node3")
- gm.StoreNode("main", node3)
- edge := data.NewGraphEdge()
- edge.SetAttr("key", "abc")
- edge.SetAttr("kind", "myedge")
- edge.SetAttr(data.EdgeEnd1Key, node1.Key())
- edge.SetAttr(data.EdgeEnd1Kind, node1.Kind())
- edge.SetAttr(data.EdgeEnd1Role, "node1")
- edge.SetAttr(data.EdgeEnd1Cascading, true)
- edge.SetAttr(data.EdgeEnd2Key, node2.Key())
- edge.SetAttr(data.EdgeEnd2Kind, node2.Kind())
- edge.SetAttr(data.EdgeEnd2Role, "node2")
- edge.SetAttr(data.EdgeEnd2Cascading, false)
- gm.StoreEdge("main", edge)
- ni, err := gm.NodeKeyIterator("main", "mykind")
- if err != nil {
- t.Error(err)
- return
- }
- expectedKeys := []string{"123", "789"}
- i := 0
- for ni.HasNext() {
- key := ni.Next()
- if key != expectedKeys[i] {
- t.Error("Unexpected key:", key, "expected", expectedKeys[i])
- return
- }
- if ni.LastError != nil {
- t.Error(ni.LastError)
- return
- }
- i++
- }
- ni, err = gm.NodeKeyIterator("main", "mykind")
- if err != nil {
- t.Error(err)
- return
- }
- msm := mgs.StorageManager("main"+"mykind"+StorageSuffixNodes, false)
- tree, _, _ := gm.getNodeStorageHTree("main", "mykind", false)
- _, loc, _ := tree.GetValueAndLocation([]byte(PrefixNSAttrs + "123"))
- msm.(*storage.MemoryStorageManager).AccessMap[loc] = storage.AccessCacheAndFetchSeriousError
- ni.Next()
- if ni.LastError == nil {
- t.Error("Expected an error to occur")
- return
- }
- delete(msm.(*storage.MemoryStorageManager).AccessMap, loc)
- msm.(*storage.MemoryStorageManager).AccessMap[1] = storage.AccessCacheAndFetchError
- ni, err = gm.NodeKeyIterator("main", "mykind")
- if ni != nil || err == nil {
- t.Error("Key iterator should not be created at this point")
- return
- }
- delete(msm.(*storage.MemoryStorageManager).AccessMap, 1)
- msm.(*storage.MemoryStorageManager).AccessMap[loc] = storage.AccessCacheAndFetchSeriousError
- ni, err = gm.NodeKeyIterator("main", "mykind")
- if ni != nil || err == nil {
- t.Error("Key iterator should not be created at this point")
- return
- }
- delete(msm.(*storage.MemoryStorageManager).AccessMap, loc)
- // Test iterator running out of items
- ni, err = gm.NodeKeyIterator("main", "mykind")
- if err != nil {
- t.Error(err)
- return
- }
- ni.Next()
- ni.Next()
- ni.Next()
- if ni.Next() != "" || ni.Error() != nil {
- t.Error("Expected iterator to run out of items:", ni.Error())
- return
- }
- }
|