storj/pkg/accounting/tally/tally_test.go
paul cannon c35b93766d
Unite all cryptographic signing and verifying (#1244)
this change removes the cryptopasta dependency.

a couple possible sources of problem with this change:

 * the encoding used for ECDSA signatures on SignedMessage has changed.
   the encoding employed by cryptopasta was workable, but not the same
   as the encoding used for such signatures in the rest of the world
   (most particularly, on ECDSA signatures in X.509 certificates). I
   think we'll be best served by using one ECDSA signature encoding from
   here on, but if we need to use the old encoding for backwards
   compatibility with existing nodes, that can be arranged.

 * since there's already a breaking change in SignedMessage, I changed
   it to send and receive public keys in raw PKIX format, instead of
   PEM. PEM just adds unhelpful overhead for this case.
2019-02-07 14:39:20 -06:00

83 lines
2.5 KiB
Go

// Copyright (C) 2019 Storj Labs, Inc.
// See LICENSE for copying information.
package tally_test
import (
"context"
"testing"
"time"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"storj.io/storj/internal/testcontext"
"storj.io/storj/internal/testplanet"
"storj.io/storj/pkg/bwagreement/testbwagreement"
"storj.io/storj/pkg/pb"
"storj.io/storj/pkg/piecestore/psserver/psdb"
"storj.io/storj/satellite"
)
func TestQueryNoAgreements(t *testing.T) {
testplanet.Run(t, testplanet.Config{
SatelliteCount: 1, StorageNodeCount: 1, UplinkCount: 1,
}, func(t *testing.T, ctx *testcontext.Context, planet *testplanet.Planet) {
tally := planet.Satellites[0].Accounting.Tally
_, bwTotals, err := tally.QueryBW(ctx)
require.NoError(t, err)
require.Len(t, bwTotals, 0)
})
}
func TestQueryWithBw(t *testing.T) {
testplanet.Run(t, testplanet.Config{
SatelliteCount: 1, StorageNodeCount: 1, UplinkCount: 1,
}, func(t *testing.T, ctx *testcontext.Context, planet *testplanet.Planet) {
db := planet.Satellites[0].DB
sendGeneratedAgreements(ctx, t, db, planet)
tally := planet.Satellites[0].Accounting.Tally
tallyEnd, bwTotals, err := tally.QueryBW(ctx)
require.NoError(t, err)
require.Len(t, bwTotals, 1)
for id, nodeTotals := range bwTotals {
require.Len(t, nodeTotals, 5)
for _, total := range nodeTotals {
require.Equal(t, planet.StorageNodes[0].Identity.ID, id)
require.Equal(t, int64(1000), total)
}
}
err = tally.SaveBWRaw(ctx, tallyEnd, time.Now().UTC(), bwTotals)
require.NoError(t, err)
})
}
func sendGeneratedAgreements(ctx context.Context, t *testing.T, db satellite.DB, planet *testplanet.Planet) {
satID := planet.Satellites[0].Identity
upID := planet.Uplinks[0].Identity
snID := planet.StorageNodes[0].Identity
sender := planet.StorageNodes[0].Agreements.Sender
actions := []pb.BandwidthAction{
pb.BandwidthAction_PUT,
pb.BandwidthAction_GET,
pb.BandwidthAction_GET_AUDIT,
pb.BandwidthAction_GET_REPAIR,
pb.BandwidthAction_PUT_REPAIR,
}
agreements := make([]*psdb.Agreement, len(actions))
for i, action := range actions {
pba, err := testbwagreement.GeneratePayerBandwidthAllocation(action, satID, upID, time.Hour)
require.NoError(t, err)
err = db.CertDB().SavePublicKey(ctx, pba.UplinkId, upID.Leaf.PublicKey)
assert.NoError(t, err)
rba, err := testbwagreement.GenerateRenterBandwidthAllocation(pba, snID.ID, upID, 1000)
require.NoError(t, err)
agreements[i] = &psdb.Agreement{Agreement: *rba}
}
sender.SendAgreementsToSatellite(ctx, satID.ID, agreements)
}