LCOV - code coverage report
Current view: top level - src/bindings/cpp/tests - testcpp_contextual_update.cpp (source / functions) Hit Total Coverage
Test: coverage-filtered.info Lines: 394 402 98.0 %
Date: 2019-09-12 12:28:41 Functions: 32 48 66.7 %

          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 : }

Generated by: LCOV version 1.13