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

#include "gpu/command_buffer/common/activity_flags.h"

#include "base/memory/unsafe_shared_memory_region.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace gpu {

TEST(ActivityFlagsTest, BasicUsage) {
  // Create the host activity flags.
  GpuProcessHostActivityFlags host_flags;
  EXPECT_FALSE(
      host_flags.IsFlagSet(ActivityFlagsBase::FLAG_LOADING_PROGRAM_BINARY));

  // Create the service activity flags from host memory.
  GpuProcessActivityFlags service_flags(host_flags.CloneRegion());

  // Ensure we can set and re-set flags.
  {
    GpuProcessActivityFlags::ScopedSetFlag scoped_set_flag(
        &service_flags, ActivityFlagsBase::FLAG_LOADING_PROGRAM_BINARY);
    EXPECT_TRUE(
        host_flags.IsFlagSet(ActivityFlagsBase::FLAG_LOADING_PROGRAM_BINARY));
  }
  EXPECT_FALSE(
      host_flags.IsFlagSet(ActivityFlagsBase::FLAG_LOADING_PROGRAM_BINARY));
}

TEST(ActivityFlagsTest, NotInitialized) {
  // Get the service activity flags without providing host memory.
  GpuProcessActivityFlags service_flags{base::UnsafeSharedMemoryRegion()};

  // Set/Unset should not crash.
  {
    GpuProcessActivityFlags::ScopedSetFlag scoped_set_flag(
        &service_flags, ActivityFlagsBase::FLAG_LOADING_PROGRAM_BINARY);
  }
}

}  // namespace gpu