blob: 3128b2cdf01e3d63fe0f6d7d6f4ca0ee2f87577f [file] [log] [blame]
// Copyright (C) 2017 The Android Open Source Project
//
// 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.googlesource.gerrit.plugins.analytics.test
import java.util.Date
import com.google.gerrit.acceptance.UseLocalDisk
import com.googlesource.gerrit.plugins.analytics.common.AggregationStrategy.EMAIL
import com.googlesource.gerrit.plugins.analytics.common.{AggregatedHistogramFilterByDates, BranchesExtractor}
import org.eclipse.jgit.lib.PersonIdent
import org.gitective.core.CommitFinder
import org.scalatest.{BeforeAndAfterEach, FlatSpec, Matchers}
@UseLocalDisk
class AggregatedHistogramFilterByDatesSpec extends FlatSpec with GerritTestDaemon with BeforeAndAfterEach with Matchers {
"Author history filter" should
"select one commit without intervals restriction" in {
testFileRepository.commitFile("file.txt", "some content")
val filter = new AggregatedHistogramFilterByDates()
new CommitFinder(fileRepository).setFilter(filter).find
val userActivity = filter.getHistogram.getUserActivity
filter.getHistogram.getUserActivity should have size 1
val activity = userActivity.head
activity.getCount should be(1)
activity.getName should be(author.getName)
activity.getEmail should be(author.getEmailAddress)
}
it should "select only the second of two commits based on the start timestamp" in {
val firstCommit = testFileRepository.commitFile("file.txt", "some content")
val firstCommitTs = firstCommit.getCommitterIdent.getWhen.getTime
val person = newPersonIdent("Second person", "second@company.com", new Date(firstCommitTs + 1000L))
val secondCommit = testFileRepository.commitFile("file.txt", "other content", author = person, committer = person)
val secondCommitTs = secondCommit.getCommitterIdent.getWhen.getTime
secondCommitTs should be > firstCommitTs
val filter = new AggregatedHistogramFilterByDates(from = Some(secondCommitTs))
new CommitFinder(fileRepository).setFilter(filter).find
val userActivity = filter.getHistogram.getUserActivity
userActivity should have size 1
val activity = userActivity.head
activity.getTimes should have size 1
activity.getName should be(person.getName)
activity.getEmail should be(person.getEmailAddress)
}
it should "select only the first of two commits based on the end timestamp" in {
val person = newPersonIdent("First person", "first@company.com")
val firstCommitTs = testFileRepository.commitFile("file.txt", "some content", author = person, committer = person)
.getCommitterIdent.getWhen.getTime
val secondCommitTs = testFileRepository.commitFile("file.txt", "other content", committer = new PersonIdent(committer, new Date(firstCommitTs + 1000L)))
.getCommitterIdent.getWhen.getTime
secondCommitTs should be > firstCommitTs
val filter = new AggregatedHistogramFilterByDates(to = Some(secondCommitTs))
new CommitFinder(fileRepository).setFilter(filter).find
val userActivity = filter.getHistogram.getUserActivity
userActivity should have size 1
val activity = userActivity.head
activity.getTimes should have size 1
activity.getName should be(person.getName)
activity.getEmail should be(person.getEmailAddress)
}
it should "select only one middle commit out of three based on interval from/to timestamp" in {
val firstCommitTs = testFileRepository.commitFile("file.txt", "some content")
.getCommitterIdent.getWhen.getTime
val person = newPersonIdent("Middle person", "middle@company.com", new Date(firstCommitTs + 1000L))
val middleCommitTs = testFileRepository.commitFile("file.txt", "other content", author = person, committer = person)
.getCommitterIdent.getWhen.getTime
val lastCommitTs = testFileRepository.commitFile("file.text", "yet other content", committer = new PersonIdent(committer, new Date(middleCommitTs + 1000L)))
.getCommitterIdent.getWhen.getTime
middleCommitTs should be > firstCommitTs
lastCommitTs should be > middleCommitTs
val filter = new AggregatedHistogramFilterByDates(from = Some(middleCommitTs), to = Some(lastCommitTs))
new CommitFinder(fileRepository).setFilter(filter).find
val userActivity = filter.getHistogram.getUserActivity
userActivity should have size 1
val activity = userActivity.head
activity.getTimes should have size 1
activity.getName should be(person.getName)
activity.getEmail should be(person.getEmailAddress)
}
it should "aggregate commits of the same user separately when they are in different branches and branchesExtractor is set" in {
testFileRepository.commitFile("file1.txt", "add file1.txt to master branch")
testFileRepository.branch("another/branch", "master")
testFileRepository.commitFile("file2.txt", "add file2.txt to another/branch", branch = "another/branch")
val filter = new AggregatedHistogramFilterByDates(
aggregationStrategy=EMAIL,
branchesExtractor = Some(new BranchesExtractor(fileRepository))
)
new CommitFinder(fileRepository).setFilter(filter).find
val userActivity = filter.getHistogram.getUserActivity
userActivity should have size 2
}
}