Path: blob/master/test/jdk/java/util/ServiceLoader/CachingTest.java
41149 views
/*1* Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*/2223/**24* @test25* @summary Test ServiceLoader caches26* @run testng CachingTest27*/2829import java.nio.file.Files;30import java.nio.file.Path;31import java.nio.file.Paths;32import java.util.ArrayList;33import java.util.Iterator;34import java.util.List;35import java.util.ServiceLoader;36import java.util.ServiceLoader.Provider;37import java.util.Spliterator;38import java.util.stream.Collectors;3940import org.testng.annotations.BeforeClass;41import org.testng.annotations.Test;42import static org.testng.Assert.*;4344public class CachingTest {4546// service type47public static interface S { }4849// service provider implementations50public static class S1 implements S { }5152public static class S2 implements S { }5354private ClassLoader testClassLoader;5556// creates the services configuration file and sets the ClassLoader57@BeforeClass58void setup() throws Exception {59String classes = System.getProperty("test.classes");60Path dir = Paths.get(classes, "META-INF", "services");61Files.createDirectories(dir);62Path config = dir.resolve(S.class.getName());63Files.write(config, List.of(S1.class.getName(), S2.class.getName()));64this.testClassLoader = CachingTest.class.getClassLoader();65}6667private void checkLists(List<?> list1, List<?> list2) {68assertTrue(list1.size() == 2);69assertTrue(list2.size() == 2);70Iterator<?> iterator1 = list1.iterator();71Iterator<?> iterator2 = list2.iterator();72while (iterator1.hasNext()) {73assertTrue(iterator1.next() == iterator2.next());74}75}7677@Test78public void testIterator1() {79ServiceLoader<S> sl = ServiceLoader.load(S.class, testClassLoader);8081List<S> list1 = new ArrayList<>();82List<S> list2 = new ArrayList<>();8384// 1-1-2-285sl.forEach(list1::add);86sl.forEach(list2::add);8788checkLists(list1, list2);89}9091// interleaved92@Test93public void testIterator2() {94ServiceLoader<S> sl = ServiceLoader.load(S.class, testClassLoader);9596List<S> list1 = new ArrayList<>();97List<S> list2 = new ArrayList<>();9899Iterator<S> iterator1 = sl.iterator();100Iterator<S> iterator2 = sl.iterator();101102// 1-2-1-2103list1.add(iterator1.next());104list2.add(iterator2.next());105list1.add(iterator1.next());106list2.add(iterator2.next());107108checkLists(list1, list2);109}110111// interleaved112@Test113public void testIterator3() {114ServiceLoader<S> sl = ServiceLoader.load(S.class, testClassLoader);115116List<S> list1 = new ArrayList<>();117List<S> list2 = new ArrayList<>();118119Iterator<S> iterator1 = sl.iterator();120Iterator<S> iterator2 = sl.iterator();121122// 1-2-2-1123list1.add(iterator1.next());124list2.add(iterator2.next());125list2.add(iterator2.next());126list1.add(iterator1.next());127128checkLists(list1, list2);129}130131@Test132public void testStream1() {133ServiceLoader<S> sl = ServiceLoader.load(S.class, testClassLoader);134135// 1-1-2-2136List<Provider<S>> list1 = sl.stream().collect(Collectors.toList());137List<Provider<S>> list2 = sl.stream().collect(Collectors.toList());138checkLists(list1, list2);139}140141// interleaved142@Test143public void testStream2() {144ServiceLoader<S> sl = ServiceLoader.load(S.class, testClassLoader);145146List<Provider<S>> list1 = new ArrayList<>();147List<Provider<S>> list2 = new ArrayList<>();148149Spliterator<Provider<S>> spliterator1 = sl.stream().spliterator();150Spliterator<Provider<S>> spliterator2 = sl.stream().spliterator();151152// 1-2-1-2153spliterator1.tryAdvance(list1::add);154spliterator2.tryAdvance(list2::add);155spliterator1.tryAdvance(list1::add);156spliterator2.tryAdvance(list2::add);157158assertFalse(spliterator1.tryAdvance(e -> assertTrue(false)));159assertFalse(spliterator2.tryAdvance(e -> assertTrue(false)));160161checkLists(list1, list2);162}163164// interleaved165@Test166public void testStream3() {167ServiceLoader<S> sl = ServiceLoader.load(S.class, testClassLoader);168169List<Provider<S>> list1 = new ArrayList<>();170List<Provider<S>> list2 = new ArrayList<>();171172Spliterator<Provider<S>> spliterator1 = sl.stream().spliterator();173Spliterator<Provider<S>> spliterator2 = sl.stream().spliterator();174175// 1-2-2-1176spliterator1.tryAdvance(list1::add);177spliterator2.tryAdvance(list2::add);178spliterator2.tryAdvance(list2::add);179spliterator1.tryAdvance(list1::add);180181assertFalse(spliterator1.tryAdvance(e -> assertTrue(false)));182assertFalse(spliterator2.tryAdvance(e -> assertTrue(false)));183184checkLists(list1, list2);185}186}187188189