chromium/chromeos/ash/components/proximity_auth/remote_status_update_unittest.cc

// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chromeos/ash/components/proximity_auth/remote_status_update.h"

#include "base/json/json_reader.h"
#include "base/values.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace proximity_auth {
namespace {

// Parses the |json| into a RemoteStatusUpdate instance.
std::unique_ptr<RemoteStatusUpdate> ParseJson(const std::string& json) {
  std::optional<base::Value> dict = base::JSONReader::Read(json);
  return RemoteStatusUpdate::Deserialize(dict->GetDict());
}

}  // namespace

// Verify that all valid values can be parsed.
TEST(ProximityAuthRemoteStatusUpdateTest, Deserialize_Valid_UserPresent) {
  const char kValidJson[] =
      R"({
        "type": "status_update",
        "user_presence": "present",
        "secure_screen_lock": "enabled",
        "trust_agent": "enabled"
      })";
  std::unique_ptr<RemoteStatusUpdate> parsed_update = ParseJson(kValidJson);
  ASSERT_TRUE(parsed_update);
  EXPECT_EQ(USER_PRESENT, parsed_update->user_presence);
  EXPECT_EQ(SECURE_SCREEN_LOCK_ENABLED,
            parsed_update->secure_screen_lock_state);
  EXPECT_EQ(TRUST_AGENT_ENABLED, parsed_update->trust_agent_state);
}

TEST(ProximityAuthRemoteStatusUpdateTest, Deserialize_Valid_UserAbsent) {
  const char kValidJson[] =
      R"({
        "type": "status_update",
        "user_presence": "absent",
        "secure_screen_lock": "disabled",
        "trust_agent": "disabled"
      })";
  std::unique_ptr<RemoteStatusUpdate> parsed_update = ParseJson(kValidJson);
  ASSERT_TRUE(parsed_update);
  EXPECT_EQ(USER_ABSENT, parsed_update->user_presence);
  EXPECT_EQ(SECURE_SCREEN_LOCK_DISABLED,
            parsed_update->secure_screen_lock_state);
  EXPECT_EQ(TRUST_AGENT_DISABLED, parsed_update->trust_agent_state);
}

TEST(ProximityAuthRemoteStatusUpdateTest, Deserialize_Valid_UserSecondary) {
  const char kValidJson[] =
      R"({
        "type": "status_update",
        "user_presence": "secondary",
        "secure_screen_lock": "disabled",
        "trust_agent": "disabled"
      })";
  std::unique_ptr<RemoteStatusUpdate> parsed_update = ParseJson(kValidJson);
  ASSERT_TRUE(parsed_update);
  EXPECT_EQ(USER_PRESENCE_SECONDARY, parsed_update->user_presence);
  EXPECT_EQ(SECURE_SCREEN_LOCK_DISABLED,
            parsed_update->secure_screen_lock_state);
  EXPECT_EQ(TRUST_AGENT_DISABLED, parsed_update->trust_agent_state);
}

TEST(ProximityAuthRemoteStatusUpdateTest, Deserialize_Valid_UserBackground) {
  const char kValidJson[] =
      R"({
        "type": "status_update",
        "user_presence": "background",
        "secure_screen_lock": "disabled",
        "trust_agent": "disabled"
      })";
  std::unique_ptr<RemoteStatusUpdate> parsed_update = ParseJson(kValidJson);
  ASSERT_TRUE(parsed_update);
  EXPECT_EQ(USER_PRESENCE_BACKGROUND, parsed_update->user_presence);
  EXPECT_EQ(SECURE_SCREEN_LOCK_DISABLED,
            parsed_update->secure_screen_lock_state);
  EXPECT_EQ(TRUST_AGENT_DISABLED, parsed_update->trust_agent_state);
}

TEST(ProximityAuthRemoteStatusUpdateTest, Deserialize_Valid_Unknown) {
  const char kValidJson[] =
      R"({
        "type": "status_update",
        "user_presence": "unknown",
        "secure_screen_lock": "unknown",
        "trust_agent": "unsupported"
      })";
  std::unique_ptr<RemoteStatusUpdate> parsed_update = ParseJson(kValidJson);
  ASSERT_TRUE(parsed_update);
  EXPECT_EQ(USER_PRESENCE_UNKNOWN, parsed_update->user_presence);
  EXPECT_EQ(SECURE_SCREEN_LOCK_STATE_UNKNOWN,
            parsed_update->secure_screen_lock_state);
  EXPECT_EQ(TRUST_AGENT_UNSUPPORTED, parsed_update->trust_agent_state);
}

