/*
* Jitsi, the OpenSource Java VoIP and Instant Messaging client.
*
* Copyright @ 2015 Atlassian Pty Ltd
*
* 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 net.java.sip.communicator.slick.history;
import java.util.*;
import junit.framework.*;
import net.java.sip.communicator.service.history.*;
import net.java.sip.communicator.service.history.records.*;
import org.osgi.framework.*;
public class TestHistoryService extends TestCase {
private static HistoryRecordStructure recordStructure =
new HistoryRecordStructure(new String[] { "age", "name_CDATA", "sex" });
/**
* The ConfigurationService that we will be testing.
*/
private HistoryService historyService = null;
private ServiceReference historyServiceRef = null;
private History history = null;
private Random random = new Random();
public TestHistoryService(String name)
{
super(name);
}
public static Test suite()
{
TestSuite suite = new TestSuite();
suite.addTest(new TestHistoryService("testCreateDB"));
suite.addTest(new TestHistoryService("testWriteRecords"));
suite.addTest(new TestHistoryService("testReadRecords"));
suite.addTest(new TestHistoryService("testPurgeLocallyStoredHistory"));
suite.addTest(new TestHistoryService("testCreatingHistoryIDFromFS"));
suite.addTest(new TestHistoryService("testWriteRecordsWithMaxNumber"));
return suite;
}
@Override
protected void setUp()
throws Exception
{
BundleContext context = HistoryServiceLick.bc;
historyServiceRef = context.getServiceReference(HistoryService.class
.getName());
this.historyService = (HistoryService) context
.getService(historyServiceRef);
HistoryID testID = HistoryID.createFromRawID(new String[] { "test",
"alltests" });
this.history = this.historyService.createHistory(testID,
recordStructure);
}
@Override
protected void tearDown()
throws Exception
{
BundleContext context = HistoryServiceLick.bc;
context.ungetService(this.historyServiceRef);
this.history = null;
this.historyService = null;
this.historyServiceRef = null;
}
public void testCreateDB()
{
ArrayList<String> al = new ArrayList<String>();
Iterator<HistoryID> i = this.historyService.getExistingIDs();
while (i.hasNext())
{
HistoryID id = i.next();
String[] components = id.getID();
if (components.length == 2 && "test".equals(components[0]))
{
al.add(components[1]);
}
}
int count = al.size();
boolean unique = false;
String lastComp = null;
while (!unique)
{
lastComp = Integer.toHexString(random.nextInt());
for (int j = 0; j < count; j++)
{
if (lastComp.equals(al.get(j)))
{
continue;
}
}
unique = true;
}
HistoryID id = HistoryID.createFromRawID(new String[] { "test",
lastComp });
try {
this.historyService.createHistory(id, recordStructure);
} catch (Exception e)
{
fail("Could not create database with id " + id + " with error " + e);
}
try
{
// after creating, remove it - do not leave content
this.historyService.purgeLocallyStoredHistory(id);
}
catch (Exception ex)
{
fail("Cannot delete local history with id " + this.history.getID()
+ " : " + ex.getMessage());
}
}
public void testWriteRecords()
{
HistoryWriter writer = this.history.getWriter();
try {
for (int i = 0; i < 202; i++)
{
writer.addRecord(new String[] { "" + random.nextInt(),
"name" + i,
i % 2 == 0 ? "m" : "f" });
}
} catch (Exception e)
{
fail("Could not write records. Reason: " + e);
}
}
public void testReadRecords()
{
HistoryReader reader = this.history.getReader();
QueryResultSet<HistoryRecord> result = reader.findByKeyword("name2", "name");
assertTrue("Nothing found", result.hasNext());
while (result.hasNext())
{
HistoryRecord record = result.nextRecord();
String[] vals = record.getPropertyValues();
try {
int n = Integer.parseInt(vals[1].substring(4));
assertEquals(3, vals.length);
assertEquals(n % 2 == 0 ? "m" : "f", vals[2]);
} catch (Exception e)
{
fail("Bad data! Expected nameXXXX, where XXXX is "
+ "an integer, but found: " + vals[0]);
}
}
}
public void testPurgeLocallyStoredHistory()
{
try
{
this.historyService.purgeLocallyStoredHistory(this.history.getID());
}
catch (Exception ex)
{
fail("Cannot delete local history with id " + this.history.getID()
+ " : " + ex.getMessage());
}
}
/**
* Test of method createFromRawStrings, used when we read history folders
* from FS and from their names want to recreate history.
*/
public void testCreatingHistoryIDFromFS()
{
testHistoryIDCreate(new String[] { "test1", "alltests1" });
//test id which has special chars (accounts)
testHistoryIDCreate(new String[] { "test2", "alltests2",
"Jabber:mincho.penchev@jit.si@jit.si" });
}
private void testHistoryIDCreate(String[] strArr)
{
HistoryID testNoSpecialCharsID = HistoryID.createFromRawID(strArr);
HistoryID testNoSpecialCharsIDFSRead =
HistoryID.createFromRawStrings(testNoSpecialCharsID.getID());
assertEquals("Wrong length", testNoSpecialCharsID.getID().length,
testNoSpecialCharsIDFSRead.getID().length);
for(int i = 0; i < testNoSpecialCharsID.getID().length; i++)
{
/*System.err.println(
testNoSpecialCharsID.getID()[i] +
" ? " +
testNoSpecialCharsIDFSRead.getID()[i]);*/
assertEquals("Wrong id", testNoSpecialCharsID.getID()[i],
testNoSpecialCharsIDFSRead.getID()[i]);
}
}
public void testWriteRecordsWithMaxNumber()
{
HistoryWriter writer = this.history.getWriter();
HistoryReader reader = this.history.getReader();
try
{
for (int i = 0; i < 20; i++)
{
writer.addRecord(new String[] { "" + i,
"name" + i,
i % 2 == 0 ? "m" : "f" }, 20);
synchronized(this)
{
try
{
wait(100);
}
catch(Throwable t){}
}
}
QueryResultSet<HistoryRecord> recs = reader.findLast(20);
int count = 0;
while(recs.hasNext())
{
count++;
recs.next();
}
assertEquals( "Wrong count of messages", 20, count);
writer.addRecord(new String[] { "" + 21,
"name" + 21, "f" }, 20);
recs = reader.findLast(20);
count = 0;
boolean foundFirstMessage = false;
while(recs.hasNext())
{
count++;
HistoryRecord hr = recs.next();
if(hr.getPropertyValues()[0].equals("0"))
foundFirstMessage = true;
}
assertEquals( "Wrong count of messages", 20, count);
assertFalse("Wrong message removed, must be the first one",
foundFirstMessage);
} catch (Exception e)
{
e.printStackTrace();
fail("Could not write records. Reason: " + e);
}
}
}