github.com/alpe/etcd@v0.1.2-0.20130915230056-09f31af88aeb/store/tree_store_test.go (about)

     1  package store
     2  
     3  import (
     4  	"fmt"
     5  	"math/rand"
     6  	"strconv"
     7  	"testing"
     8  	"time"
     9  )
    10  
    11  func TestStoreGet(t *testing.T) {
    12  
    13  	ts := &tree{
    14  		&treeNode{
    15  			NewTestNode("/"),
    16  			true,
    17  			make(map[string]*treeNode),
    18  		},
    19  	}
    20  
    21  	// create key
    22  	ts.set("/foo", NewTestNode("bar"))
    23  	// change value
    24  	ts.set("/foo", NewTestNode("barbar"))
    25  	// create key
    26  	ts.set("/hello/foo", NewTestNode("barbarbar"))
    27  	treeNode, ok := ts.get("/foo")
    28  
    29  	if !ok {
    30  		t.Fatalf("Expect to get node, but not")
    31  	}
    32  	if treeNode.Value != "barbar" {
    33  		t.Fatalf("Expect value barbar, but got %s", treeNode.Value)
    34  	}
    35  
    36  	// create key
    37  	treeNode, ok = ts.get("/hello/foo")
    38  	if !ok {
    39  		t.Fatalf("Expect to get node, but not")
    40  	}
    41  	if treeNode.Value != "barbarbar" {
    42  		t.Fatalf("Expect value barbarbar, but got %s", treeNode.Value)
    43  	}
    44  
    45  	// create a key under other key
    46  	ok = ts.set("/foo/foo", NewTestNode("bar"))
    47  	if ok {
    48  		t.Fatalf("shoud not add key under a exisiting key")
    49  	}
    50  
    51  	// delete a key
    52  	ok = ts.delete("/foo")
    53  	if !ok {
    54  		t.Fatalf("cannot delete key")
    55  	}
    56  
    57  	// delete a directory
    58  	ok = ts.delete("/hello")
    59  	if ok {
    60  		t.Fatalf("Expect cannot delet /hello, but deleted! ")
    61  	}
    62  
    63  	// test list
    64  	ts.set("/hello/fooo", NewTestNode("barbarbar"))
    65  	ts.set("/hello/foooo/foo", NewTestNode("barbarbar"))
    66  
    67  	nodes, keys, ok := ts.list("/hello")
    68  
    69  	if !ok {
    70  		t.Fatalf("cannot list!")
    71  	} else {
    72  		nodes, _ := nodes.([]*Node)
    73  		length := len(nodes)
    74  
    75  		for i := 0; i < length; i++ {
    76  			fmt.Println(keys[i], "=", nodes[i].Value)
    77  		}
    78  	}
    79  
    80  	keys = GenKeys(100, 10)
    81  
    82  	for i := 0; i < 100; i++ {
    83  		value := strconv.Itoa(rand.Int())
    84  		ts.set(keys[i], NewTestNode(value))
    85  		treeNode, ok := ts.get(keys[i])
    86  
    87  		if !ok {
    88  			continue
    89  		}
    90  		if treeNode.Value != value {
    91  			t.Fatalf("Expect value %s, but got %s", value, treeNode.Value)
    92  		}
    93  
    94  	}
    95  	ts.traverse(f, true)
    96  }
    97  
    98  func TestTreeClone(t *testing.T) {
    99  	keys := GenKeys(10000, 10)
   100  
   101  	ts := &tree{
   102  		&treeNode{
   103  			NewTestNode("/"),
   104  			true,
   105  			make(map[string]*treeNode),
   106  		},
   107  	}
   108  
   109  	backTs := &tree{
   110  		&treeNode{
   111  			NewTestNode("/"),
   112  			true,
   113  			make(map[string]*treeNode),
   114  		},
   115  	}
   116  
   117  	// generate the first tree
   118  	for _, key := range keys {
   119  		value := strconv.Itoa(rand.Int())
   120  		ts.set(key, NewTestNode(value))
   121  		backTs.set(key, NewTestNode(value))
   122  	}
   123  
   124  	copyTs := ts.clone()
   125  
   126  	// test if they are identical
   127  	copyTs.traverse(ts.contain, false)
   128  
   129  	// remove all the keys from first tree
   130  	for _, key := range keys {
   131  		ts.delete(key)
   132  	}
   133  
   134  	// test if they are identical
   135  	// make sure changes in the first tree will affect the copy one
   136  	copyTs.traverse(backTs.contain, false)
   137  
   138  }
   139  
   140  func BenchmarkTreeStoreSet(b *testing.B) {
   141  
   142  	keys := GenKeys(10000, 10)
   143  
   144  	b.ResetTimer()
   145  	for i := 0; i < b.N; i++ {
   146  
   147  		ts := &tree{
   148  			&treeNode{
   149  				NewTestNode("/"),
   150  				true,
   151  				make(map[string]*treeNode),
   152  			},
   153  		}
   154  
   155  		for _, key := range keys {
   156  			value := strconv.Itoa(rand.Int())
   157  			ts.set(key, NewTestNode(value))
   158  		}
   159  	}
   160  }
   161  
   162  func BenchmarkTreeStoreGet(b *testing.B) {
   163  
   164  	keys := GenKeys(10000, 10)
   165  
   166  	ts := &tree{
   167  		&treeNode{
   168  			NewTestNode("/"),
   169  			true,
   170  			make(map[string]*treeNode),
   171  		},
   172  	}
   173  
   174  	for _, key := range keys {
   175  		value := strconv.Itoa(rand.Int())
   176  		ts.set(key, NewTestNode(value))
   177  	}
   178  
   179  	b.ResetTimer()
   180  	for i := 0; i < b.N; i++ {
   181  		for _, key := range keys {
   182  			ts.get(key)
   183  		}
   184  	}
   185  }
   186  
   187  func BenchmarkTreeStoreCopy(b *testing.B) {
   188  	keys := GenKeys(10000, 10)
   189  
   190  	ts := &tree{
   191  		&treeNode{
   192  			NewTestNode("/"),
   193  			true,
   194  			make(map[string]*treeNode),
   195  		},
   196  	}
   197  
   198  	for _, key := range keys {
   199  		value := strconv.Itoa(rand.Int())
   200  		ts.set(key, NewTestNode(value))
   201  	}
   202  
   203  	b.ResetTimer()
   204  	for i := 0; i < b.N; i++ {
   205  		ts.clone()
   206  	}
   207  }
   208  
   209  func BenchmarkTreeStoreList(b *testing.B) {
   210  
   211  	keys := GenKeys(10000, 10)
   212  
   213  	ts := &tree{
   214  		&treeNode{
   215  			NewTestNode("/"),
   216  			true,
   217  			make(map[string]*treeNode),
   218  		},
   219  	}
   220  
   221  	for _, key := range keys {
   222  		value := strconv.Itoa(rand.Int())
   223  		ts.set(key, NewTestNode(value))
   224  	}
   225  
   226  	b.ResetTimer()
   227  	for i := 0; i < b.N; i++ {
   228  		for _, key := range keys {
   229  			ts.list(key)
   230  		}
   231  	}
   232  }
   233  
   234  func (t *tree) contain(key string, node *Node) {
   235  	_, ok := t.get(key)
   236  	if !ok {
   237  		panic("tree do not contain the given key")
   238  	}
   239  }
   240  
   241  func f(key string, n *Node) {
   242  	return
   243  }
   244  
   245  func NewTestNode(value string) Node {
   246  	return Node{value, time.Unix(0, 0), nil}
   247  }