大更新
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
#include "adminive/adapters/nlohmann_json.hpp"
|
||||
#include "adminive/http.hpp"
|
||||
#include <atomic>
|
||||
#include <cassert>
|
||||
#include "adminive_test.hpp"
|
||||
#include <string>
|
||||
#include <thread>
|
||||
namespace managed_test {
|
||||
@@ -87,72 +87,72 @@ int main() {
|
||||
static_assert(Writable_Field<decltype(unsynchronized)>);
|
||||
static_assert(!Reference_Escaping_Read<decltype(immutable)>);
|
||||
const auto resolved = guarded.resolved_synchronization();
|
||||
assert(resolved.lock_count == 2);
|
||||
assert(resolved.slot(0) != structive::Resolved_Synchronization_View::unsynchronized_slot);
|
||||
assert(resolved.slot(1) == structive::Resolved_Synchronization_View::unsynchronized_slot);
|
||||
assert(resolved.slot(2) != structive::Resolved_Synchronization_View::unsynchronized_slot);
|
||||
assert(resolved.slot(0) != resolved.slot(2));
|
||||
assert(resolved.slot(3) == structive::Resolved_Synchronization_View::unsynchronized_slot);
|
||||
ADMINIVE_CHECK(resolved.lock_count == 2);
|
||||
ADMINIVE_CHECK(resolved.slot(0) != structive::Resolved_Synchronization_View::unsynchronized_slot);
|
||||
ADMINIVE_CHECK(resolved.slot(1) == structive::Resolved_Synchronization_View::unsynchronized_slot);
|
||||
ADMINIVE_CHECK(resolved.slot(2) != structive::Resolved_Synchronization_View::unsynchronized_slot);
|
||||
ADMINIVE_CHECK(resolved.slot(0) != resolved.slot(2));
|
||||
ADMINIVE_CHECK(resolved.slot(3) == structive::Resolved_Synchronization_View::unsynchronized_slot);
|
||||
Probe_Lock::reset();
|
||||
assert(immutable.snapshot() == 2);
|
||||
assert(Probe_Lock::exclusive_locks.load(std::memory_order_relaxed) == 0);
|
||||
assert(Probe_Lock::shared_locks.load(std::memory_order_relaxed) == 0);
|
||||
ADMINIVE_CHECK(immutable.snapshot() == 2);
|
||||
ADMINIVE_CHECK(Probe_Lock::exclusive_locks.load(std::memory_order_relaxed) == 0);
|
||||
ADMINIVE_CHECK(Probe_Lock::shared_locks.load(std::memory_order_relaxed) == 0);
|
||||
Probe_Lock::reset();
|
||||
editable.write([](int& value) {
|
||||
value = 11;
|
||||
});
|
||||
assert(Probe_Lock::exclusive_locks.load(std::memory_order_relaxed) == 1);
|
||||
assert(Probe_Lock::shared_locks.load(std::memory_order_relaxed) == 0);
|
||||
ADMINIVE_CHECK(Probe_Lock::exclusive_locks.load(std::memory_order_relaxed) == 1);
|
||||
ADMINIVE_CHECK(Probe_Lock::shared_locks.load(std::memory_order_relaxed) == 0);
|
||||
Probe_Lock::reset();
|
||||
backend.write([](int& value) {
|
||||
value = 12;
|
||||
});
|
||||
assert(Probe_Lock::exclusive_locks.load(std::memory_order_relaxed) == 1);
|
||||
ADMINIVE_CHECK(Probe_Lock::exclusive_locks.load(std::memory_order_relaxed) == 1);
|
||||
Probe_Lock::reset();
|
||||
unsynchronized.write([](int& value) {
|
||||
value = 13;
|
||||
});
|
||||
assert(Probe_Lock::exclusive_locks.load(std::memory_order_relaxed) == 0);
|
||||
assert(Probe_Lock::shared_locks.load(std::memory_order_relaxed) == 0);
|
||||
ADMINIVE_CHECK(Probe_Lock::exclusive_locks.load(std::memory_order_relaxed) == 0);
|
||||
ADMINIVE_CHECK(Probe_Lock::shared_locks.load(std::memory_order_relaxed) == 0);
|
||||
const auto descriptor = adminive::to_descriptor_json<Json, Section_Config>();
|
||||
assert(descriptor.at("protocol_version") == 5);
|
||||
assert(!descriptor.at("fields").at(0).contains("lock_mode"));
|
||||
assert(descriptor.at("fields").at(0).at("writable") == true);
|
||||
assert(descriptor.at("fields").at(0).at("synchronized") == true);
|
||||
assert(descriptor.at("fields").at(1).at("writable") == false);
|
||||
assert(descriptor.at("fields").at(1).at("synchronized") == false);
|
||||
assert(descriptor.at("fields").at(2).at("writable") == true);
|
||||
assert(descriptor.at("fields").at(2).at("editable") == false);
|
||||
assert(descriptor.at("fields").at(2).at("synchronized") == true);
|
||||
assert(descriptor.at("fields").at(3).at("writable") == true);
|
||||
assert(descriptor.at("fields").at(3).at("synchronized") == false);
|
||||
ADMINIVE_CHECK(descriptor.at("protocol_version") == 5);
|
||||
ADMINIVE_CHECK(!descriptor.at("fields").at(0).contains("lock_mode"));
|
||||
ADMINIVE_CHECK(descriptor.at("fields").at(0).at("writable") == true);
|
||||
ADMINIVE_CHECK(descriptor.at("fields").at(0).at("synchronized") == true);
|
||||
ADMINIVE_CHECK(descriptor.at("fields").at(1).at("writable") == false);
|
||||
ADMINIVE_CHECK(descriptor.at("fields").at(1).at("synchronized") == false);
|
||||
ADMINIVE_CHECK(descriptor.at("fields").at(2).at("writable") == true);
|
||||
ADMINIVE_CHECK(descriptor.at("fields").at(2).at("editable") == false);
|
||||
ADMINIVE_CHECK(descriptor.at("fields").at(2).at("synchronized") == true);
|
||||
ADMINIVE_CHECK(descriptor.at("fields").at(3).at("writable") == true);
|
||||
ADMINIVE_CHECK(descriptor.at("fields").at(3).at("synchronized") == false);
|
||||
adminive::Managed_Value<Root_Config, adminive::Mutex_Policy<Probe_Lock>> nested;
|
||||
auto section = nested.member<&Root_Config::section>();
|
||||
static_assert(!Writable_Field<decltype(section)>);
|
||||
Probe_Lock::reset();
|
||||
assert(section.member<&Section_Config::immutable_value>().snapshot() == 2);
|
||||
assert(Probe_Lock::shared_locks.load(std::memory_order_relaxed) == 0);
|
||||
ADMINIVE_CHECK(section.member<&Section_Config::immutable_value>().snapshot() == 2);
|
||||
ADMINIVE_CHECK(Probe_Lock::shared_locks.load(std::memory_order_relaxed) == 0);
|
||||
Probe_Lock::reset();
|
||||
section.member<&Section_Config::editable_value>().write([](int& value) {
|
||||
value = 31;
|
||||
});
|
||||
assert(Probe_Lock::exclusive_locks.load(std::memory_order_relaxed) == 1);
|
||||
ADMINIVE_CHECK(Probe_Lock::exclusive_locks.load(std::memory_order_relaxed) == 1);
|
||||
Probe_Lock::reset();
|
||||
section.member<&Section_Config::unsynchronized_value>().write([](int& value) {
|
||||
value = 32;
|
||||
});
|
||||
assert(Probe_Lock::exclusive_locks.load(std::memory_order_relaxed) == 0);
|
||||
ADMINIVE_CHECK(Probe_Lock::exclusive_locks.load(std::memory_order_relaxed) == 0);
|
||||
adminive::Managed_Value<Section_Config, structive::No_Lock_Policy> no_lock;
|
||||
adminive::Resource_Service<Section_Config, Json> service(no_lock, "/section");
|
||||
const auto rejected = service.update_response(R"({"backend_value":99,"immutable_value":88})");
|
||||
assert(rejected.status == 422);
|
||||
ADMINIVE_CHECK(rejected.status == 422);
|
||||
const auto update = service.update_response(R"({"editable_value":21,"unsynchronized_value":22})");
|
||||
assert(update.status == 200);
|
||||
ADMINIVE_CHECK(update.status == 200);
|
||||
const auto no_lock_snapshot = no_lock.snapshot();
|
||||
assert(no_lock_snapshot.editable_value == 21);
|
||||
assert(no_lock_snapshot.backend_value == 3);
|
||||
assert(no_lock_snapshot.immutable_value == 2);
|
||||
assert(no_lock_snapshot.unsynchronized_value == 22);
|
||||
ADMINIVE_CHECK(no_lock_snapshot.editable_value == 21);
|
||||
ADMINIVE_CHECK(no_lock_snapshot.backend_value == 3);
|
||||
ADMINIVE_CHECK(no_lock_snapshot.immutable_value == 2);
|
||||
ADMINIVE_CHECK(no_lock_snapshot.unsynchronized_value == 22);
|
||||
adminive::Managed_Value<Concurrent_Config> concurrent;
|
||||
std::atomic<bool> start{};
|
||||
auto first_writer = std::thread([&] {
|
||||
@@ -175,7 +175,7 @@ int main() {
|
||||
while(!start.load(std::memory_order_acquire)) {}
|
||||
for(int index = 0; index < 1000; ++index) {
|
||||
const Json value = adminive::to_json<Json>(concurrent);
|
||||
assert(value.at("immutable_value") == 7);
|
||||
ADMINIVE_CHECK(value.at("immutable_value") == 7);
|
||||
}
|
||||
});
|
||||
start.store(true, std::memory_order_release);
|
||||
@@ -183,8 +183,8 @@ int main() {
|
||||
second_writer.join();
|
||||
serializer.join();
|
||||
const auto concurrent_snapshot = concurrent.snapshot();
|
||||
assert(concurrent_snapshot.first == 4999);
|
||||
assert(concurrent_snapshot.second == 4999);
|
||||
assert(concurrent_snapshot.immutable_value == 7);
|
||||
ADMINIVE_CHECK(concurrent_snapshot.first == 4999);
|
||||
ADMINIVE_CHECK(concurrent_snapshot.second == 4999);
|
||||
ADMINIVE_CHECK(concurrent_snapshot.immutable_value == 7);
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user