blob: 26c478349acab6f99d762e63d1d0bb41ff1a7970 [file] [log] [blame]
/*
* Copyright (C) 2015 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "base_type.h"
#include "context.h"
#include "interpreter.h"
#include "memory_manager.h"
#include "mock_resource_provider.h"
#include "resource_provider.h"
#include "test_utilities.h"
#include <gapic/mock_connection.h>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include <memory>
#include <vector>
using ::testing::_;
using ::testing::DoAll;
using ::testing::Eq;
using ::testing::IsNull;
using ::testing::NotNull;
using ::testing::Return;
using ::testing::ReturnArg;
using ::testing::StrictMock;
using ::testing::WithArg;
using ::testing::ElementsAreArray;
namespace gapir {
namespace test {
namespace {
const uint32_t MEMORY_SIZE = 4096;
class ContextTest : public ::testing::Test {
protected:
virtual void SetUp() {
std::vector<uint32_t> memorySizes = {MEMORY_SIZE};
mMemoryManager.reset(new MemoryManager(memorySizes));
mResourceProvider.reset(new StrictMock<MockResourceProvider>());
}
std::unique_ptr<MemoryManager> mMemoryManager;
std::unique_ptr<StrictMock<MockResourceProvider>> mResourceProvider;
};
void resourceProviderLoadReplay(MockResourceProvider* resourceProvider,
const std::vector<uint8_t>& replayData) {
EXPECT_CALL(*resourceProvider, get(Eq(""), _, _, replayData.size()))
.WillOnce(DoAll(WithArg<2>(SetVoidPointee(replayData)), ReturnArg<3>()));
EXPECT_CALL(*resourceProvider, prefetch(_, _, _, _)).WillOnce(Return(true));
}
} // anonymous namespace
TEST_F(ContextTest, Create) {
auto replayData = createReplayData(0, 0, {}, {}, {});
resourceProviderLoadReplay(mResourceProvider.get(), replayData);
auto gazerConnection = createServerConnection("", replayData.size());
auto context = Context::create(*gazerConnection, mResourceProvider.get(), mMemoryManager.get());
EXPECT_THAT(context, NotNull());
}
TEST_F(ContextTest, CreateErrorReplayRequest) {
// Failed to load
EXPECT_CALL(*mResourceProvider, get(Eq(""), _, _, 10)).WillOnce(Return(0));
auto gazerConnection = createServerConnection("", 10);
auto context = Context::create(*gazerConnection, mResourceProvider.get(), mMemoryManager.get());
EXPECT_THAT(context, IsNull());
}
TEST_F(ContextTest, CreateErrorVolatileMemory) {
auto replayData = createReplayData(0, MEMORY_SIZE, {}, {}, {});
EXPECT_CALL(*mResourceProvider, get(Eq(""), _, _, replayData.size()))
.WillOnce(DoAll(WithArg<2>(SetVoidPointee(replayData)), ReturnArg<3>()));
auto gazerConnection = createServerConnection("", replayData.size());
auto context = Context::create(*gazerConnection, mResourceProvider.get(), mMemoryManager.get());
EXPECT_THAT(context, IsNull());
}
TEST_F(ContextTest, LoadResource) {
auto replayData = createReplayData(
128, 1024, {}, {{"A", 4}},
{instruction(Interpreter::InstructionCode::PUSH_I, BaseType::VolatilePointer, 0),
instruction(Interpreter::InstructionCode::RESOURCE, 0)});
std::vector<uint8_t> resourceA{1, 2, 3, 4};
resourceProviderLoadReplay(mResourceProvider.get(), replayData);
EXPECT_CALL(*mResourceProvider, get(Eq("A"), _, _, 4))
.WillOnce(DoAll(WithArg<2>(SetVoidPointee(resourceA)), ReturnArg<3>()));
auto gazerConnection = createServerConnection("", replayData.size());
auto context = Context::create(*gazerConnection, mResourceProvider.get(), mMemoryManager.get());
EXPECT_THAT(context, NotNull());
EXPECT_TRUE(context->interpret());
auto res = (uint8_t*)mMemoryManager->volatileToAbsolute(0);
EXPECT_THAT(resourceA, ElementsAreArray(res, resourceA.size()));
}
TEST_F(ContextTest, LoadResourcePopFailed) {
auto replayData = createReplayData(128, 1024, {}, {{"A", 4}},
{instruction(Interpreter::InstructionCode::RESOURCE, 0)});
resourceProviderLoadReplay(mResourceProvider.get(), replayData);
auto gazerConnection = createServerConnection("", replayData.size());
auto context = Context::create(*gazerConnection, mResourceProvider.get(), mMemoryManager.get());
EXPECT_THAT(context, NotNull());
EXPECT_FALSE(context->interpret());
}
TEST_F(ContextTest, LoadResourceGetFailed) {
auto replayData = createReplayData(
128, 1024, {}, {{"A", 4}},
{instruction(Interpreter::InstructionCode::PUSH_I, BaseType::VolatilePointer, 0),
instruction(Interpreter::InstructionCode::RESOURCE, 0)});
resourceProviderLoadReplay(mResourceProvider.get(), replayData);
EXPECT_CALL(*mResourceProvider, get(Eq("A"), _, _, 4)).WillOnce(Return(0));
auto gazerConnection = createServerConnection("", replayData.size());
auto context = Context::create(*gazerConnection, mResourceProvider.get(), mMemoryManager.get());
EXPECT_THAT(context, NotNull());
EXPECT_FALSE(context->interpret());
}
TEST_F(ContextTest, PostData) {
auto replayData = createReplayData(
128, 1024, {0, 1, 2, 3, 4, 5, 6, 7}, {},
{instruction(Interpreter::InstructionCode::PUSH_I, BaseType::ConstantPointer, 1),
instruction(Interpreter::InstructionCode::PUSH_I, BaseType::Uint32, 6),
instruction(Interpreter::InstructionCode::POST)});
std::vector<uint8_t> expected;
pushUint8(&expected, ServerConnection::MESSAGE_TYPE_POST);
pushUint32(&expected, 6);
pushBytes(&expected, {1, 2, 3, 4, 5, 6});
auto connection = new gapic::test::MockConnection();
resourceProviderLoadReplay(mResourceProvider.get(), replayData);
auto gazerConnection = createServerConnection(connection, "", replayData.size());
auto context = Context::create(*gazerConnection, mResourceProvider.get(), mMemoryManager.get());
EXPECT_THAT(context, NotNull());
EXPECT_TRUE(context->interpret());
EXPECT_EQ(connection->out, expected);
}
TEST_F(ContextTest, PostDataErrorPop) {
auto replayData = createReplayData(
128, 1024, {0, 1, 2, 3, 4, 5, 6, 7}, {},
{instruction(Interpreter::InstructionCode::PUSH_I, BaseType::ConstantPointer, 1),
instruction(Interpreter::InstructionCode::PUSH_I, BaseType::Uint8, 6), // Wrong type
instruction(Interpreter::InstructionCode::POST)});
resourceProviderLoadReplay(mResourceProvider.get(), replayData);
auto gazerConnection = createServerConnection("", replayData.size());
auto context = Context::create(*gazerConnection, mResourceProvider.get(), mMemoryManager.get());
EXPECT_THAT(context, NotNull());
EXPECT_FALSE(context->interpret());
}
TEST_F(ContextTest, PostDataErrorPost) {
auto replayData = createReplayData(
128, 1024, {0, 1, 2, 3, 4, 5, 6, 7}, {},
{instruction(Interpreter::InstructionCode::PUSH_I, BaseType::ConstantPointer, 1),
instruction(Interpreter::InstructionCode::PUSH_I, BaseType::Uint32, 6),
instruction(Interpreter::InstructionCode::POST)});
auto connection = new gapic::test::MockConnection();
connection->out_limit = 7;
resourceProviderLoadReplay(mResourceProvider.get(), replayData);
auto gazerConnection = createServerConnection(connection, "", replayData.size());
auto context = Context::create(*gazerConnection, mResourceProvider.get(), mMemoryManager.get());
EXPECT_THAT(context, NotNull());
EXPECT_FALSE(context->interpret());
}
} // namespace test
} // namespace gapir