1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24 #include "precompiled_configmgr.hxx"
25 #include "sal/config.h"
26
27 #include <cstddef>
28 #include <cstdlib>
29
30 #include "com/sun/star/beans/NamedValue.hpp"
31 #include "com/sun/star/beans/PropertyChangeEvent.hpp"
32 #include "com/sun/star/beans/XPropertyChangeListener.hpp"
33 #include "com/sun/star/beans/XPropertySet.hpp"
34 #include "com/sun/star/beans/XPropertyState.hpp"
35 #include "com/sun/star/container/XHierarchicalNameAccess.hpp"
36 #include "com/sun/star/container/XNameReplace.hpp"
37 #include "com/sun/star/container/XNamed.hpp"
38 #include "com/sun/star/lang/EventObject.hpp"
39 #include "com/sun/star/lang/XComponent.hpp"
40 #include "com/sun/star/lang/XMultiServiceFactory.hpp"
41 #include "com/sun/star/uno/Any.hxx"
42 #include "com/sun/star/uno/Reference.hxx"
43 #include "com/sun/star/uno/RuntimeException.hpp"
44 #include "com/sun/star/uno/Sequence.hxx"
45 #include "com/sun/star/uno/XComponentContext.hpp"
46 #include "com/sun/star/uno/XInterface.hpp"
47 #include "com/sun/star/util/XChangesBatch.hpp"
48 #include "cppuhelper/implbase1.hxx"
49 #include "cppuhelper/servicefactory.hxx"
50 #include "osl/conditn.hxx"
51 #include "osl/process.h"
52 #include "osl/thread.h"
53 #include "osl/thread.hxx"
54 #include "osl/time.h"
55 #include "rtl/ref.hxx"
56 #include "rtl/string.h"
57 #include "rtl/textcvt.h"
58 #include "rtl/ustrbuf.hxx"
59 #include "rtl/ustring.h"
60 #include "rtl/ustring.hxx"
61 #include "sal/types.h"
62 #include "gtest/gtest.h"
63
64 namespace {
65
66 namespace css = com::sun::star;
67
normalize(rtl::OUString const & path,rtl::OUString const & relative,rtl::OUString * normalizedPath,rtl::OUString * name)68 void normalize(
69 rtl::OUString const & path, rtl::OUString const & relative,
70 rtl::OUString * normalizedPath, rtl::OUString * name)
71 {
72 sal_Int32 i = relative.lastIndexOf('/');
73 if (i == -1) {
74 *normalizedPath = path;
75 *name = relative;
76 } else {
77 rtl::OUStringBuffer buf(path);
78 buf.append(sal_Unicode('/'));
79 buf.append(relative.copy(0, i));
80 *normalizedPath = buf.makeStringAndClear();
81 *name = relative.copy(i + 1);
82 }
83 }
84
85 class Test: public ::testing::Test {
86 public:
87 virtual void SetUp();
88
89 virtual void TearDown();
90
91 css::uno::Any getKey(
92 rtl::OUString const & path, rtl::OUString const & relative) const;
93
94 void setKey(
95 rtl::OUString const & path, rtl::OUString const & name,
96 css::uno::Any const & value) const;
97
98 bool resetKey(rtl::OUString const & path, rtl::OUString const & name) const;
99
100 css::uno::Reference< css::uno::XInterface > createViewAccess(
101 rtl::OUString const & path) const;
102
103 css::uno::Reference< css::uno::XInterface > createUpdateAccess(
104 rtl::OUString const & path) const;
105
106 private:
107 css::uno::Reference< css::uno::XComponentContext > context_;
108 css::uno::Reference< css::lang::XMultiServiceFactory > provider_;
109 };
110
111 class TestThread: public osl::Thread {
112 public:
113 TestThread(osl::Condition & stop);
114
115 bool getSuccess() const;
116
117 protected:
118 virtual bool iteration() = 0;
119
120 private:
121 virtual void SAL_CALL run();
122
123 osl::Condition & stop_;
124 bool success_;
125 };
126
TestThread(osl::Condition & stop)127 TestThread::TestThread(
128 osl::Condition & stop):
129 stop_(stop), success_(true)
130 {}
131
getSuccess() const132 bool TestThread::getSuccess() const {
133 return success_;
134 }
135
run()136 void TestThread::run() {
137 try {
138 while (!stop_.check()) {
139 if (!iteration()) {
140 success_ = false;
141 }
142 }
143 } catch (...) {
144 success_ = false;
145 }
146 }
147
148 class ReaderThread: public TestThread {
149 public:
150 ReaderThread(
151 osl::Condition & stop, Test const & test, rtl::OUString const & path,
152 rtl::OUString const & relative);
153
154 private:
155 virtual bool iteration();
156
157 Test const & test_;
158 rtl::OUString path_;
159 rtl::OUString relative_;
160 };
161
ReaderThread(osl::Condition & stop,Test const & test,rtl::OUString const & path,rtl::OUString const & relative)162 ReaderThread::ReaderThread(
163 osl::Condition & stop, Test const & test, rtl::OUString const & path,
164 rtl::OUString const & relative):
165 TestThread(stop), test_(test), path_(path), relative_(relative)
166 {
167 create();
168 }
169
iteration()170 bool ReaderThread::iteration() {
171 return test_.getKey(path_, relative_).hasValue();
172 }
173
174 class WriterThread: public TestThread {
175 public:
176 WriterThread(
177 osl::Condition & stop, Test const & test, rtl::OUString const & path,
178 rtl::OUString const & relative);
179
180 private:
181 virtual bool iteration();
182
183 Test const & test_;
184 rtl::OUString path_;
185 rtl::OUString name_;
186 std::size_t index_;
187 };
188
WriterThread(osl::Condition & stop,Test const & test,rtl::OUString const & path,rtl::OUString const & relative)189 WriterThread::WriterThread(
190 osl::Condition & stop, Test const & test, rtl::OUString const & path,
191 rtl::OUString const & relative):
192 TestThread(stop), test_(test), index_(0)
193 {
194 normalize(path, relative, &path_, &name_);
195 create();
196 }
197
iteration()198 bool WriterThread::iteration() {
199 rtl::OUString options[] = {
200 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("fish")),
201 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("chips")),
202 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("kippers")),
203 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("bloaters")) };
204 test_.setKey(path_, name_, css::uno::makeAny(options[index_]));
205 index_ = (index_ + 1) % (sizeof options / sizeof (rtl::OUString));
206 return true;
207 }
208
209 class RecursiveTest:
210 public cppu::WeakImplHelper1< css::beans::XPropertyChangeListener >
211 {
212 public:
213 RecursiveTest(Test const & theTest, int count, bool * destroyed);
214
215 void test();
216
217 protected:
218 virtual ~RecursiveTest();
219
220 virtual void step() const = 0;
221
222 Test const & test_;
223
224 private:
225 virtual void SAL_CALL disposing(css::lang::EventObject const &);
226
227 virtual void SAL_CALL propertyChange(
228 css::beans::PropertyChangeEvent const &);
229
230 int count_;
231 bool * destroyed_;
232 css::uno::Reference< css::beans::XPropertySet > properties_;
233 };
234
RecursiveTest(Test const & theTest,int count,bool * destroyed)235 RecursiveTest::RecursiveTest(
236 Test const & theTest, int count, bool * destroyed):
237 test_(theTest), count_(count), destroyed_(destroyed)
238 {}
239
test()240 void RecursiveTest::test() {
241 properties_ = css::uno::Reference< css::beans::XPropertySet >(
242 test_.createUpdateAccess(
243 rtl::OUString(
244 RTL_CONSTASCII_USTRINGPARAM(
245 "/org.openoffice.UI.GenericCommands/UserInterface/Commands/"
246 "dotuno:WebHtml"))),
247 css::uno::UNO_QUERY_THROW);
248 properties_->addPropertyChangeListener(
249 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Label")), this);
250 step();
251 ASSERT_TRUE(count_ == 0);
252 css::uno::Reference< css::lang::XComponent >(
253 properties_, css::uno::UNO_QUERY_THROW)->dispose();
254 }
255
~RecursiveTest()256 RecursiveTest::~RecursiveTest() {
257 *destroyed_ = true;
258 }
259
disposing(css::lang::EventObject const & Source)260 void RecursiveTest::disposing(css::lang::EventObject const & Source)
261 {
262 ASSERT_TRUE(properties_.is() && Source.Source == properties_);
263 properties_.clear();
264 }
265
propertyChange(css::beans::PropertyChangeEvent const & evt)266 void RecursiveTest::propertyChange(css::beans::PropertyChangeEvent const & evt)
267 {
268 ASSERT_TRUE(
269 evt.Source == properties_ &&
270 evt.PropertyName.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("Label")));
271 if (count_ > 0) {
272 --count_;
273 step();
274 }
275 }
276
277 class SimpleRecursiveTest: public RecursiveTest {
278 public:
279 SimpleRecursiveTest(Test const & theTest, int count, bool * destroyed);
280
281 private:
282 virtual void step() const;
283 };
284
SimpleRecursiveTest(Test const & theTest,int count,bool * destroyed)285 SimpleRecursiveTest::SimpleRecursiveTest(
286 Test const & theTest, int count, bool * destroyed):
287 RecursiveTest(theTest, count, destroyed)
288 {}
289
step() const290 void SimpleRecursiveTest::step() const {
291 test_.setKey(
292 rtl::OUString(
293 RTL_CONSTASCII_USTRINGPARAM(
294 "/org.openoffice.UI.GenericCommands/UserInterface/Commands/"
295 "dotuno:WebHtml")),
296 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Label")),
297 css::uno::makeAny(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("step"))));
298 }
299
300 class CrossThreadTest: public RecursiveTest {
301 public:
302 CrossThreadTest(Test const & theTest, int count, bool * destroyed);
303
304 private:
305 virtual void step() const;
306 };
307
CrossThreadTest(Test const & theTest,int count,bool * destroyed)308 CrossThreadTest::CrossThreadTest(
309 Test const & theTest, int count, bool * destroyed):
310 RecursiveTest(theTest, count, destroyed)
311 {}
312
step() const313 void CrossThreadTest::step() const {
314 osl::Condition stop;
315 stop.set();
316 WriterThread(
317 stop, test_,
318 rtl::OUString(
319 RTL_CONSTASCII_USTRINGPARAM(
320 "/org.openoffice.UI.GenericCommands/UserInterface/Commands/"
321 "dotuno:WebHtml")),
322 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Label"))).join();
323 test_.resetKey(
324 rtl::OUString(
325 RTL_CONSTASCII_USTRINGPARAM(
326 "/org.openoffice.UI.GenericCommands/UserInterface/Commands/"
327 "dotuno:WebHtml")),
328 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Label")));
329 }
330
SetUp()331 void Test::SetUp() {
332 char const * forward = getenv("CONFIGMGR_UNIT_FORWARD_STRING");
333 rtl_uString * registry = 0;
334 ASSERT_TRUE(
335 rtl_convertStringToUString(
336 ®istry, forward, rtl_str_getLength(forward),
337 osl_getThreadTextEncoding(),
338 (RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_ERROR |
339 RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_ERROR |
340 RTL_TEXTTOUNICODE_FLAGS_INVALID_ERROR)));
341 context_ = css::uno::Reference< css::uno::XComponentContext >(
342 css::uno::Reference< css::beans::XPropertySet >(
343 cppu::createRegistryServiceFactory(
344 rtl::OUString(registry, SAL_NO_ACQUIRE)),
345 css::uno::UNO_QUERY_THROW)->getPropertyValue(
346 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DefaultContext"))),
347 css::uno::UNO_QUERY_THROW);
348 ASSERT_TRUE(
349 context_->getValueByName(
350 rtl::OUString(
351 RTL_CONSTASCII_USTRINGPARAM(
352 "/singletons/"
353 "com.sun.star.configuration.theDefaultProvider"))) >>=
354 provider_);
355 }
356
TearDown()357 void Test::TearDown() {
358 css::uno::Reference< css::lang::XComponent >(
359 context_, css::uno::UNO_QUERY_THROW)->dispose();
360 }
361
TEST_F(Test,testKeyFetch)362 TEST_F(Test, testKeyFetch) {
363 rtl::OUString s;
364 ASSERT_TRUE(
365 getKey(
366 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("/org.openoffice.Setup")),
367 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("L10N/ooLocale"))) >>=
368 s);
369 ASSERT_TRUE(
370 getKey(
371 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("/org.openoffice.Setup")),
372 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Test/AString"))) >>=
373 s);
374 }
375
TEST_F(Test,testKeySet)376 TEST_F(Test, testKeySet) {
377 setKey(
378 rtl::OUString(
379 RTL_CONSTASCII_USTRINGPARAM("/org.openoffice.Setup/Test")),
380 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("AString")),
381 css::uno::makeAny(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("baa"))));
382 rtl::OUString s;
383 ASSERT_TRUE(
384 getKey(
385 rtl::OUString(
386 RTL_CONSTASCII_USTRINGPARAM("/org.openoffice.Setup/Test")),
387 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("AString"))) >>=
388 s);
389 ASSERT_TRUE(s.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("baa")));
390 }
391
TEST_F(Test,testKeyReset)392 TEST_F(Test, testKeyReset) {
393 if (resetKey(
394 rtl::OUString(
395 RTL_CONSTASCII_USTRINGPARAM("/org.openoffice.Setup/Test")),
396 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("AString"))))
397 {
398 rtl::OUString s;
399 ASSERT_TRUE(
400 getKey(
401 rtl::OUString(
402 RTL_CONSTASCII_USTRINGPARAM("/org.openoffice.Setup/Test")),
403 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("AString"))) >>=
404 s);
405 ASSERT_TRUE(s.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("Foo")));
406 }
407 }
408
TEST_F(Test,testSetSetMemberName)409 TEST_F(Test, testSetSetMemberName) {
410 rtl::OUString s;
411 ASSERT_TRUE(
412 getKey(
413 rtl::OUString(
414 RTL_CONSTASCII_USTRINGPARAM(
415 "/org.openoffice.UI.GenericCommands/UserInterface/Commands/"
416 ".uno:FontworkShapeType")),
417 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Label"))) >>=
418 s);
419 ASSERT_TRUE(
420 s.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("Fontwork Shape")));
421
422 css::uno::Reference< css::container::XNameAccess > access(
423 createUpdateAccess(
424 rtl::OUString(
425 RTL_CONSTASCII_USTRINGPARAM(
426 "/org.openoffice.UI.GenericCommands/UserInterface/"
427 "Commands"))),
428 css::uno::UNO_QUERY_THROW);
429 css::uno::Reference< css::container::XNamed > member;
430 access->getByName(
431 rtl::OUString(
432 RTL_CONSTASCII_USTRINGPARAM(".uno:FontworkGalleryFloater"))) >>=
433 member;
434 ASSERT_TRUE(member.is());
435 member->setName(
436 rtl::OUString(
437 RTL_CONSTASCII_USTRINGPARAM(".uno:FontworkShapeType")));
438 css::uno::Reference< css::util::XChangesBatch >(
439 access, css::uno::UNO_QUERY_THROW)->commitChanges();
440 css::uno::Reference< css::lang::XComponent >(
441 access, css::uno::UNO_QUERY_THROW)->dispose();
442
443 ASSERT_TRUE(
444 getKey(
445 rtl::OUString(
446 RTL_CONSTASCII_USTRINGPARAM(
447 "/org.openoffice.UI.GenericCommands/UserInterface/Commands/"
448 ".uno:FontworkShapeType")),
449 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Label"))) >>=
450 s);
451 ASSERT_TRUE(
452 s.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("Fontwork Gallery")));
453 }
454
TEST_F(Test,testReadCommands)455 TEST_F(Test, testReadCommands) {
456 css::uno::Reference< css::container::XNameAccess > access(
457 createViewAccess(
458 rtl::OUString(
459 RTL_CONSTASCII_USTRINGPARAM(
460 "/org.openoffice.UI.GenericCommands/UserInterface/"
461 "Commands"))),
462 css::uno::UNO_QUERY_THROW);
463 css::uno::Sequence< rtl::OUString > names(access->getElementNames());
464 ASSERT_TRUE(names.getLength() == 695);
465 // testSetSetMemberName() already removed ".uno:FontworkGalleryFloater"
466 sal_uInt32 n = osl_getGlobalTimer();
467 for (int i = 0; i < 8; ++i) {
468 for (sal_Int32 j = 0; j < names.getLength(); ++j) {
469 css::uno::Reference< css::container::XNameAccess > child;
470 if (access->getByName(names[j]) >>= child) {
471 ASSERT_TRUE(child.is());
472 child->getByName(
473 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Label")));
474 child->getByName(
475 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ContextLabel")));
476 child->getByName(
477 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Properties")));
478 }
479 }
480 }
481 n = osl_getGlobalTimer() - n;
482 printf("Reading elements took %" SAL_PRIuUINT32 " ms\n", n);
483 css::uno::Reference< css::lang::XComponent >(
484 access, css::uno::UNO_QUERY_THROW)->dispose();
485 }
486
TEST_F(Test,testThreads)487 TEST_F(Test, testThreads) {
488 struct Entry { rtl::OUString path; rtl::OUString relative; };
489 Entry list[] = {
490 { rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("/org.openoffice.Setup")),
491 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Test/AString")) },
492 { rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("/org.openoffice.Setup")),
493 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Test/AString")) },
494 { rtl::OUString(
495 RTL_CONSTASCII_USTRINGPARAM(
496 "/org.openoffice.UI.GenericCommands")),
497 rtl::OUString(
498 RTL_CONSTASCII_USTRINGPARAM(
499 "UserInterface/Commands/dotuno:WebHtml/Label")) },
500 { rtl::OUString(
501 RTL_CONSTASCII_USTRINGPARAM(
502 "/org.openoffice.UI.GenericCommands")),
503 rtl::OUString(
504 RTL_CONSTASCII_USTRINGPARAM(
505 "UserInterface/Commands/dotuno:NewPresentation/Label")) },
506 { rtl::OUString(
507 RTL_CONSTASCII_USTRINGPARAM(
508 "/org.openoffice.UI.GenericCommands")),
509 rtl::OUString(
510 RTL_CONSTASCII_USTRINGPARAM(
511 "UserInterface/Commands/dotuno:RecentFileList/Label")) },
512 { rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("/org.openoffice.Setup")),
513 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("L10N/ooLocale")) },
514 { rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("/org.openoffice.Setup")),
515 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Test/ABoolean")) }
516 };
517 std::size_t const numReaders = sizeof list / sizeof (Entry);
518 std::size_t const numWriters = numReaders - 2;
519 ReaderThread * readers[numReaders];
520 WriterThread * writers[numWriters];
521 osl::Condition stop;
522 for (std::size_t i = 0; i < numReaders; ++i) {
523 ASSERT_TRUE(getKey(list[i].path, list[i].relative).hasValue());
524 readers[i] = new ReaderThread(
525 stop, *this, list[i].path, list[i].relative);
526 }
527 for (std::size_t i = 0; i < numWriters; ++i) {
528 writers[i] = new WriterThread(
529 stop, *this, list[i].path, list[i].relative);
530 }
531 for (int i = 0; i < 5; ++i) {
532 for (std::size_t j = 0; j < numReaders; ++j) {
533 rtl::OUString path;
534 rtl::OUString name;
535 normalize(list[j].path, list[j].relative, &path, &name);
536 resetKey(path, name);
537 osl::Thread::yield();
538 }
539 }
540 stop.set();
541 bool success = true;
542 for (std::size_t i = 0; i < numReaders; ++i) {
543 readers[i]->join();
544 success = success && readers[i]->getSuccess();
545 delete readers[i];
546 }
547 for (std::size_t i = 0; i < numWriters; ++i) {
548 writers[i]->join();
549 success = success && writers[i]->getSuccess();
550 delete writers[i];
551 }
552 ASSERT_TRUE(success);
553 }
554
TEST_F(Test,testRecursive)555 TEST_F(Test, testRecursive) {
556 bool destroyed = false;
557 rtl::Reference< RecursiveTest >(
558 new SimpleRecursiveTest(*this, 100, &destroyed))->test();
559 ASSERT_TRUE(destroyed);
560 }
561
TEST_F(Test,testCrossThreads)562 TEST_F(Test, testCrossThreads) {
563 bool destroyed = false;
564 rtl::Reference< RecursiveTest >(
565 new SimpleRecursiveTest(*this, 10, &destroyed))->test();
566 ASSERT_TRUE(destroyed);
567 }
568
getKey(rtl::OUString const & path,rtl::OUString const & relative) const569 css::uno::Any Test::getKey(
570 rtl::OUString const & path, rtl::OUString const & relative) const
571 {
572 css::uno::Reference< css::container::XHierarchicalNameAccess > access(
573 createViewAccess(path), css::uno::UNO_QUERY_THROW);
574 css::uno::Any value(access->getByHierarchicalName(relative));
575 css::uno::Reference< css::lang::XComponent >(
576 access, css::uno::UNO_QUERY_THROW)->dispose();
577 return value;
578 }
579
setKey(rtl::OUString const & path,rtl::OUString const & name,css::uno::Any const & value) const580 void Test::setKey(
581 rtl::OUString const & path, rtl::OUString const & name,
582 css::uno::Any const & value) const
583 {
584 css::uno::Reference< css::container::XNameReplace > access(
585 createUpdateAccess(path), css::uno::UNO_QUERY_THROW);
586 access->replaceByName(name, value);
587 css::uno::Reference< css::util::XChangesBatch >(
588 access, css::uno::UNO_QUERY_THROW)->commitChanges();
589 css::uno::Reference< css::lang::XComponent >(
590 access, css::uno::UNO_QUERY_THROW)->dispose();
591 }
592
resetKey(rtl::OUString const & path,rtl::OUString const & name) const593 bool Test::resetKey(rtl::OUString const & path, rtl::OUString const & name)
594 const
595 {
596 //TODO: support setPropertyToDefault
597 css::uno::Reference< css::util::XChangesBatch > access(
598 createUpdateAccess(path), css::uno::UNO_QUERY_THROW);
599 css::uno::Reference< css::beans::XPropertyState > state(
600 access, css::uno::UNO_QUERY);
601 if (!state.is()) {
602 return false;
603 }
604 state->setPropertyToDefault(name);
605 access->commitChanges();
606 css::uno::Reference< css::lang::XComponent >(
607 access, css::uno::UNO_QUERY_THROW)->dispose();
608 return true;
609 }
610
createViewAccess(rtl::OUString const & path) const611 css::uno::Reference< css::uno::XInterface > Test::createViewAccess(
612 rtl::OUString const & path) const
613 {
614 css::uno::Any arg(
615 css::uno::makeAny(
616 css::beans::NamedValue(
617 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("nodepath")),
618 css::uno::makeAny(path))));
619 return provider_->createInstanceWithArguments(
620 rtl::OUString(
621 RTL_CONSTASCII_USTRINGPARAM(
622 "com.sun.star.configuration.ConfigurationAccess")),
623 css::uno::Sequence< css::uno::Any >(&arg, 1));
624 }
625
createUpdateAccess(rtl::OUString const & path) const626 css::uno::Reference< css::uno::XInterface > Test::createUpdateAccess(
627 rtl::OUString const & path) const
628 {
629 css::uno::Any arg(
630 css::uno::makeAny(
631 css::beans::NamedValue(
632 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("nodepath")),
633 css::uno::makeAny(path))));
634 return provider_->createInstanceWithArguments(
635 rtl::OUString(
636 RTL_CONSTASCII_USTRINGPARAM(
637 "com.sun.star.configuration.ConfigurationUpdateAccess")),
638 css::uno::Sequence< css::uno::Any >(&arg, 1));
639 }
640
641
642 }
643
main(int argc,char ** argv)644 int main(int argc, char **argv)
645 {
646 osl_setCommandArgs(argc, argv);
647 ::testing::InitGoogleTest(&argc, argv);
648 return RUN_ALL_TESTS();
649 }
650