1 // Copyright 2023 The Chromium Authors 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 package org.chromium.base.supplier; 6 7 import static org.junit.Assert.assertEquals; 8 import static org.junit.Assert.assertFalse; 9 import static org.junit.Assert.assertTrue; 10 import static org.mockito.Mockito.times; 11 import static org.mockito.Mockito.verify; 12 13 import org.junit.Before; 14 import org.junit.Test; 15 import org.junit.runner.RunWith; 16 import org.mockito.MockitoAnnotations; 17 import org.mockito.Spy; 18 import org.robolectric.annotation.Config; 19 import org.robolectric.annotation.LooperMode; 20 import org.robolectric.shadows.ShadowProcess; 21 22 import org.chromium.base.Callback; 23 import org.chromium.base.test.BaseRobolectricTestRunner; 24 25 /** Unit tests for {@link LazyOneshotSupplierImpl}. */ 26 @RunWith(BaseRobolectricTestRunner.class) 27 @Config(shadows = {ShadowProcess.class}) 28 @LooperMode(LooperMode.Mode.LEGACY) 29 public class LazyOneshotSupplierImplTest { 30 @Spy 31 private LazyOneshotSupplierImpl<String> mSupplier = 32 new LazyOneshotSupplierImpl<>() { 33 @Override 34 public void doSet() { 35 set("answer"); 36 } 37 }; 38 39 @Spy private Callback<String> mCallback1; 40 @Spy private Callback<String> mCallback2; 41 42 @Before setup()43 public void setup() { 44 MockitoAnnotations.initMocks(this); 45 } 46 47 @Test testSetBeforeDoSet()48 public void testSetBeforeDoSet() { 49 assertFalse(mSupplier.hasValue()); 50 mSupplier.set("answer"); 51 52 mSupplier.onAvailable(mCallback1); 53 mSupplier.onAvailable(mCallback2); 54 55 assertTrue(mSupplier.hasValue()); 56 verify(mCallback1).onResult("answer"); 57 verify(mCallback2).onResult("answer"); 58 verify(mSupplier, times(0)).doSet(); 59 } 60 61 @Test testDoSetCalledOnce()62 public void testDoSetCalledOnce() { 63 mSupplier.onAvailable(mCallback1); 64 verify(mSupplier, times(0)).doSet(); 65 66 assertEquals("answer", mSupplier.get()); 67 assertEquals("answer", mSupplier.get()); 68 69 verify(mCallback1).onResult("answer"); 70 verify(mSupplier).doSet(); 71 } 72 } 73