blob: 5c7f0e579ba779c4c8cd6efdcaf75354dd229399 [file] [log] [blame]
/* Copyright (c) 2013 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 <errno.h>
#include <fcntl.h>
#include <pthread.h>
#include <stdio.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <sys/time.h>
#include "gtest/gtest.h"
#include "nacl_io/fifo_char.h"
#include "nacl_io/fifo_null.h"
#include "nacl_io/fifo_packet.h"
#include "nacl_io/packet.h"
#include "ppapi_simple/ps.h"
using namespace nacl_io;
namespace {
const size_t kTestSize = 32;
const size_t kHalfSize = 16;
const size_t kQuarterSize = 8;
};
TEST(FIFONull, Basic) {
FIFONull fifo;
EXPECT_FALSE(fifo.IsFull());
EXPECT_FALSE(fifo.IsEmpty());
EXPECT_LT(0, fifo.ReadAvailable());
EXPECT_LT(0, fifo.WriteAvailable());
}
TEST(FIFOChar, Wrap) {
char temp_wr[kTestSize * 2];
char temp_rd[kTestSize * 2];
size_t wr_offs = 0;
size_t rd_offs = 0;
FIFOChar fifo(kTestSize);
memset(temp_rd, 0, sizeof(temp_rd));
for (size_t index = 0; index < sizeof(temp_wr); index++)
temp_wr[index] = index;
EXPECT_TRUE(fifo.IsEmpty());
EXPECT_FALSE(fifo.IsFull());
// Wrap read and write differently, and verify copy is correct
EXPECT_EQ(0, fifo.ReadAvailable());
EXPECT_EQ(kTestSize, fifo.WriteAvailable());
wr_offs += fifo.Write(temp_wr, kHalfSize);
EXPECT_EQ(kHalfSize, wr_offs);
EXPECT_FALSE(fifo.IsEmpty());
EXPECT_FALSE(fifo.IsFull());
rd_offs += fifo.Read(temp_rd, kQuarterSize);
EXPECT_EQ(kQuarterSize, rd_offs);
EXPECT_FALSE(fifo.IsEmpty());
EXPECT_FALSE(fifo.IsFull());
wr_offs += fifo.Write(&temp_wr[wr_offs], kTestSize);
EXPECT_EQ(kTestSize + kQuarterSize, wr_offs);
EXPECT_FALSE(fifo.IsEmpty());
rd_offs += fifo.Read(&temp_rd[rd_offs], kTestSize);
EXPECT_EQ(kTestSize + kQuarterSize, rd_offs);
EXPECT_TRUE(fifo.IsEmpty());
EXPECT_FALSE(fifo.IsFull());
for (size_t index = 0; index < kQuarterSize + kTestSize; index++)
EXPECT_EQ((char) index, temp_rd[index]);
}
TEST(FIFOPacket, Packets) {
char temp_wr[kTestSize];
FIFOPacket fifo(kTestSize);
Packet* pkt0 = new Packet(NULL);
Packet* pkt1 = new Packet(NULL);
pkt0->Copy(temp_wr, kHalfSize, 0);
pkt1->Copy(temp_wr, kTestSize, 0);
EXPECT_TRUE(fifo.IsEmpty());
EXPECT_FALSE(fifo.IsFull());
EXPECT_EQ(0, fifo.ReadAvailable());
EXPECT_EQ(kTestSize, fifo.WriteAvailable());
fifo.WritePacket(pkt0);
EXPECT_FALSE(fifo.IsEmpty());
EXPECT_FALSE(fifo.IsFull());
EXPECT_EQ(kHalfSize, fifo.ReadAvailable());
EXPECT_EQ(kHalfSize, fifo.WriteAvailable());
fifo.WritePacket(pkt1);
EXPECT_FALSE(fifo.IsEmpty());
EXPECT_TRUE(fifo.IsFull());
EXPECT_EQ(kHalfSize + kTestSize, fifo.ReadAvailable());
EXPECT_EQ(0, fifo.WriteAvailable());
EXPECT_EQ(pkt0, fifo.ReadPacket());
EXPECT_FALSE(fifo.IsEmpty());
EXPECT_TRUE(fifo.IsFull());
EXPECT_EQ(kTestSize, fifo.ReadAvailable());
EXPECT_EQ(0, fifo.WriteAvailable());
EXPECT_EQ(pkt1, fifo.ReadPacket());
EXPECT_TRUE(fifo.IsEmpty());
EXPECT_FALSE(fifo.IsFull());
EXPECT_EQ(0, fifo.ReadAvailable());
EXPECT_EQ(kTestSize, fifo.WriteAvailable());
}