TEST(ProximityAuthRemoteStatusUpdateTest, Deserialize_MissingUserPresence) {
  const char kJson[] =
      R"({
        "type": "status_update",
        "secure_screen_lock": "enabled",
        "trust_agent": "enabled"
      })";
  std::unique_ptr<RemoteStatusUpdate> parsed_update = ParseJson(kJson);
  EXPECT_FALSE(parsed_update);
}

TEST(ProximityAuthRemoteStatusUpdateTest, Deserialize_MissingSecureScreenLock) {
  const char kJson[] =
      R"({
        "type": "status_update",
        "user_presence": "present",
        "trust_agent": "enabled"
      })";
  std::unique_ptr<RemoteStatusUpdate> parsed_update = ParseJson(kJson);
  EXPECT_FALSE(parsed_update);
}

TEST(ProximityAuthRemoteStatusUpdateTest, Deserialize_MissingTrustAgent) {
  const char kJson[] =
      R"({
        "type": "status_update",
        "user_presence": "present",
        "secure_screen_lock": "enabled"
      })";
  std::unique_ptr<RemoteStatusUpdate> parsed_update = ParseJson(kJson);
  EXPECT_FALSE(parsed_update);
}

TEST(ProximityAuthRemoteStatusUpdateTest, Deserialize_InvalidType) {
  const char kJson[] =
      R"({
        "type": "garbage",
        "user_presence": "present",
        "secure_screen_lock": "enabled",
        "trust_agent": "enabled"
      })";
  std::unique_ptr<RemoteStatusUpdate> parsed_update = ParseJson(kJson);
  EXPECT_FALSE(parsed_update);
}

TEST(ProximityAuthRemoteStatusUpdateTest, Deserialize_InvalidPresence) {
  const char kJson[] =
      R"({
        "type": "status_update",
        "user_presence": "garbage",
        "secure_screen_lock": "enabled",
        "trust_agent": "enabled"
      })";
  std::unique_ptr<RemoteStatusUpdate> parsed_update = ParseJson(kJson);
  EXPECT_FALSE(parsed_update);
}

TEST(ProximityAuthRemoteStatusUpdateTest, Deserialize_InvalidLock) {
  const char kJson[] =
      R"({
        "type": "status_update",
        "user_presence": "present",
        "secure_screen_lock": "garbage",
        "trust_agent": "enabled"
      })";
  std::unique_ptr<RemoteStatusUpdate> parsed_update = ParseJson(kJson);
  EXPECT_FALSE(parsed_update);
}

TEST(ProximityAuthRemoteStatusUpdateTest, Deserialize_InvalidAgent) {
  const char kJson[] =
      R"({
        "type": "status_update",
        "user_presence": "present",
        "secure_screen_lock": "enabled",
        "trust_agent": "garbage"
      })";
  std::unique_ptr<RemoteStatusUpdate> parsed_update = ParseJson(kJson);
  EXPECT_FALSE(parsed_update);
}

// Verify that extra fields do not prevent parsing. This provides
// forward-compatibility.
TEST(ProximityAuthRemoteStatusUpdateTest,
     Deserialize_ValidStatusWithExtraFields) {
  const char kJson[] =
      R"({
        "type": "status_update",
        "user_presence": "present",
        "secure_screen_lock": "enabled",
        "trust_agent": "enabled",
        "secret_sauce": "chipotle"
      })";
  std::unique_ptr<RemoteStatusUpdate> parsed_update = ParseJson(kJson);
  ASSERT_TRUE(parsed_update);
  EXPECT_EQ(USER_PRESENT, parsed_update->user_presence);
  EXPECT_EQ(SECURE_SCREEN_LOCK_ENABLED,
            parsed_update->secure_screen_lock_state);
  EXPECT_EQ(TRUST_AGENT_ENABLED, parsed_update->trust_agent_state);
}

}  // namespace proximity_auth