• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2016 Google LLC
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *       http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.google.cloud.dns;
18 
19 import static org.junit.Assert.assertEquals;
20 import static org.junit.Assert.assertNotNull;
21 import static org.junit.Assert.assertNull;
22 import static org.junit.Assert.assertSame;
23 import static org.junit.Assert.assertTrue;
24 import static org.junit.Assert.fail;
25 
26 import com.google.api.client.googleapis.json.GoogleJsonError;
27 import com.google.api.gax.paging.Page;
28 import com.google.api.services.dns.model.Change;
29 import com.google.api.services.dns.model.ChangesListResponse;
30 import com.google.api.services.dns.model.ManagedZone;
31 import com.google.api.services.dns.model.ManagedZonesListResponse;
32 import com.google.api.services.dns.model.Project;
33 import com.google.api.services.dns.model.ResourceRecordSet;
34 import com.google.api.services.dns.model.ResourceRecordSetsListResponse;
35 import com.google.cloud.dns.spi.v1.DnsRpc;
36 import com.google.cloud.dns.spi.v1.RpcBatch;
37 import com.google.common.collect.ImmutableList;
38 import java.util.Iterator;
39 import java.util.List;
40 import java.util.Map;
41 import org.easymock.Capture;
42 import org.easymock.EasyMock;
43 import org.junit.After;
44 import org.junit.Before;
45 import org.junit.Test;
46 
47 public class DnsBatchTest {
48 
49   private static final String ZONE_NAME = "somezonename";
50   private static final String DNS_NAME = "example.com.";
51   private static final String DESCRIPTION = "desc";
52   private static final Integer MAX_SIZE = 20;
53   private static final String PAGE_TOKEN = "some token";
54 
55   private static final ZoneInfo ZONE_INFO = ZoneInfo.of(ZONE_NAME, DNS_NAME, DESCRIPTION);
56   private static final Dns.ZoneOption ZONE_FIELDS =
57       Dns.ZoneOption.fields(Dns.ZoneField.CREATION_TIME);
58   private static final Dns.ProjectOption PROJECT_FIELDS =
59       Dns.ProjectOption.fields(Dns.ProjectField.QUOTA);
60   private static final Dns.ZoneListOption[] ZONE_LIST_OPTIONS = {
61     Dns.ZoneListOption.pageSize(MAX_SIZE),
62     Dns.ZoneListOption.pageToken(PAGE_TOKEN),
63     Dns.ZoneListOption.fields(Dns.ZoneField.DESCRIPTION),
64     Dns.ZoneListOption.dnsName(DNS_NAME)
65   };
66   private static final ProjectInfo PROJECT_INFO = ProjectInfo.newBuilder().build();
67   private static final Dns.RecordSetListOption[] RECORD_SET_LIST_OPTIONS = {
68     Dns.RecordSetListOption.pageSize(MAX_SIZE),
69     Dns.RecordSetListOption.pageToken(PAGE_TOKEN),
70     Dns.RecordSetListOption.fields(Dns.RecordSetField.TTL),
71     Dns.RecordSetListOption.dnsName(DNS_NAME),
72     Dns.RecordSetListOption.type(RecordSet.Type.AAAA)
73   };
74   private static final RecordSet RECORD_SET =
75       RecordSet.newBuilder("Something", RecordSet.Type.AAAA).build();
76   private static final ChangeRequestInfo CHANGE_REQUEST_PARTIAL =
77       ChangeRequestInfo.newBuilder().add(RECORD_SET).build();
78   private static final String CHANGE_ID = "some change id";
79   private static final ChangeRequestInfo CHANGE_REQUEST_COMPLETE =
80       ChangeRequestInfo.newBuilder()
81           .add(RECORD_SET)
82           .setStartTime(123L)
83           .setStatus(ChangeRequest.Status.PENDING)
84           .setGeneratedId(CHANGE_ID)
85           .build();
86   private static final Dns.ChangeRequestListOption[] CHANGE_LIST_OPTIONS = {
87     Dns.ChangeRequestListOption.pageSize(MAX_SIZE),
88     Dns.ChangeRequestListOption.pageToken(PAGE_TOKEN),
89     Dns.ChangeRequestListOption.fields(Dns.ChangeRequestField.STATUS),
90     Dns.ChangeRequestListOption.sortOrder(Dns.SortingOrder.ASCENDING)
91   };
92   private static final Dns.ChangeRequestOption CHANGE_GET_FIELDS =
93       Dns.ChangeRequestOption.fields(Dns.ChangeRequestField.STATUS);
94   private static final List<ResourceRecordSet> RECORD_SET_LIST =
95       ImmutableList.of(RECORD_SET.toPb(), RECORD_SET.toPb(), RECORD_SET.toPb(), RECORD_SET.toPb());
96   private static final List<Change> CHANGE_LIST =
97       ImmutableList.of(
98           CHANGE_REQUEST_COMPLETE.toPb(),
99           CHANGE_REQUEST_COMPLETE.toPb(),
100           CHANGE_REQUEST_COMPLETE.toPb());
101   private static final List<ManagedZone> ZONE_LIST =
102       ImmutableList.of(ZONE_INFO.toPb(), ZONE_INFO.toPb());
103   private static final GoogleJsonError GOOGLE_JSON_ERROR = new GoogleJsonError();
104 
105   private DnsOptions optionsMock;
106   private DnsRpc dnsRpcMock;
107   private RpcBatch batchMock;
108   private DnsBatch dnsBatch;
109   private final Dns dns = EasyMock.createStrictMock(Dns.class);
110 
111   @Before
setUp()112   public void setUp() {
113     optionsMock = EasyMock.createMock(DnsOptions.class);
114     dnsRpcMock = EasyMock.createMock(DnsRpc.class);
115     batchMock = EasyMock.createMock(RpcBatch.class);
116     EasyMock.expect(optionsMock.getDnsRpcV1()).andReturn(dnsRpcMock);
117     EasyMock.expect(dnsRpcMock.createBatch()).andReturn(batchMock);
118     EasyMock.replay(optionsMock, dnsRpcMock, batchMock, dns);
119     dnsBatch = new DnsBatch(optionsMock);
120   }
121 
122   @After
tearDown()123   public void tearDown() {
124     EasyMock.verify(batchMock, dnsRpcMock, optionsMock, dns);
125   }
126 
127   @Test
testConstructor()128   public void testConstructor() {
129     assertSame(batchMock, dnsBatch.getBatch());
130     assertSame(optionsMock, dnsBatch.getOptions());
131     assertSame(dnsRpcMock, dnsBatch.getDnsRpc());
132   }
133 
134   @Test
testListZones()135   public void testListZones() {
136     EasyMock.reset(batchMock);
137     Capture<RpcBatch.Callback<ManagedZonesListResponse>> callback = Capture.newInstance();
138     Capture<Map<DnsRpc.Option, Object>> capturedOptions = Capture.newInstance();
139     batchMock.addListZones(EasyMock.capture(callback), EasyMock.capture(capturedOptions));
140     EasyMock.replay(batchMock);
141     DnsBatchResult<Page<Zone>> batchResult = dnsBatch.listZones();
142     assertEquals(0, capturedOptions.getValue().size());
143     assertNotNull(callback.getValue());
144     try {
145       batchResult.get();
146       fail("No result available yet.");
147     } catch (IllegalStateException ex) {
148       // expected
149     }
150     RpcBatch.Callback<ManagedZonesListResponse> capturedCallback = callback.getValue();
151     capturedCallback.onFailure(GOOGLE_JSON_ERROR);
152     try {
153       batchResult.get();
154       fail("Should throw a DnsException on error.");
155     } catch (DnsException ex) {
156       // expected
157     }
158   }
159 
160   @Test
testListZonesWithOptions()161   public void testListZonesWithOptions() {
162     EasyMock.reset(batchMock);
163     Capture<RpcBatch.Callback<ManagedZonesListResponse>> callback = Capture.newInstance();
164     Capture<Map<DnsRpc.Option, Object>> capturedOptions = Capture.newInstance();
165     batchMock.addListZones(EasyMock.capture(callback), EasyMock.capture(capturedOptions));
166     EasyMock.replay(batchMock);
167     DnsBatchResult<Page<Zone>> batchResult = dnsBatch.listZones(ZONE_LIST_OPTIONS);
168     assertNotNull(callback.getValue());
169     Integer size = (Integer) capturedOptions.getValue().get(ZONE_LIST_OPTIONS[0].getRpcOption());
170     assertEquals(MAX_SIZE, size);
171     String selector = (String) capturedOptions.getValue().get(ZONE_LIST_OPTIONS[1].getRpcOption());
172     assertEquals(PAGE_TOKEN, selector);
173     selector = (String) capturedOptions.getValue().get(ZONE_LIST_OPTIONS[2].getRpcOption());
174     assertTrue(selector.contains(Dns.ZoneField.DESCRIPTION.getSelector()));
175     assertTrue(selector.contains(Dns.ZoneField.NAME.getSelector()));
176     selector = (String) capturedOptions.getValue().get(ZONE_LIST_OPTIONS[3].getRpcOption());
177     assertEquals(DNS_NAME, selector);
178     // check the callback
179     ManagedZonesListResponse response =
180         new ManagedZonesListResponse().setManagedZones(ZONE_LIST).setNextPageToken(PAGE_TOKEN);
181     RpcBatch.Callback<ManagedZonesListResponse> capturedCallback = callback.getValue();
182     EasyMock.verify(optionsMock);
183     EasyMock.reset(optionsMock);
184     EasyMock.expect(optionsMock.getService()).andReturn(dns).times(ZONE_LIST.size());
185     EasyMock.replay(optionsMock);
186     capturedCallback.onSuccess(response);
187     Page<Zone> page = batchResult.get();
188     assertEquals(PAGE_TOKEN, page.getNextPageToken());
189     Iterator<Zone> iterator = page.getValues().iterator();
190     int resultSize = 0;
191     EasyMock.verify(dns);
192     EasyMock.reset(dns);
193     EasyMock.expect(dns.getOptions()).andReturn(optionsMock).times(ZONE_LIST.size() + 1);
194     EasyMock.replay(dns);
195     Zone zoneInfoFunctional = new Zone(dns, new ZoneInfo.BuilderImpl(ZONE_INFO));
196     while (iterator.hasNext()) {
197       assertEquals(zoneInfoFunctional, iterator.next());
198       resultSize++;
199     }
200     assertEquals(ZONE_LIST.size(), resultSize);
201   }
202 
203   @Test
testCreateZone()204   public void testCreateZone() {
205     EasyMock.reset(batchMock);
206     Capture<RpcBatch.Callback<ManagedZone>> callback = Capture.newInstance();
207     Capture<Map<DnsRpc.Option, Object>> capturedOptions = Capture.newInstance();
208     Capture<ManagedZone> capturedZone = Capture.newInstance();
209     batchMock.addCreateZone(
210         EasyMock.capture(capturedZone),
211         EasyMock.capture(callback),
212         EasyMock.capture(capturedOptions));
213     EasyMock.replay(batchMock);
214     DnsBatchResult<Zone> batchResult = dnsBatch.createZone(ZONE_INFO);
215     assertEquals(0, capturedOptions.getValue().size());
216     assertEquals(ZONE_INFO.toPb(), capturedZone.getValue());
217     assertNotNull(callback.getValue());
218     try {
219       batchResult.get();
220       fail("No result available yet.");
221     } catch (IllegalStateException ex) {
222       // expected
223     }
224     // testing error here, success is tested with options
225     RpcBatch.Callback<ManagedZone> capturedCallback = callback.getValue();
226     GoogleJsonError error = new GoogleJsonError();
227     error.setCode(404);
228     capturedCallback.onFailure(error);
229     try {
230       batchResult.get();
231       fail("Should throw a DnsException on error.");
232     } catch (DnsException ex) {
233       // expected
234     }
235   }
236 
237   @Test
testCreateZoneWithOptions()238   public void testCreateZoneWithOptions() {
239     EasyMock.reset(dns, batchMock, optionsMock);
240     EasyMock.expect(dns.getOptions()).andReturn(optionsMock);
241     EasyMock.expect(optionsMock.getService()).andReturn(dns);
242     Capture<RpcBatch.Callback<ManagedZone>> callback = Capture.newInstance();
243     Capture<Map<DnsRpc.Option, Object>> capturedOptions = Capture.newInstance();
244     Capture<ManagedZone> capturedZone = Capture.newInstance();
245     batchMock.addCreateZone(
246         EasyMock.capture(capturedZone),
247         EasyMock.capture(callback),
248         EasyMock.capture(capturedOptions));
249     EasyMock.replay(dns, batchMock, optionsMock);
250     DnsBatchResult<Zone> batchResult = dnsBatch.createZone(ZONE_INFO, ZONE_FIELDS);
251     assertEquals(ZONE_INFO.toPb(), capturedZone.getValue());
252     assertNotNull(callback.getValue());
253     String selector = (String) capturedOptions.getValue().get(ZONE_FIELDS.getRpcOption());
254     assertTrue(selector.contains(Dns.ZoneField.CREATION_TIME.getSelector()));
255     assertTrue(selector.contains(Dns.ZoneField.NAME.getSelector()));
256     RpcBatch.Callback<ManagedZone> capturedCallback = callback.getValue();
257     capturedCallback.onSuccess(ZONE_INFO.toPb());
258     assertEquals(ZONE_INFO.toPb(), batchResult.get().toPb());
259   }
260 
261   @Test
testGetZone()262   public void testGetZone() {
263     EasyMock.reset(batchMock);
264     Capture<RpcBatch.Callback<ManagedZone>> callback = Capture.newInstance();
265     Capture<Map<DnsRpc.Option, Object>> capturedOptions = Capture.newInstance();
266     batchMock.addGetZone(
267         EasyMock.eq(ZONE_NAME), EasyMock.capture(callback), EasyMock.capture(capturedOptions));
268     EasyMock.replay(batchMock);
269     DnsBatchResult<Zone> batchResult = dnsBatch.getZone(ZONE_NAME);
270     assertEquals(0, capturedOptions.getValue().size());
271     assertNotNull(callback.getValue());
272     try {
273       batchResult.get();
274       fail("No result available yet.");
275     } catch (IllegalStateException ex) {
276       // expected
277     }
278     // testing error here, success is tested with options
279     RpcBatch.Callback<ManagedZone> capturedCallback = callback.getValue();
280     capturedCallback.onFailure(GOOGLE_JSON_ERROR);
281     try {
282       batchResult.get();
283       fail("Should throw a DnsException on error.");
284     } catch (DnsException ex) {
285       // expected
286     }
287   }
288 
289   @Test
testGetZoneNotFound()290   public void testGetZoneNotFound() {
291     EasyMock.reset(batchMock);
292     Capture<RpcBatch.Callback<ManagedZone>> callback = Capture.newInstance();
293     Capture<Map<DnsRpc.Option, Object>> capturedOptions = Capture.newInstance();
294     batchMock.addGetZone(
295         EasyMock.eq(ZONE_NAME), EasyMock.capture(callback), EasyMock.capture(capturedOptions));
296     EasyMock.replay(batchMock);
297     DnsBatchResult<Zone> batchResult = dnsBatch.getZone(ZONE_NAME);
298     assertEquals(0, capturedOptions.getValue().size());
299     GoogleJsonError error = new GoogleJsonError();
300     error.setCode(404);
301     RpcBatch.Callback<ManagedZone> capturedCallback = callback.getValue();
302     capturedCallback.onFailure(error);
303     assertNull(batchResult.get());
304   }
305 
306   @Test
testGetZoneWithOptions()307   public void testGetZoneWithOptions() {
308     EasyMock.reset(dns, batchMock, optionsMock);
309     EasyMock.expect(dns.getOptions()).andReturn(optionsMock);
310     Capture<RpcBatch.Callback<ManagedZone>> callback = Capture.newInstance();
311     Capture<Map<DnsRpc.Option, Object>> capturedOptions = Capture.newInstance();
312     batchMock.addGetZone(
313         EasyMock.eq(ZONE_NAME), EasyMock.capture(callback), EasyMock.capture(capturedOptions));
314     EasyMock.expect(optionsMock.getService()).andReturn(dns);
315     EasyMock.replay(dns, batchMock, optionsMock);
316     DnsBatchResult<Zone> batchResult = dnsBatch.getZone(ZONE_NAME, ZONE_FIELDS);
317     assertNotNull(callback.getValue());
318     String selector = (String) capturedOptions.getValue().get(ZONE_FIELDS.getRpcOption());
319     assertTrue(selector.contains(Dns.ZoneField.CREATION_TIME.getSelector()));
320     assertTrue(selector.contains(Dns.ZoneField.NAME.getSelector()));
321     RpcBatch.Callback<ManagedZone> capturedCallback = callback.getValue();
322     capturedCallback.onSuccess(ZONE_INFO.toPb());
323     assertEquals(ZONE_INFO.toPb(), batchResult.get().toPb());
324   }
325 
326   @Test
testDeleteZone()327   public void testDeleteZone() {
328     EasyMock.reset(batchMock);
329     Capture<RpcBatch.Callback<Void>> callback = Capture.newInstance();
330     batchMock.addDeleteZone(EasyMock.eq(ZONE_NAME), EasyMock.capture(callback));
331     EasyMock.replay(batchMock);
332     DnsBatchResult<Boolean> batchResult = dnsBatch.deleteZone(ZONE_NAME);
333     assertNotNull(callback.getValue());
334     try {
335       batchResult.get();
336       fail("No result available yet.");
337     } catch (IllegalStateException ex) {
338       // expected
339     }
340     // testing error here, success is tested with options
341     RpcBatch.Callback<Void> capturedCallback = callback.getValue();
342     capturedCallback.onFailure(GOOGLE_JSON_ERROR);
343     try {
344       batchResult.get();
345       fail("Should throw a DnsException on error.");
346     } catch (DnsException ex) {
347       // expected
348     }
349   }
350 
351   @Test
testDeleteZoneOnSuccess()352   public void testDeleteZoneOnSuccess() {
353     EasyMock.reset(batchMock);
354     Capture<RpcBatch.Callback<Void>> callback = Capture.newInstance();
355     batchMock.addDeleteZone(EasyMock.eq(ZONE_NAME), EasyMock.capture(callback));
356     EasyMock.replay(batchMock);
357     DnsBatchResult<Boolean> batchResult = dnsBatch.deleteZone(ZONE_NAME);
358     assertNotNull(callback.getValue());
359     RpcBatch.Callback<Void> capturedCallback = callback.getValue();
360     Void result = null;
361     capturedCallback.onSuccess(result);
362     assertTrue(batchResult.get());
363   }
364 
365   @Test
testGetProject()366   public void testGetProject() {
367     EasyMock.reset(batchMock);
368     Capture<RpcBatch.Callback<Project>> callback = Capture.newInstance();
369     Capture<Map<DnsRpc.Option, Object>> capturedOptions = Capture.newInstance();
370     batchMock.addGetProject(EasyMock.capture(callback), EasyMock.capture(capturedOptions));
371     EasyMock.replay(batchMock);
372     DnsBatchResult<ProjectInfo> batchResult = dnsBatch.getProject();
373     assertEquals(0, capturedOptions.getValue().size());
374     assertNotNull(callback.getValue());
375     try {
376       batchResult.get();
377       fail("No result available yet.");
378     } catch (IllegalStateException ex) {
379       // expected
380     }
381     // testing error here, success is tested with options
382     RpcBatch.Callback<Project> capturedCallback = callback.getValue();
383     capturedCallback.onFailure(GOOGLE_JSON_ERROR);
384     try {
385       batchResult.get();
386       fail("Should throw a DnsException on error.");
387     } catch (DnsException ex) {
388       // expected
389     }
390   }
391 
392   @Test
testGetProjectWithOptions()393   public void testGetProjectWithOptions() {
394     EasyMock.reset(batchMock);
395     Capture<RpcBatch.Callback<Project>> callback = Capture.newInstance();
396     Capture<Map<DnsRpc.Option, Object>> capturedOptions = Capture.newInstance();
397     batchMock.addGetProject(EasyMock.capture(callback), EasyMock.capture(capturedOptions));
398     EasyMock.replay(batchMock);
399     DnsBatchResult<ProjectInfo> batchResult = dnsBatch.getProject(PROJECT_FIELDS);
400     assertNotNull(callback.getValue());
401     String selector = (String) capturedOptions.getValue().get(PROJECT_FIELDS.getRpcOption());
402     assertTrue(selector.contains(Dns.ProjectField.QUOTA.getSelector()));
403     assertTrue(selector.contains(Dns.ProjectField.PROJECT_ID.getSelector()));
404     RpcBatch.Callback<Project> capturedCallback = callback.getValue();
405     capturedCallback.onSuccess(PROJECT_INFO.toPb());
406     assertEquals(PROJECT_INFO, batchResult.get());
407   }
408 
409   @Test
testListRecordSets()410   public void testListRecordSets() {
411     EasyMock.reset(batchMock);
412     Capture<RpcBatch.Callback<ResourceRecordSetsListResponse>> callback = Capture.newInstance();
413     Capture<Map<DnsRpc.Option, Object>> capturedOptions = Capture.newInstance();
414     batchMock.addListRecordSets(
415         EasyMock.eq(ZONE_NAME), EasyMock.capture(callback), EasyMock.capture(capturedOptions));
416     EasyMock.replay(batchMock);
417     DnsBatchResult<Page<RecordSet>> batchResult = dnsBatch.listRecordSets(ZONE_NAME);
418     assertEquals(0, capturedOptions.getValue().size());
419     assertNotNull(callback.getValue());
420     try {
421       batchResult.get();
422       fail("No result available yet.");
423     } catch (IllegalStateException ex) {
424       // expected
425     }
426     RpcBatch.Callback<ResourceRecordSetsListResponse> capturedCallback = callback.getValue();
427     capturedCallback.onFailure(GOOGLE_JSON_ERROR);
428     try {
429       batchResult.get();
430       fail("Should throw a DnsException on error.");
431     } catch (DnsException ex) {
432       // expected
433     }
434   }
435 
436   @Test
testListRecordSetsWithOptions()437   public void testListRecordSetsWithOptions() {
438     EasyMock.reset(batchMock);
439     Capture<RpcBatch.Callback<ResourceRecordSetsListResponse>> callback = Capture.newInstance();
440     Capture<Map<DnsRpc.Option, Object>> capturedOptions = Capture.newInstance();
441     batchMock.addListRecordSets(
442         EasyMock.eq(ZONE_NAME), EasyMock.capture(callback), EasyMock.capture(capturedOptions));
443     EasyMock.replay(batchMock);
444     DnsBatchResult<Page<RecordSet>> batchResult =
445         dnsBatch.listRecordSets(ZONE_NAME, RECORD_SET_LIST_OPTIONS);
446     assertNotNull(callback.getValue());
447     Integer size =
448         (Integer) capturedOptions.getValue().get(RECORD_SET_LIST_OPTIONS[0].getRpcOption());
449     assertEquals(MAX_SIZE, size);
450     String selector =
451         (String) capturedOptions.getValue().get(RECORD_SET_LIST_OPTIONS[1].getRpcOption());
452     assertEquals(PAGE_TOKEN, selector);
453     selector = (String) capturedOptions.getValue().get(RECORD_SET_LIST_OPTIONS[2].getRpcOption());
454     assertTrue(selector.contains(Dns.RecordSetField.NAME.getSelector()));
455     assertTrue(selector.contains(Dns.RecordSetField.TTL.getSelector()));
456     selector = (String) capturedOptions.getValue().get(RECORD_SET_LIST_OPTIONS[3].getRpcOption());
457     assertEquals(RECORD_SET_LIST_OPTIONS[3].getValue(), selector);
458     String type =
459         (String) capturedOptions.getValue().get(RECORD_SET_LIST_OPTIONS[4].getRpcOption());
460     assertEquals(RECORD_SET_LIST_OPTIONS[4].getValue(), type);
461     RpcBatch.Callback<ResourceRecordSetsListResponse> capturedCallback = callback.getValue();
462     ResourceRecordSetsListResponse response =
463         new ResourceRecordSetsListResponse()
464             .setRrsets(RECORD_SET_LIST)
465             .setNextPageToken(PAGE_TOKEN);
466     capturedCallback.onSuccess(response);
467     Page<RecordSet> page = batchResult.get();
468     assertEquals(PAGE_TOKEN, page.getNextPageToken());
469     Iterator<RecordSet> iterator = page.getValues().iterator();
470     int resultSize = 0;
471     while (iterator.hasNext()) {
472       assertEquals(RECORD_SET, iterator.next());
473       resultSize++;
474     }
475     assertEquals(RECORD_SET_LIST.size(), resultSize);
476   }
477 
478   @Test
testListChangeRequests()479   public void testListChangeRequests() {
480     EasyMock.reset(batchMock);
481     Capture<RpcBatch.Callback<ChangesListResponse>> callback = Capture.newInstance();
482     Capture<Map<DnsRpc.Option, Object>> capturedOptions = Capture.newInstance();
483     batchMock.addListChangeRequests(
484         EasyMock.eq(ZONE_NAME), EasyMock.capture(callback), EasyMock.capture(capturedOptions));
485     EasyMock.replay(batchMock);
486     DnsBatchResult<Page<ChangeRequest>> batchResult = dnsBatch.listChangeRequests(ZONE_NAME);
487     assertNotNull(callback.getValue());
488     assertEquals(0, capturedOptions.getValue().size());
489     try {
490       batchResult.get();
491       fail("No result available yet.");
492     } catch (IllegalStateException ex) {
493       // expected
494     }
495     RpcBatch.Callback<ChangesListResponse> capturedCallback = callback.getValue();
496     capturedCallback.onFailure(GOOGLE_JSON_ERROR);
497     try {
498       batchResult.get();
499       fail("Should throw a DnsException on error.");
500     } catch (DnsException ex) {
501       // expected
502     }
503   }
504 
505   @Test
testListChangeRequestsWithOptions()506   public void testListChangeRequestsWithOptions() {
507     EasyMock.reset(batchMock);
508     Capture<RpcBatch.Callback<ChangesListResponse>> callback = Capture.newInstance();
509     Capture<Map<DnsRpc.Option, Object>> capturedOptions = Capture.newInstance();
510     batchMock.addListChangeRequests(
511         EasyMock.eq(ZONE_NAME), EasyMock.capture(callback), EasyMock.capture(capturedOptions));
512     EasyMock.replay(batchMock);
513     DnsBatchResult<Page<ChangeRequest>> batchResult =
514         dnsBatch.listChangeRequests(ZONE_NAME, CHANGE_LIST_OPTIONS);
515     assertNotNull(callback.getValue());
516     Integer size = (Integer) capturedOptions.getValue().get(CHANGE_LIST_OPTIONS[0].getRpcOption());
517     assertEquals(MAX_SIZE, size);
518     String selector =
519         (String) capturedOptions.getValue().get(CHANGE_LIST_OPTIONS[1].getRpcOption());
520     assertEquals(PAGE_TOKEN, selector);
521     selector = (String) capturedOptions.getValue().get(CHANGE_LIST_OPTIONS[2].getRpcOption());
522     assertTrue(selector.contains(Dns.ChangeRequestField.STATUS.getSelector()));
523     assertTrue(selector.contains(Dns.ChangeRequestField.ID.getSelector()));
524     selector = (String) capturedOptions.getValue().get(CHANGE_LIST_OPTIONS[3].getRpcOption());
525     assertTrue(selector.contains(Dns.SortingOrder.ASCENDING.selector()));
526     // check the callback
527     ChangesListResponse response =
528         new ChangesListResponse().setChanges(CHANGE_LIST).setNextPageToken(PAGE_TOKEN);
529     RpcBatch.Callback<ChangesListResponse> capturedCallback = callback.getValue();
530     EasyMock.verify(optionsMock);
531     EasyMock.reset(optionsMock);
532     EasyMock.expect(optionsMock.getService()).andReturn(dns);
533     EasyMock.replay(optionsMock);
534     capturedCallback.onSuccess(response);
535     Page<ChangeRequest> page = batchResult.get();
536     assertEquals(PAGE_TOKEN, page.getNextPageToken());
537     Iterator<ChangeRequest> iterator = page.getValues().iterator();
538     int resultSize = 0;
539     EasyMock.verify(dns);
540     EasyMock.reset(dns);
541     EasyMock.expect(dns.getOptions()).andReturn(optionsMock).times(CHANGE_LIST.size());
542     EasyMock.replay(dns);
543     while (iterator.hasNext()) {
544       assertEquals(CHANGE_REQUEST_COMPLETE.toPb(), iterator.next().toPb());
545       resultSize++;
546     }
547     assertEquals(CHANGE_LIST.size(), resultSize);
548   }
549 
550   @Test
testGetChangeRequest()551   public void testGetChangeRequest() {
552     EasyMock.reset(batchMock);
553     Capture<RpcBatch.Callback<Change>> callback = Capture.newInstance();
554     Capture<Map<DnsRpc.Option, Object>> capturedOptions = Capture.newInstance();
555     batchMock.addGetChangeRequest(
556         EasyMock.eq(ZONE_NAME),
557         EasyMock.eq(CHANGE_REQUEST_COMPLETE.getGeneratedId()),
558         EasyMock.capture(callback),
559         EasyMock.capture(capturedOptions));
560     EasyMock.replay(batchMock);
561     DnsBatchResult<ChangeRequest> batchResult =
562         dnsBatch.getChangeRequest(ZONE_NAME, CHANGE_REQUEST_COMPLETE.getGeneratedId());
563     assertEquals(0, capturedOptions.getValue().size());
564     assertNotNull(callback.getValue());
565     try {
566       batchResult.get();
567       fail("No result available yet.");
568     } catch (IllegalStateException ex) {
569       // expected
570     }
571     // testing error here, success is tested with options
572     RpcBatch.Callback<Change> capturedCallback = callback.getValue();
573     capturedCallback.onFailure(GOOGLE_JSON_ERROR);
574     try {
575       batchResult.get();
576       fail("Should throw a DnsException on error.");
577     } catch (DnsException ex) {
578       // expected
579     }
580   }
581 
582   @Test
testGetChangeRequestNotFound()583   public void testGetChangeRequestNotFound() {
584     EasyMock.reset(batchMock);
585     Capture<RpcBatch.Callback<Change>> callback = Capture.newInstance();
586     Capture<Map<DnsRpc.Option, Object>> capturedOptions = Capture.newInstance();
587     batchMock.addGetChangeRequest(
588         EasyMock.eq(ZONE_NAME),
589         EasyMock.eq(CHANGE_REQUEST_COMPLETE.getGeneratedId()),
590         EasyMock.capture(callback),
591         EasyMock.capture(capturedOptions));
592     EasyMock.replay(batchMock);
593     DnsBatchResult<ChangeRequest> batchResult =
594         dnsBatch.getChangeRequest(ZONE_NAME, CHANGE_REQUEST_COMPLETE.getGeneratedId());
595     assertEquals(0, capturedOptions.getValue().size());
596     RpcBatch.Callback<Change> capturedCallback = callback.getValue();
597     GoogleJsonError error = new GoogleJsonError();
598     GoogleJsonError.ErrorInfo errorInfo = new GoogleJsonError.ErrorInfo();
599     errorInfo.setReason("reason");
600     errorInfo.setLocation("entity.parameters.changeId");
601     error.setCode(404);
602     error.setErrors(ImmutableList.of(errorInfo));
603     capturedCallback.onFailure(error);
604     assertNull(batchResult.get());
605   }
606 
607   @Test
testGetChangeRequestWithOptions()608   public void testGetChangeRequestWithOptions() {
609     EasyMock.reset(dns, batchMock, optionsMock);
610     EasyMock.expect(dns.getOptions()).andReturn(optionsMock);
611     EasyMock.expect(optionsMock.getService()).andReturn(dns);
612     Capture<RpcBatch.Callback<Change>> callback = Capture.newInstance();
613     Capture<Map<DnsRpc.Option, Object>> capturedOptions = Capture.newInstance();
614     batchMock.addGetChangeRequest(
615         EasyMock.eq(ZONE_NAME),
616         EasyMock.eq(CHANGE_REQUEST_COMPLETE.getGeneratedId()),
617         EasyMock.capture(callback),
618         EasyMock.capture(capturedOptions));
619     EasyMock.replay(dns, batchMock, optionsMock);
620     DnsBatchResult<ChangeRequest> batchResult =
621         dnsBatch.getChangeRequest(
622             ZONE_NAME, CHANGE_REQUEST_COMPLETE.getGeneratedId(), CHANGE_GET_FIELDS);
623     assertNotNull(callback.getValue());
624     String selector = (String) capturedOptions.getValue().get(CHANGE_GET_FIELDS.getRpcOption());
625     assertTrue(selector.contains(Dns.ChangeRequestField.STATUS.getSelector()));
626     assertTrue(selector.contains(Dns.ChangeRequestField.ID.getSelector()));
627     RpcBatch.Callback<Change> capturedCallback = callback.getValue();
628     capturedCallback.onSuccess(CHANGE_REQUEST_COMPLETE.toPb());
629     assertEquals(CHANGE_REQUEST_COMPLETE.toPb(), batchResult.get().toPb());
630   }
631 
632   @Test
testApplyChangeRequest()633   public void testApplyChangeRequest() {
634     EasyMock.reset(batchMock);
635     Capture<RpcBatch.Callback<Change>> callback = Capture.newInstance();
636     Capture<Map<DnsRpc.Option, Object>> capturedOptions = Capture.newInstance();
637     batchMock.addApplyChangeRequest(
638         EasyMock.eq(ZONE_NAME),
639         EasyMock.eq(CHANGE_REQUEST_PARTIAL.toPb()),
640         EasyMock.capture(callback),
641         EasyMock.capture(capturedOptions));
642     EasyMock.replay(batchMock);
643     DnsBatchResult<ChangeRequest> batchResult =
644         dnsBatch.applyChangeRequest(ZONE_INFO.getName(), CHANGE_REQUEST_PARTIAL);
645     assertEquals(0, capturedOptions.getValue().size());
646     assertNotNull(callback.getValue());
647     try {
648       batchResult.get();
649       fail("No result available yet.");
650     } catch (IllegalStateException ex) {
651       // expected
652     }
653     // testing error here, success is tested with options
654     RpcBatch.Callback<Change> capturedCallback = callback.getValue();
655     GoogleJsonError error = new GoogleJsonError();
656     error.setCode(404);
657     capturedCallback.onFailure(error);
658     try {
659       batchResult.get();
660       fail("Should throw a DnsException on error.");
661     } catch (DnsException ex) {
662       // expected
663     }
664   }
665 
666   @Test
testApplyChangeRequestWithOptions()667   public void testApplyChangeRequestWithOptions() {
668     EasyMock.reset(dns, batchMock, optionsMock);
669     EasyMock.expect(dns.getOptions()).andReturn(optionsMock);
670     Capture<RpcBatch.Callback<Change>> callback = Capture.newInstance();
671     Capture<Map<DnsRpc.Option, Object>> capturedOptions = Capture.newInstance();
672     batchMock.addApplyChangeRequest(
673         EasyMock.eq(ZONE_NAME),
674         EasyMock.eq(CHANGE_REQUEST_PARTIAL.toPb()),
675         EasyMock.capture(callback),
676         EasyMock.capture(capturedOptions));
677     EasyMock.expect(optionsMock.getService()).andReturn(dns);
678     EasyMock.replay(dns, batchMock, optionsMock);
679     DnsBatchResult<ChangeRequest> batchResult =
680         dnsBatch.applyChangeRequest(ZONE_INFO.getName(), CHANGE_REQUEST_PARTIAL, CHANGE_GET_FIELDS);
681     String selector = (String) capturedOptions.getValue().get(CHANGE_GET_FIELDS.getRpcOption());
682     assertTrue(selector.contains(Dns.ChangeRequestField.STATUS.getSelector()));
683     assertTrue(selector.contains(Dns.ChangeRequestField.ID.getSelector()));
684     RpcBatch.Callback<Change> capturedCallback = callback.getValue();
685     capturedCallback.onSuccess(CHANGE_REQUEST_COMPLETE.toPb());
686     assertEquals(CHANGE_REQUEST_COMPLETE.toPb(), batchResult.get().toPb());
687   }
688 }
689