github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/libraries/syndtr/goleveldb/leveldb/version_test.go (about)

     1  package leveldb
     2  
     3  import (
     4  	"encoding/binary"
     5  	"reflect"
     6  	"testing"
     7  
     8  	"github.com/insionng/yougam/libraries/onsi/gomega"
     9  
    10  	"github.com/insionng/yougam/libraries/syndtr/goleveldb/leveldb/testutil"
    11  )
    12  
    13  type testFileRec struct {
    14  	level int
    15  	num   int64
    16  }
    17  
    18  func TestVersionStaging(t *testing.T) {
    19  	gomega.RegisterTestingT(t)
    20  	stor := testutil.NewStorage()
    21  	defer stor.Close()
    22  	s, err := newSession(stor, nil)
    23  	if err != nil {
    24  		t.Fatal(err)
    25  	}
    26  
    27  	v := newVersion(s)
    28  	v.newStaging()
    29  
    30  	tmp := make([]byte, 4)
    31  	mik := func(i uint64) []byte {
    32  		binary.BigEndian.PutUint32(tmp, uint32(i))
    33  		return []byte(makeInternalKey(nil, tmp, 0, keyTypeVal))
    34  	}
    35  
    36  	for i, x := range []struct {
    37  		add, del []testFileRec
    38  		levels   [][]int64
    39  	}{
    40  		{
    41  			add: []testFileRec{
    42  				{1, 1},
    43  			},
    44  			levels: [][]int64{
    45  				{},
    46  				{1},
    47  			},
    48  		},
    49  		{
    50  			add: []testFileRec{
    51  				{1, 1},
    52  			},
    53  			levels: [][]int64{
    54  				{},
    55  				{1},
    56  			},
    57  		},
    58  		{
    59  			del: []testFileRec{
    60  				{1, 1},
    61  			},
    62  			levels: [][]int64{},
    63  		},
    64  		{
    65  			add: []testFileRec{
    66  				{0, 1},
    67  				{0, 3},
    68  				{0, 2},
    69  				{2, 5},
    70  				{1, 4},
    71  			},
    72  			levels: [][]int64{
    73  				{3, 2, 1},
    74  				{4},
    75  				{5},
    76  			},
    77  		},
    78  		{
    79  			add: []testFileRec{
    80  				{1, 6},
    81  				{2, 5},
    82  			},
    83  			del: []testFileRec{
    84  				{0, 1},
    85  				{0, 4},
    86  			},
    87  			levels: [][]int64{
    88  				{3, 2},
    89  				{4, 6},
    90  				{5},
    91  			},
    92  		},
    93  		{
    94  			del: []testFileRec{
    95  				{0, 3},
    96  				{0, 2},
    97  				{1, 4},
    98  				{1, 6},
    99  				{2, 5},
   100  			},
   101  			levels: [][]int64{},
   102  		},
   103  		{
   104  			add: []testFileRec{
   105  				{0, 1},
   106  			},
   107  			levels: [][]int64{
   108  				{1},
   109  			},
   110  		},
   111  		{
   112  			add: []testFileRec{
   113  				{1, 2},
   114  			},
   115  			levels: [][]int64{
   116  				{1},
   117  				{2},
   118  			},
   119  		},
   120  		{
   121  			add: []testFileRec{
   122  				{0, 3},
   123  			},
   124  			levels: [][]int64{
   125  				{3, 1},
   126  				{2},
   127  			},
   128  		},
   129  		{
   130  			add: []testFileRec{
   131  				{6, 9},
   132  			},
   133  			levels: [][]int64{
   134  				{3, 1},
   135  				{2},
   136  				{},
   137  				{},
   138  				{},
   139  				{},
   140  				{9},
   141  			},
   142  		},
   143  		{
   144  			del: []testFileRec{
   145  				{6, 9},
   146  			},
   147  			levels: [][]int64{
   148  				{3, 1},
   149  				{2},
   150  			},
   151  		},
   152  	} {
   153  		rec := &sessionRecord{}
   154  		for _, f := range x.add {
   155  			ik := mik(uint64(f.num))
   156  			rec.addTable(f.level, f.num, 1, ik, ik)
   157  		}
   158  		for _, f := range x.del {
   159  			rec.delTable(f.level, f.num)
   160  		}
   161  		vs := v.newStaging()
   162  		vs.commit(rec)
   163  		v = vs.finish()
   164  		if len(v.levels) != len(x.levels) {
   165  			t.Fatalf("#%d: invalid level count: want=%d got=%d", i, len(x.levels), len(v.levels))
   166  		}
   167  		for j, want := range x.levels {
   168  			tables := v.levels[j]
   169  			if len(want) != len(tables) {
   170  				t.Fatalf("#%d.%d: invalid tables count: want=%d got=%d", i, j, len(want), len(tables))
   171  			}
   172  			got := make([]int64, len(tables))
   173  			for k, t := range tables {
   174  				got[k] = t.fd.Num
   175  			}
   176  			if !reflect.DeepEqual(want, got) {
   177  				t.Fatalf("#%d.%d: invalid tables: want=%v got=%v", i, j, want, got)
   178  			}
   179  		}
   180  	}
   181  }