/*
* Copyright (C) 2003-2007 eXo Platform SAS.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see<http://www.gnu.org/licenses/>.
*/
package org.exoplatform.services.jcr.impl.core.query.lucene;
import org.exoplatform.services.jcr.impl.core.query.BaseQueryTest;
import org.exoplatform.services.jcr.impl.core.query.ErrorLog;
import java.io.File;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* Created by The eXo Platform SAS Author : Sergey Karpenko
* <sergey.karpenko@exoplatform.com.ua>
*
* @version $Id: $
*/
public class TestErrorLog extends BaseQueryTest {
ErrorLog log;
File file;
private static final int SIZE = 100;
public void setUp() throws Exception {
super.setUp();
file = File.createTempFile("error", "log");
if (file.exists()) {
file.delete();
}
}
public void tearDown() throws Exception {
super.tearDown();
log.clear();
file.delete();
}
public void testConcurrentWrite() throws Exception {
class Loader extends Thread {
private String name;
public Loader(String n) {
name = n;
}
public void run() {
/*
* try { for (int i = 0; i < SIZE; i++) {
* log.append(ErrorLog.ADD,name + i); //System.out.println(name
* + i); } log.flush(); } catch (Exception e) {
* System.out.println(e); }
*/
try {
HashSet<String> add = new HashSet<String>();
HashSet<String> rem = new HashSet<String>();
for (int j = 0; j < 10; j++) {
add.clear();
for (int i = 0; i < 10; i++) {
int el = j * 10 + i;
add.add(name + el);
}
log.writeChanges(rem, add);
}
} catch (Exception e) {
System.out.println(e);
}
}
}
log = new ErrorLog(file, SearchIndex.DEFAULT_ERRORLOG_FILE_SIZE);
Thread one = new Loader("first");
Thread two = new Loader("second");
one.start();
two.start();
one.join();
two.join();
List<String> list = log.readList();
int lost_first = 0;
int lost_second = 0;
for (int i = 0; i < SIZE; i++) {
String firstname = ErrorLog.ADD + " first" + i;
String secondname = ErrorLog.ADD + " second" + i;
int ffinded = 0;
int sfinded = 0;
for (int j = 0; j < list.size(); j++) {
if (list.get(j).equals(firstname)) {
ffinded++;
}
if (list.get(j).equals(secondname)) {
sfinded++;
}
}
if (ffinded == 0) {
System.out.println(firstname + " NOT FINDED");
}
if (ffinded > 1) {
System.out.println(firstname + " DUPLICATED");
}
if (sfinded == 0) {
System.out.println(secondname + " NOT FINDED");
}
if (sfinded > 1) {
System.out.println(secondname + " DUPLICATED");
}
}
assertEquals("There is mismatch of expected writed messages count ",
200, list.size());
assertEquals("First thread has lost apdates", 0, lost_first);
assertEquals("Second thread has lost apdates", 0, lost_second);
}
public void testExctractNotifyList() throws Exception {
log = new ErrorLog(file, SearchIndex.DEFAULT_ERRORLOG_FILE_SIZE);
Set<String> removed = new HashSet<String>();
Set<String> added = new HashSet<String>();
for (int i = 0; i < 10; i++) {
added.add("uuidadd" + i);
}
for (int i = 0; i < 5; i++) {
removed.add("uuidrem" + i);
}
log.writeChanges(removed, added);
Set<String> rem = new HashSet<String>();
Set<String> add = new HashSet<String>();
log.readChanges(rem, add);
assertTrue(rem.containsAll(removed));
assertTrue(add.containsAll(added));
}
}