/* * Copyright 2016 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.uberfire.preferences.backend; import java.io.IOException; import java.net.URI; import java.util.Collection; import org.jboss.errai.marshalling.server.MappingContextSingleton; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.uberfire.backend.server.io.object.ObjectStorage; import org.uberfire.backend.server.io.object.ObjectStorageImpl; import org.uberfire.io.IOService; import org.uberfire.java.nio.file.FileSystem; import org.uberfire.mocks.FileSystemTestingUtils; import org.uberfire.mocks.SessionInfoMock; import org.uberfire.preferences.shared.PreferenceScope; import org.uberfire.preferences.shared.PreferenceScopeTypes; import org.uberfire.preferences.shared.impl.DefaultPreferenceScopeResolutionStrategy; import org.uberfire.preferences.shared.impl.DefaultPreferenceScopeTypes; import org.uberfire.preferences.shared.impl.DefaultScopes; import org.uberfire.preferences.shared.impl.PreferenceScopeFactoryImpl; import org.uberfire.preferences.shared.impl.PreferenceScopeImpl; import org.uberfire.preferences.shared.impl.PreferenceScopeResolutionStrategyInfo; import org.uberfire.preferences.shared.impl.PreferenceScopedValue; import org.uberfire.rpc.SessionInfo; import static org.junit.Assert.*; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyMap; import static org.mockito.Mockito.*; public class PreferenceStorageImplTest { private static final String allUsersScopeType = DefaultScopes.ALL_USERS.type(); private static final String entireApplicationScopeType = DefaultScopes.ENTIRE_APPLICATION.type(); private static final String userScopeType = DefaultScopes.USER.type(); private static final String allUsersScopeKey = allUsersScopeType; private static final String entireApplicationScopeKey = entireApplicationScopeType; private static final String userScopeKey = "my-user"; private static final PreferenceScopeImpl allUsersScope = new PreferenceScopeImpl(allUsersScopeType, allUsersScopeKey, null); private static final PreferenceScopeImpl entireApplicationScope = new PreferenceScopeImpl(entireApplicationScopeType, entireApplicationScopeKey, null); private static final PreferenceScopeImpl userScope = new PreferenceScopeImpl(userScopeType, userScopeKey, null); private static FileSystemTestingUtils fileSystemTestingUtils = new FileSystemTestingUtils(); private PreferenceScope userEntireApplicationScope, allUsersEntireApplicationScope; private PreferenceStorageImpl preferenceStorageServiceBackendImpl; private PreferenceScopeResolutionStrategyInfo scopeResolutionStrategyInfo; private PreferenceScopeFactoryImpl scopeFactory; private PreferenceScopeTypes scopeTypes; @Before public void setup() throws IOException { MappingContextSingleton.get(); fileSystemTestingUtils.setup(); final SessionInfo sessionInfo = mockSessionInfo(); final FileSystem fileSystem = mockFileSystem(); final IOService ioService = mockIoService(fileSystem); ObjectStorage objectStorage = new ObjectStorageImpl(ioService); scopeTypes = new DefaultPreferenceScopeTypes(new ServerUsernameProvider(sessionInfo)); scopeFactory = new PreferenceScopeFactoryImpl(scopeTypes); scopeResolutionStrategyInfo = new DefaultPreferenceScopeResolutionStrategy(scopeFactory, null).getInfo(); preferenceStorageServiceBackendImpl = new PreferenceStorageImpl(ioService, sessionInfo, scopeTypes, scopeFactory, objectStorage); preferenceStorageServiceBackendImpl.init(); userEntireApplicationScope = scopeFactory.createScope(userScope, entireApplicationScope); allUsersEntireApplicationScope = scopeFactory.createScope(allUsersScope, entireApplicationScope); } @After public void cleanupFileSystem() { fileSystemTestingUtils.cleanup(); } @Test public void unexistentPreferenceDoesNotExistsInAScopeTest() { final PreferenceScope scope = userEntireApplicationScope; final String key = "my.preference.key"; final boolean preferenceExists = preferenceStorageServiceBackendImpl.exists(scope, key); assertFalse(preferenceExists); } @Test public void preferenceExistsInAScopeTest() { final PreferenceScope scope = userEntireApplicationScope; final String key = "my.preference.key"; final long value = 23L; preferenceStorageServiceBackendImpl.write(scope, key, value); final boolean preferenceExists = preferenceStorageServiceBackendImpl.exists(scope, key); assertTrue(preferenceExists); } @Test public void unexistentPreferenceDoesNotExistUsingScopeResolutionStrategyTest() { final String key = "my.preference.key"; final boolean preferenceExists = preferenceStorageServiceBackendImpl.exists(scopeResolutionStrategyInfo, key); assertFalse(preferenceExists); } @Test public void userPreferenceExistsUsingScopeResolutionStrategyTest() { final PreferenceScope scope = userEntireApplicationScope; final String key = "my.preference.key"; final long value = 23L; preferenceStorageServiceBackendImpl.write(scope, key, value); final boolean preferenceExists = preferenceStorageServiceBackendImpl.exists(scopeResolutionStrategyInfo, key); assertTrue(preferenceExists); } @Test public void globalPreferenceExistsUsingScopeResolutionStrategyTest() { final PreferenceScope scope = allUsersEntireApplicationScope; final String key = "my.preference.key"; final long value = 23L; preferenceStorageServiceBackendImpl.write(scope, key, value); final boolean preferenceExists = preferenceStorageServiceBackendImpl.exists(scopeResolutionStrategyInfo, key); assertTrue(preferenceExists); } @Test public void writeReadLongTest() { final PreferenceScope scope = userEntireApplicationScope; preferenceStorageServiceBackendImpl.write(scope, "my.preference.key", 23L); final long value = preferenceStorageServiceBackendImpl.read(scope, "my.preference.key"); assertEquals(23, value); } @Test public void writeReadStringTest() { final PreferenceScope scope = userEntireApplicationScope; preferenceStorageServiceBackendImpl.write(scope, "my.preference.key", "text"); final String value = preferenceStorageServiceBackendImpl.read(scope, "my.preference.key"); assertEquals("text", value); } @Test public void writeReadBooleanTest() { final PreferenceScope scope = userEntireApplicationScope; preferenceStorageServiceBackendImpl.write(scope, "my.preference.key.true", true); preferenceStorageServiceBackendImpl.write(scope, "my.preference.key.false", false); final boolean value1 = preferenceStorageServiceBackendImpl.read(scope, "my.preference.key.true"); final boolean value2 = preferenceStorageServiceBackendImpl.read(scope, "my.preference.key.false"); assertEquals(true, value1); assertEquals(false, value2); } @Test public void writeReadCustomObjectTest() { final PreferenceScope scope = userEntireApplicationScope; CustomObject customObject = new CustomObject(61L, "some text"); preferenceStorageServiceBackendImpl.write(scope, "my.preference.key", customObject); final CustomObject value = preferenceStorageServiceBackendImpl.read(scope, "my.preference.key"); assertEquals(customObject.id, value.id); assertEquals(customObject.text, value.text); } @Test public void readNonexistentPreferenceFromSpecificScopeTest() { final PreferenceScope scope = userEntireApplicationScope; final String value = preferenceStorageServiceBackendImpl.read(scope, "my.nonexistent.preference.key"); assertNull(value); } @Test public void readNonexistentPreferenceWithResolutionStrategyTest() { final String value = preferenceStorageServiceBackendImpl.read(scopeResolutionStrategyInfo, "my.nonexistent.preference.key"); assertNull(value); } @Test public void writeGlobalAndUserReadUserWithResolutionStrategyTest() { preferenceStorageServiceBackendImpl.write(userEntireApplicationScope, "my.preference.key", "user_value"); preferenceStorageServiceBackendImpl.write(allUsersEntireApplicationScope, "my.preference.key", "global_value"); final String value = preferenceStorageServiceBackendImpl.read(scopeResolutionStrategyInfo, "my.preference.key"); assertEquals("user_value", value); } @Test public void writeGlobalReadGlobalWithResolutionStrategyTest() { preferenceStorageServiceBackendImpl.write(allUsersEntireApplicationScope, "my.preference.key", "global_value"); final String value = preferenceStorageServiceBackendImpl.read(scopeResolutionStrategyInfo, "my.preference.key"); assertEquals("global_value", value); } @Test public void writeUserReadUserWithResolutionStrategyTest() { preferenceStorageServiceBackendImpl.write(userEntireApplicationScope, "my.preference.key", "user_value"); final String value = preferenceStorageServiceBackendImpl.read(scopeResolutionStrategyInfo, "my.preference.key"); assertEquals("user_value", value); } @Test public void readFromSpecificScopeTest() { preferenceStorageServiceBackendImpl.write(userEntireApplicationScope, "my.preference.key", "value"); final String value = preferenceStorageServiceBackendImpl.read(userEntireApplicationScope, "my.preference.key"); assertEquals("value", value); } @Test public void readWithResolutionStrategyTest() { preferenceStorageServiceBackendImpl.write(allUsersEntireApplicationScope, "my.preference.key", "value"); final String value = preferenceStorageServiceBackendImpl.read(scopeResolutionStrategyInfo, "my.preference.key"); assertEquals("value", value); } @Test public void writeGlobalAndUserReadWithScopeUserWithResolutionStrategyTest() { preferenceStorageServiceBackendImpl.write(userEntireApplicationScope, "my.preference.key", "user_value"); preferenceStorageServiceBackendImpl.write(allUsersEntireApplicationScope, "my.preference.key", "global_value"); final PreferenceScopedValue<String> scopedValue = preferenceStorageServiceBackendImpl.readWithScope(scopeResolutionStrategyInfo, "my.preference.key"); assertEquals("user_value", scopedValue.getValue()); assertEquals(userEntireApplicationScope.key(), scopedValue.getScope().key()); } @Test public void writeGlobalReadWithScopeGlobalWithResolutionStrategyTest() { preferenceStorageServiceBackendImpl.write(allUsersEntireApplicationScope, "my.preference.key", "global_value"); final PreferenceScopedValue<String> scopedValue = preferenceStorageServiceBackendImpl.readWithScope(scopeResolutionStrategyInfo, "my.preference.key"); assertEquals("global_value", scopedValue.getValue()); assertEquals(allUsersEntireApplicationScope.key(), scopedValue.getScope().key()); } @Test public void writeUserReadWithScopeUserUsingResolutionStrategyTest() { preferenceStorageServiceBackendImpl.write(userEntireApplicationScope, "my.preference.key", "user_value"); final PreferenceScopedValue<String> scopedValue = preferenceStorageServiceBackendImpl.readWithScope(scopeResolutionStrategyInfo, "my.preference.key"); assertEquals("user_value", scopedValue.getValue()); assertEquals(userEntireApplicationScope.key(), scopedValue.getScope().key()); } @Test public void deleteFromUserTest() { String value; // create preference defined for global and user scopes preferenceStorageServiceBackendImpl.write(userEntireApplicationScope, "my.preference.key", "user_value"); preferenceStorageServiceBackendImpl.write(allUsersEntireApplicationScope, "my.preference.key", "global_value"); value = preferenceStorageServiceBackendImpl.read(scopeResolutionStrategyInfo, "my.preference.key"); assertEquals("user_value", value); // delete preference from user scope preferenceStorageServiceBackendImpl.delete(userEntireApplicationScope, "my.preference.key"); value = preferenceStorageServiceBackendImpl.read(scopeResolutionStrategyInfo, "my.preference.key"); assertEquals("global_value", value); // delete preference from global scope preferenceStorageServiceBackendImpl.delete(allUsersEntireApplicationScope, "my.preference.key"); value = preferenceStorageServiceBackendImpl.read(scopeResolutionStrategyInfo, "my.preference.key"); assertNull(value); } @Test public void allKeysWithKeysTest() { // global preferences preferenceStorageServiceBackendImpl.write(allUsersEntireApplicationScope, "my.first.global.preference.key", "global_value1"); preferenceStorageServiceBackendImpl.write(allUsersEntireApplicationScope, "my.second.global.preference.key", "global_value2"); preferenceStorageServiceBackendImpl.write(allUsersEntireApplicationScope, "my.third.global.preference.key", "global_value3"); // user preferences preferenceStorageServiceBackendImpl.write(userEntireApplicationScope, "my.first.user.preference.key", "user_value1"); preferenceStorageServiceBackendImpl.write(userEntireApplicationScope, "my.second.user.preference.key", "user_value2"); final Collection<String> globalKeys = preferenceStorageServiceBackendImpl.allKeys(allUsersEntireApplicationScope); final Collection<String> userKeys = preferenceStorageServiceBackendImpl.allKeys(userEntireApplicationScope); assertNotNull(globalKeys); assertEquals(3, globalKeys.size()); assertTrue(globalKeys.contains("my.first.global.preference.key")); assertTrue(globalKeys.contains("my.second.global.preference.key")); assertTrue(globalKeys.contains("my.third.global.preference.key")); assertNotNull(userKeys); assertEquals(2, userKeys.size()); assertTrue(userKeys.contains("my.first.user.preference.key")); assertTrue(userKeys.contains("my.second.user.preference.key")); } @Test public void allKeysWithNoKeysTest() { final Collection<String> keys = preferenceStorageServiceBackendImpl.allKeys(allUsersEntireApplicationScope); assertNotNull(keys); assertEquals("There should not exist any keys.", 0, keys.size()); } @Test public void buildScopePathForAllUsersEntireApplicationScope() { final String path = preferenceStorageServiceBackendImpl.buildScopePath(allUsersEntireApplicationScope); assertEquals("/config/all-users/all-users/entire-application/entire-application/", path); } @Test public void buildScopePathForUserScope() { final String path = preferenceStorageServiceBackendImpl.buildScopePath(userEntireApplicationScope); assertEquals("/config/user/my-user/entire-application/entire-application/", path); } @Test public void buildStoragePathForUserScope() { final String path = preferenceStorageServiceBackendImpl.buildScopedPreferencePath(userEntireApplicationScope, "my.preference.key"); assertEquals("/config/user/my-user/entire-application/entire-application/my.preference.key.preferences", path); } @Test public void buildStoragePathForGlobalScope() { final String path = preferenceStorageServiceBackendImpl.buildScopedPreferencePath(allUsersEntireApplicationScope, "my.preference.key"); assertEquals("/config/all-users/all-users/entire-application/entire-application/my.preference.key.preferences", path); } private SessionInfo mockSessionInfo() { return new SessionInfoMock(userScopeKey); } private FileSystem mockFileSystem() { return fileSystemTestingUtils.getFileSystem(); } private IOService mockIoService(final FileSystem fileSystem) { final IOService ioService = spy(fileSystemTestingUtils.getIoService()); doNothing().when(ioService).startBatch(any(FileSystem.class)); doNothing().when(ioService).endBatch(); doReturn(fileSystem).when(ioService).newFileSystem(any(URI.class), anyMap()); return ioService; } }