# -------------------------------------------------------------
# In this test a store (n1, s1) acts as a provider of
# support from another store (n2, s2).
# -------------------------------------------------------------

# -------------------------------------------------------------
# Store (n1, s1) provides support.
# -------------------------------------------------------------

handle-messages
  msg type=MsgHeartbeat from-node-id=2 from-store-id=2 epoch=1 expiration=100
----
responses:
{Type:MsgHeartbeatResp From:{NodeID:1 StoreID:1} To:{NodeID:2 StoreID:2} Epoch:1 Expiration:100.000000000,0}

support-for node-id=2 store-id=2
----
epoch: 1, support provided: true

# -------------------------------------------------------------
# Store (n1, s1) does not provide support for an unknown store.
# -------------------------------------------------------------

support-for node-id=3 store-id=3
----
epoch: 0, support provided: false

# -------------------------------------------------------------
# Store (n1, s1) extends support.
# -------------------------------------------------------------

handle-messages
  msg type=MsgHeartbeat from-node-id=2 from-store-id=2 epoch=1 expiration=200
----
responses:
{Type:MsgHeartbeatResp From:{NodeID:1 StoreID:1} To:{NodeID:2 StoreID:2} Epoch:1 Expiration:200.000000000,0}

support-for node-id=2 store-id=2
----
epoch: 1, support provided: true


# -------------------------------------------------------------
# Store (n1, s1) attempts to withdraw support but doesn't.
# -------------------------------------------------------------

withdraw-support now=199
----

support-for node-id=2 store-id=2
----
epoch: 1, support provided: true


# -------------------------------------------------------------
# Store (n1, s1) withdraws support.
# -------------------------------------------------------------

withdraw-support now=201
----

support-for node-id=2 store-id=2
----
epoch: 2, support provided: false

debug-supporter-state
----
meta:
{MaxWithdrawn:201.000000000,0}
support for:
{Target:{NodeID:2 StoreID:2} Epoch:2 Expiration:0,0}


# -------------------------------------------------------------
# Store (n1, s1) provides support at a higher epoch.
# -------------------------------------------------------------

handle-messages
  msg type=MsgHeartbeat from-node-id=2 from-store-id=2 epoch=2 expiration=300
----
responses:
{Type:MsgHeartbeatResp From:{NodeID:1 StoreID:1} To:{NodeID:2 StoreID:2} Epoch:2 Expiration:300.000000000,0}

support-for node-id=2 store-id=2
----
epoch: 2, support provided: true


# -------------------------------------------------------------
# Store (n1, s1) does not regress support epoch or expiration.
# -------------------------------------------------------------

handle-messages
  msg type=MsgHeartbeat from-node-id=2 from-store-id=2 epoch=1 expiration=301
----
responses:
{Type:MsgHeartbeatResp From:{NodeID:1 StoreID:1} To:{NodeID:2 StoreID:2} Epoch:2 Expiration:300.000000000,0}

support-for node-id=2 store-id=2
----
epoch: 2, support provided: true

handle-messages
  msg type=MsgHeartbeat from-node-id=2 from-store-id=2 epoch=2 expiration=299
----
responses:
{Type:MsgHeartbeatResp From:{NodeID:1 StoreID:1} To:{NodeID:2 StoreID:2} Epoch:2 Expiration:300.000000000,0}

support-for node-id=2 store-id=2
----
epoch: 2, support provided: true


# -------------------------------------------------------------
# Store (n1, s1) provides support even if the expiration is in
# the past.
# -------------------------------------------------------------

send-heartbeats now=301 support-duration=10s # just to forward the clock
----
heartbeats:

support-for node-id=2 store-id=2
----
epoch: 2, support provided: true

debug-supporter-state
----
meta:
{MaxWithdrawn:201.000000000,0}
support for:
{Target:{NodeID:2 StoreID:2} Epoch:2 Expiration:300.000000000,0}


# -------------------------------------------------------------
# Store (n1, s1) fails to write the support state.
# -------------------------------------------------------------

error-on-write on=true
----

handle-messages
  msg type=MsgHeartbeat from-node-id=2 from-store-id=2 epoch=3 expiration=400
----

withdraw-support now=400
----

error-on-write on=false
----

debug-supporter-state
----
meta:
{MaxWithdrawn:201.000000000,0}
support for:
{Target:{NodeID:2 StoreID:2} Epoch:2 Expiration:300.000000000,0}

debug-metrics
----
HeartbeatSuccess: 0, HeartbeatFailure: 0
MessageHandleSuccess: 5, MessageHandleFailure: 1
SupportWithdrawSuccess: 1, SupportWithdrawFailure: 1
SupportFromStores: 0, SupportForStores: 1
