From 2cca4d089a24002c10b8e58c42ce6b10ddbcd1bf Mon Sep 17 00:00:00 2001 From: Aaron Son Date: Thu, 21 Oct 2021 17:08:23 -0700 Subject: [PATCH] Add some tests for async sorted edits changes. --- .../types/edits/async_sorted_edits_test.go | 52 ++++++++++++++ go/store/types/edits/kvp_collection_test.go | 45 ++++++++++++ go/store/types/edits/sorted_edit_itr_test.go | 70 +++++++++++++++++++ 3 files changed, 167 insertions(+) create mode 100644 go/store/types/edits/sorted_edit_itr_test.go diff --git a/go/store/types/edits/async_sorted_edits_test.go b/go/store/types/edits/async_sorted_edits_test.go index d25d29bdb4..9d97e2cf2a 100644 --- a/go/store/types/edits/async_sorted_edits_test.go +++ b/go/store/types/edits/async_sorted_edits_test.go @@ -15,7 +15,9 @@ package edits import ( + "context" "fmt" + "io" "math/rand" "testing" "time" @@ -52,6 +54,56 @@ func TestAsyncSortedEdits(t *testing.T) { } } +func TestAsyncSortedEditsStable(t *testing.T) { + ase := NewAsyncSortedEdits(types.Format_LD_1, 2, 1, 1) + assert.NotNil(t, ase) + ase.AddEdit(types.Int(0), nil) + ase.AddEdit(types.Int(1), nil) + ase.AddEdit(types.Int(2), nil) + ase.AddEdit(types.Int(0), types.Int(0)) + ase.AddEdit(types.Int(1), types.Int(0)) + ase.AddEdit(types.Int(2), types.Int(0)) + + ep, err := ase.FinishedEditing() + assert.NoError(t, err) + + err = ase.Close(context.Background()) + assert.NoError(t, err) + + kvp, err := ep.Next() + assert.NoError(t, err) + assert.NotNil(t, kvp) + assert.Equal(t, types.Int(0), kvp.Key) + assert.Nil(t, kvp.Val) + kvp, err = ep.Next() + assert.NoError(t, err) + assert.NotNil(t, kvp) + assert.Equal(t, types.Int(0), kvp.Key) + assert.Equal(t, types.Int(0), kvp.Val) + kvp, err = ep.Next() + assert.NoError(t, err) + assert.NotNil(t, kvp) + assert.Equal(t, types.Int(1), kvp.Key) + assert.Nil(t, kvp.Val) + kvp, err = ep.Next() + assert.NoError(t, err) + assert.NotNil(t, kvp) + assert.Equal(t, types.Int(1), kvp.Key) + assert.Equal(t, types.Int(0), kvp.Val) + kvp, err = ep.Next() + assert.NoError(t, err) + assert.NotNil(t, kvp) + assert.Equal(t, types.Int(2), kvp.Key) + assert.Nil(t, kvp.Val) + kvp, err = ep.Next() + assert.NoError(t, err) + assert.NotNil(t, kvp) + assert.Equal(t, types.Int(2), kvp.Key) + assert.Equal(t, types.Int(0), kvp.Val) + _, err = ep.Next() + assert.Equal(t, io.EOF, err) +} + func testASE(t *testing.T, rng *rand.Rand) { const ( minKVPS = 1 diff --git a/go/store/types/edits/kvp_collection_test.go b/go/store/types/edits/kvp_collection_test.go index 5d9c556c87..0fea262cf5 100644 --- a/go/store/types/edits/kvp_collection_test.go +++ b/go/store/types/edits/kvp_collection_test.go @@ -16,6 +16,7 @@ package edits import ( "context" + "io" "math/rand" "testing" "time" @@ -64,6 +65,50 @@ func TestKVPCollection(t *testing.T) { } } +func TestKVPCollectionDestructiveMergeStable(t *testing.T) { + left := NewKVPCollection(types.Format_LD_1, types.KVPSlice{ + types.KVP{Key: types.Int(0)}, + types.KVP{Key: types.Int(1)}, + types.KVP{Key: types.Int(2)}, + }) + right := NewKVPCollection(types.Format_LD_1, types.KVPSlice{ + types.KVP{Key: types.Int(0), Val: types.Int(0)}, + types.KVP{Key: types.Int(1), Val: types.Int(0)}, + types.KVP{Key: types.Int(2), Val: types.Int(0)}, + }) + var err error + left, err = left.DestructiveMerge(right) + assert.NoError(t, err) + i := left.Iterator() + var v *types.KVP + v, err = i.Next() + assert.NoError(t, err) + assert.Equal(t, types.Int(0), v.Key) + assert.Nil(t, v.Val) + v, err = i.Next() + assert.NoError(t, err) + assert.Equal(t, types.Int(0), v.Key) + assert.NotNil(t, v.Val) + v, err = i.Next() + assert.NoError(t, err) + assert.Equal(t, types.Int(1), v.Key) + assert.Nil(t, v.Val) + v, err = i.Next() + assert.NoError(t, err) + assert.Equal(t, types.Int(1), v.Key) + assert.NotNil(t, v.Val) + v, err = i.Next() + assert.NoError(t, err) + assert.Equal(t, types.Int(2), v.Key) + assert.Nil(t, v.Val) + v, err = i.Next() + assert.NoError(t, err) + assert.Equal(t, types.Int(2), v.Key) + assert.NotNil(t, v.Val) + _, err = i.Next() + assert.Equal(t, io.EOF, err) +} + func testKVPCollection(t *testing.T, rng *rand.Rand) { const ( maxSize = 1024 diff --git a/go/store/types/edits/sorted_edit_itr_test.go b/go/store/types/edits/sorted_edit_itr_test.go new file mode 100644 index 0000000000..00962567c2 --- /dev/null +++ b/go/store/types/edits/sorted_edit_itr_test.go @@ -0,0 +1,70 @@ +// Copyright 2019 Dolthub, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package edits + +import ( + "io" + "testing" + + "github.com/stretchr/testify/assert" + + "github.com/dolthub/dolt/go/store/types" +) + +func TestSortedEditItrStable(t *testing.T) { + left := NewKVPCollection(types.Format_LD_1, types.KVPSlice{ + types.KVP{Key: types.Int(0)}, + types.KVP{Key: types.Int(1)}, + types.KVP{Key: types.Int(2)}, + }) + right := NewKVPCollection(types.Format_LD_1, types.KVPSlice{ + types.KVP{Key: types.Int(0), Val: types.Int(0)}, + types.KVP{Key: types.Int(1), Val: types.Int(0)}, + types.KVP{Key: types.Int(2), Val: types.Int(0)}, + }) + assert.NotNil(t, left) + assert.NotNil(t, right) + i := NewSortedEditItr(types.Format_LD_1, left, right) + assert.NotNil(t, i) + + var err error + var v *types.KVP + v, err = i.Next() + assert.NoError(t, err) + assert.Equal(t, types.Int(0), v.Key) + assert.Nil(t, v.Val) + v, err = i.Next() + assert.NoError(t, err) + assert.Equal(t, types.Int(0), v.Key) + assert.NotNil(t, v.Val) + v, err = i.Next() + assert.NoError(t, err) + assert.Equal(t, types.Int(1), v.Key) + assert.Nil(t, v.Val) + v, err = i.Next() + assert.NoError(t, err) + assert.Equal(t, types.Int(1), v.Key) + assert.NotNil(t, v.Val) + v, err = i.Next() + assert.NoError(t, err) + assert.Equal(t, types.Int(2), v.Key) + assert.Nil(t, v.Val) + v, err = i.Next() + assert.NoError(t, err) + assert.Equal(t, types.Int(2), v.Key) + assert.NotNil(t, v.Val) + _, err = i.Next() + assert.Equal(t, io.EOF, err) +}