blob: 6b9ae29bd9587b7d1cf8c3eedb4b865b699cc7ce [file] [log] [blame]
// Copyright 2015 The Weave Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "src/privet/auth_manager.h"
#include <gtest/gtest.h>
#include <weave/settings.h>
namespace weave {
namespace privet {
class AuthManagerTest : public testing::Test {
public:
void SetUp() override {}
protected:
const base::Time time_ = base::Time::FromTimeT(1410000000);
AuthManager auth_{{}, {}};
};
TEST_F(AuthManagerTest, RandomSecret) {
EXPECT_GE(auth_.GetSecret().size(), 32u);
}
TEST_F(AuthManagerTest, DifferentSecret) {
AuthManager auth{{}, {}};
EXPECT_NE(auth_.GetSecret(), auth.GetSecret());
}
TEST_F(AuthManagerTest, Constructor) {
std::vector<uint8_t> secret;
std::vector<uint8_t> fingerpint;
for (uint8_t i = 0; i < 32; ++i) {
secret.push_back(i);
fingerpint.push_back(i + 100);
}
AuthManager auth{secret, fingerpint};
EXPECT_EQ(secret, auth.GetSecret());
EXPECT_EQ(fingerpint, auth.GetCertificateFingerprint());
}
TEST_F(AuthManagerTest, CreateSameToken) {
EXPECT_EQ(auth_.CreateAccessToken(UserInfo{AuthScope::kViewer, 555}, time_),
auth_.CreateAccessToken(UserInfo{AuthScope::kViewer, 555}, time_));
}
TEST_F(AuthManagerTest, CreateTokenDifferentScope) {
EXPECT_NE(auth_.CreateAccessToken(UserInfo{AuthScope::kViewer, 456}, time_),
auth_.CreateAccessToken(UserInfo{AuthScope::kOwner, 456}, time_));
}
TEST_F(AuthManagerTest, CreateTokenDifferentUser) {
EXPECT_NE(auth_.CreateAccessToken(UserInfo{AuthScope::kOwner, 456}, time_),
auth_.CreateAccessToken(UserInfo{AuthScope::kOwner, 789}, time_));
}
TEST_F(AuthManagerTest, CreateTokenDifferentTime) {
EXPECT_NE(auth_.CreateAccessToken(UserInfo{AuthScope::kOwner, 567}, time_),
auth_.CreateAccessToken(UserInfo{AuthScope::kOwner, 567},
base::Time::FromTimeT(1400000000)));
}
TEST_F(AuthManagerTest, CreateTokenDifferentInstance) {
EXPECT_NE(auth_.CreateAccessToken(UserInfo{AuthScope::kUser, 123}, time_),
AuthManager({}, {})
.CreateAccessToken(UserInfo{AuthScope::kUser, 123}, time_));
}
TEST_F(AuthManagerTest, ParseAccessToken) {
// Multiple attempts with random secrets.
for (size_t i = 0; i < 1000; ++i) {
AuthManager auth{{}, {}};
auto token = auth.CreateAccessToken(UserInfo{AuthScope::kUser, 5}, time_);
base::Time time2;
EXPECT_EQ(AuthScope::kUser, auth.ParseAccessToken(token, &time2).scope());
EXPECT_EQ(5u, auth.ParseAccessToken(token, &time2).user_id());
// Token timestamp resolution is one second.
EXPECT_GE(1, std::abs((time_ - time2).InSeconds()));
}
}
} // namespace privet
} // namespace weave