2121import static com .google .appengine .api .datastore .FetchOptions .Builder .withDefaults ;
2222import static com .google .appengine .api .datastore .FetchOptions .Builder .withLimit ;
2323import static com .google .common .truth .Truth .assertThat ;
24- import static org .mockito .ArgumentMatchers .eq ;
25- import static org .mockito .Mockito .anyString ;
26- import static org .mockito .Mockito .reset ;
27- import static org .mockito .Mockito .times ;
28- import static org .mockito .Mockito .verify ;
29- import static org .mockito .Mockito .verifyNoMoreInteractions ;
3024
3125import com .google .appengine .tools .development .testing .LocalDatastoreServiceTestConfig ;
3226import com .google .appengine .tools .development .testing .LocalServiceTestHelper ;
3327import java .util .ArrayList ;
3428import java .util .List ;
3529import java .util .function .Consumer ;
30+ import java .util .logging .Handler ;
3631import java .util .logging .Level ;
37- import java .util .logging .Logger ;
32+ import java .util .logging .LogRecord ;
3833import org .junit .After ;
3934import org .junit .Before ;
40- import org .junit .Rule ;
4135import org .junit .Test ;
4236import org .junit .runner .RunWith ;
4337import org .junit .runners .JUnit4 ;
44- import org .mockito .Mock ;
45- import org .mockito .junit .MockitoJUnit ;
46- import org .mockito .junit .MockitoRule ;
4738
4839@ RunWith (JUnit4 .class )
4940public class QueryResultsSourceImplTest {
50- @ Rule public MockitoRule mockitoRule = MockitoJUnit .rule ();
51-
5241 private final LocalServiceTestHelper helper =
5342 new LocalServiceTestHelper (new LocalDatastoreServiceTestConfig ());
5443
55- @ Mock Logger mockLogger ;
44+ private final AssertingHandler assertingHandler = new AssertingHandler () ;
5645
5746 @ Before
5847 public void setUp () throws Exception {
5948 helper .setUp ();
6049 lastChunkSizeWarning .set (0 );
50+ BaseQueryResultsSource .logger .addHandler (assertingHandler );
6151 }
6252
6353 @ After
6454 public void tearDown () {
55+ BaseQueryResultsSource .logger .removeHandler (assertingHandler );
6556 lastChunkSizeWarning .set (0 );
6657 helper .tearDown ();
6758 }
6859
60+ private static class AssertingHandler extends Handler {
61+ private final List <LogRecord > records = new ArrayList <>();
62+
63+ @ Override
64+ public void publish (LogRecord record ) {
65+ records .add (record );
66+ }
67+
68+ @ Override
69+ public void flush () {}
70+
71+ @ Override
72+ public void close () {}
73+ }
74+
6975 private void addData (int count ) {
7076 DatastoreService datastore = DatastoreServiceFactory .getDatastoreService ();
7177 List <Entity > toPut = new ArrayList <>();
@@ -88,40 +94,35 @@ private static Iterable<Entity> asList(PreparedQuery query, FetchOptions opts) {
8894 }
8995
9096 private void doQueries (ResultIterableProvider provider ) {
91- Logger original = BaseQueryResultsSource .logger ;
92- BaseQueryResultsSource .logger = mockLogger ;
93- try {
94- DatastoreService datastore = DatastoreServiceFactory .getDatastoreService ();
95- Query query = new Query ("foo" );
96- // This won't trigger the warning because we're not pulling back enough.
97- for (@ SuppressWarnings ("unused" )
98- Entity e : provider .asIterable (datastore .prepare (query ), withLimit (1000 ))) {}
99- // This won't trigger the warning because we're setting an explicit chunk size.
100- for (@ SuppressWarnings ("unused" )
101- Entity e : provider .asIterable (datastore .prepare (query ), withChunkSize (21 ))) {}
102- // This will trigger the warning.
103- for (@ SuppressWarnings ("unused" )
104- Entity e : provider .asIterable (datastore .prepare (query ), withDefaults ())) {}
105- // Do it again - we shouldn't log a second time because we only log every
106- // 5 minutes.
107- for (@ SuppressWarnings ("unused" )
108- Entity e : provider .asIterable (datastore .prepare (query ), withDefaults ())) {}
109- } finally {
110- BaseQueryResultsSource .logger = original ;
111- }
97+ DatastoreService datastore = DatastoreServiceFactory .getDatastoreService ();
98+ Query query = new Query ("foo" );
99+ // This won't trigger the warning because we're not pulling back enough.
100+ for (@ SuppressWarnings ("unused" )
101+ Entity e : provider .asIterable (datastore .prepare (query ), withLimit (1000 ))) {}
102+ // This won't trigger the warning because we're setting an explicit chunk size.
103+ for (@ SuppressWarnings ("unused" )
104+ Entity e : provider .asIterable (datastore .prepare (query ), withChunkSize (21 ))) {}
105+ // This will trigger the warning.
106+ for (@ SuppressWarnings ("unused" )
107+ Entity e : provider .asIterable (datastore .prepare (query ), withDefaults ())) {}
108+ // Do it again - we shouldn't log a second time because we only log every
109+ // 5 minutes.
110+ for (@ SuppressWarnings ("unused" )
111+ Entity e : provider .asIterable (datastore .prepare (query ), withDefaults ())) {}
112112 }
113113
114114 @ Test
115115 public void testLogChunkSizeWarning () {
116116 Consumer <ResultIterableProvider > test =
117117 provider -> {
118118 doQueries (provider );
119- verify (mockLogger ).warning (anyString ());
120119 assertThat (lastChunkSizeWarning .get ()).isGreaterThan (0 );
120+ assertThat (assertingHandler .records ).isNotEmpty ();
121+ assertThat (assertingHandler .records .get (0 ).getLevel ()).isEqualTo (Level .WARNING );
121122 };
122123 addData (1001 );
123124 test .accept (QueryResultsSourceImplTest ::asIterable );
124- reset ( mockLogger );
125+ assertingHandler . records . clear ( );
125126 lastChunkSizeWarning .set (0 );
126127 test .accept (QueryResultsSourceImplTest ::asList );
127128 }
@@ -135,12 +136,12 @@ public void testLogChunkSizeWarning_After5Minutes() {
135136 lastChunkSizeWarning .set (lastChunkSizeWarning .get () - (1000 * 60 * 10 ));
136137 // Run again, we'll get one more log warning
137138 doQueries (provider );
138- verify ( mockLogger , times ( 2 )). warning ( anyString () );
139+ assertThat ( assertingHandler . records ). hasSize ( 2 );
139140 assertThat (lastChunkSizeWarning .get ()).isGreaterThan (0 );
140141 };
141142 addData (1001 );
142143 test .accept (QueryResultsSourceImplTest ::asIterable );
143- reset ( mockLogger );
144+ assertingHandler . records . clear ( );
144145 lastChunkSizeWarning .set (0 );
145146 test .accept (QueryResultsSourceImplTest ::asList );
146147 }
@@ -156,11 +157,11 @@ public void testLogChunkSizeWarning_LoggingDisabled() {
156157 System .clearProperty ("appengine.datastore.disableChunkSizeWarning" );
157158 }
158159 assertThat (lastChunkSizeWarning .get ()).isEqualTo (0 );
159- verifyNoMoreInteractions ( mockLogger );
160+ assertThat ( assertingHandler . records ). isEmpty ( );
160161 };
161162 addData (1001 );
162163 test .accept (QueryResultsSourceImplTest ::asIterable );
163- reset ( mockLogger );
164+ assertingHandler . records . clear ( );
164165 lastChunkSizeWarning .set (0 );
165166 test .accept (QueryResultsSourceImplTest ::asList );
166167 }
0 commit comments