/*
* Copyright 2013-2017 Erudika. https://erudika.com
*
* 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.
*
* For issues and patches go to: https://github.com/erudika
*/
package com.erudika.para.aop;
import com.erudika.para.Para;
import com.erudika.para.ParaServer;
import com.erudika.para.cache.Cache;
import com.erudika.para.cache.MockCache;
import com.erudika.para.core.utils.CoreUtils;
import com.erudika.para.core.Sysprop;
import com.erudika.para.core.Tag;
import com.erudika.para.core.User;
import com.erudika.para.persistence.DAO;
import com.erudika.para.persistence.MockDAO;
import com.erudika.para.search.ElasticSearch;
import com.erudika.para.search.ElasticSearchUtils;
import com.erudika.para.search.Search;
import com.erudika.para.utils.Config;
import com.erudika.para.utils.Utils;
import com.google.inject.Binder;
import com.google.inject.Module;
import com.google.inject.util.Modules;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import org.junit.AfterClass;
import static org.junit.Assert.*;
import org.junit.BeforeClass;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
* @author Alex Bogdanovski [alex@erudika.com]
*/
public class AspectsIT {
private static final Logger logger = LoggerFactory.getLogger(AspectsIT.class);
private static Sysprop s0;
private static Sysprop s1;
private static Sysprop s2;
@BeforeClass
public static void setUpClass() throws Exception {
System.setProperty("para.env", "embedded");
System.setProperty("para.print_logo", "false");
System.setProperty("para.app_name", "para-test");
System.setProperty("para.cluster_name", "para-test");
System.setProperty("para.cache_enabled", "true");
Para.initialize(Modules.override(ParaServer.getCoreModules()).with(new Module() {
public void configure(Binder binder) {
binder.bind(DAO.class).to(MockDAO.class).asEagerSingleton();
binder.bind(Cache.class).to(MockCache.class).asEagerSingleton();
binder.bind(Search.class).to(ElasticSearch.class).asEagerSingleton();
}
}));
ElasticSearchUtils.createIndex(Config.APP_NAME_NS);
s0 = new Sysprop("s111");
s0.setName("John Doe");
s0.setTimestamp(Utils.timestamp());
s0.setTags(CoreUtils.getInstance().addTags(s0.getTags(), "one", "two", "three"));
s1 = new Sysprop("s222");
s1.setName("Joe Black");
s1.setTimestamp(Utils.timestamp());
s1.setTags(CoreUtils.getInstance().addTags(s1.getTags(), "two", "four", "three"));
s2 = new Sysprop("s333");
s2.setName("Ann Smith");
s2.setTimestamp(Utils.timestamp());
s2.setTags(CoreUtils.getInstance().addTags(s2.getTags(), "four", "five", "three"));
CoreUtils.getInstance().setDao(Para.getDAO());
CoreUtils.getInstance().setCache(Para.getCache());
CoreUtils.getInstance().setSearch(Para.getSearch());
}
@AfterClass
public static void tearDownClass() throws Exception {
Para.getDAO().deleteAll(Arrays.asList(s0, s1, s2));
Para.destroy();
}
@Test
public void test() throws InterruptedException {
DAO d = Para.getDAO();
Search s = Para.getSearch();
Cache c = Para.getCache();
System.setProperty("para.cache_enabled", "true");
assertNotNull(s0.create());
assertNotNull(d.read(s0.getId()));
User uB = new User("invalid");
uB.setIdentifier(null); // no identifier (username)
uB.setPassword("badpass");
uB.create();
assertNull(d.read(uB.getId()));
assertNull(s.findById(uB.getId()));
assertNull(c.get(uB.getId()));
uB.setEmail("tes1@test.com");
uB.setIdentifier(uB.getEmail());
uB.create();
assertNotNull(d.read(uB.getId()));
assertNotNull(s.findById(uB.getId()));
assertNotNull(c.get(uB.getId()));
logger.debug("---- cache remove -----");
c.remove(uB.getId());
assertNotNull(d.read(uB.getId()));
assertTrue(c.contains(uB.getId()));
logger.debug("---------");
uB.delete();
assertNull(d.read(uB.getId()));
assertNull(s.findById(uB.getId()));
assertNull(c.get(uB.getId()));
ArrayList<Sysprop> list = new ArrayList<Sysprop>();
list.add(s0);
list.add(s1);
list.add(s2);
d.createAll(list);
assertNotNull(d.read(s0.getId()));
assertNotNull(s.findById(s0.getId()));
assertNotNull(c.get(s0.getId()));
assertNotNull(d.read(s1.getId()));
assertNotNull(s.findById(s1.getId()));
assertNotNull(c.get(s1.getId()));
assertNotNull(d.read(s2.getId()));
assertNotNull(s.findById(s2.getId()));
assertNotNull(c.get(s2.getId()));
logger.debug("---- read all from cache ----");
Map<String, User> map = d.readAll(Arrays.asList(s0.getId(), s1.getId(), s2.getId()), true);
assertTrue(map.containsKey(s0.getId()));
assertTrue(map.containsKey(s1.getId()));
assertTrue(map.containsKey(s2.getId()));
logger.debug("---- cache remove ----");
c.remove(s1.getId());
c.remove(s2.getId());
d.readAll(Arrays.asList(s0.getId(), s1.getId(), s2.getId()), true);
assertTrue(c.contains(s1.getId()));
assertTrue(c.contains(s2.getId()));
logger.debug("---- delete all ----");
d.deleteAll(list);
Thread.sleep(500);
assertNull(d.read(s0.getId()));
assertNull(s.findById(s0.getId()));
assertNull(c.get(s0.getId()));
assertNull(d.read(s1.getId()));
assertNull(s.findById(s1.getId()));
assertNull(c.get(s1.getId()));
assertNull(d.read(s2.getId()));
assertNull(s.findById(s2.getId()));
assertNull(c.get(s2.getId()));
// Removed in v1.18 - this will cause unexpected behavior in the future.
// These "special" classes are not documented and this is the wrong
// place to filter them out.
// test skipping special classes calling batch methods
// App app1 = new App("app1");
// User user1 = new User("user1");
// user1.setName("John Doe");
// user1.setGroups(User.Groups.USERS.toString());
// user1.setEmail("john1@asd.com");
// user1.setIdentifier(user1.getEmail());
// user1.setTimestamp(Utils.timestamp());
// user1.setPassword("123456");
// Tag t1 = new Tag("testtag123");
//
// // test that Apps and Users are removed from batch operations
// ArrayList<ParaObject> list1 = new ArrayList<ParaObject>();
// list1.add(app1);
// list1.add(user1);
// list1.add(t1);
// Para.getDAO().createAll(list1);
//
// System.setProperty("para.cache_enabled", "false");
// assertNull(Para.getDAO().read(app1.getId()));
// assertNull(Para.getDAO().read(user1.getId()));
// assertNotNull(Para.getDAO().read(t1.getId()));
//
// assertNull(Para.getSearch().findById(app1.getId()));
// assertNull(Para.getSearch().findById(user1.getId()));
// assertNotNull(Para.getSearch().findById(t1.getId()));
//
// System.setProperty("para.cache_enabled", "true");
// assertFalse(Para.getCache().contains(app1.getId()));
// assertFalse(Para.getCache().contains(user1.getId()));
// assertTrue(Para.getCache().contains(t1.getId()));
}
@Test
public void testFlags() throws InterruptedException {
// default - store=true, index=true, cache=true
Tag t1 = new Tag("tag1");
Sysprop o11 = new Sysprop("obj11");
Sysprop o12 = new Sysprop("obj12");
Para.getDAO().create(t1);
Para.getDAO().createAll(new LinkedList<Sysprop>(Arrays.asList(o11, o12)));
assertNotNull(Para.getDAO().read(t1.getId()));
assertNotNull(Para.getDAO().read(o11.getId()));
assertNotNull(Para.getDAO().read(o12.getId()));
assertNotNull(Para.getSearch().findById(t1.getId()));
assertNotNull(Para.getSearch().findById(o11.getId()));
assertNotNull(Para.getSearch().findById(o12.getId()));
assertNotNull(Para.getCache().get(t1.getId()));
assertNotNull(Para.getCache().get(o11.getId()));
assertNotNull(Para.getCache().get(o12.getId()));
Para.getDAO().deleteAll(Arrays.asList(t1, o11, o12));
assertNull(Para.getDAO().read(t1.getId()));
assertNull(Para.getDAO().read(o11.getId()));
assertNull(Para.getDAO().read(o12.getId()));
assertNull(Para.getSearch().findById(t1.getId()));
assertNull(Para.getSearch().findById(o11.getId()));
assertNull(Para.getSearch().findById(o12.getId()));
assertNull(Para.getCache().get(t1.getId()));
assertNull(Para.getCache().get(o11.getId()));
assertNull(Para.getCache().get(o12.getId()));
// special case - readAll should always return an empty list and never null
Map<String, ?> deleted = Para.getDAO().readAll(Arrays.asList(t1.getId(), o11.getId(), o12.getId()), true);
assertNotNull(deleted);
assertTrue(deleted.isEmpty());
// not in DB - store=false, index=true, cache=true
Tag t2 = new Tag("tag2");
Sysprop o21 = new Sysprop("obj21");
Sysprop o22 = new Sysprop("obj22");
t2.setStored(false);
o21.setStored(false);
o22.setStored(false);
Para.getDAO().create(t2);
Para.getDAO().createAll(new LinkedList<Sysprop>(Arrays.asList(o21, o22)));
System.setProperty("para.cache_enabled", "false");
assertNull(Para.getDAO().read(t2.getId()));
assertNull(Para.getDAO().read(o21.getId()));
assertNull(Para.getDAO().read(o22.getId()));
assertNotNull(Para.getSearch().findById(t2.getId()));
assertNotNull(Para.getSearch().findById(o21.getId()));
assertNotNull(Para.getSearch().findById(o22.getId()));
System.setProperty("para.cache_enabled", "true");
assertNotNull(Para.getCache().get(t2.getId()));
assertNotNull(Para.getCache().get(o21.getId()));
assertNotNull(Para.getCache().get(o22.getId()));
Para.getDAO().deleteAll(Arrays.asList(t2, o21, o22));
assertNull(Para.getDAO().read(t2.getId()));
assertNull(Para.getDAO().read(o21.getId()));
assertNull(Para.getDAO().read(o22.getId()));
assertNull(Para.getSearch().findById(t2.getId()));
assertNull(Para.getSearch().findById(o21.getId()));
assertNull(Para.getSearch().findById(o22.getId()));
assertNull(Para.getCache().get(t2.getId()));
assertNull(Para.getCache().get(o21.getId()));
assertNull(Para.getCache().get(o22.getId()));
// in memory - store=false, index=false, cache=true
Tag t3 = new Tag("tag3");
Sysprop o31 = new Sysprop("obj31");
Sysprop o32 = new Sysprop("obj32");
t3.setStored(false);
t3.setIndexed(false);
o31.setStored(false);
o31.setIndexed(false);
o32.setStored(false);
o32.setIndexed(false);
Para.getDAO().create(t3);
Para.getDAO().createAll(new LinkedList<Sysprop>(Arrays.asList(o31, o32)));
System.setProperty("para.cache_enabled", "false");
assertNull(Para.getDAO().read(t3.getId()));
assertNull(Para.getDAO().read(o31.getId()));
assertNull(Para.getDAO().read(o32.getId()));
assertNull(Para.getSearch().findById(t3.getId()));
assertNull(Para.getSearch().findById(o31.getId()));
assertNull(Para.getSearch().findById(o32.getId()));
System.setProperty("para.cache_enabled", "true");
assertNotNull(Para.getCache().get(t3.getId()));
assertNotNull(Para.getCache().get(o31.getId()));
assertNotNull(Para.getCache().get(o32.getId()));
Para.getDAO().deleteAll(Arrays.asList(t3, o31, o32));
assertNull(Para.getDAO().read(t3.getId()));
assertNull(Para.getDAO().read(o31.getId()));
assertNull(Para.getDAO().read(o32.getId()));
assertNull(Para.getSearch().findById(t3.getId()));
assertNull(Para.getSearch().findById(o31.getId()));
assertNull(Para.getSearch().findById(o32.getId()));
assertNull(Para.getCache().get(t3.getId()));
assertNull(Para.getCache().get(o31.getId()));
assertNull(Para.getCache().get(o32.getId()));
// not cached - store=true, index=true, cache=false
Tag t4 = new Tag("tag4");
Sysprop o41 = new Sysprop("obj41");
Sysprop o42 = new Sysprop("obj42");
t4.setCached(false);
o41.setCached(false);
o42.setCached(false);
Para.getDAO().create(t4);
Para.getDAO().createAll(new LinkedList<Sysprop>(Arrays.asList(o41, o42)));
System.setProperty("para.cache_enabled", "false");
assertNotNull(Para.getDAO().read(t4.getId()));
assertNotNull(Para.getDAO().read(o41.getId()));
assertNotNull(Para.getDAO().read(o42.getId()));
assertNotNull(Para.getSearch().findById(t4.getId()));
assertNotNull(Para.getSearch().findById(o41.getId()));
assertNotNull(Para.getSearch().findById(o42.getId()));
System.setProperty("para.cache_enabled", "true");
assertNull(Para.getCache().get(t4.getId()));
assertNull(Para.getCache().get(o41.getId()));
assertNull(Para.getCache().get(o42.getId()));
Para.getDAO().deleteAll(Arrays.asList(t4, o41, o42));
assertNull(Para.getDAO().read(t4.getId()));
assertNull(Para.getDAO().read(o41.getId()));
assertNull(Para.getDAO().read(o42.getId()));
assertNull(Para.getSearch().findById(t4.getId()));
assertNull(Para.getSearch().findById(o41.getId()));
assertNull(Para.getSearch().findById(o42.getId()));
assertNull(Para.getCache().get(t4.getId()));
assertNull(Para.getCache().get(o41.getId()));
assertNull(Para.getCache().get(o42.getId()));
// only in DB - store=true, index=false, cache=false
Tag t5 = new Tag("tag5");
Sysprop o51 = new Sysprop("obj51");
Sysprop o52 = new Sysprop("obj52");
t5.setIndexed(false);
t5.setCached(false);
o51.setIndexed(false);
o51.setCached(false);
o52.setIndexed(false);
o52.setCached(false);
Para.getDAO().create(t5);
Para.getDAO().createAll(new LinkedList<Sysprop>(Arrays.asList(o51, o52)));
System.setProperty("para.cache_enabled", "false");
assertNotNull(Para.getDAO().read(t5.getId()));
assertNotNull(Para.getDAO().read(o51.getId()));
assertNotNull(Para.getDAO().read(o52.getId()));
assertNull(Para.getSearch().findById(t5.getId()));
assertNull(Para.getSearch().findById(o51.getId()));
assertNull(Para.getSearch().findById(o52.getId()));
System.setProperty("para.cache_enabled", "true");
assertNull(Para.getCache().get(t5.getId()));
assertNull(Para.getCache().get(o51.getId()));
assertNull(Para.getCache().get(o52.getId()));
Para.getDAO().deleteAll(Arrays.asList(t5, o51, o52));
assertNull(Para.getDAO().read(t5.getId()));
assertNull(Para.getDAO().read(o51.getId()));
assertNull(Para.getDAO().read(o52.getId()));
assertNull(Para.getSearch().findById(t5.getId()));
assertNull(Para.getSearch().findById(o51.getId()));
assertNull(Para.getSearch().findById(o52.getId()));
assertNull(Para.getCache().get(t5.getId()));
assertNull(Para.getCache().get(o51.getId()));
assertNull(Para.getCache().get(o52.getId()));
// only in index - store=false, index=true, cache=false
Tag t6 = new Tag("tag6");
Sysprop o61 = new Sysprop("obj61");
Sysprop o62 = new Sysprop("obj62");
o61.addProperty("dont_lose_this", o61.getId());
o62.addProperty("dont_lose_this", o62.getId());
t6.setStored(false);
t6.setCached(false);
o61.setStored(false);
o61.setCached(false);
o62.setStored(false);
o62.setCached(false);
Para.getDAO().create(t6);
Para.getDAO().createAll(new LinkedList<Sysprop>(Arrays.asList(o61, o62)));
Thread.sleep(1000);
System.setProperty("para.cache_enabled", "false");
assertNull(Para.getDAO().read(t6.getId()));
assertNull(Para.getDAO().read(o61.getId()));
assertNull(Para.getDAO().read(o62.getId()));
assertNotNull(Para.getSearch().findById(t6.getId()));
assertNotNull(Para.getSearch().findById(o61.getId()));
assertNotNull(Para.getSearch().findById(o62.getId()));
// special case: read_from_index (query multiple objects)
List<?> results = Para.getSearch().findByIds(Arrays.asList(o61.getId(), o62.getId()));
assertNotNull(results);
assertFalse(results.isEmpty());
assertEquals(2, results.size());
Sysprop first = ((Sysprop) results.get(0));
Sysprop second = ((Sysprop) results.get(1));
assertEquals(first.getId(), first.getProperty("dont_lose_this"));
assertEquals(second.getId(), second.getProperty("dont_lose_this"));
System.setProperty("para.cache_enabled", "true");
assertNull(Para.getCache().get(t6.getId()));
assertNull(Para.getCache().get(o61.getId()));
assertNull(Para.getCache().get(o62.getId()));
Para.getDAO().deleteAll(Arrays.asList(t6, o61, o62));
assertNull(Para.getDAO().read(t6.getId()));
assertNull(Para.getDAO().read(o61.getId()));
assertNull(Para.getDAO().read(o62.getId()));
assertNull(Para.getSearch().findById(t6.getId()));
assertNull(Para.getSearch().findById(o61.getId()));
assertNull(Para.getSearch().findById(o62.getId()));
assertNull(Para.getCache().get(t6.getId()));
assertNull(Para.getCache().get(o61.getId()));
assertNull(Para.getCache().get(o62.getId()));
}
}