diff --git a/pom.xml b/pom.xml
index efe552b..4eb7d58 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
org.jenkins-ci.plugins
plugin
- 5.2
+ 5.7
io.jenkins.plugins
jira-integration
@@ -19,7 +19,7 @@
The Apache Software License, Version 2.0
- http://www.apache.org/licenses/LICENSE-2.0.txt
+ https://www.apache.org/licenses/LICENSE-2.0.txt
repo
@@ -56,7 +56,7 @@
io.jenkins.tools.bom
bom-${jenkins.baseline}.x
- 3613.v584fca_12cf5c
+ 4136.vca_c3202a_7fd1
import
pom
diff --git a/src/test/java/org/marvelution/jji/AbstractTechnicalTest.java b/src/test/java/org/marvelution/jji/AbstractTechnicalTest.java
index 4b1ff7a..612db5d 100644
--- a/src/test/java/org/marvelution/jji/AbstractTechnicalTest.java
+++ b/src/test/java/org/marvelution/jji/AbstractTechnicalTest.java
@@ -2,6 +2,7 @@
import java.util.Optional;
+import org.jvnet.hudson.test.junit.jupiter.WithJenkins;
import org.marvelution.jji.configuration.JiraSite;
import org.marvelution.jji.configuration.JiraSitesConfiguration;
import org.marvelution.jji.rest.HttpClientProvider;
@@ -12,25 +13,27 @@
import com.fasterxml.jackson.databind.ObjectMapper;
import okhttp3.OkHttpClient;
import okhttp3.Request;
-import org.junit.Before;
-import org.junit.Rule;
+import org.junit.jupiter.api.BeforeEach;
import org.jvnet.hudson.test.JenkinsRule;
import org.jvnet.hudson.test.MockAuthorizationStrategy;
+@WithJenkins
public abstract class AbstractTechnicalTest
{
public static final String ALICE = "alice";
protected final MockAuthorizationStrategy authorizationStrategy = new MockAuthorizationStrategy();
- @Rule
- public JenkinsRule jenkins = new JenkinsRule();
+
+ protected JenkinsRule jenkins;
protected JiraSitesConfiguration sitesConfiguration;
protected OkHttpClient httpClient;
protected ObjectMapper objectMapper;
- @Before
- public void setUpCommonBits()
+ @BeforeEach
+ void setUp(JenkinsRule jenkins)
{
+ this.jenkins = jenkins;
+
jenkins.getInstance()
.setSecurityRealm(jenkins.createDummySecurityRealm());
jenkins.getInstance()
diff --git a/src/test/java/org/marvelution/jji/casc/ConfigurationAsCodeTest.java b/src/test/java/org/marvelution/jji/casc/ConfigurationAsCodeTest.java
index fc33c67..f538b8f 100644
--- a/src/test/java/org/marvelution/jji/casc/ConfigurationAsCodeTest.java
+++ b/src/test/java/org/marvelution/jji/casc/ConfigurationAsCodeTest.java
@@ -2,23 +2,22 @@
import java.net.*;
+import io.jenkins.plugins.casc.misc.junit.jupiter.WithJenkinsConfiguredWithCode;
import org.marvelution.jji.configuration.*;
import io.jenkins.plugins.casc.misc.*;
import org.assertj.core.api.*;
-import org.junit.*;
+import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.*;
-public class ConfigurationAsCodeTest
+@WithJenkinsConfiguredWithCode
+class ConfigurationAsCodeTest
{
- @Rule
- public JenkinsConfiguredWithCodeRule jenkins = new JenkinsConfiguredWithCodeRule();
-
@Test
@ConfiguredWithCode("configuration-as-code.yml")
- public void testSupportConfigurationAsCode()
+ void testSupportConfigurationAsCode(JenkinsConfiguredWithCodeRule jenkins)
{
JiraSitesConfiguration sitesConfiguration = (JiraSitesConfiguration) jenkins.getInstance()
.getDescriptorOrDie(JiraSitesConfiguration.class);
diff --git a/src/test/java/org/marvelution/jji/configuration/JiraSitesConfigurationTest.java b/src/test/java/org/marvelution/jji/configuration/JiraSitesConfigurationTest.java
index 2f06338..3a97f5d 100644
--- a/src/test/java/org/marvelution/jji/configuration/JiraSitesConfigurationTest.java
+++ b/src/test/java/org/marvelution/jji/configuration/JiraSitesConfigurationTest.java
@@ -5,6 +5,7 @@
import java.net.*;
import java.util.*;
+import org.jvnet.hudson.test.junit.jupiter.WithJenkins;
import org.marvelution.jji.synctoken.utils.*;
import com.cloudbees.plugins.credentials.*;
@@ -15,21 +16,20 @@
import jenkins.model.*;
import org.assertj.core.groups.*;
import org.jenkinsci.plugins.plaincredentials.*;
-import org.junit.*;
+import org.junit.jupiter.api.Test;
import org.jvnet.hudson.test.*;
import org.jvnet.hudson.test.recipes.*;
import static org.assertj.core.api.Assertions.*;
import static org.marvelution.jji.configuration.JiraSitesConfiguration.*;
-public class JiraSitesConfigurationTest
+@WithJenkins
+class JiraSitesConfigurationTest
{
- @Rule
- public JenkinsRule jenkins = new JenkinsRule();
@Test
@LocalData
- public void testMigrateSharedSecretAsCredentials()
+ void testMigrateSharedSecretAsCredentials(JenkinsRule jenkins)
throws IOException
{
URL resource = getClass().getResource(getClass().getSimpleName() + "/" + jenkins.getTestDescription()
@@ -41,7 +41,7 @@ public void testMigrateSharedSecretAsCredentials()
.map(site -> tuple(site.getName(), site.getSharedSecret()))
.toArray(Tuple[]::new);
- JiraSitesConfiguration config = getJiraSitesConfiguration();
+ JiraSitesConfiguration config = getJiraSitesConfiguration(jenkins);
assertThat(config.getSites()).hasSize(2)
.allSatisfy(site -> {
@@ -59,11 +59,11 @@ public void testMigrateSharedSecretAsCredentials()
}
@Test
- public void testRegisterSiteStoresSharedSecretAsCredential()
+ void testRegisterSiteStoresSharedSecretAsCredential(JenkinsRule jenkins)
{
String sharedSecret = SharedSecretGenerator.generate();
- JiraSitesConfiguration configuration = getJiraSitesConfiguration();
+ JiraSitesConfiguration configuration = getJiraSitesConfiguration(jenkins);
configuration.registerSite(new JiraSite(URI.create("http://jira.local/rest/jenkins/latest")).withName("Jira")
.withIdentifier("site-1")
@@ -84,9 +84,9 @@ public void testRegisterSiteStoresSharedSecretAsCredential()
}
@Test
- public void testUnRegisterSiteRemovedSharedSecretCredential()
+ void testUnRegisterSiteRemovedSharedSecretCredential(JenkinsRule jenkins)
{
- JiraSitesConfiguration configuration = getJiraSitesConfiguration();
+ JiraSitesConfiguration configuration = getJiraSitesConfiguration(jenkins);
String sharedSecret = SharedSecretGenerator.generate();
configuration.registerSite(new JiraSite(URI.create("http://jira.local/rest/jenkins/latest")).withName("Jira")
@@ -104,9 +104,9 @@ public void testUnRegisterSiteRemovedSharedSecretCredential()
String sharedSecretId = registeredSite.get()
.getSharedSecretId();
- List credentials = CredentialsProvider.lookupCredentials(StringCredentials.class,
+ List credentials = CredentialsProvider.lookupCredentialsInItemGroup(StringCredentials.class,
Jenkins.get(),
- ACL.SYSTEM,
+ ACL.SYSTEM2,
List.of(new SchemeRequirement(uri.getScheme()), new HostnameRequirement(uri.getHost())));
assertThat(CredentialsMatchers.firstOrNull(credentials, CredentialsMatchers.withId(sharedSecretId))).isNotNull()
.extracting(StringCredentials::getSecret)
@@ -116,19 +116,19 @@ public void testUnRegisterSiteRemovedSharedSecretCredential()
configuration.unregisterSite(registeredSite.get());
assertThat(configuration.findSite("site-1")).isEmpty();
- credentials = CredentialsProvider.lookupCredentials(StringCredentials.class,
+ credentials = CredentialsProvider.lookupCredentialsInItemGroup(StringCredentials.class,
Jenkins.get(),
- ACL.SYSTEM,
+ ACL.SYSTEM2,
List.of(new SchemeRequirement(uri.getScheme()), new HostnameRequirement(uri.getHost())));
assertThat(CredentialsMatchers.firstOrNull(credentials, CredentialsMatchers.withId(sharedSecretId))).isNull();
}
@Test
- public void testRegisterUpdatedSiteUpdatesSharedSecretCredential()
+ void testRegisterUpdatedSiteUpdatesSharedSecretCredential(JenkinsRule jenkins)
{
String sharedSecret = SharedSecretGenerator.generate();
- JiraSitesConfiguration configuration = getJiraSitesConfiguration();
+ JiraSitesConfiguration configuration = getJiraSitesConfiguration(jenkins);
configuration.registerSite(new JiraSite(URI.create("http://jira.local/rest/jenkins/latest")).withName("Jira")
.withIdentifier("site-1")
@@ -169,7 +169,7 @@ public void testRegisterUpdatedSiteUpdatesSharedSecretCredential()
}
@Nonnull
- private JiraSitesConfiguration getJiraSitesConfiguration()
+ private JiraSitesConfiguration getJiraSitesConfiguration(JenkinsRule jenkins)
{
return (JiraSitesConfiguration) jenkins.getInstance()
.getDescriptorOrDie(JiraSitesConfiguration.class);
diff --git a/src/test/java/org/marvelution/jji/listener/AbstractListenerTest.java b/src/test/java/org/marvelution/jji/listener/AbstractListenerTest.java
index faff107..09697d4 100644
--- a/src/test/java/org/marvelution/jji/listener/AbstractListenerTest.java
+++ b/src/test/java/org/marvelution/jji/listener/AbstractListenerTest.java
@@ -2,9 +2,9 @@
import java.net.URI;
import java.util.*;
-import java.util.stream.Collectors;
import javax.annotation.Nonnull;
+import org.jvnet.hudson.test.junit.jupiter.WithJenkins;
import org.marvelution.jji.JiraUtils;
import org.marvelution.jji.configuration.JiraSite;
import org.marvelution.jji.configuration.JiraSitesConfiguration;
@@ -22,10 +22,8 @@
import okhttp3.mockwebserver.RecordedRequest;
import org.assertj.core.api.InstanceOfAssertFactories;
import org.jenkinsci.plugins.plaincredentials.StringCredentials;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.rules.TestName;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
import org.jvnet.hudson.test.JenkinsRule;
import static java.util.Optional.empty;
@@ -33,21 +31,22 @@
import static org.assertj.core.api.Assertions.assertThat;
import static org.marvelution.jji.Headers.SYNC_TOKEN;
-public class AbstractListenerTest
+@WithJenkins
+class AbstractListenerTest
{
static final String REST_BASE_PATH = "/rest/jenkins/latest/integration/";
- @Rule
- public TestName testName = new TestName();
- @Rule
- public JenkinsRule jenkins = new JenkinsRule();
+
+ protected JenkinsRule jenkins;
protected MockWebServer jira;
protected MockWebServer jira2;
FreeStyleProject project;
- @Before
- public void setup()
+ @BeforeEach
+ void setup(JenkinsRule jenkins)
throws Exception
{
+ this.jenkins = jenkins;
+
jira = new MockWebServer();
jira.setDispatcher(new MemorizingQueueDispatcher());
jira.start();
@@ -60,8 +59,8 @@ public void setup()
registerJiraSite(jira2, of("Jira 2"), true);
}
- @After
- public void tearDown()
+ @AfterEach
+ void tearDown()
throws Exception
{
jira.shutdown();
@@ -197,7 +196,7 @@ public List findRequest(
{
return requests.stream()
.filter(request -> Objects.equals(method, request.getMethod()) && Objects.equals(path, request.getPath()))
- .collect(Collectors.toList());
+ .toList();
}
@Nonnull
diff --git a/src/test/java/org/marvelution/jji/listener/BuildListenerTest.java b/src/test/java/org/marvelution/jji/listener/BuildListenerTest.java
index 1b2d199..385a365 100644
--- a/src/test/java/org/marvelution/jji/listener/BuildListenerTest.java
+++ b/src/test/java/org/marvelution/jji/listener/BuildListenerTest.java
@@ -2,22 +2,24 @@
import java.util.concurrent.*;
+import org.jvnet.hudson.test.junit.jupiter.WithJenkins;
import org.marvelution.jji.*;
import org.marvelution.jji.model.parsers.*;
import hudson.model.*;
import okhttp3.mockwebserver.*;
-import org.junit.*;
+import org.junit.jupiter.api.Test;
import org.jvnet.hudson.test.*;
import static org.assertj.core.api.Assertions.*;
import static org.marvelution.jji.JiraUtils.*;
-public class BuildListenerTest
+@WithJenkins
+class BuildListenerTest
extends AbstractListenerTest
{
@Test
- public void testNotifyAndDelete()
+ void testNotifyAndDelete()
throws Exception
{
jira.enqueue(new MockResponse().setResponseCode(500));
@@ -42,7 +44,7 @@ public void testNotifyAndDelete()
}
@Test
- public void testNotify_WithParents()
+ void testNotify_WithParents()
throws Exception
{
jira.enqueue(new MockResponse().setResponseCode(202));
@@ -81,7 +83,7 @@ public void testNotify_WithParents()
}
@Test
- public void testNotify_WithData()
+ void testNotify_WithData()
throws Exception
{
jira.enqueue(new MockResponse().setResponseCode(202));
diff --git a/src/test/java/org/marvelution/jji/listener/JobDSLListenerTest.java b/src/test/java/org/marvelution/jji/listener/JobDSLListenerTest.java
index d65fd56..13975aa 100644
--- a/src/test/java/org/marvelution/jji/listener/JobDSLListenerTest.java
+++ b/src/test/java/org/marvelution/jji/listener/JobDSLListenerTest.java
@@ -5,26 +5,29 @@
import hudson.model.*;
import javaposse.jobdsl.plugin.*;
import okhttp3.mockwebserver.*;
-import org.junit.*;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestInfo;
+import org.jvnet.hudson.test.junit.jupiter.WithJenkins;
-public class JobDSLListenerTest
+@WithJenkins
+class JobDSLListenerTest
extends AbstractListenerTest
{
@Test
- public void testCreate()
+ void testCreate(TestInfo info)
throws Exception
{
fixedResponse(jira, new MockResponse().setResponseCode(202));
fixedResponse(jira2, new MockResponse().setResponseCode(202));
- configureJobDsl();
+ configureJobDsl(info);
FreeStyleBuild build = project.scheduleBuild2(0)
.get(10, TimeUnit.SECONDS);
jenkins.assertBuildStatusSuccess(build);
- TopLevelItem item = jenkins.jenkins.getItem(testName.getMethodName());
+ TopLevelItem item = jenkins.jenkins.getItem(info.getTestMethod().orElseThrow().getName());
verifyNotificationSend(jira, item, "POST");
verifyNotificationSend(jira2, item, "POST");
@@ -33,22 +36,22 @@ public void testCreate()
}
@Test
- public void testModify()
+ void testModify(TestInfo info)
throws Exception
{
fixedResponse(jira, new MockResponse().setResponseCode(202));
fixedResponse(jira2, new MockResponse().setResponseCode(202));
- jenkins.createFreeStyleProject(testName.getMethodName());
+ jenkins.createFreeStyleProject(info.getTestMethod().orElseThrow().getName());
- configureJobDsl();
+ configureJobDsl(info);
FreeStyleBuild build = project.scheduleBuild2(0)
.get(10, TimeUnit.SECONDS);
jenkins.assertBuildStatusSuccess(build);
- TopLevelItem item = jenkins.jenkins.getItem(testName.getMethodName());
+ TopLevelItem item = jenkins.jenkins.getItem(info.getTestMethod().orElseThrow().getName());
verifyNotificationSend(jira, item, "POST");
verifyNotificationSend(jira2, item, "POST");
@@ -56,11 +59,11 @@ public void testModify()
verifyNotificationSend(jira2, build, "POST");
}
- public void configureJobDsl()
+ public void configureJobDsl(TestInfo info)
{
ExecuteDslScripts executeDslScripts = new ExecuteDslScripts();
executeDslScripts.setUseScriptText(true);
- executeDslScripts.setScriptText("job('" + testName.getMethodName() + "') {\n steps {\n shell('echo Hello World!')\n }\n}");
+ executeDslScripts.setScriptText("job('" + info.getTestMethod().orElseThrow().getName() + "') {\n steps {\n shell('echo Hello World!')\n }\n}");
project.getBuildersList()
.add(executeDslScripts);
}
diff --git a/src/test/java/org/marvelution/jji/listener/JobListenerTest.java b/src/test/java/org/marvelution/jji/listener/JobListenerTest.java
index c869a3f..f2388ae 100644
--- a/src/test/java/org/marvelution/jji/listener/JobListenerTest.java
+++ b/src/test/java/org/marvelution/jji/listener/JobListenerTest.java
@@ -5,15 +5,17 @@
import hudson.model.*;
import net.sf.json.*;
import okhttp3.mockwebserver.*;
-import org.junit.*;
+import org.junit.jupiter.api.Test;
+import org.jvnet.hudson.test.junit.jupiter.WithJenkins;
import static org.assertj.core.api.Assertions.*;
-public class JobListenerTest
+@WithJenkins
+class JobListenerTest
extends AbstractListenerTest
{
@Test
- public void testCreate()
+ void testCreate()
throws IOException
{
fixedResponse(jira, new MockResponse().setResponseCode(202));
@@ -37,7 +39,7 @@ private void verifyCreateNotification(
}
@Test
- public void testModify()
+ void testModify()
throws IOException
{
fixedResponse(jira, new MockResponse().setResponseCode(202));
@@ -60,7 +62,7 @@ private void verifyModifiedNotification(MockWebServer jira)
}
@Test
- public void testDelete()
+ void testDelete()
throws Exception
{
jira.enqueue(new MockResponse().setResponseCode(204));
diff --git a/src/test/java/org/marvelution/jji/listener/RunSaveListenerTest.java b/src/test/java/org/marvelution/jji/listener/RunSaveListenerTest.java
index 0b6f66c..5a47509 100644
--- a/src/test/java/org/marvelution/jji/listener/RunSaveListenerTest.java
+++ b/src/test/java/org/marvelution/jji/listener/RunSaveListenerTest.java
@@ -4,15 +4,17 @@
import hudson.model.*;
import okhttp3.mockwebserver.*;
-import org.junit.*;
+import org.junit.jupiter.api.Test;
+import org.jvnet.hudson.test.junit.jupiter.WithJenkins;
import static org.assertj.core.api.Assertions.*;
-public class RunSaveListenerTest
+@WithJenkins
+class RunSaveListenerTest
extends AbstractListenerTest
{
@Test
- public void testOnChange()
+ void testOnChange()
throws Exception
{
diff --git a/src/test/java/org/marvelution/jji/management/JiraSiteManagementTest.java b/src/test/java/org/marvelution/jji/management/JiraSiteManagementTest.java
index 5f8dff2..f70003f 100644
--- a/src/test/java/org/marvelution/jji/management/JiraSiteManagementTest.java
+++ b/src/test/java/org/marvelution/jji/management/JiraSiteManagementTest.java
@@ -12,19 +12,19 @@
import net.sf.json.JSONObject;
import okhttp3.*;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
import static jenkins.model.Jenkins.ADMINISTER;
import static org.assertj.core.api.Assertions.assertThat;
-public class JiraSiteManagementTest
+class JiraSiteManagementTest
extends AbstractTechnicalTest
{
private JiraSite jiraSite;
- @Before
- public void setUp()
+ @BeforeEach
+ void setUp()
{
jiraSite = new JiraSite(URI.create("http://localhost:2990/jira/rest/jenkins/latest")).withName("Local Jira")
.withIdentifier("identifier")
@@ -33,7 +33,7 @@ public void setUp()
}
@Test
- public void testRegisterJiraSite()
+ void testRegisterJiraSite()
throws Exception
{
authorizationStrategy.grant(ADMINISTER)
@@ -51,7 +51,7 @@ public void testRegisterJiraSite()
}
@Test
- public void testRegisterJiraSite_NoAdmin()
+ void testRegisterJiraSite_NoAdmin()
throws Exception
{
try (Response response = registerJiraSite(jiraSite, Credentials.basic(ALICE, ALICE)))
@@ -62,7 +62,7 @@ public void testRegisterJiraSite_NoAdmin()
}
@Test
- public void testRegisterJiraSite_NoBasicAuth()
+ void testRegisterJiraSite_NoBasicAuth()
throws Exception
{
try (Response response = registerJiraSite(jiraSite, (String) null))
@@ -73,7 +73,7 @@ public void testRegisterJiraSite_NoBasicAuth()
}
@Test
- public void testRegisterJiraSite_Update()
+ void testRegisterJiraSite_Update()
throws Exception
{
injectSite(jiraSite);
@@ -87,7 +87,7 @@ public void testRegisterJiraSite_Update()
}
@Test
- public void testRegisterJiraSite_AccessDenied()
+ void testRegisterJiraSite_AccessDenied()
throws Exception
{
try (Response response = registerJiraSite(jiraSite, request -> request.addHeader("Authorization", Credentials.basic(ALICE, ALICE))))
@@ -98,7 +98,7 @@ public void testRegisterJiraSite_AccessDenied()
}
@Test
- public void testUnregisterJiraSite()
+ void testUnregisterJiraSite()
throws Exception
{
injectSite(jiraSite);
@@ -111,7 +111,7 @@ public void testUnregisterJiraSite()
}
@Test
- public void testUnregisterJiraSite_UnknownJiraSite()
+ void testUnregisterJiraSite_UnknownJiraSite()
throws Exception
{
JiraSite site = new JiraSite(URI.create("http://localhost:8080/jira/rest/jenkins/latest")).withName("Local Jira")
@@ -128,7 +128,7 @@ public void testUnregisterJiraSite_UnknownJiraSite()
}
@Test
- public void testUnregisterJiraSite_AccessDenied()
+ void testUnregisterJiraSite_AccessDenied()
throws Exception
{
JiraSite site = new JiraSite(URI.create("http://localhost:8080/jira/rest/jenkins/latest")).withName("Local Jira")
diff --git a/src/test/java/org/marvelution/jji/security/SyncTokenAuthenticationFilterTest.java b/src/test/java/org/marvelution/jji/security/SyncTokenAuthenticationFilterTest.java
index ad67141..1f9d14c 100644
--- a/src/test/java/org/marvelution/jji/security/SyncTokenAuthenticationFilterTest.java
+++ b/src/test/java/org/marvelution/jji/security/SyncTokenAuthenticationFilterTest.java
@@ -2,26 +2,27 @@
import java.net.*;
+import org.jvnet.hudson.test.junit.jupiter.WithJenkins;
import org.marvelution.jji.*;
import org.marvelution.jji.configuration.*;
import org.marvelution.jji.synctoken.utils.*;
import hudson.model.*;
import okhttp3.*;
-import org.junit.*;
-import org.jvnet.hudson.test.*;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
import static jenkins.model.Jenkins.*;
import static org.assertj.core.api.Assertions.*;
-public class SyncTokenAuthenticationFilterTest
+@WithJenkins
+class SyncTokenAuthenticationFilterTest
extends AbstractTechnicalTest
{
- private JiraSitesConfiguration sitesConfiguration;
private JiraSite site;
- @Before
- public void setUp()
+ @BeforeEach
+ void setUp()
{
site = new JiraSite(URI.create("https://jira.example.com")).withIdentifier("jira")
.withName("Jira")
@@ -30,7 +31,7 @@ public void setUp()
}
@Test
- public void testAccessViaSyncToken()
+ void testAccessViaSyncToken()
throws Exception
{
authorizationStrategy.grant(ADMINISTER)
@@ -56,7 +57,7 @@ public void testAccessViaSyncToken()
}
@Test
- public void testNoSyncTokenAccessToAPI()
+ void testNoSyncTokenAccessToAPI()
throws Exception
{
authorizationStrategy.grant(ADMINISTER)