1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "gpu/command_buffer/service/transfer_buffer_manager.h"
6
7#include "base/memory/scoped_ptr.h"
8#include "testing/gtest/include/gtest/gtest.h"
9#include "testing/gmock/include/gmock/gmock.h"
10
11using base::SharedMemory;
12
13namespace gpu {
14
15const static size_t kBufferSize = 1024;
16
17class TransferBufferManagerTest : public testing::Test {
18 protected:
19  virtual void SetUp() {
20    TransferBufferManager* manager = new TransferBufferManager();
21    transfer_buffer_manager_.reset(manager);
22    ASSERT_TRUE(manager->Initialize());
23  }
24
25  scoped_ptr<TransferBufferManagerInterface> transfer_buffer_manager_;
26};
27
28TEST_F(TransferBufferManagerTest, ZeroHandleMapsToNull) {
29  EXPECT_TRUE(NULL == transfer_buffer_manager_->GetTransferBuffer(0).get());
30}
31
32TEST_F(TransferBufferManagerTest, NegativeHandleMapsToNull) {
33  EXPECT_TRUE(NULL == transfer_buffer_manager_->GetTransferBuffer(-1).get());
34}
35
36TEST_F(TransferBufferManagerTest, OutOfRangeHandleMapsToNull) {
37  EXPECT_TRUE(NULL == transfer_buffer_manager_->GetTransferBuffer(1).get());
38}
39
40TEST_F(TransferBufferManagerTest, CanRegisterTransferBuffer) {
41  scoped_ptr<base::SharedMemory> shm(new base::SharedMemory());
42  shm->CreateAndMapAnonymous(kBufferSize);
43  base::SharedMemory* shm_raw_pointer = shm.get();
44  scoped_ptr<SharedMemoryBufferBacking> backing(
45      new SharedMemoryBufferBacking(shm.Pass(), kBufferSize));
46  SharedMemoryBufferBacking* backing_raw_ptr = backing.get();
47
48  EXPECT_TRUE(transfer_buffer_manager_->RegisterTransferBuffer(
49      1, backing.PassAs<BufferBacking>()));
50  scoped_refptr<Buffer> registered =
51      transfer_buffer_manager_->GetTransferBuffer(1);
52
53  // Shared-memory ownership is transfered. It should be the same memory.
54  EXPECT_EQ(backing_raw_ptr, registered->backing());
55  EXPECT_EQ(shm_raw_pointer, backing_raw_ptr->shared_memory());
56}
57
58class FakeBufferBacking : public BufferBacking {
59 public:
60  virtual void* GetMemory() const OVERRIDE {
61    return reinterpret_cast<void*>(0xBADF00D0);
62  }
63  virtual size_t GetSize() const OVERRIDE { return 42; }
64  static scoped_ptr<BufferBacking> Make() {
65    return scoped_ptr<BufferBacking>(new FakeBufferBacking);
66  }
67};
68
69TEST_F(TransferBufferManagerTest, CanDestroyTransferBuffer) {
70  EXPECT_TRUE(transfer_buffer_manager_->RegisterTransferBuffer(
71      1, scoped_ptr<BufferBacking>(new FakeBufferBacking)));
72  transfer_buffer_manager_->DestroyTransferBuffer(1);
73  scoped_refptr<Buffer> registered =
74      transfer_buffer_manager_->GetTransferBuffer(1);
75
76  scoped_refptr<Buffer> null_buffer;
77  EXPECT_EQ(null_buffer, registered);
78}
79
80TEST_F(TransferBufferManagerTest, CannotRegregisterTransferBufferId) {
81  EXPECT_TRUE(transfer_buffer_manager_->RegisterTransferBuffer(
82      1, FakeBufferBacking::Make()));
83  EXPECT_FALSE(transfer_buffer_manager_->RegisterTransferBuffer(
84      1, FakeBufferBacking::Make()));
85  EXPECT_FALSE(transfer_buffer_manager_->RegisterTransferBuffer(
86      1, FakeBufferBacking::Make()));
87}
88
89TEST_F(TransferBufferManagerTest, CanReuseTransferBufferIdAfterDestroying) {
90  EXPECT_TRUE(transfer_buffer_manager_->RegisterTransferBuffer(
91      1, FakeBufferBacking::Make()));
92  transfer_buffer_manager_->DestroyTransferBuffer(1);
93  EXPECT_TRUE(transfer_buffer_manager_->RegisterTransferBuffer(
94      1, FakeBufferBacking::Make()));
95}
96
97TEST_F(TransferBufferManagerTest, DestroyUnusedTransferBufferIdDoesNotCrash) {
98  transfer_buffer_manager_->DestroyTransferBuffer(1);
99}
100
101TEST_F(TransferBufferManagerTest, CannotRegisterNullTransferBuffer) {
102  EXPECT_FALSE(transfer_buffer_manager_->RegisterTransferBuffer(
103      0, FakeBufferBacking::Make()));
104}
105
106TEST_F(TransferBufferManagerTest, CannotRegisterNegativeTransferBufferId) {
107  scoped_ptr<base::SharedMemory> shm(new base::SharedMemory());
108  shm->CreateAndMapAnonymous(kBufferSize);
109  EXPECT_FALSE(transfer_buffer_manager_->RegisterTransferBuffer(
110      -1, FakeBufferBacking::Make()));
111}
112
113}  // namespace gpu
114