| Index: ppapi/shared_impl/circular_buffer_unittest.cc
|
| diff --git a/ppapi/shared_impl/circular_buffer_unittest.cc b/ppapi/shared_impl/circular_buffer_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..a5de5500d9570435c026da2a8e831e4f19664664
|
| --- /dev/null
|
| +++ b/ppapi/shared_impl/circular_buffer_unittest.cc
|
| @@ -0,0 +1,223 @@
|
| +// Copyright (c) 2011 The Chromium 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 "base/compiler_specific.h"
|
| +#include "ppapi/c/pp_errors.h"
|
| +#include "ppapi/shared_impl/circular_buffer.h"
|
| +#include "ppapi/shared_impl/test_globals.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +namespace ppapi {
|
| +
|
| +typedef testing::Test CircularBufferTest;
|
| +
|
| +TEST_F(CircularBufferTest, TestWrite) {
|
| + {
|
| + char buf[] = "0123456789EEEE";
|
| + scoped_ptr<CircularBuffer> cb(new CircularBuffer(buf, 10));
|
| +
|
| + cb->MoveLimit(10);
|
| + EXPECT_EQ(10u, cb->remaining());
|
| +
|
| + EXPECT_EQ(2, cb->Write("AB", 2));
|
| + EXPECT_EQ(8U, cb->remaining());
|
| + EXPECT_STREQ("AB23456789EEEE", buf);
|
| +
|
| + EXPECT_EQ(4, cb->WriteAll("ABCD", 4));
|
| + EXPECT_EQ(4U, cb->remaining());
|
| + EXPECT_STREQ("ABABCD6789EEEE", buf);
|
| + }
|
| +
|
| + {
|
| + char buf[] = "0123456789EEEE";
|
| + scoped_ptr<CircularBuffer> cb(new CircularBuffer(buf, 10));
|
| +
|
| + cb->MoveLimit(10);
|
| + cb->MovePosition(8);
|
| + EXPECT_EQ(2U, cb->remaining());
|
| +
|
| + // Do not have enough space for 4 bytes
|
| + EXPECT_EQ(PP_ERROR_NOSPACE, cb->WriteAll("ABCD", 4));
|
| + EXPECT_EQ(2U, cb->remaining());
|
| + EXPECT_STREQ("0123456789EEEE", buf);
|
| +
|
| + EXPECT_EQ(2, cb->Write("ABCD", 4));
|
| + EXPECT_EQ(0U, cb->remaining());
|
| + EXPECT_STREQ("01234567ABEEEE", buf);
|
| + }
|
| +
|
| + {
|
| + char buf[] = "0123456789EEEE";
|
| + scoped_ptr<CircularBuffer> cb(new CircularBuffer(buf, 10));
|
| +
|
| + // Make the available range cross border of the buf.
|
| + cb->MoveLimit(10);
|
| + cb->MovePosition(8);
|
| + EXPECT_EQ(2U, cb->remaining());
|
| +
|
| + cb->MoveLimit(2);
|
| + EXPECT_EQ(4U, cb->remaining());
|
| +
|
| + EXPECT_EQ(PP_ERROR_NOSPACE, cb->WriteAll("ABCDEF", 6));
|
| + EXPECT_EQ(4U, cb->remaining());
|
| + EXPECT_STREQ("0123456789EEEE", buf);
|
| +
|
| + EXPECT_EQ(4, cb->Write("ABCDEF", 6));
|
| + EXPECT_EQ(0U, cb->remaining());
|
| + EXPECT_STREQ("CD234567ABEEEE", buf);
|
| + }
|
| +}
|
| +
|
| +TEST_F(CircularBufferTest, TestRead) {
|
| + {
|
| + char buf[] = "0123456789EEEE";
|
| + scoped_ptr<CircularBuffer> cb(new CircularBuffer(buf, 10));
|
| +
|
| + cb->MoveLimit(10);
|
| + EXPECT_EQ(10u, cb->remaining());
|
| +
|
| + {
|
| + char buf1[] = "AAAAAA";
|
| + EXPECT_EQ(2, cb->Read(buf1, 2));
|
| + EXPECT_EQ(8U, cb->remaining());
|
| + EXPECT_STREQ("01AAAA", buf1);
|
| + }
|
| +
|
| + {
|
| + char buf1[] = "AAAAAA";
|
| + EXPECT_EQ(4, cb->ReadAll(buf1, 4));
|
| + EXPECT_EQ(4U, cb->remaining());
|
| + EXPECT_STREQ("2345AA", buf1);
|
| + }
|
| + EXPECT_STREQ("0123456789EEEE", buf);
|
| + }
|
| +
|
| + {
|
| + char buf[] = "0123456789EEEE";
|
| + scoped_ptr<CircularBuffer> cb(new CircularBuffer(buf, 10));
|
| +
|
| + cb->MoveLimit(10);
|
| + cb->MovePosition(8);
|
| + EXPECT_EQ(2U, cb->remaining());
|
| +
|
| + // Do not have enough space for 4 bytes
|
| + char buf1[] = "AAAAAA";
|
| + EXPECT_EQ(PP_ERROR_NOSPACE, cb->ReadAll(buf1, 4));
|
| + EXPECT_EQ(2U, cb->remaining());
|
| + EXPECT_STREQ("AAAAAA", buf1);
|
| +
|
| + EXPECT_EQ(2, cb->Read(buf1, 4));
|
| + EXPECT_EQ(0U, cb->remaining());
|
| + EXPECT_STREQ("89AAAA", buf1);
|
| +
|
| + EXPECT_STREQ("0123456789EEEE", buf);
|
| + }
|
| +
|
| + {
|
| + char buf[] = "0123456789EEEE";
|
| + scoped_ptr<CircularBuffer> cb(new CircularBuffer(buf, 10));
|
| +
|
| + // Make the available range cross border of the buf.
|
| + cb->MoveLimit(10);
|
| + cb->MovePosition(8);
|
| + EXPECT_EQ(2U, cb->remaining());
|
| +
|
| + cb->MoveLimit(2);
|
| + EXPECT_EQ(4U, cb->remaining());
|
| +
|
| + char buf1[] = "AAAAAA";
|
| + EXPECT_EQ(PP_ERROR_NOSPACE, cb->ReadAll(buf1, 6));
|
| + EXPECT_EQ(4U, cb->remaining());
|
| + EXPECT_STREQ("AAAAAA", buf1);
|
| +
|
| + EXPECT_EQ(4, cb->Read(buf1, 6));
|
| + EXPECT_EQ(0U, cb->remaining());
|
| + EXPECT_STREQ("8901AA", buf1);
|
| +
|
| + EXPECT_STREQ("0123456789EEEE", buf);
|
| + }
|
| +}
|
| +
|
| +TEST_F(CircularBufferTest, TestLock) {
|
| + {
|
| + char buf[] = "0123456789EEEE";
|
| + char *p = NULL;
|
| + char *p1 = NULL;
|
| + scoped_ptr<CircularBuffer> cb(new CircularBuffer(buf, 10));
|
| +
|
| + cb->MoveLimit(8);
|
| + cb->MovePosition(2);
|
| + EXPECT_EQ(6U, cb->remaining());
|
| +
|
| + EXPECT_EQ(PP_ERROR_NOSPACE, cb->Lock(reinterpret_cast<void**>(&p), 8));
|
| +
|
| + EXPECT_EQ(PP_OK, cb->Lock(reinterpret_cast<void**>(&p), 2));
|
| + EXPECT_STREQ(buf + 2, p);
|
| +
|
| + EXPECT_STREQ("23456789EEEE", p);
|
| +
|
| + p[0] = 'A';
|
| + p[1] = 'B';
|
| + EXPECT_STREQ("01AB456789EEEE", buf);
|
| +
|
| + // Write with the CricularBuffer locked.
|
| + EXPECT_EQ(PP_ERROR_INPROGRESS, cb->Write("CD", 2));
|
| + EXPECT_EQ(PP_ERROR_INPROGRESS, cb->WriteAll("CD", 2));
|
| +
|
| + // Read with the CricularBuffer locked.
|
| + char buf1[2];
|
| + EXPECT_EQ(PP_ERROR_INPROGRESS, cb->Read(buf1, 2));
|
| + EXPECT_EQ(PP_ERROR_INPROGRESS, cb->ReadAll(buf1, 2));
|
| +
|
| + // Lock the CricularBuffer again.
|
| + EXPECT_EQ(PP_ERROR_INPROGRESS, cb->Lock(reinterpret_cast<void**>(&p1), 2));
|
| +
|
| + // Unlock with an invalid pointer.
|
| + EXPECT_EQ(PP_ERROR_BADARGUMENT, cb->Unlock(p + 1));
|
| + EXPECT_EQ(2, cb->Unlock(p));
|
| + EXPECT_EQ(4U, cb->remaining());
|
| +
|
| + EXPECT_EQ(PP_OK, cb->Lock(reinterpret_cast<void**>(&p1), 2));
|
| + EXPECT_STREQ(buf + 4, p1);
|
| +
|
| + EXPECT_EQ(2, cb->Unlock(p1));
|
| + EXPECT_EQ(2U, cb->remaining());
|
| + }
|
| +
|
| + {
|
| + char buf[] = "0123456789EEEE";
|
| + char *p = NULL;
|
| + scoped_ptr<CircularBuffer> cb(new CircularBuffer(buf, 10));
|
| +
|
| + // Make the available range cross border of the buf.
|
| + cb->MoveLimit(10);
|
| + cb->MovePosition(5);
|
| + EXPECT_EQ(5U, cb->remaining());
|
| +
|
| + cb->MoveLimit(5);
|
| + EXPECT_EQ(10U, cb->remaining());
|
| +
|
| + // Try Lock a range cross border of the buf.
|
| + EXPECT_EQ(PP_ERROR_FAILED, cb->Lock(reinterpret_cast<void**>(&p), 8));
|
| +
|
| + EXPECT_EQ(PP_OK, cb->Lock(reinterpret_cast<void**>(&p), 5));
|
| + EXPECT_EQ(buf + 5, p);
|
| + EXPECT_EQ(5, cb->Unlock(p));
|
| + }
|
| +}
|
| +
|
| +TEST_F(CircularBufferTest, TestCrash) {
|
| + char buf[] = "0123456789EEEE";
|
| + scoped_ptr<CircularBuffer> cb(new CircularBuffer(buf, 10));
|
| +
|
| + cb->MoveLimit(10);
|
| + EXPECT_EQ(10u, cb->remaining());
|
| +
|
| + EXPECT_DEATH(cb->MoveLimit(1), ".*Check failed:.*");
|
| +
|
| + cb->MovePosition(8);
|
| + EXPECT_DEATH(cb->MovePosition(3), ".*Check failed:.*");
|
| +}
|
| +
|
| +} // namespace ppapi
|
|
|