1// Copyright (C) 2021 Storj Labs, Inc.
2// See LICENSE for copying information.
3
4package reputation_test
5
6import (
7	"context"
8	"testing"
9	"time"
10
11	"github.com/stretchr/testify/require"
12
13	"storj.io/common/storj"
14	"storj.io/common/testrand"
15	"storj.io/storj/satellite"
16	"storj.io/storj/satellite/reputation"
17	"storj.io/storj/satellite/satellitedb/satellitedbtest"
18)
19
20func BenchmarkReputation(b *testing.B) {
21	satellitedbtest.Bench(b, func(b *testing.B, db satellite.DB) {
22		const (
23			TotalNodeCount = 211
24			OfflineCount   = 10
25		)
26
27		reputationdb := db.Reputation()
28		ctx := context.Background()
29
30		var all []storj.NodeID
31		for i := 0; i < TotalNodeCount; i++ {
32			id := testrand.NodeID()
33			all = append(all, id)
34		}
35
36		b.Run("UpdateStatsSuccess", func(b *testing.B) {
37			for i := 0; i < b.N; i++ {
38				id := all[i%len(all)]
39				_, _, err := reputationdb.Update(ctx, reputation.UpdateRequest{
40					NodeID:       id,
41					AuditOutcome: reputation.AuditSuccess,
42					AuditHistory: testAuditHistoryConfig(),
43				}, time.Now())
44				require.NoError(b, err)
45			}
46		})
47
48		b.Run("UpdateStatsFailure", func(b *testing.B) {
49			for i := 0; i < b.N; i++ {
50				id := all[i%len(all)]
51				_, _, err := reputationdb.Update(ctx, reputation.UpdateRequest{
52					NodeID:       id,
53					AuditOutcome: reputation.AuditFailure,
54					AuditHistory: testAuditHistoryConfig(),
55				}, time.Now())
56				require.NoError(b, err)
57			}
58		})
59
60		b.Run("UpdateStatsUnknown", func(b *testing.B) {
61			for i := 0; i < b.N; i++ {
62				id := all[i%len(all)]
63				_, _, err := reputationdb.Update(ctx, reputation.UpdateRequest{
64					NodeID:       id,
65					AuditOutcome: reputation.AuditUnknown,
66					AuditHistory: testAuditHistoryConfig(),
67				}, time.Now())
68				require.NoError(b, err)
69			}
70		})
71
72		b.Run("UpdateStatsOffline", func(b *testing.B) {
73			for i := 0; i < b.N; i++ {
74				id := all[i%len(all)]
75				_, _, err := reputationdb.Update(ctx, reputation.UpdateRequest{
76					NodeID:       id,
77					AuditOutcome: reputation.AuditOffline,
78					AuditHistory: testAuditHistoryConfig(),
79				}, time.Now())
80				require.NoError(b, err)
81			}
82		})
83	})
84}
85