1 /*
2  * This file is part of the LibreOffice project.
3  *
4  * This Source Code Form is subject to the terms of the Mozilla Public
5  * License, v. 2.0. If a copy of the MPL was not distributed with this
6  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
7  *
8  * This file incorporates work covered by the following license notice:
9  *
10  *   Licensed to the Apache Software Foundation (ASF) under one or more
11  *   contributor license agreements. See the NOTICE file distributed
12  *   with this work for additional information regarding copyright
13  *   ownership. The ASF licenses this file to you under the Apache
14  *   License, Version 2.0 (the "License"); you may not use this file
15  *   except in compliance with the License. You may obtain a copy of
16  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
17  */
18 
19 package ifc.ucb;
20 
21 import lib.MultiMethodTest;
22 import lib.Status;
23 import lib.StatusException;
24 
25 import com.sun.star.lang.XMultiServiceFactory;
26 import com.sun.star.ucb.ContentProviderInfo;
27 import com.sun.star.ucb.DuplicateProviderException;
28 import com.sun.star.ucb.XContentProvider;
29 import com.sun.star.ucb.XContentProviderManager;
30 import com.sun.star.uno.Exception;
31 import com.sun.star.uno.UnoRuntime;
32 
33 /**
34 * Tests XContentProviderManager. The test registers two ContentProviders, calls
35 * queryXXX methods to verify results, and deregisters them.
36 *
37 * Testing <code>com.sun.star.ucb.XContentProviderManager</code>
38 * interface methods :
39 * <ul>
40 *  <li><code> registerContentProvider()</code></li>
41 *  <li><code> deregisterContentProvider()</code></li>
42 *  <li><code> queryContentProviders()</code></li>
43 *  <li><code> queryContentProvider()</code></li>
44 * </ul> <p>
45 * The test registers two ContentProviders, calls
46 * queryXXX methods to verify results, and deregisters them. <p>
47 *
48 * Test is <b> NOT </b> multithread compliant. <p>
49 * @see com.sun.star.ucb.XContentProviderManager
50 */
51 public class _XContentProviderManager extends MultiMethodTest {
52     /**
53      * Contains the tested object.
54      */
55     public XContentProviderManager oObj;
56 
57     /**
58      * The test scheme name.
59      */
60     static final String myScheme = "test-scheme";
61 
62     /**
63      * Any preexisting content provider. If it exists it will be hidden by
64      * <code>firstContentProvider</code>, registered with the same
65      * <code>myScheme</code>. Typically there is no preexisting content
66      * provider, unless the catch-all providers GnomeVFSContentProvider or
67      * GIOContentProvider is installed
68      */
69     XContentProvider preexistingContentProvider;
70 
71     /**
72      * First content provider. It will be hidden by <code>contentProvider
73      * </code>, registered with the same <code>myScheme</code> to test
74      * the "hiding" behaviour.
75      */
76     XContentProvider firstContentProvider;
77 
78     /**
79      * The main content provider.
80      */
81     XContentProvider contentProvider;
82 
83     /**
84      * <code>ContentProvider</code>s information which are in the manager
85      * before registering the testing providers.
86      */
87     ContentProviderInfo[] initialProvidersInfo;
88 
89     /**
90      * Creates two testing providers.
91      *
92      * @see #firstContentProvider
93      * @see #contentProvider
94      */
95     @Override
before()96     public void before() {
97         XMultiServiceFactory xMSF = tParam.getMSF();
98 
99         log.println("creating testing content providers");
100         try {
101             firstContentProvider = UnoRuntime.queryInterface(
102                     XContentProvider.class, xMSF.createInstance(
103                             "com.sun.star.ucb.FileContentProvider"));
104 
105             contentProvider = UnoRuntime.queryInterface(
106                     XContentProvider.class, xMSF.createInstance(
107                             "com.sun.star.ucb.FileContentProvider"));
108         } catch (Exception e) {
109             log.println("Can't create content providers " + e.getMessage());
110             e.printStackTrace(log);
111             throw new StatusException("Unexpected exception", e);
112         }
113     }
114 
115     /**
116      * At the beginning call <code>queryContentProviders</code> method
117      *
118      * to have info about providers existing before new adding.
119      * It adds two testing contents providers, both for the same scheme.
120      * The second one is added two times: first, in non-replacing mode, to test
121      * <code>DuplicateProviderException</code>, and second, in replacing mode,
122      * to hide the first provider. <p>
123      *
124      * The evaluation of results are performed later, in
125      * <code>queryContentProvider()</code>.
126      *
127      * Has <b> OK </b> status if in the first provider is registered
128      * without exceptions, the second throws
129      * <code>DuplicateProviderException</code> in non-replacing mode,
130      * and no exceptions in replacing mode. <p>
131      *
132      * @see #_queryContentProvider
133      */
_registerContentProvider()134     public void _registerContentProvider() {
135         // querying providers info before inserting them, to verify results
136         initialProvidersInfo = oObj.queryContentProviders();
137 
138         // GnomeVFSContentProvider or GIOContentProvider ?, typically null
139         preexistingContentProvider = oObj.queryContentProvider(myScheme);
140 
141         log.println("registering the first provider");
142         try {
143             oObj.registerContentProvider(firstContentProvider, myScheme,false);
144         } catch (DuplicateProviderException e) {
145             log.println("Unexpected exception thrown " + e.getMessage());
146             e.printStackTrace(log);
147             throw new StatusException("Unexpected exception ", e);
148         }
149 
150         log.println("registering the second provider in non-replacing mode");
151         try {
152             oObj.registerContentProvider(contentProvider, myScheme, false);
153             throw new StatusException(Status.failed("registerContentProvider(.., .., false)"));
154         } catch (DuplicateProviderException e) {
155             log.println("DuplicateProviderException thrown - OK");
156         }
157 
158         XContentProvider result;
159 
160         log.println("registering the second provider in the replace mode");
161         try {
162             result = oObj.registerContentProvider(contentProvider, myScheme, true);
163         } catch (DuplicateProviderException e) {
164             log.println("Unexpected exception thrown " + e.getMessage());
165             e.printStackTrace(log);
166             throw new StatusException("Unexpected exception ", e);
167         }
168 
169         // check the result is the first provider
170         tRes.tested("registerContentProvider()",
171             result.equals(firstContentProvider));
172     }
173 
174     /**
175      * It calls the method (after registering providers) and compares
176      * its result with the result  before registering.
177      *
178      * Has <b> OK </b> status if the number of providers increases
179      * by one after registering custom provider.
180      *
181      * The following method tests are to be completed successfully before :
182      * <ul>
183      *  <li> <code> registerContentProvider() </code> : to compare number
184      *  of providers. </li>
185      * </ul>
186      * @see #_registerContentProvider
187      */
_queryContentProviders()188     public void _queryContentProviders() {
189         executeMethod("registerContentProvider()");
190 
191         ContentProviderInfo[] providersInfo = oObj.queryContentProviders();
192         // verifying that the number of providers increased by 1
193         tRes.tested("queryContentProviders()",
194                 providersInfo.length == initialProvidersInfo.length + 1);
195     }
196 
197     /**
198      * It queries for added custom provider using its scheme
199      * and verifies its result with
200      * <code>queryContentProviders()</code> result and with
201      * custom provider created in <code>registerContentProvider()</code>.
202      * Also verifies <code>registerContentProvider()</code>. <p>
203      *
204      * Has <b>OK</b> status if the provider returned is found within
205      * all providers and is equal to provider created before.
206      *
207      * The following method tests are to be completed successfully before :
208      * <ul>
209      *  <li> <code> registerContentProvider() </code> </li>
210      * </ul>
211      */
_queryContentProvider()212     public void _queryContentProvider() {
213         executeMethod("registerContentProvider()");
214 
215         XContentProvider result = oObj.queryContentProvider
216             ("http://www.sun.com");
217 
218         log.println("finding queryContentProvider() result");
219         boolean found = false;
220 
221         ContentProviderInfo[] providersInfo = oObj.queryContentProviders();
222 
223         for (int i = 0; i < providersInfo.length; i++) {
224             if (result.equals(providersInfo[i].ContentProvider)) {
225                 found = true;
226                 break;
227             }
228         }
229 
230         tRes.tested("queryContentProvider()", found);
231     }
232 
233     /**
234      * At first one provider is deregistered, after that provider
235      * is queried, the second provider must be returned for the
236      * specified scheme. Then the second provider is deregistered.
237      * Now <code>null</code> value must be returned by the method
238      * <code>queryContentProvider</code> on the specified scheme. <p>
239      *
240      * Has <b>OK</b> status if in the first case the second provider
241      * remains registered, and after its removing no providers remain
242      * registered for the scheme specified.
243      *
244      * The following method tests are to be completed successfully before :
245      * <ul>
246      *  <li> <code> registerContentProvider() </code> : two providers
247      *  must be registered. </li>
248      * </ul>
249      * The following method tests are to be executed before :
250      * <ul>
251      *  <li> <code> queryContentProvider() </code> : to run this test
252      *   finally. </li>
253      *  <li> <code> queryContentProviders() </code> : to run this test
254      *   finally.  </li>
255      * </ul>
256      */
_deregisterContentProvider()257     public void _deregisterContentProvider() {
258         executeMethod("queryContentProvider()");
259         executeMethod("queryContentProviders()");
260         requiredMethod("registerContentProvider()");
261 
262         log.println("deregistering the second provider");
263         oObj.deregisterContentProvider(contentProvider, myScheme);
264 
265         XContentProvider res = oObj.queryContentProvider(myScheme);
266 
267         log.println("deregistering the first provider");
268         oObj.deregisterContentProvider(firstContentProvider, myScheme);
269 
270         res = oObj.queryContentProvider(myScheme);
271 
272 	// verifying that the original provider (typically none) is returned.
273         tRes.tested("deregisterContentProvider()", res == preexistingContentProvider);
274     }
275 }
276