Skip to content

Commit 2038358

Browse files
authored
Merge pull request #1985 from joto/middle-test-clean
Call middle::after_nodes/ways/relations() in tests in right order
2 parents 9ab3f89 + e404a65 commit 2038358

File tree

6 files changed

+134
-6
lines changed

6 files changed

+134
-6
lines changed

src/middle-pgsql.cpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,8 @@ std::size_t middle_query_pgsql_t::get_way_node_locations_db(
347347

348348
void middle_pgsql_t::node(osmium::Node const &node)
349349
{
350+
assert(m_middle_state == middle_state::node);
351+
350352
if (node.deleted()) {
351353
node_delete(node.id());
352354
} else {
@@ -358,6 +360,8 @@ void middle_pgsql_t::node(osmium::Node const &node)
358360
}
359361

360362
void middle_pgsql_t::way(osmium::Way const &way) {
363+
assert(m_middle_state == middle_state::way);
364+
361365
if (way.deleted()) {
362366
way_delete(way.id());
363367
} else {
@@ -369,6 +373,8 @@ void middle_pgsql_t::way(osmium::Way const &way) {
369373
}
370374

371375
void middle_pgsql_t::relation(osmium::Relation const &relation) {
376+
assert(m_middle_state == middle_state::relation);
377+
372378
if (relation.deleted()) {
373379
relation_delete(relation.id());
374380
} else {
@@ -664,6 +670,11 @@ void middle_pgsql_t::relation_delete(osmid_t osm_id)
664670

665671
void middle_pgsql_t::after_nodes()
666672
{
673+
assert(m_middle_state == middle_state::node);
674+
#ifndef NDEBUG
675+
m_middle_state = middle_state::way;
676+
#endif
677+
667678
m_db_copy.sync();
668679
if (!m_options->append && m_options->flat_node_file.empty()) {
669680
auto const &table = m_tables.nodes();
@@ -673,6 +684,11 @@ void middle_pgsql_t::after_nodes()
673684

674685
void middle_pgsql_t::after_ways()
675686
{
687+
assert(m_middle_state == middle_state::way);
688+
#ifndef NDEBUG
689+
m_middle_state = middle_state::relation;
690+
#endif
691+
676692
m_db_copy.sync();
677693
if (!m_options->append) {
678694
auto const &table = m_tables.ways();
@@ -682,6 +698,11 @@ void middle_pgsql_t::after_ways()
682698

683699
void middle_pgsql_t::after_relations()
684700
{
701+
assert(m_middle_state == middle_state::relation);
702+
#ifndef NDEBUG
703+
m_middle_state = middle_state::done;
704+
#endif
705+
685706
m_db_copy.sync();
686707
if (!m_options->append) {
687708
auto const &table = m_tables.relations();
@@ -706,6 +727,11 @@ middle_query_pgsql_t::middle_query_pgsql_t(
706727

707728
void middle_pgsql_t::start()
708729
{
730+
assert(m_middle_state == middle_state::constructed);
731+
#ifndef NDEBUG
732+
m_middle_state = middle_state::node;
733+
#endif
734+
709735
if (m_options->append) {
710736
// Disable JIT and parallel workers as they are known to cause
711737
// problems when accessing the intarrays.
@@ -732,6 +758,8 @@ void middle_pgsql_t::start()
732758

733759
void middle_pgsql_t::stop()
734760
{
761+
assert(m_middle_state == middle_state::done);
762+
735763
m_cache.reset();
736764
if (!m_options->flat_node_file.empty()) {
737765
m_persistent_cache.reset();

src/middle-ram.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@ void middle_ram_t::set_requirements(output_requirements const &requirements)
6161

6262
void middle_ram_t::stop()
6363
{
64+
assert(m_middle_state == middle_state::done);
65+
6466
auto const mbyte = 1024 * 1024;
6567

6668
log_debug("Middle 'ram': Node locations: size={} bytes={}M",
@@ -148,6 +150,7 @@ static void add_delta_encoded_way_node_list(std::string *data,
148150

149151
void middle_ram_t::node(osmium::Node const &node)
150152
{
153+
assert(m_middle_state == middle_state::node);
151154
assert(node.visible());
152155

153156
if (m_store_options.locations) {
@@ -162,6 +165,7 @@ void middle_ram_t::node(osmium::Node const &node)
162165

163166
void middle_ram_t::way(osmium::Way const &way)
164167
{
168+
assert(m_middle_state == middle_state::way);
165169
assert(way.visible());
166170

167171
if (m_store_options.way_nodes) {
@@ -177,6 +181,7 @@ void middle_ram_t::way(osmium::Way const &way)
177181

178182
void middle_ram_t::relation(osmium::Relation const &relation)
179183
{
184+
assert(m_middle_state == middle_state::relation);
180185
assert(relation.visible());
181186

182187
if (m_store_options.relations) {

src/middle-ram.hpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,14 @@ class middle_ram_t : public middle_t, public middle_query_t
4747

4848
~middle_ram_t() noexcept override = default;
4949

50-
void start() override {}
50+
void start() override
51+
{
52+
assert(m_middle_state == middle_state::constructed);
53+
#ifndef NDEBUG
54+
m_middle_state = middle_state::node;
55+
#endif
56+
}
57+
5158
void stop() override;
5259

5360
void node(osmium::Node const &node) override;

src/middle.hpp

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -122,13 +122,31 @@ class middle_t
122122
virtual void relation(osmium::Relation const &relation) = 0;
123123

124124
/// Called after all nodes from the input file(s) have been processed.
125-
virtual void after_nodes() {}
125+
virtual void after_nodes()
126+
{
127+
assert(m_middle_state == middle_state::node);
128+
#ifndef NDEBUG
129+
m_middle_state = middle_state::way;
130+
#endif
131+
}
126132

127133
/// Called after all ways from the input file(s) have been processed.
128-
virtual void after_ways() {}
134+
virtual void after_ways()
135+
{
136+
assert(m_middle_state == middle_state::way);
137+
#ifndef NDEBUG
138+
m_middle_state = middle_state::relation;
139+
#endif
140+
}
129141

130142
/// Called after all relations from the input file(s) have been processed.
131-
virtual void after_relations() {}
143+
virtual void after_relations()
144+
{
145+
assert(m_middle_state == middle_state::relation);
146+
#ifndef NDEBUG
147+
m_middle_state = middle_state::done;
148+
#endif
149+
}
132150

133151
virtual idlist_t get_ways_by_node(osmid_t) { return {}; }
134152
virtual idlist_t get_rels_by_node(osmid_t) { return {}; }
@@ -145,6 +163,21 @@ class middle_t
145163
return *m_thread_pool;
146164
}
147165

166+
#ifndef NDEBUG
167+
enum class middle_state
168+
{
169+
constructed,
170+
started,
171+
node,
172+
way,
173+
relation,
174+
done
175+
};
176+
177+
// NOLINTNEXTLINE(cppcoreguidelines-non-private-member-variables-in-classes, misc-non-private-member-variables-in-classes)
178+
middle_state m_middle_state = middle_state::constructed;
179+
#endif
180+
148181
private:
149182
std::shared_ptr<thread_pool_t> m_thread_pool;
150183
}; // class middle_t

tests/test-middle.cpp

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,8 @@ TEMPLATE_TEST_CASE("middle import", "", options_slim_default,
130130
// set the node
131131
mid->node(node);
132132
mid->after_nodes();
133+
mid->after_ways();
134+
mid->after_relations();
133135

134136
// getting it back works only via a waylist
135137
auto &nodes = buffer.add_way("w3 Nn1234").nodes();
@@ -170,6 +172,7 @@ TEMPLATE_TEST_CASE("middle import", "", options_slim_default,
170172
// set the way
171173
mid->way(buffer.add_way(way_id, nds));
172174
mid->after_ways();
175+
mid->after_relations();
173176

174177
// get it back
175178
osmium::memory::Buffer outbuf{4096,
@@ -372,6 +375,7 @@ TEMPLATE_TEST_CASE("middle: add, delete and update node", "",
372375
mid->node(node10);
373376
mid->node(node11);
374377
mid->after_nodes();
378+
mid->after_ways();
375379
mid->after_relations();
376380

377381
check_node(mid, node10);
@@ -402,6 +406,7 @@ TEMPLATE_TEST_CASE("middle: add, delete and update node", "",
402406
mid->node(node10d);
403407
mid->node(node42d);
404408
mid->after_nodes();
409+
mid->after_ways();
405410
mid->after_relations();
406411

407412
REQUIRE(no_node(mid, 5));
@@ -432,6 +437,7 @@ TEMPLATE_TEST_CASE("middle: add, delete and update node", "",
432437
mid->node(node12d);
433438
mid->node(node12);
434439
mid->after_nodes();
440+
mid->after_ways();
435441
mid->after_relations();
436442

437443
check_node(mid, node10a);
@@ -457,6 +463,7 @@ TEMPLATE_TEST_CASE("middle: add, delete and update node", "",
457463

458464
mid->node(node12);
459465
mid->after_nodes();
466+
mid->after_ways();
460467
mid->after_relations();
461468

462469
REQUIRE(no_node(mid, 5));
@@ -585,6 +592,7 @@ TEMPLATE_TEST_CASE("middle: add, delete and update way", "",
585592
auto mid = std::make_shared<middle_pgsql_t>(thread_pool, &options);
586593
mid->start();
587594

595+
mid->after_nodes();
588596
mid->way(way20);
589597
mid->way(way21);
590598
mid->after_ways();
@@ -614,6 +622,7 @@ TEMPLATE_TEST_CASE("middle: add, delete and update way", "",
614622
auto mid = std::make_shared<middle_pgsql_t>(thread_pool, &options);
615623
mid->start();
616624

625+
mid->after_nodes();
617626
mid->way(way5d);
618627
mid->way(way20d);
619628
mid->way(way42d);
@@ -643,6 +652,7 @@ TEMPLATE_TEST_CASE("middle: add, delete and update way", "",
643652
auto mid = std::make_shared<middle_pgsql_t>(thread_pool, &options);
644653
mid->start();
645654

655+
mid->after_nodes();
646656
mid->way(way20d);
647657
mid->way(way20a);
648658
mid->way(way22d);
@@ -675,6 +685,7 @@ TEMPLATE_TEST_CASE("middle: add, delete and update way", "",
675685
auto mid = std::make_shared<middle_pgsql_t>(thread_pool, &options);
676686
mid->start();
677687

688+
mid->after_nodes();
678689
mid->way(way22);
679690
mid->after_ways();
680691
mid->after_relations();
@@ -728,6 +739,7 @@ TEMPLATE_TEST_CASE("middle: add way with attributes", "", options_slim_default,
728739
auto mid = std::make_shared<middle_pgsql_t>(thread_pool, &options);
729740
mid->start();
730741

742+
mid->after_nodes();
731743
mid->way(way20);
732744
mid->after_ways();
733745
mid->after_relations();
@@ -831,6 +843,8 @@ TEMPLATE_TEST_CASE("middle: add, delete and update relation", "",
831843
auto mid = std::make_shared<middle_pgsql_t>(thread_pool, &options);
832844
mid->start();
833845

846+
mid->after_nodes();
847+
mid->after_ways();
834848
mid->relation(relation30);
835849
mid->relation(relation31);
836850
mid->after_relations();
@@ -859,6 +873,8 @@ TEMPLATE_TEST_CASE("middle: add, delete and update relation", "",
859873
auto mid = std::make_shared<middle_pgsql_t>(thread_pool, &options);
860874
mid->start();
861875

876+
mid->after_nodes();
877+
mid->after_ways();
862878
mid->relation(relation5d);
863879
mid->relation(relation30d);
864880
mid->relation(relation42d);
@@ -887,6 +903,8 @@ TEMPLATE_TEST_CASE("middle: add, delete and update relation", "",
887903
auto mid = std::make_shared<middle_pgsql_t>(thread_pool, &options);
888904
mid->start();
889905

906+
mid->after_nodes();
907+
mid->after_ways();
890908
mid->relation(relation30d);
891909
mid->relation(relation30a);
892910
mid->relation(relation32d);
@@ -918,6 +936,8 @@ TEMPLATE_TEST_CASE("middle: add, delete and update relation", "",
918936
auto mid = std::make_shared<middle_pgsql_t>(thread_pool, &options);
919937
mid->start();
920938

939+
mid->after_nodes();
940+
mid->after_ways();
921941
mid->relation(relation32);
922942
mid->after_relations();
923943

@@ -967,6 +987,8 @@ TEMPLATE_TEST_CASE("middle: add relation with attributes", "",
967987
auto mid = std::make_shared<middle_pgsql_t>(thread_pool, &options);
968988
mid->start();
969989

990+
mid->after_nodes();
991+
mid->after_ways();
970992
mid->relation(relation30);
971993
mid->after_relations();
972994

@@ -1052,6 +1074,8 @@ TEMPLATE_TEST_CASE("middle: change nodes in way", "", options_slim_default,
10521074
mid->node(node10a);
10531075
dependency_manager.node_changed(10);
10541076
mid->after_nodes();
1077+
mid->after_ways();
1078+
mid->after_relations();
10551079

10561080
REQUIRE(dependency_manager.has_pending());
10571081
idlist_t const way_ids = dependency_manager.get_pending_way_ids();
@@ -1067,9 +1091,11 @@ TEMPLATE_TEST_CASE("middle: change nodes in way", "", options_slim_default,
10671091
auto mid = std::make_shared<middle_pgsql_t>(thread_pool, &options);
10681092
mid->start();
10691093

1094+
mid->after_nodes();
10701095
mid->way(way22);
10711096
mid->after_ways();
10721097
mid->after_relations();
1098+
10731099
check_way(mid, way22);
10741100
}
10751101
{
@@ -1081,6 +1107,8 @@ TEMPLATE_TEST_CASE("middle: change nodes in way", "", options_slim_default,
10811107
mid->node(node10a);
10821108
dependency_manager.node_changed(10);
10831109
mid->after_nodes();
1110+
mid->after_ways();
1111+
mid->after_relations();
10841112

10851113
REQUIRE(dependency_manager.has_pending());
10861114
idlist_t const way_ids = dependency_manager.get_pending_way_ids();
@@ -1099,6 +1127,7 @@ TEMPLATE_TEST_CASE("middle: change nodes in way", "", options_slim_default,
10991127
auto mid = std::make_shared<middle_pgsql_t>(thread_pool, &options);
11001128
mid->start();
11011129

1130+
mid->after_nodes();
11021131
mid->way(way20d);
11031132
mid->way(way20a);
11041133
mid->after_ways();
@@ -1117,6 +1146,8 @@ TEMPLATE_TEST_CASE("middle: change nodes in way", "", options_slim_default,
11171146
mid->node(node10a);
11181147
dependency_manager.node_changed(10);
11191148
mid->after_nodes();
1149+
mid->after_ways();
1150+
mid->after_relations();
11201151

11211152
REQUIRE_FALSE(dependency_manager.has_pending());
11221153
}
@@ -1179,6 +1210,7 @@ TEMPLATE_TEST_CASE("middle: change nodes in relation", "", options_slim_default,
11791210
mid->node(node10a);
11801211
dependency_manager.node_changed(10);
11811212
mid->after_nodes();
1213+
mid->after_ways();
11821214
mid->after_relations();
11831215

11841216
REQUIRE(dependency_manager.has_pending());
@@ -1198,6 +1230,7 @@ TEMPLATE_TEST_CASE("middle: change nodes in relation", "", options_slim_default,
11981230
mid->node(node11a);
11991231
dependency_manager.node_changed(11);
12001232
mid->after_nodes();
1233+
mid->after_ways();
12011234
mid->after_relations();
12021235

12031236
REQUIRE(dependency_manager.has_pending());

0 commit comments

Comments
 (0)