diff --git a/core/src/main/groovy/com/muwire/core/files/PersisterService.groovy b/core/src/main/groovy/com/muwire/core/files/PersisterService.groovy index 211097a2..0a694781 100644 --- a/core/src/main/groovy/com/muwire/core/files/PersisterService.groovy +++ b/core/src/main/groovy/com/muwire/core/files/PersisterService.groovy @@ -19,7 +19,7 @@ class PersisterService { final Timer timer final def fileSource - PersisterService(File location, EventBus listener, int interval, def FileSource) { + PersisterService(File location, EventBus listener, int interval, def fileSource) { this.location = location this.listener = listener this.interval = interval diff --git a/core/src/test/groovy/com/muwire/core/files/PersisterServiceTest.groovy b/core/src/test/groovy/com/muwire/core/files/PersisterServiceTest.groovy index 1ea23c43..ea91cdc6 100644 --- a/core/src/test/groovy/com/muwire/core/files/PersisterServiceTest.groovy +++ b/core/src/test/groovy/com/muwire/core/files/PersisterServiceTest.groovy @@ -1,5 +1,6 @@ package com.muwire.core.files +import org.junit.Before import org.junit.Test import com.muwire.core.EventBus @@ -10,20 +11,51 @@ import groovy.json.JsonOutput import groovy.util.GroovyTestCase import net.i2p.data.Base32 -class PersisterServiceTest extends GroovyTestCase { +class PersisterServiceTest { - @Test - void testName() { - File sharedDir = new File("sharedDir") + class Listener { + def publishedFiles = [] + def onFileLoadedEvent(FileLoadedEvent e) { + publishedFiles.add(e.loadedFile) + } + } + + EventBus eventBus + Listener listener + File sharedDir + File sharedFile1 + + @Before + void setup() { + eventBus = new EventBus() + listener = new Listener() + eventBus.register(FileLoadedEvent.class, listener) + + sharedDir = new File("sharedDir") sharedDir.mkdir() sharedDir.deleteOnExit() - File sharedFile1 = new File(sharedDir,"file1") + sharedFile1 = new File(sharedDir,"file1") sharedFile1.deleteOnExit() + } + + private void writeToSharedFile(int size) { FileOutputStream fos = new FileOutputStream(sharedFile1); - fos.write new byte[1] + fos.write new byte[size] fos.close() - + } + + private File initPersisted() { + File persisted = new File("persisted") + if (persisted.exists()) + persisted.delete() + persisted.deleteOnExit() + persisted + } + + @Test + void test1SharedFile1Piece() { + writeToSharedFile(1) FileHasher fh = new FileHasher() InfoHash ih1 = fh.hashFile(sharedFile1) @@ -35,29 +67,53 @@ class PersisterServiceTest extends GroovyTestCase { json = JsonOutput.toJson(json) - File persisted = new File("persisted") - if (persisted.exists()) - persisted.delete() - persisted.deleteOnExit() + File persisted = initPersisted() persisted.write json - SharedFile loadedFile - def eventListener = new Object() { - def onFileLoadedEvent(FileLoadedEvent e) { - loadedFile = e.loadedFile - } - } - - EventBus eventBus = new EventBus() - eventBus.register(FileLoadedEvent.class, eventListener) - PersisterService ps = new PersisterService(persisted, eventBus, 100, null) ps.start() Thread.sleep(2000) + assert listener.publishedFiles.size() == 1 + def loadedFile = listener.publishedFiles[0] assert loadedFile != null assert loadedFile.file == sharedFile1.getCanonicalFile() assert loadedFile.infoHash == ih1 } + @Test + public void test1SharedFile2Pieces() { + writeToSharedFile((0x1 << 18) + 1) + FileHasher fh = new FileHasher() + InfoHash ih1 = fh.hashFile(sharedFile1) + + assert ih1.getHashList().length == 2 * 32 + + def json = [:] + json.file = sharedFile1.getCanonicalFile().toString() + json.length = sharedFile1.length() + json.infoHash = Base32.encode ih1.getRoot() + + byte [] tmp = new byte[32] + System.arraycopy(ih1.getHashList(), 0, tmp, 0, 32) + String hash1 = Base32.encode(tmp) + System.arraycopy(ih1.getHashList(), 32, tmp, 0, 32) + String hash2 = Base32.encode(tmp) + json.hashList = [hash1, hash2] + + json = JsonOutput.toJson(json) + + File persisted = initPersisted() + persisted.write json + + PersisterService ps = new PersisterService(persisted, eventBus, 100, null) + ps.start() + Thread.sleep(2000) + + assert listener.publishedFiles.size() == 1 + def loadedFile = listener.publishedFiles[0] + assert loadedFile != null + assert loadedFile.file == sharedFile1.getCanonicalFile() + assert loadedFile.infoHash == ih1 + } }