github.com/braveheart12/insolar-09-08-19@v0.8.7/ledger/storage/nodes/nodes_test.go (about) 1 /* 2 * Copyright 2019 Insolar 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package nodes 18 19 import ( 20 "testing" 21 22 "github.com/google/gofuzz" 23 "github.com/insolar/insolar" 24 "github.com/insolar/insolar/core" 25 "github.com/insolar/insolar/gen" 26 "github.com/insolar/insolar/ledger/storage" 27 "github.com/stretchr/testify/assert" 28 ) 29 30 func TestNodeStorage_All(t *testing.T) { 31 t.Parallel() 32 33 var all []insolar.Node 34 f := fuzz.New().Funcs(func(e *insolar.Node, c fuzz.Continue) { 35 e.ID = gen.Reference() 36 }) 37 f.NumElements(5, 10).NilChance(0).Fuzz(&all) 38 pulse := gen.PulseNumber() 39 40 t.Run("returns correct nodes", func(t *testing.T) { 41 nodeStorage := NewStorage() 42 nodeStorage.nodes[pulse] = all 43 result, err := nodeStorage.All(pulse) 44 assert.NoError(t, err) 45 assert.Equal(t, all, result) 46 }) 47 48 t.Run("returns nil when empty nodes", func(t *testing.T) { 49 nodeStorage := NewStorage() 50 nodeStorage.nodes[pulse] = nil 51 result, err := nodeStorage.All(pulse) 52 assert.NoError(t, err) 53 assert.Nil(t, result) 54 }) 55 56 t.Run("returns error when no nodes", func(t *testing.T) { 57 nodeStorage := NewStorage() 58 result, err := nodeStorage.All(pulse) 59 assert.Equal(t, core.ErrNoNodes, err) 60 assert.Nil(t, result) 61 }) 62 } 63 64 func TestNodeStorage_InRole(t *testing.T) { 65 t.Parallel() 66 67 var ( 68 virtuals []insolar.Node 69 materials []insolar.Node 70 all []insolar.Node 71 ) 72 { 73 f := fuzz.New().Funcs(func(e *insolar.Node, c fuzz.Continue) { 74 e.ID = gen.Reference() 75 e.Role = core.StaticRoleVirtual 76 }) 77 f.NumElements(5, 10).NilChance(0).Fuzz(&virtuals) 78 } 79 { 80 f := fuzz.New().Funcs(func(e *insolar.Node, c fuzz.Continue) { 81 e.ID = gen.Reference() 82 e.Role = core.StaticRoleLightMaterial 83 }) 84 f.NumElements(5, 10).NilChance(0).Fuzz(&materials) 85 } 86 all = append(virtuals, materials...) 87 pulse := gen.PulseNumber() 88 89 t.Run("returns correct nodes", func(t *testing.T) { 90 nodeStorage := NewStorage() 91 nodeStorage.nodes[pulse] = all 92 { 93 result, err := nodeStorage.InRole(pulse, core.StaticRoleVirtual) 94 assert.NoError(t, err) 95 assert.Equal(t, virtuals, result) 96 } 97 { 98 result, err := nodeStorage.InRole(pulse, core.StaticRoleLightMaterial) 99 assert.NoError(t, err) 100 assert.Equal(t, materials, result) 101 } 102 }) 103 104 t.Run("returns nil when empty nodes", func(t *testing.T) { 105 nodeStorage := NewStorage() 106 nodeStorage.nodes[pulse] = nil 107 result, err := nodeStorage.InRole(pulse, core.StaticRoleVirtual) 108 assert.NoError(t, err) 109 assert.Nil(t, result) 110 }) 111 112 t.Run("returns error when no nodes", func(t *testing.T) { 113 nodeStorage := NewStorage() 114 result, err := nodeStorage.InRole(pulse, core.StaticRoleVirtual) 115 assert.Equal(t, core.ErrNoNodes, err) 116 assert.Nil(t, result) 117 }) 118 } 119 120 func TestStorage_Set(t *testing.T) { 121 t.Parallel() 122 123 var nodes []insolar.Node 124 f := fuzz.New().Funcs(func(e *insolar.Node, c fuzz.Continue) { 125 e.ID = gen.Reference() 126 }) 127 f.NumElements(5, 10).NilChance(0).Fuzz(&nodes) 128 pulse := gen.PulseNumber() 129 130 t.Run("saves correct nodes", func(t *testing.T) { 131 nodeStorage := NewStorage() 132 err := nodeStorage.Set(pulse, nodes) 133 assert.NoError(t, err) 134 assert.Equal(t, nodes, nodeStorage.nodes[pulse]) 135 }) 136 137 t.Run("saves nil if empty nodes", func(t *testing.T) { 138 nodeStorage := NewStorage() 139 err := nodeStorage.Set(pulse, []insolar.Node{}) 140 assert.NoError(t, err) 141 assert.Nil(t, nodeStorage.nodes[pulse]) 142 }) 143 144 t.Run("returns error when saving with the same pulse", func(t *testing.T) { 145 nodeStorage := NewStorage() 146 _ = nodeStorage.Set(pulse, nodes) 147 err := nodeStorage.Set(pulse, nodes) 148 assert.Equal(t, storage.ErrOverride, err) 149 assert.Equal(t, nodes, nodeStorage.nodes[pulse]) 150 }) 151 } 152 153 func TestNewStorage_Delete(t *testing.T) { 154 t.Parallel() 155 156 var nodes []insolar.Node 157 f := fuzz.New().Funcs(func(e *insolar.Node, c fuzz.Continue) { 158 e.ID = gen.Reference() 159 }) 160 f.NumElements(5, 10).NilChance(0).Fuzz(&nodes) 161 pulse := gen.PulseNumber() 162 nodeStorage := NewStorage() 163 nodeStorage.nodes[pulse] = nodes 164 165 t.Run("removes nodes for pulse", func(t *testing.T) { 166 { 167 result, err := nodeStorage.All(pulse) 168 assert.NoError(t, err) 169 assert.Equal(t, nodes, result) 170 } 171 { 172 nodeStorage.Delete(pulse) 173 result, err := nodeStorage.All(pulse) 174 assert.Equal(t, core.ErrNoNodes, err) 175 assert.Nil(t, result) 176 } 177 }) 178 }