chromium/ui/display/manager/test/test_native_display_delegate.h

// 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.

#ifndef UI_DISPLAY_MANAGER_TEST_TEST_NATIVE_DISPLAY_DELEGATE_H_
#define UI_DISPLAY_MANAGER_TEST_TEST_NATIVE_DISPLAY_DELEGATE_H_

#include <stdint.h>

#include <vector>

#include "base/containers/flat_map.h"
#include "base/memory/raw_ptr.h"
#include "base/observer_list.h"
#include "ui/display/manager/test/action_logger.h"
#include "ui/display/manager/test/action_logger_util.h"
#include "ui/display/types/display_constants.h"
#include "ui/display/types/native_display_delegate.h"

namespace display {

class ActionLogger;
class DisplaySnapshot;
class NativeDisplayObserver;

namespace test {

constexpr char kTestModesetStr[] = "test-modeset";
constexpr char kCommitModesetStr[] = "commit-modeset";
constexpr char kSeamlessModesetStr[] = "seamless-modeset";
constexpr char kModesetOutcomeFailure[] = "outcome: failure";
constexpr char kModesetOutcomeSuccess[] = "outcome: success";

class TestNativeDisplayDelegate : public NativeDisplayDelegate {
 public:
  // Ownership of |log| remains with the caller.
  explicit TestNativeDisplayDelegate(ActionLogger* log);

  TestNativeDisplayDelegate(const TestNativeDisplayDelegate&) = delete;
  TestNativeDisplayDelegate& operator=(const TestNativeDisplayDelegate&) =
      delete;

  ~TestNativeDisplayDelegate() override;

  void set_max_configurable_pixels(int pixels) {
    max_configurable_pixels_ = pixels;
  }

  void set_system_bandwidth_limit(int bandwidth_limit) {
    system_bandwidth_limit_ = bandwidth_limit;
  }

  void set_get_hdcp_state_expectation(bool success) {
    get_hdcp_expectation_ = success;
  }

  void set_set_hdcp_state_expectation(bool success) {
    set_hdcp_expectation_ = success;
  }

  HDCPState hdcp_state() const { return hdcp_state_; }
  void set_hdcp_state(HDCPState state) { hdcp_state_ = state; }

  ContentProtectionMethod content_protection_method() const {
    return content_protection_method_;
  }
  void set_content_protection_method(
      ContentProtectionMethod protection_method) {
    content_protection_method_ = protection_method;
  }

  void set_run_async(bool run_async) { run_async_ = run_async; }

  const std::vector<raw_ptr<DisplaySnapshot, VectorExperimental>> GetOutputs()
      const;

  // Sets and takes ownership of the provided |outputs|.
  void SetOutputs(std::vector<std::unique_ptr<DisplaySnapshot>> outputs);

  // NativeDisplayDelegate overrides:
  void Initialize() override;
  void TakeDisplayControl(DisplayControlCallback callback) override;
  void RelinquishDisplayControl(DisplayControlCallback callback) override;
  void GetDisplays(GetDisplaysCallback callback) override;
  void Configure(
      const std::vector<display::DisplayConfigurationParams>& config_requests,
      ConfigureCallback callback,
      display::ModesetFlags modeset_flags) override;
  void SetHdcpKeyProp(int64_t display_id,
                      const std::string& key,
                      SetHdcpKeyPropCallback callback) override;
  void GetHDCPState(const DisplaySnapshot& output,
                    GetHDCPStateCallback callback) override;
  void SetHDCPState(const DisplaySnapshot& output,
                    HDCPState state,
                    ContentProtectionMethod protection_method,
                    SetHDCPStateCallback callback) override;
  void SetColorTemperatureAdjustment(
      int64_t display_id,
      const ColorTemperatureAdjustment& cta) override;
  void SetColorCalibration(int64_t display_id,
                           const ColorCalibration& calibration) override;
  void SetGammaAdjustment(int64_t display_id,
                          const GammaAdjustment& gamma) override;
  void SetPrivacyScreen(int64_t display_id,
                        bool enabled,
                        SetPrivacyScreenCallback callback) override;
  void GetSeamlessRefreshRates(
      int64_t display_id,
      GetSeamlessRefreshRatesCallback callback) const override;

  void AddObserver(NativeDisplayObserver* observer) override;
  void RemoveObserver(NativeDisplayObserver* observer) override;
  FakeDisplayController* GetFakeDisplayController() override;

 private:
  bool Configure(
      const display::DisplayConfigurationParams& display_config_params);

  void DoSetHDCPState(int64_t display_id,
                      HDCPState state,
                      ContentProtectionMethod protection_method,
                      SetHDCPStateCallback callback);

  bool IsConfigurationWithinSystemBandwidth(
      const std::vector<display::DisplayConfigurationParams>& config_requests);
  void SaveCurrentConfigSystemBandwidth(
      const std::vector<display::DisplayConfigurationParams>& config_requests);

  // Outputs to be returned by GetDisplays().
  std::vector<std::unique_ptr<DisplaySnapshot>> outputs_;
  // Outputs which are scheduled for deletion after the next invalidation.
  std::vector<std::unique_ptr<DisplaySnapshot>> cached_outputs_;

  // |max_configurable_pixels_| represents the maximum number of pixels that
  // Configure will support.  Tests can use this to force Configure
  // to fail if attempting to set a resolution that is higher than what
  // a device might support under a given circumstance.
  // A value of 0 means that no limit is enforced and Configure will
  // return success regardless of the resolution.
  int max_configurable_pixels_;

  int system_bandwidth_limit_ = 0;
  base::flat_map<int64_t, int> display_id_to_used_system_bw_;

  bool get_hdcp_expectation_;
  bool set_hdcp_expectation_;

  // Result value of GetHDCPState().
  HDCPState hdcp_state_;
  ContentProtectionMethod content_protection_method_;

  // If true, the callbacks are posted on the message loop.
  bool run_async_;

  raw_ptr<ActionLogger, DanglingUntriaged> log_;  // Not owned.

  base::ObserverList<NativeDisplayObserver>::Unchecked observers_;
};

}  // namespace test

}  // namespace display

#endif  // UI_DISPLAY_MANAGER_TEST_TEST_NATIVE_DISPLAY_DELEGATE_H_