github.com/braveheart12/insolar-09-08-19@v0.8.7/ledger/storage/pulsetrackermemory_test.go (about) 1 /* 2 * Copyright 2019 Insolar Technologies 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 storage 18 19 import ( 20 "testing" 21 22 "github.com/insolar/insolar/core" 23 "github.com/insolar/insolar/instrumentation/inslogger" 24 "github.com/stretchr/testify/assert" 25 "github.com/stretchr/testify/require" 26 ) 27 28 func TestPulseTrackerMemory_GetPulse(t *testing.T) { 29 t.Parallel() 30 31 // Arrange 32 ctx := inslogger.TestContext(t) 33 pulseTracker := &pulseTrackerMemory{ 34 memory: map[core.PulseNumber]Pulse{}, 35 } 36 existingPulse := Pulse{Pulse: core.Pulse{PulseNumber: core.FirstPulseNumber}} 37 existingPulse.SerialNumber = 1 38 pulseTracker.memory[core.FirstPulseNumber] = existingPulse 39 40 // Act 41 pulse, err := pulseTracker.GetPulse(ctx, core.FirstPulseNumber) 42 _, notFoundErr := pulseTracker.GetPulse(ctx, core.FirstPulseNumber+1) 43 44 // Assert 45 require.NoError(t, err) 46 assert.Equal(t, existingPulse, *pulse) 47 assert.Equal(t, core.ErrNotFound, notFoundErr) 48 } 49 50 func TestPulseTrackerMemory_GetPreviousPulse(t *testing.T) { 51 t.Parallel() 52 53 // Arrange 54 ctx := inslogger.TestContext(t) 55 pulseTracker := &pulseTrackerMemory{ 56 memory: map[core.PulseNumber]Pulse{}, 57 } 58 firstPulse := Pulse{ 59 Pulse: core.Pulse{PulseNumber: core.FirstPulseNumber}, 60 SerialNumber: 1, 61 } 62 secondPulse := Pulse{ 63 Pulse: core.Pulse{PulseNumber: core.FirstPulseNumber + 1}, 64 Prev: &firstPulse.Pulse.PulseNumber, 65 } 66 badPrev := core.PulseNumber(42) 67 thirdPulse := Pulse{ 68 Pulse: core.Pulse{PulseNumber: core.FirstPulseNumber + 2}, 69 Prev: &badPrev, 70 } 71 pulseTracker.memory[core.FirstPulseNumber] = firstPulse 72 pulseTracker.memory[core.FirstPulseNumber+1] = secondPulse 73 pulseTracker.memory[core.FirstPulseNumber+2] = thirdPulse 74 75 // Act 76 pulse, err := pulseTracker.GetPreviousPulse(ctx, core.FirstPulseNumber+1) 77 _, prevPulseErr := pulseTracker.GetPreviousPulse(ctx, core.FirstPulseNumber) 78 _, badPrevErr := pulseTracker.GetPreviousPulse(ctx, core.FirstPulseNumber+2) 79 _, notFoundErr := pulseTracker.GetPreviousPulse(ctx, 42) 80 81 // Assert 82 require.NoError(t, err) 83 assert.Equal(t, firstPulse, *pulse) 84 assert.Equal(t, ErrPrevPulse, prevPulseErr) 85 assert.Equal(t, core.ErrNotFound, badPrevErr) 86 assert.Equal(t, core.ErrNotFound, notFoundErr) 87 } 88 89 func TestPulseTrackerMemory_GetNthPrevPulse(t *testing.T) { 90 t.Parallel() 91 92 // Arrange 93 ctx := inslogger.TestContext(t) 94 pulseTracker := &pulseTrackerMemory{ 95 memory: map[core.PulseNumber]Pulse{}, 96 } 97 firstPulse := Pulse{ 98 Pulse: core.Pulse{PulseNumber: core.FirstPulseNumber}, 99 SerialNumber: 1, 100 } 101 secondPulse := Pulse{ 102 Pulse: core.Pulse{PulseNumber: core.FirstPulseNumber + 1}, 103 Prev: &firstPulse.Pulse.PulseNumber, 104 } 105 thirdPulse := Pulse{ 106 Pulse: core.Pulse{PulseNumber: core.FirstPulseNumber + 2}, 107 Prev: &secondPulse.Pulse.PulseNumber, 108 } 109 fourth := Pulse{ 110 Pulse: core.Pulse{PulseNumber: core.FirstPulseNumber + 3}, 111 Prev: &thirdPulse.Pulse.PulseNumber, 112 } 113 pulseTracker.memory[core.FirstPulseNumber] = firstPulse 114 pulseTracker.memory[core.FirstPulseNumber+1] = secondPulse 115 pulseTracker.memory[core.FirstPulseNumber+2] = thirdPulse 116 pulseTracker.memory[core.FirstPulseNumber+3] = fourth 117 118 // Act and Assert 119 targetPulse, err := pulseTracker.GetNthPrevPulse(ctx, 0, core.FirstPulseNumber+3) 120 require.NoError(t, err) 121 assert.Equal(t, fourth, *targetPulse) 122 123 prev1pulse, err := pulseTracker.GetNthPrevPulse(ctx, 1, core.FirstPulseNumber+3) 124 require.NoError(t, err) 125 assert.Equal(t, thirdPulse, *prev1pulse) 126 127 prev2pulse, err := pulseTracker.GetNthPrevPulse(ctx, 2, core.FirstPulseNumber+3) 128 require.NoError(t, err) 129 assert.Equal(t, secondPulse, *prev2pulse) 130 131 prev3pulse, err := pulseTracker.GetNthPrevPulse(ctx, 3, core.FirstPulseNumber+3) 132 require.NoError(t, err) 133 assert.Equal(t, firstPulse, *prev3pulse) 134 135 _, err = pulseTracker.GetNthPrevPulse(ctx, 4, core.FirstPulseNumber+3) 136 assert.Equal(t, ErrPrevPulse, err) 137 } 138 139 func TestPulseTrackerMemory_GetLatestPulse(t *testing.T) { 140 t.Parallel() 141 142 ctx := inslogger.TestContext(t) 143 pulseTracker := &pulseTrackerMemory{ 144 memory: map[core.PulseNumber]Pulse{}, 145 } 146 147 // Check empty storage 148 _, err := pulseTracker.GetLatestPulse(ctx) 149 assert.Equal(t, core.ErrNotFound, err) 150 151 // Check correct pulseNumber, but empty storage 152 pulseTracker.latestPulse = 1 153 _, err = pulseTracker.GetLatestPulse(ctx) 154 assert.Equal(t, core.ErrNotFound, err) 155 156 // Add and check first pulse 157 // latest = first 158 firstPulse := Pulse{ 159 Pulse: core.Pulse{PulseNumber: core.FirstPulseNumber}, 160 SerialNumber: 1, 161 } 162 pulseTracker.memory[core.FirstPulseNumber] = firstPulse 163 pulseTracker.latestPulse = core.FirstPulseNumber 164 pulse, err := pulseTracker.GetLatestPulse(ctx) 165 require.NoError(t, err) 166 assert.Equal(t, firstPulse, *pulse) 167 168 // Add and check second pulse 169 // latest = second 170 secondPulse := Pulse{ 171 Pulse: core.Pulse{PulseNumber: core.FirstPulseNumber + 1}, 172 Prev: &firstPulse.Pulse.PulseNumber, 173 } 174 pulseTracker.memory[core.FirstPulseNumber+1] = secondPulse 175 pulseTracker.latestPulse = core.FirstPulseNumber + 1 176 pulse, err = pulseTracker.GetLatestPulse(ctx) 177 require.NoError(t, err) 178 assert.Equal(t, secondPulse, *pulse) 179 180 // Add and check third pulse 181 // latest != third, latest = second because third pulseNumber smaller than second 182 thirdPulse := Pulse{ 183 Pulse: core.Pulse{PulseNumber: 42}, 184 Prev: &secondPulse.Pulse.PulseNumber, 185 } 186 pulseTracker.memory[42] = thirdPulse 187 pulse, err = pulseTracker.GetLatestPulse(ctx) 188 require.NoError(t, err) 189 assert.Equal(t, secondPulse, *pulse) 190 191 // Add and check fourth pulse 192 // latest = fourth 193 fourthPulse := Pulse{ 194 Pulse: core.Pulse{PulseNumber: core.FirstPulseNumber + 3}, 195 Prev: &thirdPulse.Pulse.PulseNumber, 196 } 197 pulseTracker.memory[core.FirstPulseNumber+3] = fourthPulse 198 pulseTracker.latestPulse = core.FirstPulseNumber + 3 199 pulse, err = pulseTracker.GetLatestPulse(ctx) 200 require.NoError(t, err) 201 assert.Equal(t, fourthPulse, *pulse) 202 } 203 204 func TestPulseTrackerMemory_AddPulse_FailFirstCheck(t *testing.T) { 205 t.Parallel() 206 207 ctx := inslogger.TestContext(t) 208 pulseTracker := &pulseTrackerMemory{ 209 memory: map[core.PulseNumber]Pulse{}, 210 } 211 212 // Check pulse smaller than current 213 firstPulse := &Pulse{ 214 Pulse: core.Pulse{PulseNumber: core.FirstPulseNumber}, 215 } 216 pulseTracker.latestPulse = core.FirstPulseNumber + 1 217 err := pulseTracker.AddPulse(ctx, firstPulse.Pulse) 218 219 assert.Equal(t, ErrBadPulse, err) 220 221 // Check pulse equal with current 222 pulseTracker.latestPulse = core.FirstPulseNumber 223 err = pulseTracker.AddPulse(ctx, firstPulse.Pulse) 224 225 assert.Equal(t, ErrBadPulse, err) 226 } 227 228 func TestPulseTrackerMemory_AddPulse(t *testing.T) { 229 t.Parallel() 230 231 ctx := inslogger.TestContext(t) 232 233 // Arrange 234 // Check new pulse adding 235 pulseTracker := &pulseTrackerMemory{ 236 memory: map[core.PulseNumber]Pulse{}, 237 } 238 firstPulse := Pulse{ 239 Pulse: core.Pulse{PulseNumber: core.FirstPulseNumber}, 240 } 241 prevPN := core.PulseNumber(0) 242 firstPulse.Prev = &prevPN 243 firstPulse.SerialNumber = 1 244 245 // Act 246 err := pulseTracker.AddPulse(ctx, firstPulse.Pulse) 247 248 // Assert 249 require.NoError(t, err) 250 assert.Equal(t, firstPulse.Pulse, pulseTracker.memory[core.FirstPulseNumber].Pulse) 251 assert.Equal(t, firstPulse.Pulse.PulseNumber, pulseTracker.latestPulse) 252 assert.Equal(t, firstPulse, pulseTracker.memory[core.FirstPulseNumber]) 253 254 // Arrange 255 // Check pulse adding to non-empty storage 256 secondPulse := &Pulse{ 257 Pulse: core.Pulse{PulseNumber: core.FirstPulseNumber + 1}, 258 } 259 secondPulse.Prev = &firstPulse.Pulse.PulseNumber 260 secondPulse.SerialNumber = firstPulse.SerialNumber + 1 261 firstPulse.Next = &secondPulse.Pulse.PulseNumber 262 263 // Act 264 err = pulseTracker.AddPulse(ctx, secondPulse.Pulse) 265 266 // Assert 267 require.NoError(t, err) 268 assert.Equal(t, secondPulse.Pulse, pulseTracker.memory[core.FirstPulseNumber+1].Pulse) 269 assert.Equal(t, secondPulse.Pulse.PulseNumber, pulseTracker.latestPulse) 270 assert.Equal(t, *secondPulse.Prev, pulseTracker.memory[core.FirstPulseNumber].Pulse.PulseNumber) 271 assert.Equal(t, secondPulse.SerialNumber, pulseTracker.memory[core.FirstPulseNumber+1].SerialNumber) 272 assert.Equal(t, *firstPulse.Next, pulseTracker.memory[core.FirstPulseNumber+1].Pulse.PulseNumber) 273 274 // Check pulse from the past for non-empty storage 275 pastPulse := &Pulse{ 276 Pulse: core.Pulse{PulseNumber: core.FirstPulseNumber - 1}, 277 } 278 err = pulseTracker.AddPulse(ctx, pastPulse.Pulse) 279 require.Equal(t, ErrBadPulse, err) 280 } 281 282 func TestPulseTrackerMemory_DeletePulse(t *testing.T) { 283 t.Parallel() 284 285 ctx := inslogger.TestContext(t) 286 287 pulseTracker := &pulseTrackerMemory{ 288 memory: map[core.PulseNumber]Pulse{}, 289 } 290 firstPulse := Pulse{ 291 Pulse: core.Pulse{PulseNumber: core.FirstPulseNumber}, 292 } 293 assert.Equal(t, 0, len(pulseTracker.memory)) 294 295 // Check deleting from empty storage 296 err := pulseTracker.DeletePulse(ctx, core.FirstPulseNumber) 297 require.NoError(t, err) 298 assert.Equal(t, 0, len(pulseTracker.memory)) 299 300 // Add pulse to storage 301 pulseTracker.memory[core.FirstPulseNumber] = firstPulse 302 assert.Equal(t, 1, len(pulseTracker.memory)) 303 assert.Equal(t, firstPulse.Pulse, pulseTracker.memory[core.FirstPulseNumber].Pulse) 304 305 // Check deleting from non-empty storage 306 err = pulseTracker.DeletePulse(ctx, core.FirstPulseNumber) 307 require.NoError(t, err) 308 assert.Equal(t, 0, len(pulseTracker.memory)) 309 }