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  }