/**
* Copyright 2012 Anjuke Inc.
*
* 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 com.anjuke.romar.mahout.persistence;
import static org.junit.Assert.*;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import org.apache.hadoop.fs.FileUtil;
import org.apache.mahout.cf.taste.impl.common.FastByIDMap;
import org.apache.mahout.cf.taste.model.PreferenceArray;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class FilePreferenceSourceTest {
private final File path = new File("/tmp/romar/test");
FilePreferenceSource source;
@Before
public void setUp() throws Exception {
source = new FilePreferenceSource(path);
}
@After
public void tearDown() throws Exception {
source.close();
for(File f:path.listFiles()){
f.delete();
}
}
@Test
public void testFilePreferenceSourceFileString() throws Exception {
tearDown();
FilePreferenceSource file = new FilePreferenceSource(path);
String[] list = path.list();
String name = list[0];
assertTrue(name
.startsWith(AbstractFilePreferenceSource.LOG_FILE_PREFIX));
assertEquals("0", name.substring(
AbstractFilePreferenceSource.LOG_FILE_PREFIX.length()));
}
@Test
public void testAddPreference() throws IOException {
source.setPreference(1, 1, 1.0f);
File file = source.getLatestLogFile();
BufferedReader reader = new BufferedReader(new InputStreamReader(
new FileInputStream(file)));
String line = reader.readLine();
assertNotNull(line);
assertEquals("1,1,1.0", line);
reader.close();
}
@Test
public void testRemovePreference() throws IOException {
source.removePreference(1, 1);
File file = source.getLatestLogFile();
BufferedReader reader = new BufferedReader(new InputStreamReader(
new FileInputStream(file)));
String line = reader.readLine();
assertNotNull(line);
assertEquals("1,1,", line);
reader.close();
}
@Test
public void testGetPreferenceData() {
source.setPreference(2, 3, 2);
source.removePreference(2, 3);
source.setPreference(1, 1, 2);
source.setPreference(3, 4, 2);
source.setPreference(3, 5, 3);
source.commit();
source.setPreference(5, 4, 1.0f);
source.compact();
source.close();
source=new FilePreferenceSource(path);
FastByIDMap<PreferenceArray> data=source.getPreferenceUserData();
PreferenceArray id2=data.get(2);
assertNull(id2);
PreferenceArray id1=data.get(1);
assertNotNull(id1);
assertEquals(1,id1.getItemID(0));
assertEquals(2.0f,id1.getValue(0),0f);
PreferenceArray id3=data.get(3);
assertNotNull(id3);
assertEquals(4,id3.getItemID(0));
assertEquals(2.0f,id3.getValue(0),0f);
assertEquals(5,id3.getItemID(1));
assertEquals(3.0f,id3.getValue(1),0f);
PreferenceArray id5=data.get(5);
assertNotNull(id5);
assertEquals(4,id5.getItemID(0));
assertEquals(1.0f,id5.getValue(0),0f);
}
@Test
public void testCompact() throws IOException {
source.setPreference(2, 3, 2);
source.removePreference(2, 3);
source.setPreference(1, 1, 2);
source.setPreference(3, 4, 2);
source.commit();
source.setPreference(5, 4, 2);
source.compact();
File file = source.getSnapshotFile(0);
BufferedReader reader = new BufferedReader(new InputStreamReader(
new FileInputStream(file)));
String line = reader.readLine();
assertNotNull(line);
assertEquals("1,1,2.0", line);
line = reader.readLine();
assertNotNull(line);
assertEquals("3,4,2.0", line);
line = reader.readLine();
assertNull(line);
reader.close();
}
@Test
public void testCommit() throws IOException {
source.setPreference(1, 1, 1);
source.commit();
File file = source.getLatestLogFile();
String name = file.getName();
assertEquals("1", name.substring(
AbstractFilePreferenceSource.LOG_FILE_PREFIX.length()));
assertEquals(2, source.listLogFileNamesAndSorted().size());
source.setPreference(1, 1, 1);
source.commit();
file = source.getLatestLogFile();
name = file.getName();
assertEquals("2", name.substring(
AbstractFilePreferenceSource.LOG_FILE_PREFIX.length()));
assertEquals(3, source.listLogFileNamesAndSorted().size());
source.setPreference(1, 1, 1.0f);
BufferedReader reader = new BufferedReader(new InputStreamReader(
new FileInputStream(file)));
String line = reader.readLine();
assertNotNull(line);
assertEquals("1,1,1.0", line);
reader.close();
}
@Test
public void testContinuousCompactAndCommit(){
source.setPreference(1, 1, 1);
source.commit();
source.compact();
assertEquals(2, source.listLogFileNamesAndSorted().size());
assertEquals(1, source.listSnapshotFileNamesAndSorted().size());
assertEquals(1,source.getLogFileVersion(source.getLatestLogFile()));
assertEquals(0,source.getSnapshotFileVersion(source.getLatestSnapshotFile()));
source.commit();
source.compact();
assertEquals(2, source.listLogFileNamesAndSorted().size());
assertEquals(1, source.listSnapshotFileNamesAndSorted().size());
source.commit();
source.compact();
assertEquals(2, source.listLogFileNamesAndSorted().size());
assertEquals(1, source.listSnapshotFileNamesAndSorted().size());
source.commit();
source.compact();
assertEquals(2, source.listLogFileNamesAndSorted().size());
assertEquals(1, source.listSnapshotFileNamesAndSorted().size());
assertEquals(1,source.getLogFileVersion(source.getLatestLogFile()));
assertEquals(0,source.getSnapshotFileVersion(source.getLatestSnapshotFile()));
}
}