This is an automated email from the ASF dual-hosted git repository.
dpavlov pushed a commit to branch ignite-9542-new-run-stripe
in repository https://gitbox.apache.org/repos/asf/ignite-teamcity-bot.git
The following commit(s) were added to refs/heads/ignite-9542-new-run-stripe by
this push:
new ac57ba8 IGNITE-9542 Flaky detection ported and tested, new skeletons
for tests: provide separated base/current branch history for PR page
ac57ba8 is described below
commit ac57ba826b3419e613c1f28da993f337600007f3
Author: Dmitriy Pavlov <[email protected]>
AuthorDate: Fri Dec 7 21:12:29 2018 +0300
IGNITE-9542 Flaky detection ported and tested, new skeletons for tests:
provide separated base/current branch history for PR page
---
.../java/org/apache/ignite/ci/HelperConfig.java | 2 +-
.../main/java/org/apache/ignite/ci/ITcHelper.java | 2 +-
.../main/java/org/apache/ignite/ci/TcHelper.java | 3 +-
.../org/apache/ignite/ci/di/IgniteTcBotModule.java | 2 +-
.../org/apache/ignite/ci/issue/IssuesStorage.java | 2 +-
.../tcbot/chain/TrackedBranchChainsProcessor.java | 4 +
.../ignite/ci/{ => tcbot}/issue/IssueDetector.java | 21 ++++--
.../ignite/ci/{ => tcbot}/issue/Notification.java | 3 +-
.../ignite/ci/web/rest/login/UserService.java | 2 +-
.../ci/tcbot/chain/MockBasedTcBotModule.java | 86 ++++++++++++++++++++++
.../ci/tcbot/chain/PrChainsProcessorTest.java | 60 +--------------
.../ci/tcbot/chain/TrackedBranchProcessorTest.java | 70 ++++++++++++++++++
.../ignite/ci/tcbot/issue/IssueDetectorTest.java | 73 ++++++++++++++++++
13 files changed, 258 insertions(+), 72 deletions(-)
diff --git
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/HelperConfig.java
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/HelperConfig.java
index 741d958..50207d8 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/HelperConfig.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/HelperConfig.java
@@ -37,7 +37,7 @@ import static com.google.common.base.Preconditions.checkState;
import static com.google.common.base.Strings.isNullOrEmpty;
/**
- * TC Helper Config access stuff.
+ * TC Helper Config access, tracked branches, etc stuff.
*/
public class HelperConfig {
public static final String CONFIG_FILE_NAME = "auth.properties";
diff --git
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/ITcHelper.java
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/ITcHelper.java
index 481ffa1..71f9c07 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/ITcHelper.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/ITcHelper.java
@@ -19,7 +19,7 @@ package org.apache.ignite.ci;
import java.util.Collection;
import java.util.List;
-import org.apache.ignite.ci.issue.IssueDetector;
+import org.apache.ignite.ci.tcbot.issue.IssueDetector;
import org.apache.ignite.ci.issue.IssuesStorage;
import org.apache.ignite.ci.teamcity.restcached.ITcServerProvider;
import org.apache.ignite.ci.user.ICredentialsProv;
diff --git
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/TcHelper.java
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/TcHelper.java
index 3ec2840..059e2bd 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/TcHelper.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/TcHelper.java
@@ -24,7 +24,7 @@ import java.util.Objects;
import java.util.concurrent.atomic.AtomicBoolean;
import javax.inject.Inject;
import org.apache.ignite.ci.conf.BranchesTracked;
-import org.apache.ignite.ci.issue.IssueDetector;
+import org.apache.ignite.ci.tcbot.issue.IssueDetector;
import org.apache.ignite.ci.issue.IssuesStorage;
import org.apache.ignite.ci.jira.IJiraIntegration;
import org.apache.ignite.ci.tcbot.chain.PrChainsProcessor;
@@ -46,7 +46,6 @@ import org.jetbrains.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import static org.apache.ignite.ci.analysis.RunStat.MAX_LATEST_RUNS;
import static org.apache.ignite.ci.util.XmlUtil.xmlEscapeText;
/**
diff --git
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/IgniteTcBotModule.java
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/IgniteTcBotModule.java
index d714b99..b9eb2b8 100644
---
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/IgniteTcBotModule.java
+++
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/IgniteTcBotModule.java
@@ -32,7 +32,7 @@ import org.apache.ignite.ci.db.Ignite1Init;
import org.apache.ignite.ci.di.cache.GuavaCachedModule;
import org.apache.ignite.ci.di.scheduler.SchedulerModule;
import org.apache.ignite.ci.github.ignited.GitHubIgnitedModule;
-import org.apache.ignite.ci.issue.IssueDetector;
+import org.apache.ignite.ci.tcbot.issue.IssueDetector;
import org.apache.ignite.ci.jira.JiraIntegrationModule;
import org.apache.ignite.ci.observer.BuildObserver;
import org.apache.ignite.ci.observer.ObserverTask;
diff --git
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/issue/IssuesStorage.java
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/issue/IssuesStorage.java
index 4651bb3..d542709 100644
---
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/issue/IssuesStorage.java
+++
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/issue/IssuesStorage.java
@@ -37,7 +37,7 @@ public class IssuesStorage {
public IssuesStorage() {
}
- IgniteCache<IssueKey, Issue> cache() {
+ public IgniteCache<IssueKey, Issue> cache() {
return botDetectedIssuesCache(getIgnite());
}
diff --git
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/chain/TrackedBranchChainsProcessor.java
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/chain/TrackedBranchChainsProcessor.java
index da4188b..fc9cf12 100644
---
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/chain/TrackedBranchChainsProcessor.java
+++
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/chain/TrackedBranchChainsProcessor.java
@@ -41,7 +41,11 @@ import org.jetbrains.annotations.Nullable;
import static com.google.common.base.Strings.isNullOrEmpty;
+/**
+ * Process failures for some setup tracked branch, which may be
triggered/monitored by TC Bot.
+ */
public class TrackedBranchChainsProcessor {
+ /** TC Server prov. */
@Inject private ITcServerProvider srvProv;
@Inject private ITeamcityIgnitedProvider tcIgnitedProv;
diff --git
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/issue/IssueDetector.java
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/issue/IssueDetector.java
similarity index 96%
rename from
ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/issue/IssueDetector.java
rename to
ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/issue/IssueDetector.java
index fbe54eb..b8e47e3 100644
---
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/issue/IssueDetector.java
+++
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/issue/IssueDetector.java
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-package org.apache.ignite.ci.issue;
+package org.apache.ignite.ci.tcbot.issue;
import com.google.common.base.Strings;
@@ -35,6 +35,11 @@ import javax.inject.Provider;
import org.apache.ignite.ci.HelperConfig;
import org.apache.ignite.ci.IAnalyticsEnabledTeamcity;
import org.apache.ignite.ci.ITcHelper;
+import org.apache.ignite.ci.issue.EventTemplate;
+import org.apache.ignite.ci.issue.EventTemplates;
+import org.apache.ignite.ci.issue.Issue;
+import org.apache.ignite.ci.issue.IssueKey;
+import org.apache.ignite.ci.issue.IssuesStorage;
import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnited;
import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnitedProvider;
@@ -83,7 +88,7 @@ public class IssueDetector {
@Inject private Provider<CheckQueueJob> checkQueueJobProv;
- /** TrackedBranch Processor. */
+ /** Tracked Branch Processor. */
@Inject private TrackedBranchChainsProcessor tbProc;
/** Tc helper. */
@@ -101,16 +106,18 @@ public class IssueDetector {
private final AtomicBoolean sndNotificationGuard = new AtomicBoolean();
- private void registerIssuesAndNotifyLater(TestFailuresSummary res,
+ private String registerIssuesAndNotifyLater(TestFailuresSummary res,
ICredentialsProv creds) {
if (creds == null)
- return;
+ return null;
- registerNewIssues(res, creds);
+ String newIssues = registerNewIssues(res, creds);
if (sndNotificationGuard.compareAndSet(false, true))
executorService.schedule(this::sendNewNotifications, 90,
TimeUnit.SECONDS);
+
+ return newIssues;
}
@@ -446,9 +453,9 @@ public class IssueDetector {
backgroundOpsCreds
);
- registerIssuesAndNotifyLater(failures, backgroundOpsCreds);
+ String issResult = registerIssuesAndNotifyLater(failures,
backgroundOpsCreds);
- return "Tests " + failures.failedTests + " Suites " +
failures.failedToFinish + " were checked";
+ return "Tests " + failures.failedTests + " Suites " +
failures.failedToFinish + " were checked. " + issResult;
}
public void stop() {
diff --git
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/issue/Notification.java
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/issue/Notification.java
similarity index 98%
rename from
ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/issue/Notification.java
rename to
ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/issue/Notification.java
index fe5f7d1..e385e7e 100644
---
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/issue/Notification.java
+++
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/issue/Notification.java
@@ -15,10 +15,11 @@
* limitations under the License.
*/
-package org.apache.ignite.ci.issue;
+package org.apache.ignite.ci.tcbot.issue;
import java.util.*;
+import org.apache.ignite.ci.issue.Issue;
import org.apache.ignite.ci.util.TimeUtil;
import org.apache.ignite.ci.web.model.Version;
diff --git
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/login/UserService.java
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/login/UserService.java
index a44df25..0b6e12a 100644
---
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/login/UserService.java
+++
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/login/UserService.java
@@ -32,7 +32,7 @@ import javax.ws.rs.core.Context;
import javax.ws.rs.core.Form;
import javax.ws.rs.core.MediaType;
import org.apache.ignite.ci.ITcHelper;
-import org.apache.ignite.ci.issue.IssueDetector;
+import org.apache.ignite.ci.tcbot.issue.IssueDetector;
import org.apache.ignite.ci.tcbot.visa.TcBotTriggerAndSignOffService;
import org.apache.ignite.ci.tcmodel.user.User;
import org.apache.ignite.ci.teamcity.pure.ITcLogin;
diff --git
a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/tcbot/chain/MockBasedTcBotModule.java
b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/tcbot/chain/MockBasedTcBotModule.java
new file mode 100644
index 0000000..960674e
--- /dev/null
+++
b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/tcbot/chain/MockBasedTcBotModule.java
@@ -0,0 +1,86 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.ignite.ci.tcbot.chain;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.internal.SingletonScope;
+import org.apache.ignite.ci.IAnalyticsEnabledTeamcity;
+import org.apache.ignite.ci.github.PullRequest;
+import org.apache.ignite.ci.github.ignited.IGitHubConnIgnited;
+import org.apache.ignite.ci.github.ignited.IGitHubConnIgnitedProvider;
+import org.apache.ignite.ci.github.pure.IGitHubConnection;
+import org.apache.ignite.ci.github.pure.IGitHubConnectionProvider;
+import org.apache.ignite.ci.jira.IJiraIntegration;
+import org.apache.ignite.ci.jira.IJiraIntegrationProvider;
+import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
+import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnitedProvider;
+import org.apache.ignite.ci.teamcity.ignited.InMemoryStringCompactor;
+import org.apache.ignite.ci.teamcity.ignited.TeamcityIgnitedProviderMock;
+import org.apache.ignite.ci.teamcity.restcached.ITcServerProvider;
+import org.apache.ignite.ci.user.ICredentialsProv;
+import org.mockito.Mockito;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.when;
+
+/**
+ * Setup TC bot context with Ignited services mocks:
+ * - TC: {@link TeamcityIgnitedProviderMock}
+ */
+public class MockBasedTcBotModule extends AbstractModule {
+ /** {@inheritDoc} */
+ @Override protected void configure() {
+ bind(IStringCompactor.class).to(InMemoryStringCompactor.class).in(new
SingletonScope());
+
+ final IGitHubConnectionProvider ghProv =
Mockito.mock(IGitHubConnectionProvider.class);
+ bind(IGitHubConnectionProvider.class).toInstance(ghProv);
+
when(ghProv.server(anyString())).thenReturn(Mockito.mock(IGitHubConnection.class));
+
+ final IGitHubConnIgnitedProvider gitHubConnIgnitedProvider =
Mockito.mock(IGitHubConnIgnitedProvider.class);
+
+
bind(IGitHubConnIgnitedProvider.class).toInstance(gitHubConnIgnitedProvider);
+
+ IGitHubConnIgnited gitHubConnIgnited =
Mockito.mock(IGitHubConnIgnited.class);
+
+ PullRequest pullReq = Mockito.mock(PullRequest.class);
+
+ when(pullReq.getTitle()).thenReturn("");
+
+
when(gitHubConnIgnited.getPullRequest(anyString())).thenReturn(pullReq);
+
+
when(gitHubConnIgnitedProvider.server(anyString())).thenReturn(gitHubConnIgnited);
+
+ final IJiraIntegrationProvider jiraProv =
Mockito.mock(IJiraIntegrationProvider.class);
+
+ bind(IJiraIntegrationProvider.class).toInstance(jiraProv);
+
+
when(jiraProv.server(anyString())).thenReturn(Mockito.mock(IJiraIntegration.class));
+
+
bind(ITeamcityIgnitedProvider.class).to(TeamcityIgnitedProviderMock.class).in(new
SingletonScope());
+
+ final ITcServerProvider tcSrvOldProv =
Mockito.mock(ITcServerProvider.class);
+
+ final IAnalyticsEnabledTeamcity tcOld =
BuildChainProcessorTest.tcOldMock();
+ when(tcSrvOldProv.server(anyString(),
any(ICredentialsProv.class))).thenReturn(tcOld);
+
+ bind(ITcServerProvider.class).toInstance(tcSrvOldProv);
+
+ super.configure();
+ }
+}
diff --git
a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/tcbot/chain/PrChainsProcessorTest.java
b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/tcbot/chain/PrChainsProcessorTest.java
index e8b689a..53670b6 100644
---
a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/tcbot/chain/PrChainsProcessorTest.java
+++
b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/tcbot/chain/PrChainsProcessorTest.java
@@ -18,10 +18,8 @@ package org.apache.ignite.ci.tcbot.chain;
import com.google.common.base.Preconditions;
import com.google.common.collect.Lists;
-import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Injector;
-import com.google.inject.internal.SingletonScope;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@@ -30,16 +28,8 @@ import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
import java.util.function.Predicate;
-import org.apache.ignite.ci.IAnalyticsEnabledTeamcity;
-import org.apache.ignite.ci.github.PullRequest;
import org.apache.ignite.ci.ITeamcity;
import org.apache.ignite.ci.analysis.RunStat;
-import org.apache.ignite.ci.github.ignited.IGitHubConnIgnited;
-import org.apache.ignite.ci.github.ignited.IGitHubConnIgnitedProvider;
-import org.apache.ignite.ci.github.pure.IGitHubConnection;
-import org.apache.ignite.ci.github.pure.IGitHubConnectionProvider;
-import org.apache.ignite.ci.jira.IJiraIntegration;
-import org.apache.ignite.ci.jira.IJiraIntegrationProvider;
import org.apache.ignite.ci.tcmodel.conf.BuildType;
import org.apache.ignite.ci.tcmodel.hist.BuildRef;
import org.apache.ignite.ci.tcmodel.result.Build;
@@ -49,28 +39,22 @@ import
org.apache.ignite.ci.tcmodel.result.tests.TestOccurrenceFull;
import org.apache.ignite.ci.tcmodel.result.tests.TestRef;
import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnitedProvider;
-import org.apache.ignite.ci.teamcity.ignited.InMemoryStringCompactor;
import org.apache.ignite.ci.teamcity.ignited.TeamcityIgnitedProviderMock;
import org.apache.ignite.ci.teamcity.ignited.fatbuild.FatBuildCompacted;
import org.apache.ignite.ci.teamcity.ignited.runhist.InvocationData;
-import org.apache.ignite.ci.teamcity.restcached.ITcServerProvider;
import org.apache.ignite.ci.user.ICredentialsProv;
import org.apache.ignite.ci.web.model.current.SuiteCurrentStatus;
import org.apache.ignite.ci.web.model.current.TestFailure;
import org.jetbrains.annotations.NotNull;
import org.junit.Before;
import org.junit.Test;
-import org.mockito.Mockito;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
/**
* Unit test for {@link PrChainsProcessor} and blockers detection.
@@ -104,48 +88,9 @@ public class PrChainsProcessorTest {
/**
* Injector.
*/
- private Injector injector = Guice.createInjector(new AbstractModule() {
- @Override
- protected void configure() {
-
bind(IStringCompactor.class).to(InMemoryStringCompactor.class).in(new
SingletonScope());
-
- final IGitHubConnectionProvider ghProv =
Mockito.mock(IGitHubConnectionProvider.class);
- bind(IGitHubConnectionProvider.class).toInstance(ghProv);
-
when(ghProv.server(anyString())).thenReturn(Mockito.mock(IGitHubConnection.class));
-
- final IGitHubConnIgnitedProvider gitHubConnIgnitedProvider =
Mockito.mock(IGitHubConnIgnitedProvider.class);
-
-
bind(IGitHubConnIgnitedProvider.class).toInstance(gitHubConnIgnitedProvider);
-
- IGitHubConnIgnited gitHubConnIgnited =
Mockito.mock(IGitHubConnIgnited.class);
-
- PullRequest pullReq = Mockito.mock(PullRequest.class);
-
- when(pullReq.getTitle()).thenReturn("");
-
-
when(gitHubConnIgnited.getPullRequest(anyString())).thenReturn(pullReq);
-
-
when(gitHubConnIgnitedProvider.server(anyString())).thenReturn(gitHubConnIgnited);
-
- final IJiraIntegrationProvider jiraProv =
Mockito.mock(IJiraIntegrationProvider.class);
-
- bind(IJiraIntegrationProvider.class).toInstance(jiraProv);
-
-
when(jiraProv.server(anyString())).thenReturn(Mockito.mock(IJiraIntegration.class));
-
-
bind(ITeamcityIgnitedProvider.class).to(TeamcityIgnitedProviderMock.class).in(new
SingletonScope());
-
- final ITcServerProvider tcSrvOldProv =
Mockito.mock(ITcServerProvider.class);
-
- final IAnalyticsEnabledTeamcity tcOld =
BuildChainProcessorTest.tcOldMock();
- when(tcSrvOldProv.server(anyString(),
any(ICredentialsProv.class))).thenReturn(tcOld);
-
- bind(ITcServerProvider.class).toInstance(tcSrvOldProv);
-
- super.configure();
- }
- });
+ private Injector injector = Guice.createInjector(new
MockBasedTcBotModule());
+ /** */
@Before
public void initBuilds() {
final TeamcityIgnitedProviderMock instance =
(TeamcityIgnitedProviderMock)
injector.getInstance(ITeamcityIgnitedProvider.class);
@@ -429,4 +374,5 @@ public class PrChainsProcessorTest {
public Map<Integer, FatBuildCompacted> apacheBuilds() {
return apacheBuilds;
}
+
}
diff --git
a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/tcbot/chain/TrackedBranchProcessorTest.java
b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/tcbot/chain/TrackedBranchProcessorTest.java
new file mode 100644
index 0000000..07ce028
--- /dev/null
+++
b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/tcbot/chain/TrackedBranchProcessorTest.java
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.ignite.ci.tcbot.chain;
+
+import com.google.gson.Gson;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnitedProvider;
+import org.apache.ignite.ci.teamcity.ignited.TeamcityIgnitedProviderMock;
+import org.apache.ignite.ci.teamcity.ignited.fatbuild.FatBuildCompacted;
+import org.apache.ignite.ci.user.ICredentialsProv;
+import org.apache.ignite.ci.web.model.current.TestFailuresSummary;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.mockito.Mockito.mock;
+
+/**
+ * Tests {@link TrackedBranchChainsProcessor}
+ */
+public class TrackedBranchProcessorTest {
+ public static final String SRV_ID = "apache";
+ /** Builds emulated storage. */
+ private Map<Integer, FatBuildCompacted> apacheBuilds = new
ConcurrentHashMap<>();
+
+ /**
+ * Injector.
+ */
+ private Injector injector = Guice.createInjector(new
MockBasedTcBotModule());
+
+ /** */
+ @Before
+ public void initBuilds() {
+ final TeamcityIgnitedProviderMock instance =
(TeamcityIgnitedProviderMock)
injector.getInstance(ITeamcityIgnitedProvider.class);
+ instance.addServer(SRV_ID, apacheBuilds);
+ }
+
+ @Test
+ public void testTrackedBranchChainsProcessor() {
+ TrackedBranchChainsProcessor tbProc =
injector.getInstance(TrackedBranchChainsProcessor.class);
+
+ String brachName = "master"; //todo use separate branch e.g.
masterForTests
+ TestFailuresSummary failures =
tbProc.getTrackedBranchTestFailures(brachName,
+ false,
+ 1,
+ mock(ICredentialsProv.class)
+ );
+
+ System.out.println(new Gson().toJson(failures));
+
+ }
+
+}
diff --git
a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/tcbot/issue/IssueDetectorTest.java
b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/tcbot/issue/IssueDetectorTest.java
new file mode 100644
index 0000000..0ad7865
--- /dev/null
+++
b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/tcbot/issue/IssueDetectorTest.java
@@ -0,0 +1,73 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.ignite.ci.tcbot.issue;
+
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import org.apache.ignite.ci.tcbot.chain.MockBasedTcBotModule;
+import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnitedProvider;
+import org.apache.ignite.ci.teamcity.ignited.TeamcityIgnitedProviderMock;
+import org.apache.ignite.ci.teamcity.ignited.fatbuild.FatBuildCompacted;
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+
+/**
+ *
+ */
+public class IssueDetectorTest {
+ public static final String SRV_ID = "apache";
+ /** Builds emulated storage. */
+ private Map<Integer, FatBuildCompacted> apacheBuilds = new
ConcurrentHashMap<>();
+
+ /**
+ * Injector.
+ */
+ private Injector injector = Guice.createInjector(new
MockBasedTcBotModule());
+
+ /** */
+ @Before
+ public void initBuilds() {
+ final TeamcityIgnitedProviderMock instance =
(TeamcityIgnitedProviderMock)
injector.getInstance(ITeamcityIgnitedProvider.class);
+ instance.addServer(SRV_ID, apacheBuilds);
+ }
+
+ @Test
+ @Ignore
+ public void testDetector() {
+ IssueDetector issueDetector =
injector.getInstance(IssueDetector.class);
+
+ String masterStatus = issueDetector.checkFailuresEx("master");
+
+ System.out.println(masterStatus);
+ /* todo: implement users/issue test only storeages
+ 1) No implementation for org.apache.ignite.Ignite was bound.
+ while locating com.google.inject.Provider<org.apache.ignite.Ignite>
+ for field at
org.apache.ignite.ci.issue.IssuesStorage.igniteProvider(IssuesStorage.java:37)
+
+2) No implementation for org.apache.ignite.ci.ITcHelper was bound.
+ while locating org.apache.ignite.ci.ITcHelper
+
+3) No implementation for org.apache.ignite.Ignite was bound.
+ while locating com.google.inject.Provider<org.apache.ignite.Ignite>
+ */
+ }
+
+}