blob: 670734c0ae7efd345994f438134bc9e6a468d919 [file] [log] [blame]
// Copyright 2021 The Fuchsia 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 "src/developer/debug/zxdb/symbols/symbol_data_provider.h"
#include <gtest/gtest.h>
#include "src/developer/debug/zxdb/common/test_with_loop.h"
#include "src/developer/debug/zxdb/symbols/mock_symbol_data_provider.h"
namespace zxdb {
using debug::RegisterID;
using SymbolDataProviderTest = TestWithLoop;
TEST_F(SymbolDataProviderTest, GetRegisters) {
auto provider = fxl::MakeRefCounted<MockSymbolDataProvider>();
using RegMap = std::map<RegisterID, std::vector<uint8_t>>;
// Request no data, the callback should be synchronous.
bool called = false;
provider->GetRegisters({}, [&called](const Err& err, RegMap map) {
called = true;
EXPECT_TRUE(err.ok());
EXPECT_TRUE(map.empty());
});
EXPECT_TRUE(called);
// Request one synchronously available register.
constexpr RegisterID kReg1 = RegisterID::kARMv8_x1;
std::vector<uint8_t> reg1_value{1, 2, 3, 4, 5, 6, 7, 8};
provider->AddRegisterValue(kReg1, true, reg1_value);
called = false;
provider->GetRegisters({kReg1}, [&](const Err& err, RegMap map) {
called = true;
EXPECT_TRUE(err.ok());
EXPECT_EQ(1u, map.size());
EXPECT_EQ(reg1_value, map[kReg1]);
});
EXPECT_TRUE(called);
// Request two additional registers that are asynchronously available.
constexpr RegisterID kReg2 = RegisterID::kARMv8_v2;
std::vector<uint8_t> reg2_value{9, 8, 7, 6, 5, 4, 3, 2};
constexpr RegisterID kReg3 = RegisterID::kARMv8_v3;
std::vector<uint8_t> reg3_value{2, 1, 2, 1, 2, 1, 9, 9};
provider->AddRegisterValue(kReg2, false, reg2_value);
provider->AddRegisterValue(kReg3, false, reg3_value);
called = false;
provider->GetRegisters({kReg1, kReg2, kReg3}, [&](const Err& err, RegMap map) {
called = true;
EXPECT_TRUE(err.ok());
EXPECT_EQ(3u, map.size());
EXPECT_EQ(reg1_value, map[kReg1]);
EXPECT_EQ(reg2_value, map[kReg2]);
EXPECT_EQ(reg3_value, map[kReg3]);
});
// Since it's async, it should not be called until we run the loop.
EXPECT_FALSE(called);
loop().RunUntilNoTasks();
EXPECT_TRUE(called);
}
} // namespace zxdb