[uploadselectionfilter] implement with tests
This commit is contained in:
parent
5090a78baa
commit
7d688954f7
3 changed files with 57 additions and 7 deletions
|
@ -1,21 +1,31 @@
|
|||
package net.kemitix.s3thorp
|
||||
|
||||
import java.io.File
|
||||
|
||||
import fs2.Stream
|
||||
import cats.effect.IO
|
||||
import net.kemitix.s3thorp.Main.putStrLn
|
||||
import net.kemitix.s3thorp.Sync.{Hash, LocalFile}
|
||||
import java.security.{MessageDigest, DigestInputStream}
|
||||
import java.io.{File, FileInputStream}
|
||||
|
||||
trait UploadSelectionFilter {
|
||||
|
||||
private def md5File(localFile: LocalFile): Hash = {
|
||||
val buffer = new Array[Byte](8192)
|
||||
val md5 = MessageDigest.getInstance("MD5")
|
||||
|
||||
val dis = new DigestInputStream(new FileInputStream(localFile), md5)
|
||||
try { while (dis.read(buffer) != -1) { } } finally { dis.close() }
|
||||
|
||||
md5.digest.map("%02x".format(_)).mkString
|
||||
}
|
||||
|
||||
def uploadRequiredFilter: Either[File, S3MetaData] => Stream[IO, File] = {
|
||||
case Left(file) => Stream(file)
|
||||
case Right(s3Metadata) =>
|
||||
Stream.eval(for {
|
||||
_ <- putStrLn(s"upload required: ${s3Metadata.localFile}")
|
||||
//md5File(localFile)
|
||||
//filter(localHash => options.force || localHash != metadataHash)
|
||||
} yield s3Metadata.localFile)
|
||||
localHash <- IO(md5File(s3Metadata.localFile))
|
||||
} yield (s3Metadata.localFile, localHash)).
|
||||
filter { case (_, localHash) => localHash != s3Metadata.remoteHash }.
|
||||
map {case (localFile,_) => localFile}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -0,0 +1,39 @@
|
|||
package net.kemitix.s3thorp
|
||||
|
||||
import java.io.File
|
||||
import java.time.Instant
|
||||
|
||||
import org.scalatest.FunSpec
|
||||
|
||||
class UploadSelectionFilterSuite extends FunSpec {
|
||||
|
||||
new UploadSelectionFilter {
|
||||
describe("uploadRequiredFilter") {
|
||||
val localFile = new File("src/test/scala/net/kemitix/s3thorp/test-file-for-hash.txt")
|
||||
val localHash = "0cbfe978783bd7950d5da4ff85e4af37"
|
||||
def invokeSubject(input: Either[File, S3MetaData]) = {
|
||||
uploadRequiredFilter(input).compile.toList.unsafeRunSync()
|
||||
}
|
||||
describe("when supplied a file") {
|
||||
val input = Left(localFile)
|
||||
it("should be marked for upload") {
|
||||
assertResult(List(localFile))(invokeSubject(input))
|
||||
}
|
||||
}
|
||||
describe("when supplied S3MetaData") {
|
||||
describe("when hash is different") {
|
||||
val input = Right(S3MetaData(localFile, "", "doesn't match any hash", Instant.now))
|
||||
it("should be marked for upload") {
|
||||
assertResult(List(localFile))(invokeSubject(input))
|
||||
}
|
||||
}
|
||||
describe("when hash is the same") {
|
||||
val input = Right(S3MetaData(localFile, "", localHash, Instant.now))
|
||||
it("should not be marked for upload") {
|
||||
assertResult(List())(invokeSubject(input))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
This is a test file for checking the md5 hash generator.
|
Loading…
Reference in a new issue