Line data Source code
1 : /**
2 : * @file
3 : *
4 : * @brief
5 : *
6 : * @copyright BSD License (see LICENSE.md or https://www.libelektra.org)
7 : */
8 :
9 : #include <kdbthread.hpp>
10 :
11 : #include <kdbprivate.h>
12 :
13 : #include <gtest/gtest.h>
14 :
15 : using namespace kdb;
16 :
17 56 : struct test_contextual_update : ::testing::Test
18 : {
19 28 : test_contextual_update ()
20 84 : : ks (), gc (), c (gc), i (ks, c, Key ("/ignore/id", KEY_META, "default", "my", KEY_END)),
21 140 : x (ks, c, Key ("/%id%/key", KEY_META, "default", "33", KEY_END)){};
22 :
23 : KeySet ks;
24 : Coordinator gc;
25 : ThreadContext c;
26 : ThreadValue<std::string> i;
27 : ThreadValue<int> x;
28 : };
29 :
30 20 : TEST_F (test_contextual_update, activate)
31 : {
32 10 : ASSERT_EQ (x.getName (), "/%/key");
33 16 : ASSERT_TRUE (ks.lookup ("/%/key"));
34 4 : c.activate (i);
35 10 : ASSERT_EQ (x.getName (), "/my/key");
36 16 : ASSERT_TRUE (ks.lookup ("/my/key"));
37 : }
38 :
39 20 : TEST_F (test_contextual_update, changeKey)
40 : {
41 6 : ks.append (Key ("/other/key", KEY_VALUE, "88", KEY_END));
42 10 : i = "other";
43 4 : c.activate (i);
44 10 : ASSERT_EQ (x.getName (), "/other/key");
45 16 : ASSERT_TRUE (ks.lookup ("/other/key"));
46 6 : ASSERT_EQ (x, 88);
47 18 : ASSERT_EQ (ks.lookup ("/other/key").getString (), "88");
48 :
49 20 : ks.lookup ("/other/key").setString ("100");
50 :
51 2 : c.syncLayers ();
52 6 : ASSERT_EQ (x, 88) << "should not influence cache";
53 10 : ASSERT_EQ (x.getName (), "/other/key");
54 18 : ASSERT_EQ (ks.lookup ("/other/key").getString (), "100");
55 :
56 2 : x.syncCache ();
57 10 : ASSERT_EQ (x.getName (), "/other/key");
58 18 : ASSERT_EQ (ks.lookup ("/other/key").getString (), "100");
59 6 : ASSERT_EQ (x, 100) << "cache should be updated";
60 : }
61 :
62 20 : TEST_F (test_contextual_update, syncCache)
63 : {
64 6 : ks.append (Key ("/%/key", KEY_VALUE, "111", KEY_END));
65 :
66 2 : x.syncCache ();
67 10 : ASSERT_EQ (x.getName (), "/%/key");
68 18 : ASSERT_EQ (ks.lookup ("/%/key").getString (), "111");
69 6 : ASSERT_EQ (x, 111) << "reevaluated context, should have found new key";
70 : }
71 :
72 20 : TEST_F (test_contextual_update, notifyAllEvents)
73 : {
74 6 : ks.append (Key ("/%/key", KEY_VALUE, "133", KEY_END));
75 :
76 2 : c.notifyAllEvents ();
77 10 : ASSERT_EQ (x.getName (), "/%/key");
78 6 : ASSERT_EQ (x, 33) << "should not be changed (optimization)";
79 18 : ASSERT_EQ (ks.lookup ("/%/key").getString (), "133") << "nothing done, so its not changed";
80 : }
81 :
82 20 : TEST_F (test_contextual_update, notifyAllEventsChange)
83 : {
84 8 : ASSERT_EQ (ks.size (), 2);
85 6 : ks.append (Key ("/other/key", KEY_VALUE, "133", KEY_END));
86 8 : ASSERT_EQ (ks.size (), 3);
87 12 : EXPECT_EQ (ks.at (0).getName (), "/%/key") << "nothing done, so its not changed";
88 12 : EXPECT_EQ (ks.at (1).getName (), "/ignore/id") << "nothing done, so its not changed";
89 :
90 10 : i = "other";
91 4 : c.activate (i);
92 10 : ASSERT_EQ (x.getName (), "/other/key");
93 6 : ASSERT_EQ (x, 133);
94 18 : ASSERT_EQ (ks.lookup ("/other/key").getString (), "133") << "nothing done, so its not changed";
95 8 : ASSERT_EQ (ks.size (), 4);
96 12 : EXPECT_EQ (ks.at (0).getName (), "/%/key") << "nothing done, so its not changed";
97 12 : EXPECT_EQ (ks.at (1).getName (), "/ignore/id") << "nothing done, so its not changed";
98 12 : EXPECT_EQ (ks.at (2).getName (), "/other/key") << "nothing done, so its not changed";
99 12 : EXPECT_EQ (ks.at (3).getName (), "user/ignore/id") << "nothing done, so its not changed";
100 12 : EXPECT_EQ (ks.at (3).getString (), "other");
101 : }
102 :
103 20 : TEST_F (test_contextual_update, notifyKeySetUpdate)
104 : {
105 8 : ASSERT_EQ (ks.size (), 2);
106 6 : ks.append (Key ("/%/key", KEY_VALUE, "144", KEY_END));
107 8 : ASSERT_EQ (ks.size (), 2);
108 12 : EXPECT_EQ (ks.at (0).getName (), "/%/key");
109 12 : EXPECT_EQ (ks.at (1).getName (), "/ignore/id");
110 :
111 2 : c.notifyKeySetUpdate ();
112 10 : ASSERT_EQ (x.getName (), "/%/key");
113 6 : ASSERT_EQ (x, 144) << "reevaluated context, should have found new key";
114 18 : ASSERT_EQ (ks.lookup ("/%/key").getString (), "144");
115 8 : ASSERT_EQ (ks.size (), 2);
116 12 : EXPECT_EQ (ks.at (0).getName (), "/%/key");
117 12 : EXPECT_EQ (ks.at (1).getName (), "/ignore/id");
118 : }
119 :
120 20 : TEST_F (test_contextual_update, notifyAssignKeySetUpdate)
121 : {
122 4 : x = 5;
123 8 : ASSERT_EQ (ks.size (), 3);
124 12 : EXPECT_EQ (ks.at (0).getName (), "/%/key");
125 12 : EXPECT_EQ (ks.at (0).getString (), "33");
126 12 : EXPECT_EQ (ks.at (1).getName (), "/ignore/id");
127 12 : EXPECT_EQ (ks.at (2).getName (), "user/%/key");
128 12 : EXPECT_EQ (ks.at (2).getString (), "5");
129 :
130 6 : ks.append (Key ("user/%/key", KEY_VALUE, "144", KEY_END));
131 :
132 2 : c.notifyKeySetUpdate ();
133 10 : ASSERT_EQ (x.getName (), "user/%/key");
134 6 : ASSERT_EQ (x, 144) << "reevaluated context, should have found new key";
135 18 : ASSERT_EQ (ks.lookup ("/%/key").getString (), "144");
136 8 : ASSERT_EQ (ks.size (), 3);
137 12 : EXPECT_EQ (ks.at (0).getName (), "/%/key");
138 12 : EXPECT_EQ (ks.at (0).getString (), "33");
139 12 : EXPECT_EQ (ks.at (1).getName (), "/ignore/id");
140 12 : EXPECT_EQ (ks.at (2).getName (), "user/%/key");
141 12 : EXPECT_EQ (ks.at (2).getString (), "144");
142 : }
143 :
144 0 : void printKs (KeySet & ks)
145 : {
146 0 : size_t s = ks.size ();
147 0 : std::cout << "ASSERT_GE (ks.size (), " << s << ");" << std::endl;
148 0 : std::cout << "EXPECT_EQ (ks.size (), " << s << ");" << std::endl;
149 0 : for (size_t i = 0; i < s; ++i)
150 : {
151 0 : std::cout << "EXPECT_EQ (ks.at (" << i << ").getName (), \"" << ks.at (i).getName () << "\");" << std::endl;
152 0 : std::cout << "EXPECT_EQ (ks.at (" << i << ").getString (), \"" << ks.at (i).getString () << "\");" << std::endl;
153 : }
154 0 : }
155 :
156 20 : TEST_F (test_contextual_update, notifyAssignKeySetUpdateLayer)
157 : {
158 4 : x = 5;
159 10 : i = "other";
160 8 : ASSERT_EQ (ks.size (), 4);
161 12 : EXPECT_EQ (ks.at (0).getName (), "/%/key");
162 12 : EXPECT_EQ (ks.at (0).getString (), "33");
163 12 : EXPECT_EQ (ks.at (1).getName (), "/ignore/id");
164 12 : EXPECT_EQ (ks.at (2).getName (), "user/%/key");
165 12 : EXPECT_EQ (ks.at (2).getString (), "5");
166 12 : EXPECT_EQ (ks.at (3).getName (), "user/ignore/id");
167 12 : EXPECT_EQ (ks.at (3).getString (), "other");
168 :
169 6 : ks.append (Key ("user/other/key", KEY_VALUE, "144", KEY_END));
170 :
171 16 : const_cast<Key &> (i.getSpec ()).setMeta<std::string> ("order", "#0");
172 16 : const_cast<Key &> (x.getSpec ()).setMeta<std::string> ("order", "#1");
173 2 : c.notifyKeySetUpdate ();
174 10 : EXPECT_EQ (x.getName (), "user/%/key") << "should be same name";
175 6 : EXPECT_EQ (x, 5) << "not activated, thus old value persists";
176 18 : EXPECT_EQ (ks.lookup ("/%/key").getString (), "5") << "should get same value";
177 :
178 6 : ASSERT_GE (ks.size (), 5);
179 8 : EXPECT_EQ (ks.size (), 5);
180 12 : EXPECT_EQ (ks.at (0).getName (), "/%/key");
181 12 : EXPECT_EQ (ks.at (0).getString (), "33");
182 12 : EXPECT_EQ (ks.at (1).getName (), "/ignore/id");
183 12 : EXPECT_EQ (ks.at (1).getString (), "my");
184 12 : EXPECT_EQ (ks.at (2).getName (), "user/%/key");
185 12 : EXPECT_EQ (ks.at (2).getString (), "5");
186 12 : EXPECT_EQ (ks.at (3).getName (), "user/ignore/id");
187 12 : EXPECT_EQ (ks.at (3).getString (), "other");
188 12 : EXPECT_EQ (ks.at (4).getName (), "user/other/key");
189 12 : EXPECT_EQ (ks.at (4).getString (), "144");
190 : }
191 :
192 20 : TEST_F (test_contextual_update, notifyAssignKeySetUpdateLayerActivateOrder)
193 : {
194 4 : c.activate (i); // activate "my"
195 :
196 4 : x = 5;
197 10 : i = "other";
198 6 : ASSERT_GE (ks.size (), 5);
199 8 : EXPECT_EQ (ks.size (), 5);
200 12 : EXPECT_EQ (ks.at (0).getName (), "/%/key");
201 12 : EXPECT_EQ (ks.at (0).getString (), "33");
202 12 : EXPECT_EQ (ks.at (1).getName (), "/ignore/id");
203 12 : EXPECT_EQ (ks.at (1).getString (), "my");
204 12 : EXPECT_EQ (ks.at (2).getName (), "/my/key");
205 12 : EXPECT_EQ (ks.at (2).getString (), "33");
206 12 : EXPECT_EQ (ks.at (3).getName (), "user/ignore/id");
207 12 : EXPECT_EQ (ks.at (3).getString (), "other");
208 12 : EXPECT_EQ (ks.at (4).getName (), "user/my/key");
209 12 : EXPECT_EQ (ks.at (4).getString (), "5");
210 :
211 6 : ks.append (Key ("user/other/key", KEY_VALUE, "144", KEY_END));
212 :
213 16 : const_cast<Key &> (i.getSpec ()).setMeta<std::string> ("layer/order", "#0");
214 16 : const_cast<Key &> (x.getSpec ()).setMeta<std::string> ("layer/order", "#1");
215 2 : c.notifyKeySetUpdate ();
216 10 : EXPECT_EQ (x.getName (), "user/other/key");
217 6 : EXPECT_EQ (x, 144) << "reevaluated context, should have found new key";
218 18 : EXPECT_EQ (ks.lookup ("/%/key").getString (), "33");
219 6 : ASSERT_GE (ks.size (), 6);
220 8 : EXPECT_EQ (ks.size (), 6);
221 12 : EXPECT_EQ (ks.at (0).getName (), "/%/key");
222 12 : EXPECT_EQ (ks.at (0).getString (), "33");
223 12 : EXPECT_EQ (ks.at (1).getName (), "/ignore/id");
224 12 : EXPECT_EQ (ks.at (1).getString (), "my");
225 12 : EXPECT_EQ (ks.at (2).getName (), "/my/key");
226 12 : EXPECT_EQ (ks.at (2).getString (), "33");
227 12 : EXPECT_EQ (ks.at (3).getName (), "user/ignore/id");
228 12 : EXPECT_EQ (ks.at (3).getString (), "other");
229 12 : EXPECT_EQ (ks.at (4).getName (), "user/my/key");
230 12 : EXPECT_EQ (ks.at (4).getString (), "5");
231 12 : EXPECT_EQ (ks.at (5).getName (), "user/other/key");
232 12 : EXPECT_EQ (ks.at (5).getString (), "144");
233 : }
234 :
235 20 : TEST_F (test_contextual_update, notifyAssignKeySetUpdateLayerActivate)
236 : {
237 4 : c.activate (i); // activate "my"
238 :
239 4 : x = 5;
240 10 : i = "other";
241 6 : ASSERT_GE (ks.size (), 5);
242 8 : EXPECT_EQ (ks.size (), 5);
243 12 : EXPECT_EQ (ks.at (0).getName (), "/%/key");
244 12 : EXPECT_EQ (ks.at (0).getString (), "33");
245 12 : EXPECT_EQ (ks.at (1).getName (), "/ignore/id");
246 12 : EXPECT_EQ (ks.at (1).getString (), "my");
247 12 : EXPECT_EQ (ks.at (2).getName (), "/my/key");
248 12 : EXPECT_EQ (ks.at (2).getString (), "33");
249 12 : EXPECT_EQ (ks.at (3).getName (), "user/ignore/id");
250 12 : EXPECT_EQ (ks.at (3).getString (), "other");
251 12 : EXPECT_EQ (ks.at (4).getName (), "user/my/key");
252 12 : EXPECT_EQ (ks.at (4).getString (), "5");
253 :
254 6 : ks.append (Key ("user/other/key", KEY_VALUE, "144", KEY_END));
255 :
256 2 : c.notifyKeySetUpdate ();
257 10 : EXPECT_EQ (x.getName (), "user/other/key");
258 6 : EXPECT_EQ (x, 144) << "reevaluated context, should have found new key";
259 18 : EXPECT_EQ (ks.lookup ("/%/key").getString (), "33");
260 6 : ASSERT_GE (ks.size (), 6);
261 8 : EXPECT_EQ (ks.size (), 6);
262 12 : EXPECT_EQ (ks.at (0).getName (), "/%/key");
263 12 : EXPECT_EQ (ks.at (0).getString (), "33");
264 12 : EXPECT_EQ (ks.at (1).getName (), "/ignore/id");
265 12 : EXPECT_EQ (ks.at (1).getString (), "my");
266 12 : EXPECT_EQ (ks.at (2).getName (), "/my/key");
267 12 : EXPECT_EQ (ks.at (2).getString (), "33");
268 12 : EXPECT_EQ (ks.at (3).getName (), "user/ignore/id");
269 12 : EXPECT_EQ (ks.at (3).getString (), "other");
270 12 : EXPECT_EQ (ks.at (4).getName (), "user/my/key");
271 12 : EXPECT_EQ (ks.at (4).getString (), "5");
272 12 : EXPECT_EQ (ks.at (5).getName (), "user/other/key");
273 12 : EXPECT_EQ (ks.at (5).getString (), "144");
274 : }
275 :
276 20 : TEST_F (test_contextual_update, activateLayersByCV)
277 : {
278 14 : EXPECT_EQ (c["doesnotexist"], "");
279 14 : EXPECT_EQ (c["id"], "");
280 14 : EXPECT_EQ (c["key"], "");
281 8 : ASSERT_EQ (x.getName (), "/%/key");
282 12 : EXPECT_EQ (ks.at (0).getName (), "/%/key");
283 12 : EXPECT_EQ (ks.at (0).getString (), "33");
284 :
285 4 : c.activate (x);
286 10 : ASSERT_EQ (x.getName (), "/%/key");
287 14 : EXPECT_EQ (c["key"], "33");
288 14 : EXPECT_EQ (c["id"], "");
289 :
290 4 : c.activate (i);
291 10 : ASSERT_EQ (x.getName (), "/my/key") << "spec should be changed";
292 14 : EXPECT_EQ (c["id"], "my");
293 14 : EXPECT_EQ (c["key"], "33") << "must be still 33, not synced";
294 :
295 4 : x = 5;
296 14 : EXPECT_EQ (c["key"], "5") << "direct assignment";
297 14 : EXPECT_EQ (c["id"], "my");
298 :
299 10 : i = "other";
300 10 : ASSERT_EQ (x.getName (), "user/my/key") << "spec should still refer to my";
301 14 : EXPECT_EQ (c["id"], "other");
302 14 : EXPECT_EQ (c["key"], "5") << "must be still 5, not synced";
303 :
304 6 : ASSERT_GE (ks.size (), 5);
305 8 : EXPECT_EQ (ks.size (), 5);
306 12 : EXPECT_EQ (ks.at (0).getName (), "/%/key");
307 12 : EXPECT_EQ (ks.at (0).getString (), "33");
308 12 : EXPECT_EQ (ks.at (1).getName (), "/ignore/id");
309 12 : EXPECT_EQ (ks.at (1).getString (), "my");
310 12 : EXPECT_EQ (ks.at (2).getName (), "/my/key");
311 12 : EXPECT_EQ (ks.at (2).getString (), "33");
312 12 : EXPECT_EQ (ks.at (3).getName (), "user/ignore/id");
313 12 : EXPECT_EQ (ks.at (3).getString (), "other");
314 12 : EXPECT_EQ (ks.at (4).getName (), "user/my/key");
315 12 : EXPECT_EQ (ks.at (4).getString (), "5");
316 :
317 4 : c.sync ();
318 10 : ASSERT_EQ (x.getName (), "/other/key") << "spec should refer to other after sync";
319 14 : EXPECT_EQ (c["id"], "other");
320 14 : EXPECT_EQ (c["key"], "33") << "must be still 5, not synced";
321 :
322 10 : i = "my";
323 10 : ASSERT_EQ (x.getName (), "/other/key") << "sync pending";
324 14 : EXPECT_EQ (c["id"], "my");
325 14 : EXPECT_EQ (c["key"], "33");
326 :
327 4 : c.sync ();
328 10 : ASSERT_EQ (x.getName (), "user/my/key") << "sync done";
329 14 : EXPECT_EQ (c["id"], "my");
330 14 : EXPECT_EQ (c["key"], "5") << "not synced properly";
331 :
332 6 : ks.append (Key ("user/my/key", KEY_VALUE, "99", KEY_END));
333 :
334 4 : c.sync ();
335 10 : ASSERT_EQ (x.getName (), "user/my/key");
336 14 : EXPECT_EQ (c["id"], "my");
337 14 : EXPECT_EQ (c["key"], "99") << "not synced properly";
338 :
339 :
340 10 : i = "";
341 10 : ASSERT_EQ (x.getName (), "user/my/key") << "key pending";
342 14 : EXPECT_EQ (c["id"], "") << "but layer should be changed";
343 14 : EXPECT_EQ (c["key"], "99") << "still 99, not synced";
344 :
345 4 : c.sync ();
346 14 : EXPECT_EQ (c["id"], "");
347 14 : EXPECT_EQ (c["key"], "33") << "go back to old value because of sync";
348 :
349 6 : ASSERT_GE (ks.size (), 6);
350 8 : EXPECT_EQ (ks.size (), 6);
351 12 : EXPECT_EQ (ks.at (0).getName (), "/%/key");
352 12 : EXPECT_EQ (ks.at (0).getString (), "33");
353 12 : EXPECT_EQ (ks.at (1).getName (), "/ignore/id");
354 12 : EXPECT_EQ (ks.at (1).getString (), "my");
355 12 : EXPECT_EQ (ks.at (2).getName (), "/my/key");
356 12 : EXPECT_EQ (ks.at (2).getString (), "33");
357 12 : EXPECT_EQ (ks.at (3).getName (), "/other/key");
358 12 : EXPECT_EQ (ks.at (3).getString (), "33");
359 12 : EXPECT_EQ (ks.at (4).getName (), "user/ignore/id");
360 12 : EXPECT_EQ (ks.at (4).getString (), "");
361 12 : EXPECT_EQ (ks.at (5).getName (), "user/my/key");
362 12 : EXPECT_EQ (ks.at (5).getString (), "99");
363 :
364 10 : i = "hello";
365 14 : EXPECT_EQ (c["id"], "hello");
366 14 : EXPECT_EQ (c["key"], "33");
367 :
368 4 : c.deactivate (i);
369 14 : EXPECT_EQ (c["id"], "");
370 14 : EXPECT_EQ (c["key"], "33");
371 :
372 4 : c.deactivate (x);
373 14 : EXPECT_EQ (c["id"], "");
374 14 : EXPECT_EQ (c["key"], "");
375 :
376 10 : i = "hi_again";
377 14 : EXPECT_EQ (c["id"], "");
378 14 : EXPECT_EQ (c["key"], "");
379 : }
380 :
381 :
382 20 : TEST_F (test_contextual_update, notifyAssignKeySetUpdateMore)
383 : {
384 : ThreadValue<std::string> j (
385 6 : ks, c, Key ("/%country%/language/code", KEY_META, "layer/name", "language", KEY_META, "default", "my", KEY_END));
386 6 : ThreadValue<int> y (ks, c, Key ("/%language%/%id%/key", KEY_META, "default", "55", KEY_END));
387 4 : c.activate (j); // activate language layer "my"
388 :
389 6 : ASSERT_GE (ks.size (), 5);
390 8 : EXPECT_EQ (ks.size (), 5);
391 12 : EXPECT_EQ (ks.at (0).getName (), "/%/%/key");
392 12 : EXPECT_EQ (ks.at (0).getString (), "55");
393 12 : EXPECT_EQ (ks.at (1).getName (), "/%/key");
394 12 : EXPECT_EQ (ks.at (1).getString (), "33");
395 12 : EXPECT_EQ (ks.at (2).getName (), "/%/language/code");
396 12 : EXPECT_EQ (ks.at (2).getString (), "my");
397 12 : EXPECT_EQ (ks.at (3).getName (), "/ignore/id");
398 12 : EXPECT_EQ (ks.at (3).getString (), "my");
399 12 : EXPECT_EQ (ks.at (4).getName (), "/my/%/key");
400 12 : EXPECT_EQ (ks.at (4).getString (), "55");
401 :
402 : // now in the database the language changes:
403 6 : ks.append (Key ("user/%/language/code", KEY_VALUE, "de", KEY_END));
404 6 : ks.append (Key ("user/de/%/key", KEY_VALUE, "155", KEY_END));
405 :
406 2 : c.notifyKeySetUpdate ();
407 8 : EXPECT_EQ (j.getName (), "user/%/language/code");
408 8 : EXPECT_EQ (y.getName (), "user/de/%/key");
409 8 : EXPECT_EQ (std::string (j), "de");
410 6 : EXPECT_EQ (y, 155);
411 :
412 6 : ASSERT_GE (ks.size (), 7);
413 8 : EXPECT_EQ (ks.size (), 7);
414 12 : EXPECT_EQ (ks.at (0).getName (), "/%/%/key");
415 12 : EXPECT_EQ (ks.at (0).getString (), "55");
416 12 : EXPECT_EQ (ks.at (1).getName (), "/%/key");
417 12 : EXPECT_EQ (ks.at (1).getString (), "33");
418 12 : EXPECT_EQ (ks.at (2).getName (), "/%/language/code");
419 12 : EXPECT_EQ (ks.at (2).getString (), "my");
420 12 : EXPECT_EQ (ks.at (3).getName (), "/ignore/id");
421 12 : EXPECT_EQ (ks.at (3).getString (), "my");
422 12 : EXPECT_EQ (ks.at (4).getName (), "/my/%/key");
423 12 : EXPECT_EQ (ks.at (4).getString (), "55");
424 12 : EXPECT_EQ (ks.at (5).getName (), "user/%/language/code");
425 12 : EXPECT_EQ (ks.at (5).getString (), "de");
426 12 : EXPECT_EQ (ks.at (6).getName (), "user/de/%/key");
427 12 : EXPECT_EQ (ks.at (6).getString (), "155");
428 : }
429 :
430 20 : TEST_F (test_contextual_update, notifySyncAssign)
431 : {
432 : ThreadValue<std::string> j (
433 6 : ks, c, Key ("/%country%/language/code", KEY_META, "layer/name", "language", KEY_META, "default", "my", KEY_END));
434 6 : ThreadValue<int> y (ks, c, Key ("/%language%/%id%/key", KEY_META, "default", "55", KEY_END));
435 4 : c.activate (j); // activate language layer with "my"
436 :
437 6 : ASSERT_GE (ks.size (), 5);
438 8 : EXPECT_EQ (ks.size (), 5);
439 12 : EXPECT_EQ (ks.at (0).getName (), "/%/%/key");
440 12 : EXPECT_EQ (ks.at (0).getString (), "55");
441 12 : EXPECT_EQ (ks.at (1).getName (), "/%/key");
442 12 : EXPECT_EQ (ks.at (1).getString (), "33");
443 12 : EXPECT_EQ (ks.at (2).getName (), "/%/language/code");
444 12 : EXPECT_EQ (ks.at (2).getString (), "my");
445 12 : EXPECT_EQ (ks.at (3).getName (), "/ignore/id");
446 12 : EXPECT_EQ (ks.at (3).getString (), "my");
447 12 : EXPECT_EQ (ks.at (4).getName (), "/my/%/key");
448 12 : EXPECT_EQ (ks.at (4).getString (), "55");
449 :
450 10 : j = "de";
451 6 : ks.append (Key ("user/de/%/key", KEY_VALUE, "155", KEY_END));
452 :
453 4 : c.sync ();
454 8 : EXPECT_EQ (j.getName (), "user/%/language/code");
455 8 : EXPECT_EQ (y.getName (), "user/de/%/key");
456 8 : EXPECT_EQ (std::string (j), "de");
457 6 : EXPECT_EQ (y, 155);
458 :
459 6 : ASSERT_GE (ks.size (), 7);
460 8 : EXPECT_EQ (ks.size (), 7);
461 12 : EXPECT_EQ (ks.at (0).getName (), "/%/%/key");
462 12 : EXPECT_EQ (ks.at (0).getString (), "55");
463 12 : EXPECT_EQ (ks.at (1).getName (), "/%/key");
464 12 : EXPECT_EQ (ks.at (1).getString (), "33");
465 12 : EXPECT_EQ (ks.at (2).getName (), "/%/language/code");
466 12 : EXPECT_EQ (ks.at (2).getString (), "my");
467 12 : EXPECT_EQ (ks.at (3).getName (), "/ignore/id");
468 12 : EXPECT_EQ (ks.at (3).getString (), "my");
469 12 : EXPECT_EQ (ks.at (4).getName (), "/my/%/key");
470 12 : EXPECT_EQ (ks.at (4).getString (), "55");
471 12 : EXPECT_EQ (ks.at (5).getName (), "user/%/language/code");
472 12 : EXPECT_EQ (ks.at (5).getString (), "de");
473 12 : EXPECT_EQ (ks.at (6).getName (), "user/de/%/key");
474 12 : EXPECT_EQ (ks.at (6).getString (), "155");
475 : }
476 :
477 20 : TEST_F (test_contextual_update, notifySyncCycle)
478 : {
479 : ThreadValue<std::string> j (
480 6 : ks, c, Key ("/%country%/%language%/code", KEY_META, "layer/name", "language", KEY_META, "default", "my", KEY_END));
481 6 : ThreadValue<int> y (ks, c, Key ("/%language%/%country%/country", KEY_META, "default", "55", KEY_END));
482 4 : EXPECT_NO_THROW (c.activate (j)) << "also works with cycle"; // activate language layer with "my"
483 :
484 6 : ASSERT_GE (ks.size (), 6);
485 8 : EXPECT_EQ (ks.size (), 6);
486 12 : EXPECT_EQ (ks.at (0).getName (), "/%/%/code");
487 12 : EXPECT_EQ (ks.at (0).getString (), "my");
488 12 : EXPECT_EQ (ks.at (1).getName (), "/%/%/country");
489 12 : EXPECT_EQ (ks.at (1).getString (), "55");
490 12 : EXPECT_EQ (ks.at (2).getName (), "/%/key");
491 12 : EXPECT_EQ (ks.at (2).getString (), "33");
492 12 : EXPECT_EQ (ks.at (3).getName (), "/%/my/code");
493 12 : EXPECT_EQ (ks.at (3).getString (), "my");
494 12 : EXPECT_EQ (ks.at (4).getName (), "/ignore/id");
495 12 : EXPECT_EQ (ks.at (4).getString (), "my");
496 12 : EXPECT_EQ (ks.at (5).getName (), "/my/%/country");
497 12 : EXPECT_EQ (ks.at (5).getString (), "55");
498 :
499 : // now in the database the language changes:
500 6 : ks.append (Key ("user/%/language/code", KEY_VALUE, "de", KEY_END));
501 6 : ks.append (Key ("user/de/%/key", KEY_VALUE, "155", KEY_END));
502 :
503 6 : EXPECT_THROW (c.sync (), std::runtime_error);
504 8 : EXPECT_EQ (std::string (j), "my");
505 6 : EXPECT_EQ (y, 55);
506 :
507 6 : ASSERT_GE (ks.size (), 8);
508 8 : EXPECT_EQ (ks.size (), 8);
509 12 : EXPECT_EQ (ks.at (0).getName (), "/%/%/code");
510 12 : EXPECT_EQ (ks.at (0).getString (), "my");
511 12 : EXPECT_EQ (ks.at (1).getName (), "/%/%/country");
512 12 : EXPECT_EQ (ks.at (1).getString (), "55");
513 12 : EXPECT_EQ (ks.at (2).getName (), "/%/key");
514 12 : EXPECT_EQ (ks.at (2).getString (), "33");
515 12 : EXPECT_EQ (ks.at (3).getName (), "/%/my/code");
516 12 : EXPECT_EQ (ks.at (3).getString (), "my");
517 12 : EXPECT_EQ (ks.at (4).getName (), "/ignore/id");
518 12 : EXPECT_EQ (ks.at (4).getString (), "my");
519 12 : EXPECT_EQ (ks.at (5).getName (), "/my/%/country");
520 12 : EXPECT_EQ (ks.at (5).getString (), "55");
521 12 : EXPECT_EQ (ks.at (6).getName (), "user/%/language/code");
522 12 : EXPECT_EQ (ks.at (6).getString (), "de");
523 12 : EXPECT_EQ (ks.at (7).getName (), "user/de/%/key");
524 12 : EXPECT_EQ (ks.at (7).getString (), "155");
525 6 : }
|