github.com/insolar/vanilla@v0.0.0-20201023172447-248fdf805322/throw/minimizer_test.go (about)

     1  // Copyright 2020 Insolar Network Ltd.
     2  // All rights reserved.
     3  // This material is licensed under the Insolar License version 1.0,
     4  // available at https://github.com/insolar/assured-ledger/blob/master/LICENSE.md.
     5  
     6  package throw
     7  
     8  import (
     9  	"testing"
    10  
    11  	"github.com/stretchr/testify/require"
    12  )
    13  
    14  const testStackDebugCall = "runtime/debug.Stack(0xc000313cc0, 0x1020601, 0x6)\n" +
    15  	"\t/go1.14.2/src/runtime/debug/stack.go:24 +0xa4\n"
    16  
    17  const testStackDebug = testStackDebugCall +
    18  	testStackClear
    19  
    20  const testStackPanic = testStackDebugCall +
    21  	testStackPanicNoDebug
    22  
    23  const testStackPanicNoDebug = testStackPanicDefer +
    24  	testPanic +
    25  	testStackClear
    26  
    27  const testStackPanicDefer = "github.com/insolar/assured-ledger/ledger-core/conveyor/smachine.RecoverSlotPanicWithStack(...)\n" +
    28  	"\t/go/src/github.com/insolar/assured-ledger/ledger-core/conveyor/smachine/api_panic.go:73\n" +
    29  	"github.com/insolar/assured-ledger/ledger-core/conveyor/smachine.recoverSlotPanicAsUpdate(0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)\n" +
    30  	"\t/go/src/github.com/insolar/assured-ledger/ledger-core/conveyor/smachine/state_update_type.go:66 +0x169\n" +
    31  	"github.com/insolar/assured-ledger/ledger-core/conveyor/smachine.(*contextTemplate).discardAndUpdate(...)\n" +
    32  	"\t/go/src/github.com/insolar/assured-ledger/ledger-core/conveyor/smachine/context_basic.go:94\n" +
    33  	"github.com/insolar/assured-ledger/ledger-core/conveyor/smachine.(*executionContext).executeNextStep.func1(0xc000336ab0, 0xc0002748c0)\n" +
    34  	"\t/go/src/github.com/insolar/assured-ledger/ledger-core/conveyor/smachine/context_exec.go:123 +0x126\n"
    35  
    36  const testPanic = "panic(0xe6b060, 0x11875c0)\n" +
    37  	"\t/go1.14.2/src/runtime/panic.go:975 +0x3f1\n"
    38  
    39  const testStackValuable = testStackValuableOnce + testStackValuableOnce
    40  
    41  const testStackValuableOnce = "github.com/insolar/assured-ledger/ledger-core/virtual/execute.(*SMExecute).stepWaitObjectReady(0xc000352000, 0x11d51a0, 0xc000336ab0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)\n" +
    42  	"\t/go/src/github.com/insolar/assured-ledger/ledger-core/virtual/execute/execute.go:161 +0x7ce\n"
    43  
    44  const testStackBoundary = "github.com/insolar/assured-ledger/ledger-core/conveyor/smachine.(*executionContext).executeNextStep(0xc000336ab0, 0xc000336ab0, 0x1, 0x2208038, 0xc0003369c0, 0x101f001, 0x0, 0x0, 0x0, 0xb, ...)\n" +
    45  	"\t/go/src/github.com/insolar/assured-ledger/ledger-core/conveyor/smachine/context_exec.go:128 +0xfb\n"
    46  
    47  const testStackClear = testStackValuable +
    48  	testStackBoundary +
    49  	testStackUseless
    50  
    51  const testStackUseless = "github.com/insolar/assured-ledger/ledger-core/conveyor/smachine.(*SlotMachine)._executeSlot.func1(0x11c8fa0, 0xc000336aa0)\n" +
    52  	"\t/go/src/github.com/insolar/assured-ledger/ledger-core/conveyor/smachine/slot_machine_execute.go:222 +0x200\n" +
    53  	"github.com/insolar/assured-ledger/ledger-core/conveyor/sworker.(*SimpleSlotWorker).DetachableCall(0xc000336a80, 0xc000266b00, 0x1912640)\n" +
    54  	"\t/go/src/github.com/insolar/assured-ledger/ledger-core/conveyor/sworker/worker_simple.go:114 +0x49\n" +
    55  	"github.com/insolar/assured-ledger/ledger-core/conveyor/smachine.(*SlotMachine)._executeSlot(0xc0001da800, 0xc000480000, 0x4, 0x11c4bc0, 0xc000336a80, 0x2711, 0x0, 0x0)\n" +
    56  	"\t/go/src/github.com/insolar/assured-ledger/ledger-core/conveyor/smachine/slot_machine_execute.go:203 +0x210\n" +
    57  	"github.com/insolar/assured-ledger/ledger-core/conveyor/smachine.(*SlotMachine).executeWorkingSlots(0xc0001da800, 0x5, 0x11c4bc0, 0xc000336a80)\n" +
    58  	"\t/go/src/github.com/insolar/assured-ledger/ledger-core/conveyor/smachine/slot_machine_execute.go:183 +0x1ba\n" +
    59  	"github.com/insolar/assured-ledger/ledger-core/conveyor/smachine.(*SlotMachine).ScanOnce(0xc0001da800, 0x0, 0x11c4bc0, 0xc000336a80, 0xc0004473c8, 0x40dcbf, 0x20, 0xef77a0)\n" +
    60  	"\t/go/src/github.com/insolar/assured-ledger/ledger-core/conveyor/smachine/slot_machine_execute.go:120 +0x462\n" +
    61  	"github.com/insolar/assured-ledger/ledger-core/conveyor/smachine.(*SlotMachine).ScanNested.func1(0x11c4bc0, 0xc000336a80)\n" +
    62  	"\t/go/src/github.com/insolar/assured-ledger/ledger-core/conveyor/smachine/slot_machine_execute.go:35 +0x63\n" +
    63  	"github.com/insolar/assured-ledger/ledger-core/conveyor/sworker.(*AttachableSimpleSlotWorker).AttachAsNested(0xc00002ad90, 0xc0001da800, 0x11c8fa0, 0xc000336950, 0x2710, 0xc000336a50, 0x117e300)\n" +
    64  	"\t/go/src/github.com/insolar/assured-ledger/ledger-core/conveyor/sworker/worker_simple.go:44 +0x14b\n" +
    65  	"github.com/insolar/assured-ledger/ledger-core/conveyor/smachine.(*SlotMachine).ScanNested(0xc0001da800, 0x11d51a0, 0xc000336a20, 0x271000274800, 0x11ac860, 0xc00002ad90, 0xfac100, 0xc000336960, 0x0, 0x40)\n" +
    66  	"\t/go/src/github.com/insolar/assured-ledger/ledger-core/conveyor/smachine/slot_machine_execute.go:34 +0x126\n" +
    67  	"github.com/insolar/assured-ledger/ledger-core/conveyor.(*PulseSlotMachine).stepPresentLoop(0xc000067900, 0x11d51a0, 0xc000336a20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)\n" +
    68  	"\t/go/src/github.com/insolar/assured-ledger/ledger-core/conveyor/sm_pulse_slot.go:207 +0x91\n" +
    69  	"github.com/insolar/assured-ledger/ledger-core/conveyor/smachine.(*executionContext).executeNextStep(0xc000336a20, 0xc000336a20, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)\n" +
    70  	"\t/go/src/github.com/insolar/assured-ledger/ledger-core/conveyor/smachine/context_exec.go:128 +0xfb\n" +
    71  	"github.com/insolar/assured-ledger/ledger-core/conveyor/smachine.(*SlotMachine)._executeSlot.func1(0x11c8fa0, 0xc000336950)\n" +
    72  	"\t/go/src/github.com/insolar/assured-ledger/ledger-core/conveyor/smachine/slot_machine_execute.go:222 +0x200\n" +
    73  	"github.com/insolar/assured-ledger/ledger-core/conveyor/sworker.(*SimpleSlotWorker).DetachableCall(0xc000336930, 0xc000266a80, 0x1912640)\n" +
    74  	"\t/go/src/github.com/insolar/assured-ledger/ledger-core/conveyor/sworker/worker_simple.go:114 +0x49\n" +
    75  	"github.com/insolar/assured-ledger/ledger-core/conveyor/smachine.(*SlotMachine)._executeSlot(0xc0001da000, 0xc000400000, 0x2, 0x11c4bc0, 0xc000336930, 0x2711, 0x0, 0x0)\n" +
    76  	"\t/go/src/github.com/insolar/assured-ledger/ledger-core/conveyor/smachine/slot_machine_execute.go:203 +0x210\n" +
    77  	"github.com/insolar/assured-ledger/ledger-core/conveyor/smachine.(*SlotMachine).executeWorkingSlots(0xc0001da000, 0x6, 0x11c4bc0, 0xc000336930)\n" +
    78  	"\t/go/src/github.com/insolar/assured-ledger/ledger-core/conveyor/smachine/slot_machine_execute.go:183 +0x1ba\n" +
    79  	"github.com/insolar/assured-ledger/ledger-core/conveyor/smachine.(*SlotMachine).ScanOnce(0xc0001da000, 0xc00026ee00, 0x11c4bc0, 0xc000336930, 0xc000447e68, 0x40dcbf, 0x30, 0xf7c160)\n" +
    80  	"\t/go/src/github.com/insolar/assured-ledger/ledger-core/conveyor/smachine/slot_machine_execute.go:120 +0x462\n" +
    81  	"github.com/insolar/assured-ledger/ledger-core/conveyor.(*PulseConveyor).runWorker.func2(0x11c4bc0, 0xc000336930)\n" +
    82  	"\t/go/src/github.com/insolar/assured-ledger/ledger-core/conveyor/conveyor.go:488 +0x67\n" +
    83  	"github.com/insolar/assured-ledger/ledger-core/conveyor/sworker.(*AttachableSimpleSlotWorker).AttachTo(0xc00002ac70, 0xc0001da000, 0xc0001af500, 0xffffffff, 0xc00026ee20, 0x0)\n" +
    84  	"\t/go/src/github.com/insolar/assured-ledger/ledger-core/conveyor/sworker/worker_simple.go:59 +0xda\n" +
    85  	"github.com/insolar/assured-ledger/ledger-core/conveyor.(*PulseConveyor).runWorker(0xc000072f00, 0x0, 0xc0001864e0, 0xc0001b46d0)\n" +
    86  	"\t/go/src/github.com/insolar/assured-ledger/ledger-core/conveyor/conveyor.go:487 +0x1ad\n" +
    87  	testCreatedBy
    88  
    89  const testCreatedBy = "created by github.com/insolar/assured-ledger/ledger-core/conveyor.(*PulseConveyor).StartWorker\n" +
    90  	"\t/go/src/github.com/insolar/assured-ledger/ledger-core/conveyor/conveyor.go:462 +0xe0\n"
    91  
    92  const testBoundary = "github.com/insolar/assured-ledger/ledger-core/conveyor"
    93  
    94  func TestMinimizeDebugStack(t *testing.T) {
    95  	require.Equal(t, []byte(testStackValuable), MinimizeDebugStack([]byte(testStackDebug), testBoundary, false))
    96  	require.Equal(t, []byte(testStackValuable+testStackBoundary), MinimizeDebugStack([]byte(testStackDebug), testBoundary, true))
    97  
    98  	require.Equal(t, []byte(testStackClear), MinimizeDebugStack([]byte(testStackDebug), "not found", false))
    99  	require.Equal(t, []byte(testStackClear), MinimizeDebugStack([]byte(testStackDebug), "not found", true))
   100  
   101  	require.Equal(t, []byte(testStackUseless), MinimizeDebugStack([]byte(testStackUseless), testBoundary, false))
   102  	require.Equal(t, []byte(testStackUseless), MinimizeDebugStack([]byte(testStackUseless), testBoundary, true))
   103  
   104  	require.Equal(t, []byte(testStackUseless), MinimizeDebugStack([]byte(testStackDebugCall+testStackUseless), testBoundary, false))
   105  	require.Equal(t, []byte(testStackUseless), MinimizeDebugStack([]byte(testStackDebugCall+testStackUseless), testBoundary, true))
   106  }
   107  
   108  func TestMinimizePanicStack(t *testing.T) {
   109  	const testPanicValuable = testPanic + testStackValuable
   110  
   111  	require.Equal(t, []byte(testPanicValuable), MinimizePanicStack([]byte(testStackPanic), testBoundary, false))
   112  	require.Equal(t, []byte(testPanicValuable+testStackBoundary), MinimizePanicStack([]byte(testStackPanic), testBoundary, true))
   113  
   114  	require.Equal(t, []byte(testStackPanicNoDebug), MinimizePanicStack([]byte(testStackPanic), "not found", false))
   115  	require.Equal(t, []byte(testStackPanicNoDebug), MinimizePanicStack([]byte(testStackPanic), "not found", true))
   116  
   117  	const testStackPanicUseless = testStackPanicDefer + testPanic + testStackUseless
   118  
   119  	require.Equal(t, []byte(testStackPanicUseless), MinimizePanicStack([]byte(testStackPanicUseless), testBoundary, false))
   120  	require.Equal(t, []byte(testStackPanicUseless), MinimizePanicStack([]byte(testStackPanicUseless), testBoundary, true))
   121  }
   122  
   123  func TestMinimizeMismatchedStack(t *testing.T) {
   124  	require.Equal(t, []byte(testStackValuable), MinimizePanicStack([]byte(testStackDebug), testBoundary, false))
   125  	require.Equal(t, []byte(testStackValuable+testStackBoundary), MinimizePanicStack([]byte(testStackDebug), testBoundary, true))
   126  
   127  	require.Equal(t, []byte(testStackClear), MinimizePanicStack([]byte(testStackDebug), "not found", false))
   128  	require.Equal(t, []byte(testStackClear), MinimizePanicStack([]byte(testStackDebug), "not found", true))
   129  
   130  	require.Equal(t, []byte(testStackUseless), MinimizePanicStack([]byte(testStackUseless), testBoundary, false))
   131  	require.Equal(t, []byte(testStackUseless), MinimizePanicStack([]byte(testStackUseless), testBoundary, true))
   132  
   133  	require.Equal(t, []byte(testStackUseless), MinimizePanicStack([]byte(testStackDebugCall+testStackUseless), testBoundary, false))
   134  	require.Equal(t, []byte(testStackUseless), MinimizePanicStack([]byte(testStackDebugCall+testStackUseless), testBoundary, true))
   135  }
   136  
   137  func TestMinimizeStackTrace(t *testing.T) {
   138  	require.Nil(t, MinimizeStackTrace(nil, testBoundary, false))
   139  	require.Equal(t, testStackValuable,
   140  		MinimizeStackTrace(stackTrace{data: []byte(testStackDebug)}, testBoundary, false).StackTraceAsText())
   141  
   142  	st := StackTrace(stackTrace{data: []byte(testStackUseless)})
   143  	require.Equal(t, st, MinimizeStackTrace(st, testBoundary, false))
   144  }