// Copyright 2019 The Fuchsia 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 "permissions.h"

#include "gtest/gtest.h"

namespace bt {
namespace att {
namespace {

const AccessRequirements kDisallowed;
const AccessRequirements kNoSecurityReq(false, false, false);
const AccessRequirements kEncryptionReq(true, false, false);
const AccessRequirements kAuthenticationReq(false, true, false);
const AccessRequirements kAuthorizationReq(false, false, true);

const sm::SecurityProperties kNoSecurity(sm::SecurityLevel::kNoSecurity, 16,
                                         false);
const sm::SecurityProperties kEncrypted(sm::SecurityLevel::kEncrypted, 16,
                                        false);
const sm::SecurityProperties kAuthenticated(sm::SecurityLevel::kAuthenticated,
                                            16, false);

TEST(ATT_PermissionsTest, ReadNotPermittedWhenDisallowed) {
  EXPECT_EQ(ErrorCode::kReadNotPermitted,
            CheckReadPermissions(kDisallowed, kNoSecurity));
  EXPECT_EQ(ErrorCode::kReadNotPermitted,
            CheckReadPermissions(kDisallowed, kEncrypted));
  EXPECT_EQ(ErrorCode::kReadNotPermitted,
            CheckReadPermissions(kDisallowed, kAuthenticated));
}

TEST(ATT_PermissionsTest, WriteNotPermittedWhenDisallowed) {
  EXPECT_EQ(ErrorCode::kWriteNotPermitted,
            CheckWritePermissions(kDisallowed, kNoSecurity));
  EXPECT_EQ(ErrorCode::kWriteNotPermitted,
            CheckWritePermissions(kDisallowed, kEncrypted));
  EXPECT_EQ(ErrorCode::kWriteNotPermitted,
            CheckWritePermissions(kDisallowed, kAuthenticated));
}

TEST(ATT_PermissionsTest, LinkNotSecure) {
  EXPECT_EQ(ErrorCode::kNoError,
            CheckReadPermissions(kNoSecurityReq, kNoSecurity));
  EXPECT_EQ(ErrorCode::kNoError,
            CheckWritePermissions(kNoSecurityReq, kNoSecurity));

  EXPECT_EQ(ErrorCode::kInsufficientAuthentication,
            CheckReadPermissions(kEncryptionReq, kNoSecurity));
  EXPECT_EQ(ErrorCode::kInsufficientAuthentication,
            CheckWritePermissions(kEncryptionReq, kNoSecurity));

  EXPECT_EQ(ErrorCode::kInsufficientAuthentication,
            CheckReadPermissions(kAuthenticationReq, kNoSecurity));
  EXPECT_EQ(ErrorCode::kInsufficientAuthentication,
            CheckWritePermissions(kAuthenticationReq, kNoSecurity));

  EXPECT_EQ(ErrorCode::kInsufficientAuthentication,
            CheckReadPermissions(kAuthorizationReq, kNoSecurity));
  EXPECT_EQ(ErrorCode::kInsufficientAuthentication,
            CheckWritePermissions(kAuthorizationReq, kNoSecurity));
}

TEST(ATT_PermissionsTest, LinkEncrypted) {
  EXPECT_EQ(ErrorCode::kNoError,
            CheckReadPermissions(kNoSecurityReq, kEncrypted));
  EXPECT_EQ(ErrorCode::kNoError,
            CheckWritePermissions(kNoSecurityReq, kEncrypted));

  EXPECT_EQ(ErrorCode::kNoError,
            CheckReadPermissions(kEncryptionReq, kEncrypted));
  EXPECT_EQ(ErrorCode::kNoError,
            CheckWritePermissions(kEncryptionReq, kEncrypted));

  EXPECT_EQ(ErrorCode::kInsufficientAuthentication,
            CheckReadPermissions(kAuthenticationReq, kEncrypted));
  EXPECT_EQ(ErrorCode::kInsufficientAuthentication,
            CheckWritePermissions(kAuthenticationReq, kEncrypted));

  EXPECT_EQ(ErrorCode::kInsufficientAuthentication,
            CheckReadPermissions(kAuthorizationReq, kEncrypted));
  EXPECT_EQ(ErrorCode::kInsufficientAuthentication,
            CheckWritePermissions(kAuthorizationReq, kEncrypted));
}

TEST(ATT_PermissionsTest, LinkAuthenticated) {
  EXPECT_EQ(ErrorCode::kNoError,
            CheckReadPermissions(kNoSecurityReq, kAuthenticated));
  EXPECT_EQ(ErrorCode::kNoError,
            CheckWritePermissions(kNoSecurityReq, kAuthenticated));

  EXPECT_EQ(ErrorCode::kNoError,
            CheckReadPermissions(kEncryptionReq, kAuthenticated));
  EXPECT_EQ(ErrorCode::kNoError,
            CheckWritePermissions(kEncryptionReq, kAuthenticated));

  EXPECT_EQ(ErrorCode::kNoError,
            CheckReadPermissions(kAuthenticationReq, kAuthenticated));
  EXPECT_EQ(ErrorCode::kNoError,
            CheckWritePermissions(kAuthenticationReq, kAuthenticated));

  EXPECT_EQ(ErrorCode::kNoError,
            CheckReadPermissions(kAuthorizationReq, kAuthenticated));
  EXPECT_EQ(ErrorCode::kNoError,
            CheckWritePermissions(kAuthorizationReq, kAuthenticated));
}

}  // namespace
}  // namespace att
}  // namespace bt
