Merge lp:~compiz-team/compiz/compiz.fix_1063617.3 into lp:compiz/0.9.9

Proposed by Sam Spilsbury
Status: Merged
Approved by: Daniel van Vugt
Approved revision: 3481
Merged at revision: 3486
Proposed branch: lp:~compiz-team/compiz/compiz.fix_1063617.3
Merge into: lp:compiz/0.9.9
Diff against target: 598 lines (+379/-158)
3 files modified
compizconfig/libcompizconfig/include/ccs.h (+25/-0)
compizconfig/libcompizconfig/src/compiz.cpp (+208/-153)
compizconfig/libcompizconfig/tests/compizconfig_test_ccs_setting.cpp (+146/-5)
To merge this branch: bzr merge lp:~compiz-team/compiz/compiz.fix_1063617.3
Reviewer Review Type Date Requested Status
PS Jenkins bot (community) continuous-integration Needs Fixing
Daniel van Vugt Approve
Review via email: mp+136037@code.launchpad.net

Commit message

Refactored CCSSettingDefaultImpl construction - export a
ccsSettingDefaultImplNew which can be provided custom methods on how to
initialize setting default values and info (eg, XML, ProtoBuf or Mock).

Added a simple construction test to prove that it works.

Description of the change

NOTE: I have a branch here which merges all of these together without conflicts, so just don't merge this one directly

