< prev index next >

test/jdk/java/lang/ScopedValue/ScopedValueAPI.java

Print this page
@@ -1,7 +1,7 @@
  /*
-  * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved.
+  * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved.
   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   *
   * This code is free software; you can redistribute it and/or modify it
   * under the terms of the GNU General Public License version 2 only, as
   * published by the Free Software Foundation.

@@ -26,12 +26,12 @@
   * @summary Test ScopedValue API
   * @enablePreview
   * @run junit ScopedValueAPI
   */
  
+ import java.lang.ScopedValue.CallableOp;
  import java.util.NoSuchElementException;
- import java.util.concurrent.Callable;
  import java.util.concurrent.ExecutionException;
  import java.util.concurrent.Executors;
  import java.util.concurrent.ThreadFactory;
  import java.util.function.Supplier;
  import java.util.stream.Stream;

@@ -46,94 +46,66 @@
      private static Stream<ThreadFactory> factories() {
          return Stream.of(Thread.ofPlatform().factory(), Thread.ofVirtual().factory());
      }
  
      /**
-      * Test that the run method is invoked.
+      * Test that runWhere invokes the Runnable's run method.
       */
      @ParameterizedTest
      @MethodSource("factories")
-     void testRun(ThreadFactory factory) throws Exception {
+     void testRunWhere(ThreadFactory factory) throws Exception {
          test(factory, () -> {
              class Box { static boolean executed; }
              ScopedValue<String> name = ScopedValue.newInstance();
              ScopedValue.runWhere(name, "duke", () -> { Box.executed = true; });
              assertTrue(Box.executed);
          });
      }
  
      /**
-      * Test the run method throwing an exception.
+      * Test runWhere when the run method throws an exception.
       */
      @ParameterizedTest
      @MethodSource("factories")
-     void testRunThrows(ThreadFactory factory) throws Exception {
+     void testRunWhereThrows(ThreadFactory factory) throws Exception {
          test(factory, () -> {
              class FooException extends RuntimeException {  }
              ScopedValue<String> name = ScopedValue.newInstance();
              Runnable op = () -> { throw new FooException(); };
              assertThrows(FooException.class, () -> ScopedValue.runWhere(name, "duke", op));
              assertFalse(name.isBound());
          });
      }
  
      /**
-      * Test that the call method is invoked.
+      * Test that callWhere invokes the CallableOp's call method.
       */
      @ParameterizedTest
      @MethodSource("factories")
-     void testCall(ThreadFactory factory) throws Exception {
+     void testCallWhere(ThreadFactory factory) throws Exception {
          test(factory, () -> {
              ScopedValue<String> name = ScopedValue.newInstance();
              String result = ScopedValue.callWhere(name, "duke", name::get);
              assertEquals("duke", result);
          });
      }
  
      /**
-      * Test that the get method is invoked.
+      * Test callWhere when the call method throws an exception.
       */
      @ParameterizedTest
      @MethodSource("factories")
-     void testGetWhere(ThreadFactory factory) throws Exception {
-         test(factory, () -> {
-             ScopedValue<String> name = ScopedValue.newInstance();
-             String result = ScopedValue.getWhere(name, "duke", (Supplier<String>)(name::get));
-             assertEquals("duke", result);
-         });
-     }
- 
-     /**
-      * Test the call method throwing an exception.
-      */
-     @ParameterizedTest
-     @MethodSource("factories")
-     void testCallThrows(ThreadFactory factory) throws Exception {
+     void testCallWhereThrows(ThreadFactory factory) throws Exception {
          test(factory, () -> {
              class FooException extends RuntimeException {  }
              ScopedValue<String> name = ScopedValue.newInstance();
-             Callable<Void> op = () -> { throw new FooException(); };
+             CallableOp<Void, RuntimeException> op = () -> { throw new FooException(); };
              assertThrows(FooException.class, () -> ScopedValue.callWhere(name, "duke", op));
              assertFalse(name.isBound());
          });
      }
  
-     /**
-      * Test the get(Supplier) method throwing an exception.
-      */
-     @ParameterizedTest
-     @MethodSource("factories")
-     void testGetThrows(ThreadFactory factory) throws Exception {
-         test(factory, () -> {
-             class FooException extends RuntimeException {  }
-             ScopedValue<String> name = ScopedValue.newInstance();
-             Supplier<Void> op = () -> { throw new FooException(); };
-             assertThrows(FooException.class, () -> ScopedValue.getWhere(name, "duke", op));
-             assertFalse(name.isBound());
-         });
-     }
- 
      /**
       * Test get method.
       */
      @ParameterizedTest
      @MethodSource("factories")

@@ -142,36 +114,27 @@
              ScopedValue<String> name1 = ScopedValue.newInstance();
              ScopedValue<String> name2 = ScopedValue.newInstance();
              assertThrows(NoSuchElementException.class, name1::get);
              assertThrows(NoSuchElementException.class, name2::get);
  
-             // run
+             // runWhere
              ScopedValue.runWhere(name1, "duke", () -> {
                  assertEquals("duke", name1.get());
                  assertThrows(NoSuchElementException.class, name2::get);
  
              });
              assertThrows(NoSuchElementException.class, name1::get);
              assertThrows(NoSuchElementException.class, name2::get);
  
-             // call
+             // callWhere
              ScopedValue.callWhere(name1, "duke", () -> {
                  assertEquals("duke", name1.get());
                  assertThrows(NoSuchElementException.class, name2::get);
                  return null;
              });
              assertThrows(NoSuchElementException.class, name1::get);
              assertThrows(NoSuchElementException.class, name2::get);
- 
-             // get
-             ScopedValue.getWhere(name1, "duke", () -> {
-                 assertEquals("duke", name1.get());
-                 assertThrows(NoSuchElementException.class, name2::get);
-                 return null;
-             });
-             assertThrows(NoSuchElementException.class, name1::get);
-             assertThrows(NoSuchElementException.class, name2::get);
          });
      }
  
      /**
       * Test isBound method.

@@ -183,28 +146,19 @@
              ScopedValue<String> name1 = ScopedValue.newInstance();
              ScopedValue<String> name2 = ScopedValue.newInstance();
              assertFalse(name1.isBound());
              assertFalse(name2.isBound());
  
-             // run
+             // runWhere
              ScopedValue.runWhere(name1, "duke", () -> {
                  assertTrue(name1.isBound());
                  assertFalse(name2.isBound());
              });
              assertFalse(name1.isBound());
              assertFalse(name2.isBound());
  
-             // call
-             ScopedValue.callWhere(name1, "duke", () -> {
-                 assertTrue(name1.isBound());
-                 assertFalse(name2.isBound());
-                 return null;
-             });
-             assertFalse(name1.isBound());
-             assertFalse(name2.isBound());
- 
-             // call
+             // callWhere
              ScopedValue.callWhere(name1, "duke", () -> {
                  assertTrue(name1.isBound());
                  assertFalse(name2.isBound());
                  return null;
              });

@@ -222,17 +176,17 @@
          test(factory, () -> {
              ScopedValue<String> name = ScopedValue.newInstance();
              assertNull(name.orElse(null));
              assertEquals("default", name.orElse("default"));
  
-             // run
+             // runWhere
              ScopedValue.runWhere(name, "duke", () -> {
                  assertEquals("duke", name.orElse(null));
                  assertEquals("duke", name.orElse("default"));
              });
  
-             // call
+             // callWhere
              ScopedValue.callWhere(name, "duke", () -> {
                  assertEquals("duke", name.orElse(null));
                  assertEquals("duke", name.orElse("default"));
                  return null;
              });

@@ -248,16 +202,16 @@
          test(factory, () -> {
              class FooException extends RuntimeException { }
              ScopedValue<String> name = ScopedValue.newInstance();
              assertThrows(FooException.class, () -> name.orElseThrow(FooException::new));
  
-             // run
+             // runWhere
              ScopedValue.runWhere(name, "duke", () -> {
                  assertEquals("duke", name.orElseThrow(FooException::new));
              });
  
-             // call
+             // callWhere
              ScopedValue.callWhere(name, "duke", () -> {
                  assertEquals("duke", name.orElseThrow(FooException::new));
                  return null;
              });
          });

@@ -271,42 +225,31 @@
      void testTwoBindings(ThreadFactory factory) throws Exception {
          test(factory, () -> {
              ScopedValue<String> name = ScopedValue.newInstance();
              ScopedValue<Integer> age = ScopedValue.newInstance();
  
-             // run
-             ScopedValue.where(name, "duke").where(age, 100).run(() -> {
+             // runWhere
+             var carrier = ScopedValue.where(name, "duke").where(age, 100);
+             ScopedValue.runWhere(carrier, () -> {
                  assertTrue(name.isBound());
                  assertTrue(age.isBound());
                  assertEquals("duke", name.get());
                  assertEquals(100, (int) age.get());
              });
              assertFalse(name.isBound());
              assertFalse(age.isBound());
  
-             // call
-             ScopedValue.where(name, "duke").where(age, 100).call(() -> {
-                 assertTrue(name.isBound());
-                 assertTrue(age.isBound());
-                 assertEquals("duke", name.get());
-                 assertEquals(100, (int) age.get());
-                 return null;
-             });
-             assertFalse(name.isBound());
-             assertFalse(age.isBound());
- 
-             // get
-             ScopedValue.where(name, "duke").where(age, 100).get(() -> {
+             // callWhere
+             ScopedValue.callWhere(carrier, () -> {
                  assertTrue(name.isBound());
                  assertTrue(age.isBound());
                  assertEquals("duke", name.get());
                  assertEquals(100, (int) age.get());
                  return null;
              });
              assertFalse(name.isBound());
              assertFalse(age.isBound());
- 
          });
      }
  
      /**
       * Test rebinding.

@@ -315,11 +258,11 @@
      @MethodSource("factories")
      void testRebinding(ThreadFactory factory) throws Exception {
          test(factory, () -> {
              ScopedValue<String> name = ScopedValue.newInstance();
  
-             // run
+             // runWhere
              ScopedValue.runWhere(name, "duke", () -> {
                  assertTrue(name.isBound());
                  assertEquals("duke", name.get());
  
                  ScopedValue.runWhere(name, "duchess", () -> {

@@ -330,11 +273,11 @@
                  assertTrue(name.isBound());
                  assertEquals("duke", name.get());
              });
              assertFalse(name.isBound());
  
-             // call
+             // callWhere
              ScopedValue.callWhere(name, "duke", () -> {
                  assertTrue(name.isBound());
                  assertEquals("duke", name.get());
  
                  ScopedValue.callWhere(name, "duchess", () -> {

@@ -346,27 +289,10 @@
                  assertTrue(name.isBound());
                  assertEquals("duke", name.get());
                  return null;
              });
              assertFalse(name.isBound());
- 
-             // get
-             ScopedValue.getWhere(name, "duke", () -> {
-                 assertTrue(name.isBound());
-                 assertEquals("duke", name.get());
- 
-                 ScopedValue.where(name, "duchess").get(() -> {
-                     assertTrue(name.isBound());
-                     assertEquals("duchess", name.get());
-                     return null;
-                 });
- 
-                 assertTrue(name.isBound());
-                 assertEquals("duke", name.get());
-                 return null;
-             });
-             assertFalse(name.isBound());
          });
      }
  
      /**
       * Test rebinding from null vaue to another value.

@@ -375,11 +301,11 @@
      @MethodSource("factories")
      void testRebindingFromNull(ThreadFactory factory) throws Exception {
          test(factory, () -> {
              ScopedValue<String> name = ScopedValue.newInstance();
  
-             // run
+             // runWhere
              ScopedValue.runWhere(name, null, () -> {
                  assertTrue(name.isBound());
                  assertNull(name.get());
  
                  ScopedValue.runWhere(name, "duchess", () -> {

@@ -390,11 +316,11 @@
                  assertTrue(name.isBound());
                  assertNull(name.get());
              });
              assertFalse(name.isBound());
  
-             // call
+             // callWhere
              ScopedValue.callWhere(name, null, () -> {
                  assertTrue(name.isBound());
                  assertNull(name.get());
  
                  ScopedValue.callWhere(name, "duchess", () -> {

@@ -406,27 +332,10 @@
                  assertTrue(name.isBound());
                  assertNull(name.get());
                  return null;
              });
              assertFalse(name.isBound());
- 
-             // getWhere
-             ScopedValue.getWhere(name, null, () -> {
-                 assertTrue(name.isBound());
-                 assertNull(name.get());
- 
-                 ScopedValue.getWhere(name, "duchess", () -> {
-                     assertTrue(name.isBound());
-                     assertTrue("duchess".equals(name.get()));
-                     return null;
-                 });
- 
-                 assertTrue(name.isBound());
-                 assertNull(name.get());
-                 return null;
-             });
-             assertFalse(name.isBound());
          });
      }
  
      /**
       * Test rebinding to null value.

@@ -435,11 +344,11 @@
      @MethodSource("factories")
      void testRebindingToNull(ThreadFactory factory) throws Exception {
          test(factory, () -> {
              ScopedValue<String> name = ScopedValue.newInstance();
  
-             // run
+             // runWhere
              ScopedValue.runWhere(name, "duke", () -> {
                  assertTrue(name.isBound());
                  assertEquals("duke", name.get());
  
                  ScopedValue.runWhere(name, null, () -> {

@@ -450,11 +359,11 @@
                  assertTrue(name.isBound());
                  assertEquals("duke", name.get());
              });
              assertFalse(name.isBound());
  
-             // call
+             // callWhere
              ScopedValue.callWhere(name, "duke", () -> {
                  assertTrue(name.isBound());
                  assertEquals("duke", name.get());
  
                  ScopedValue.callWhere(name, null, () -> {

@@ -466,27 +375,10 @@
                  assertTrue(name.isBound());
                  assertEquals("duke", name.get());
                  return null;
              });
              assertFalse(name.isBound());
- 
-             // get
-             ScopedValue.where(name, "duke").get(() -> {
-                 assertTrue(name.isBound());
-                 assertEquals("duke", name.get());
- 
-                 ScopedValue.where(name, null).get(() -> {
-                     assertTrue(name.isBound());
-                     assertNull(name.get());
-                     return null;
-                 });
- 
-                 assertTrue(name.isBound());
-                 assertEquals("duke", name.get());
-                 return null;
-             });
-             assertFalse(name.isBound());
          });
      }
  
      /**
       * Test Carrier.get.

@@ -515,22 +407,23 @@
       */
      @Test
      void testNullPointerException() {
          ScopedValue<String> name = ScopedValue.newInstance();
  
-         assertThrows(NullPointerException.class, () -> ScopedValue.where(null, "value"));
-         assertThrows(NullPointerException.class, () -> ScopedValue.runWhere(null, "value", () -> { }));
-         assertThrows(NullPointerException.class, () -> ScopedValue.getWhere(null, "value", () -> null));
+         assertThrows(NullPointerException.class, () -> ScopedValue.where(null, "duke"));
+ 
+         assertThrows(NullPointerException.class, () -> ScopedValue.runWhere(null, "duke", () -> { }));
+         assertThrows(NullPointerException.class, () -> ScopedValue.runWhere(name, "duke", null));
+ 
+         assertThrows(NullPointerException.class, () -> ScopedValue.callWhere(null, "duke", () -> ""));
+         assertThrows(NullPointerException.class, () -> ScopedValue.callWhere(name, "duke", null));
  
          assertThrows(NullPointerException.class, () -> name.orElseThrow(null));
  
          var carrier = ScopedValue.where(name, "duke");
-         assertThrows(NullPointerException.class, () -> carrier.where(null, "value"));
+         assertThrows(NullPointerException.class, () -> carrier.where(null, "duke"));
          assertThrows(NullPointerException.class, () -> carrier.get((ScopedValue<?>)null));
-         assertThrows(NullPointerException.class, () -> carrier.get((Supplier<?>)null));
-         assertThrows(NullPointerException.class, () -> carrier.run(null));
-         assertThrows(NullPointerException.class, () -> carrier.call(null));
      }
  
      @FunctionalInterface
      private interface ThrowingRunnable {
          void run() throws Exception;
< prev index next >