// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // // Proton Mail Bridge is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Proton Mail Bridge is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with Proton Mail Bridge. If not, see . package vault_test import ( "bytes" "runtime" "testing" "github.com/ProtonMail/gluon/async" "github.com/ProtonMail/proton-bridge/v3/internal/vault" "github.com/google/uuid" "github.com/stretchr/testify/require" ) func BenchmarkVault(b *testing.B) { vaultDir, gluonDir := b.TempDir(), b.TempDir() // Create a new vault. s, corrupt, err := vault.New(vaultDir, gluonDir, []byte("my secret key"), async.NoopPanicHandler{}) require.NoError(b, err) require.NoError(b, corrupt) // Add 10kB of cookies to the vault. require.NoError(b, s.SetCookies(bytes.Repeat([]byte("a"), 10_000))) // Create 10 vault users. for idx := 0; idx < 10; idx++ { user, err := s.AddUser(uuid.NewString(), "username", "dummy@proton.me", "authUID", "authRef", []byte("keyPass")) require.NoError(b, err) require.NoError(b, user.SetKeyPass([]byte("new key pass"))) } b.ResetTimer() // Time how quickly we can iterate through the users and get their key pass and bridge pass. for i := 0; i < b.N; i++ { require.NoError(b, s.ForUser(runtime.NumCPU(), func(user *vault.User) error { require.NotEmpty(b, user.KeyPass()) require.NotEmpty(b, user.BridgePass()) return nil })) } }