This is about preparing a fix for (LP: #1063617).

(LP: #1063617) is really complicated. The problem is that there is a feedback loop between integrated keys and normal keys which can cause the integrated keys to read from normal keys which will be out of date or incorrect because they were never updated.

A part of that problem is that we need to have more information in the backends as to why setting a key to a particular value failed or succeeded.

Refactored CCSSettingDefaultImpl construction - export a
ccsSettingDefaultImplNew which can be provided custom methods on how to
initialize setting default values and info (eg, XML, ProtoBuf or Mock).

Added a simple construction test to prove that it works.

To post a comment you must log in.
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
Daniel van Vugt (vanvugt) wrote :

Works for me.

review: Approve
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
Sam Spilsbury (smspillaz) wrote :

(Ignore jenkins)

Revision history for this message
Sam Spilsbury (smspillaz) wrote :

Hmm, I said don't merge these manually ...

In any case please don't merge the other ones. Wait till they're
approved and I'll drop the proposals and propose one with the
conflicts resolved.

On Tue, Nov 27, 2012 at 12:00 PM, <email address hidden> wrote:
> The proposal to merge lp:~compiz-team/compiz/compiz.fix_1063617.3 into lp:compiz has been updated.
>
> Status: Approved => Merged
>
> For more details, see:
> https://code.launchpad.net/~compiz-team/compiz/compiz.fix_1063617.3/+merge/136037
> --
> https://code.launchpad.net/~compiz-team/compiz/compiz.fix_1063617.3/+merge/136037
> Your team Compiz Maintainers is subscribed to branch lp:compiz.

--
Sam Spilsbury

Revision history for this message
Daniel van Vugt (vanvugt) wrote :

Sorry, I was looking for the do-not-merge messages but somehow missed this one.

Revision history for this message
Sam Spilsbury (smspillaz) wrote :

No problem, this one is probably resolvable

On Tue, Nov 27, 2012 at 1:07 PM, Daniel van Vugt
<email address hidden> wrote:
> Sorry, I was looking for the do-not-merge messages but somehow missed this one.
>
>
> --
> https://code.launchpad.net/~compiz-team/compiz/compiz.fix_1063617.3/+merge/136037
> Your team Compiz Maintainers is subscribed to branch lp:compiz.

--
Sam Spilsbury

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'compizconfig/libcompizconfig/include/ccs.h'
2--- compizconfig/libcompizconfig/include/ccs.h 2012-10-03 10:50:07 +0000
3+++ compizconfig/libcompizconfig/include/ccs.h 2012-11-25 02:36:21 +0000
4@@ -647,6 +647,31 @@
5 CCSObject object;
6 };
7
8+typedef void (*CCSSettingDefaultValueInitializerFunc) (CCSSettingType type,
9+ CCSSettingInfo *info,
10+ CCSSettingValue *value,
11+ void *data);
12+
13+typedef void (*CCSSettingInfoInitializerFunc) (CCSSettingType type,
14+ CCSSettingInfo *info,
15+ void *data);
16+
17+CCSSetting *
18+ccsSettingDefaultImplNew (CCSPlugin *plugin,
19+ const char *name,
20+ CCSSettingType type,
21+ const char *shortDesc,
22+ const char *longDesc,
23+ const char *hints,
24+ const char *group,
25+ const char *subGroup,
26+ CCSSettingDefaultValueInitializerFunc valueInit,
27+ void *valueInitData,
28+ CCSSettingInfoInitializerFunc infoInit,
29+ void *infoInitData,
30+ CCSObjectAllocationInterface *ai,
31+ const CCSInterfaceTable *interfaces);
32+
33 struct _CCSPluginCategory
34 {
35 const char *name; /* plugin category name */
36
37=== modified file 'compizconfig/libcompizconfig/src/compiz.cpp'
38--- compizconfig/libcompizconfig/src/compiz.cpp 2012-08-15 10:19:02 +0000
39+++ compizconfig/libcompizconfig/src/compiz.cpp 2012-11-25 02:36:21 +0000
40@@ -547,178 +547,233 @@
41 }
42
43 static void
44+ccsSettingInfoPBInitializer (CCSSettingType type,
45+ CCSSettingInfo *info,
46+ void *data)
47+{
48+ const OptionMetadata &option (*((const OptionMetadata *) data));
49+
50+ switch (type)
51+ {
52+ case TypeInt:
53+ initIntInfoPB (info, option);
54+ break;
55+ case TypeFloat:
56+ initFloatInfoPB (info, option);
57+ break;
58+ case TypeString:
59+ initStringInfoPB (info, option);
60+ break;
61+ case TypeList:
62+ initListInfoPB (info, option);
63+ break;
64+ case TypeKey:
65+ case TypeButton:
66+ case TypeEdge:
67+ case TypeBell:
68+ initActionInfoPB (info, option);
69+ break;
70+ case TypeAction: // do nothing and fall through
71+ default:
72+ break;
73+ }
74+}
75+
76+static void
77+ccsSettingDefaultValuePBInitializer (CCSSettingType type,
78+ CCSSettingInfo *info,
79+ CCSSettingValue *value,
80+ void *data)
81+{
82+ const OptionMetadata &option (*((const OptionMetadata *) data));
83+
84+ switch (type)
85+ {
86+ case TypeInt:
87+ initIntValuePB (value, info,
88+ option.default_value (0));
89+ break;
90+ case TypeBool:
91+ initBoolValuePB (value, option.default_value (0));
92+ break;
93+ case TypeFloat:
94+ initFloatValuePB (value, info,
95+ option.default_value (0));
96+ break;
97+ case TypeString:
98+ initStringValuePB (value, info,
99+ option.default_value (0));
100+ break;
101+ case TypeColor:
102+ initColorValuePB (value, option.default_value (0));
103+ break;
104+ case TypeKey:
105+ initKeyValuePB (value, info,
106+ option.default_value (0));
107+ break;
108+ case TypeButton:
109+ initButtonValuePB (value, info,
110+ option.default_value (0));
111+ break;
112+ case TypeEdge:
113+ initEdgeValuePB (value, info,
114+ option.default_value (0));
115+ break;
116+ case TypeBell:
117+ initBellValuePB (value, info,
118+ option.default_value (0));
119+ break;
120+ case TypeMatch:
121+ initMatchValuePB (value,
122+ option.default_value (0));
123+ break;
124+ case TypeList:
125+ initListValuePB (value, info,
126+ option);
127+ break;
128+ case TypeAction: // do nothing and fall through
129+ default:
130+ break;
131+ }
132+}
133+
134+static void
135+ccsSettingDefaultValueEmptyInitializer (CCSSettingType type,
136+ CCSSettingInfo *info,
137+ CCSSettingValue *value,
138+ void *data)
139+{
140+ /* if we have no set defaults, we have at least to set
141+ the string defaults to empty strings */
142+ switch (type)
143+ {
144+ case TypeString:
145+ value->value.asString = strdup ("");
146+ break;
147+ case TypeMatch:
148+ value->value.asMatch = strdup ("");
149+ break;
150+ default:
151+ break;
152+ }
153+}
154+
155+CCSSetting *
156+ccsSettingDefaultImplNew (CCSPlugin *plugin,
157+ const char *name,
158+ CCSSettingType type,
159+ const char *shortDesc,
160+ const char *longDesc,
161+ const char *hints,
162+ const char *group,
163+ const char *subGroup,
164+ CCSSettingDefaultValueInitializerFunc valueInit,
165+ void *valueInitData,
166+ CCSSettingInfoInitializerFunc infoInit,
167+ void *infoInitData,
168+ CCSObjectAllocationInterface *ai,
169+ const CCSInterfaceTable *interfaces)
170+{
171+ CCSSetting *setting = (CCSSetting *) calloc (1, sizeof (CCSSetting));
172+
173+ if (!setting)
174+ return NULL;
175+
176+ ccsObjectInit (setting, ai);
177+
178+ CCSSettingPrivate *sPrivate = (CCSSettingPrivate *) (*ai->calloc_) (ai->allocator, 1, sizeof (CCSSettingPrivate));
179+
180+ if (!sPrivate)
181+ {
182+ free (setting);
183+ return NULL;
184+ }
185+
186+ ccsObjectSetPrivate (setting, (CCSPrivate *) sPrivate);
187+ ccsObjectAddInterface (setting, (CCSInterface *) interfaces->settingInterface, GET_INTERFACE_TYPE (CCSSettingInterface));
188+ ccsSettingRef (setting);
189+
190+ sPrivate->parent = plugin;
191+ sPrivate->isDefault = TRUE;
192+ sPrivate->name = strdup (name);
193+
194+ sPrivate->shortDesc = strdup (shortDesc);
195+ sPrivate->longDesc = strdup (longDesc);
196+ sPrivate->group = strdup (group);
197+ sPrivate->hints = strdup (hints);
198+ sPrivate->subGroup = strdup (subGroup);
199+
200+ sPrivate->type = type;
201+ sPrivate->value = &sPrivate->defaultValue;
202+ sPrivate->defaultValue.parent = setting;
203+
204+ (*infoInit) (type, &sPrivate->info, infoInitData);
205+ (*valueInit) (type, &sPrivate->info, &sPrivate->defaultValue, valueInitData);
206+
207+ return setting;
208+}
209+
210+static void
211 addOptionForPluginPB (CCSPlugin * plugin,
212 const char * name,
213 const StringList & groups,
214 const StringList & subgroups,
215 const OptionMetadata & option)
216 {
217- CCSSetting *setting;
218-
219 if (ccsFindSetting (plugin, name))
220 {
221 ccsError ("Option \"%s\" already defined", name);
222 return;
223 }
224
225- CCSContext *context = ccsPluginGetContext (plugin);
226- CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context);
227-
228- setting = (CCSSetting *) calloc (1, sizeof (CCSSetting));
229-
230- if (!setting)
231- return;
232-
233- ccsObjectInit (setting, &ccsDefaultObjectAllocator);
234-
235- CCSSettingPrivate *ccsPrivate = (CCSSettingPrivate *) calloc (1, sizeof (CCSSettingPrivate));
236-
237- if (!ccsPrivate)
238- {
239- free (setting);
240- return;
241- }
242-
243- ccsObjectSetPrivate (setting, (CCSPrivate *) ccsPrivate);
244- ccsObjectAddInterface (setting, (CCSInterface *) cPrivate->object_interfaces->settingInterface, GET_INTERFACE_TYPE (CCSSettingInterface));
245- ccsSettingRef (setting);
246-
247- CCSSettingPrivate *sPrivate = GET_PRIVATE (CCSSettingPrivate, setting);
248-
249- sPrivate->parent = plugin;
250- sPrivate->isDefault = TRUE;
251- sPrivate->name = strdup (name);
252+ const char *shortDesc = name;
253+ const char *longDesc = "";
254+ const char *group = "";
255+ const char *hints = "";
256+ const char *subGroup = "";
257+
258+ CCSSettingType type = (CCSSettingType) option.type ();
259
260 if (!basicMetadata)
261 {
262- sPrivate->shortDesc =
263- strdup (option.has_short_desc () ?
264+ shortDesc = option.has_short_desc () ?
265 option.short_desc ().c_str () :
266- name);
267- sPrivate->longDesc =
268- strdup (option.has_long_desc () ?
269+ name;
270+ longDesc = option.has_long_desc () ?
271 option.long_desc ().c_str () :
272- name);
273- sPrivate->hints = strdup (option.has_hints () ?
274- option.hints ().c_str () :
275- name);
276- sPrivate->group =
277- strdup (option.group_id () >= 0 ?
278- groups.Get (option.group_id ()).c_str () :
279- "");
280- sPrivate->subGroup =
281- strdup (option.subgroup_id () >= 0 ?
282- subgroups.Get (option.subgroup_id ()).c_str () :
283- "");
284- }
285- else
286- {
287- sPrivate->shortDesc = strdup (name);
288- sPrivate->longDesc = strdup ("");
289- sPrivate->hints = strdup ("");
290- sPrivate->group = strdup ("");
291- sPrivate->subGroup = strdup ("");
292- }
293-
294- sPrivate->type = (CCSSettingType) option.type ();
295- sPrivate->value = &sPrivate->defaultValue;
296- sPrivate->defaultValue.parent = setting;
297-
298- switch (sPrivate->type)
299- {
300- case TypeInt:
301- initIntInfoPB (&sPrivate->info, option);
302- break;
303- case TypeFloat:
304- initFloatInfoPB (&sPrivate->info, option);
305- break;
306- case TypeString:
307- initStringInfoPB (&sPrivate->info, option);
308- break;
309- case TypeList:
310- initListInfoPB (&sPrivate->info, option);
311- break;
312- case TypeKey:
313- case TypeButton:
314- case TypeEdge:
315- case TypeBell:
316- initActionInfoPB (&sPrivate->info, option);
317- break;
318- case TypeAction: // do nothing and fall through
319- default:
320- break;
321- }
322-
323- if (option.default_value_size () > 0)
324- {
325- switch (sPrivate->type)
326- {
327- case TypeInt:
328- initIntValuePB (&sPrivate->defaultValue, &sPrivate->info,
329- option.default_value (0));
330- break;
331- case TypeBool:
332- initBoolValuePB (&sPrivate->defaultValue, option.default_value (0));
333- break;
334- case TypeFloat:
335- initFloatValuePB (&sPrivate->defaultValue, &sPrivate->info,
336- option.default_value (0));
337- break;
338- case TypeString:
339- initStringValuePB (&sPrivate->defaultValue, &sPrivate->info,
340- option.default_value (0));
341- break;
342- case TypeColor:
343- initColorValuePB (&sPrivate->defaultValue, option.default_value (0));
344- break;
345- case TypeKey:
346- initKeyValuePB (&sPrivate->defaultValue, &sPrivate->info,
347- option.default_value (0));
348- break;
349- case TypeButton:
350- initButtonValuePB (&sPrivate->defaultValue, &sPrivate->info,
351- option.default_value (0));
352- break;
353- case TypeEdge:
354- initEdgeValuePB (&sPrivate->defaultValue, &sPrivate->info,
355- option.default_value (0));
356- break;
357- case TypeBell:
358- initBellValuePB (&sPrivate->defaultValue, &sPrivate->info,
359- option.default_value (0));
360- break;
361- case TypeMatch:
362- initMatchValuePB (&sPrivate->defaultValue,
363- option.default_value (0));
364- break;
365- case TypeList:
366- initListValuePB (&sPrivate->defaultValue, &sPrivate->info,
367- option);
368- break;
369- case TypeAction: // do nothing and fall through
370- default:
371- break;
372- }
373- }
374- else
375- {
376- /* if we have no set defaults, we have at least to set
377- the string defaults to empty strings */
378- switch (sPrivate->type)
379- {
380- case TypeString:
381- sPrivate->defaultValue.value.asString = strdup ("");
382- break;
383- case TypeMatch:
384- sPrivate->defaultValue.value.asMatch = strdup ("");
385- break;
386- default:
387- break;
388- }
389- }
390-
391+ name;
392+ hints = option.has_hints () ?
393+ option.hints ().c_str () :
394+ name;
395+ group = option.group_id () >= 0 ?
396+ groups.Get (option.group_id ()).c_str () :
397+ "";
398+ subGroup = option.subgroup_id () >= 0 ?
399+ subgroups.Get (option.subgroup_id ()).c_str () :
400+ "";
401+ }
402+
403+ CCSContext *context = ccsPluginGetContext (plugin);
404+ CCSContextPrivate *cPrivate = GET_PRIVATE (CCSContextPrivate, context);
405 CCSPluginPrivate *pPrivate = GET_PRIVATE (CCSPluginPrivate, plugin);
406
407+ CCSSetting *setting = ccsSettingDefaultImplNew (plugin,
408+ name,
409+ type,
410+ shortDesc,
411+ longDesc,
412+ hints,
413+ group,
414+ subGroup,
415+ option.default_value_size () > 0 ?
416+ ccsSettingDefaultValuePBInitializer :
417+ ccsSettingDefaultValueEmptyInitializer,
418+ (void *) &option,
419+ ccsSettingInfoPBInitializer,
420+ (void *) &option,
421+ plugin->object.object_allocation,
422+ cPrivate->object_interfaces);
423+
424 pPrivate->settings = ccsSettingListAppend (pPrivate->settings, setting);
425 }
426
427
428=== modified file 'compizconfig/libcompizconfig/tests/compizconfig_test_ccs_setting.cpp'
429--- compizconfig/libcompizconfig/tests/compizconfig_test_ccs_setting.cpp 2012-08-09 18:21:41 +0000
430+++ compizconfig/libcompizconfig/tests/compizconfig_test_ccs_setting.cpp 2012-11-25 02:36:21 +0000
431@@ -1,17 +1,39 @@
432+/*
433+ * Compiz configuration system library
434+ *
435+ * Copyright (C) 2012 Canonical Ltd
436+ * Copyright (C) 2012 Sam Spilsbury <smspillaz@gmail.com>
437+ *
438+ * This library is free software; you can redistribute it and/or
439+ * modify it under the terms of the GNU Lesser General Public
440+ * License as published by the Free Software Foundation; either
441+ * version 2.1 of the License, or (at your option) any later version.
442+
443+ * This library is distributed in the hope that it will be useful,
444+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
445+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
446+ * Lesser General Public License for more details.
447+ * You should have received a copy of the GNU Lesser General Public
448+ * License along with this library; if not, write to the Free Software
449+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
450+*/
451+
452 #include <gtest/gtest.h>
453 #include <gmock/gmock.h>
454
455+#include <gtest_shared_autodestroy.h>
456+#include <boost/shared_ptr.hpp>
457+#include <boost/make_shared.hpp>
458+#include <boost/function.hpp>
459+
460 #include <ccs.h>
461
462 #include "compizconfig_ccs_setting_mock.h"
463+#include "compizconfig_ccs_plugin_mock.h"
464
465 using ::testing::_;
466 using ::testing::Return;
467-
468-class CCSSettingTest :
469- public ::testing::Test
470-{
471-};
472+using ::testing::InSequence;
473
474 TEST(CCSSettingTest, TestMock)
475 {
476@@ -109,3 +131,122 @@
477
478 ccsSettingUnref (setting);
479 }
480+
481+namespace
482+{
483+class MockInitializerFuncs
484+{
485+ public:
486+
487+ MOCK_METHOD3 (initializeInfo, void (CCSSettingType, CCSSettingInfo *, void *));
488+ MOCK_METHOD4 (initializeDefaultValue, void (CCSSettingType, CCSSettingInfo *, CCSSettingValue *, void *));
489+
490+ static void wrapInitializeInfo (CCSSettingType type,
491+ CCSSettingInfo *info,
492+ void *data)
493+ {
494+ MockInitializerFuncs &funcs (*(reinterpret_cast <MockInitializerFuncs *> (data)));
495+ funcs.initializeInfo (type, info, data);
496+ }
497+
498+ static void wrapInitializeValue (CCSSettingType type,
499+ CCSSettingInfo *info,
500+ CCSSettingValue *value,
501+ void *data)
502+ {
503+ MockInitializerFuncs &funcs (*(reinterpret_cast <MockInitializerFuncs *> (data)));
504+ funcs.initializeDefaultValue (type, info, value, data);
505+ }
506+};
507+
508+const std::string SETTING_NAME = "setting_name";
509+const std::string SETTING_SHORT_DESC = "Short Description";
510+const std::string SETTING_LONG_DESC = "Long Description";
511+const std::string SETTING_GROUP = "Group";
512+const std::string SETTING_SUBGROUP = "Sub Group";
513+const std::string SETTING_HINTS = "Hints";
514+const CCSSettingType SETTING_TYPE = TypeInt;
515+}
516+
517+class CCSSettingDefaultImplTest :
518+ public ::testing::Test
519+{
520+ public:
521+
522+ CCSSettingDefaultImplTest () :
523+ plugin (AutoDestroy (ccsMockPluginNew (),
524+ ccsPluginUnref)),
525+ gmockPlugin (reinterpret_cast <CCSPluginGMock *> (ccsObjectGetPrivate (plugin.get ())))
526+ {
527+ }
528+
529+ virtual void SetUpSetting (MockInitializerFuncs &funcs)
530+ {
531+ void *vFuncs = reinterpret_cast <void *> (&funcs);
532+
533+ /* Info must be initialized before the value */
534+ InSequence s;
535+
536+ EXPECT_CALL (funcs, initializeInfo (GetSettingType (), _, vFuncs));
537+ EXPECT_CALL (funcs, initializeDefaultValue (GetSettingType (), _, _, vFuncs));
538+
539+ setting = AutoDestroy (ccsSettingDefaultImplNew (plugin.get (),
540+ SETTING_NAME.c_str (),
541+ GetSettingType (),
542+ SETTING_SHORT_DESC.c_str (),
543+ SETTING_LONG_DESC.c_str (),
544+ SETTING_HINTS.c_str (),
545+ SETTING_GROUP.c_str (),
546+ SETTING_SUBGROUP.c_str (),
547+ MockInitializerFuncs::wrapInitializeValue,
548+ vFuncs,
549+ MockInitializerFuncs::wrapInitializeInfo,
550+ vFuncs,
551+ &ccsDefaultObjectAllocator,
552+ &ccsDefaultInterfaceTable),
553+ ccsSettingUnref);
554+ }
555+
556+ virtual void SetUp ()
557+ {
558+ MockInitializerFuncs funcs;
559+
560+ SetUpSetting (funcs);
561+
562+ }
563+
564+ virtual CCSSettingType GetSettingType ()
565+ {
566+ return SETTING_TYPE;
567+ }
568+
569+ boost::shared_ptr <CCSPlugin> plugin;
570+ CCSPluginGMock *gmockPlugin;
571+ boost::shared_ptr <CCSSetting> setting;
572+};
573+
574+TEST_F (CCSSettingDefaultImplTest, Construction)
575+{
576+ EXPECT_EQ (SETTING_TYPE, ccsSettingGetType (setting.get ()));
577+ EXPECT_EQ (SETTING_NAME, ccsSettingGetName (setting.get ()));
578+ EXPECT_EQ (SETTING_SHORT_DESC, ccsSettingGetShortDesc (setting.get ()));
579+ EXPECT_EQ (SETTING_LONG_DESC, ccsSettingGetLongDesc (setting.get ()));
580+ EXPECT_EQ (SETTING_GROUP, ccsSettingGetGroup (setting.get ()));
581+ EXPECT_EQ (SETTING_SUBGROUP, ccsSettingGetSubGroup (setting.get ()));
582+ EXPECT_EQ (SETTING_HINTS, ccsSettingGetHints (setting.get ()));
583+
584+ /* Pointer Equality */
585+ EXPECT_EQ (ccsSettingGetDefaultValue (setting.get ()),
586+ ccsSettingGetValue (setting.get ()));
587+
588+ /* Actual Equality */
589+ EXPECT_TRUE (ccsCheckValueEq (ccsSettingGetDefaultValue (setting.get ()),
590+ ccsSettingGetType (setting.get ()),
591+ ccsSettingGetInfo (setting.get ()),
592+ ccsSettingGetValue (setting.get ()),
593+ ccsSettingGetType (setting.get ()),
594+ ccsSettingGetInfo (setting.get ())));
595+
596+ EXPECT_EQ (ccsSettingGetParent (setting.get ()),
597+ plugin.get ());
598+}

Subscribers

People subscribed via source and target branches