blob: 79130b99c0ef1b00ce8587f34ba62226256feac1 [file] [log] [blame]
// Copyright 2022 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 <lib/async-testing/dispatcher_stub.h>
#include <lib/async/sequence_id.h>
#include <zxtest/zxtest.h>
namespace {
class FakeSequenceIdAsync : public async::DispatcherStub {
public:
zx_status_t GetSequenceId(async_sequence_id_t* out_sequence_id, const char** out_error) override {
*out_sequence_id = current_sequence_id_;
return ZX_OK;
}
void SetSequenceId(async_sequence_id_t current_sequence_id) {
current_sequence_id_ = current_sequence_id;
}
zx_status_t CheckSequenceId(async_sequence_id_t sequence_id, const char** out_error) override {
if (current_sequence_id_.value == sequence_id.value) {
return ZX_OK;
}
*out_error = "wrong";
return ZX_ERR_OUT_OF_RANGE;
}
private:
async_sequence_id_t current_sequence_id_ = {};
};
TEST(SequenceIdTests, GetSequenceId) {
FakeSequenceIdAsync dispatcher;
dispatcher.SetSequenceId({.value = 0});
async_sequence_id_t sequence_id = {};
const char* error = nullptr;
EXPECT_OK(async_get_sequence_id(&dispatcher, &sequence_id, &error));
EXPECT_EQ(0, sequence_id.value);
EXPECT_NULL(error);
dispatcher.SetSequenceId({.value = 42});
sequence_id = {};
error = nullptr;
EXPECT_OK(async_get_sequence_id(&dispatcher, &sequence_id, &error));
EXPECT_EQ(42, sequence_id.value);
EXPECT_NULL(error);
}
TEST(SequenceIdTests, CheckSequenceId) {
FakeSequenceIdAsync dispatcher;
dispatcher.SetSequenceId({.value = 0});
async_sequence_id_t sequence_id = {};
const char* error = nullptr;
EXPECT_OK(async_check_sequence_id(&dispatcher, sequence_id, &error));
EXPECT_NULL(error);
dispatcher.SetSequenceId({.value = 1});
sequence_id = {};
error = nullptr;
EXPECT_STATUS(ZX_ERR_OUT_OF_RANGE, async_check_sequence_id(&dispatcher, sequence_id, &error));
EXPECT_STREQ("wrong", error);
}
TEST(SequenceIdTests, Unsupported) {
constexpr const static async_ops_t kOps = {
.version = ASYNC_OPS_V1,
.reserved = 0,
};
async_dispatcher_t dispatcher{
.ops = &kOps,
};
async_sequence_id_t sequence_id = {};
const char* error = nullptr;
EXPECT_STATUS(ZX_ERR_NOT_SUPPORTED, async_get_sequence_id(&dispatcher, &sequence_id, &error));
EXPECT_SUBSTR(error, "support");
sequence_id = {};
error = nullptr;
EXPECT_STATUS(ZX_ERR_NOT_SUPPORTED, async_check_sequence_id(&dispatcher, sequence_id, &error));
EXPECT_SUBSTR(error, "support");
}
} // namespace