PageRenderTime 45ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/app/src/androidTest/java/at/bitfire/davdroid/ui/setup/DavResourceFinderTest.java

https://gitlab.com/Tveiker/davdroid
Java | 192 lines | 144 code | 37 blank | 11 comment | 12 complexity | 060359eb06149ecc5fa435d0d274ff3c MD5 | raw file
  1. /*
  2. * Copyright © 2013 – 2016 Ricki Hirner (bitfire web engineering).
  3. * All rights reserved. This program and the accompanying materials
  4. * are made available under the terms of the GNU Public License v3.0
  5. * which accompanies this distribution, and is available at
  6. * http://www.gnu.org/licenses/gpl.html
  7. */
  8. package at.bitfire.davdroid.ui.setup;
  9. import android.test.InstrumentationTestCase;
  10. import java.io.IOException;
  11. import java.net.URI;
  12. import at.bitfire.dav4android.DavResource;
  13. import at.bitfire.dav4android.exception.DavException;
  14. import at.bitfire.dav4android.exception.HttpException;
  15. import at.bitfire.dav4android.property.AddressbookHomeSet;
  16. import at.bitfire.dav4android.property.ResourceType;
  17. import at.bitfire.davdroid.App;
  18. import at.bitfire.davdroid.HttpClient;
  19. import at.bitfire.davdroid.ui.setup.DavResourceFinder;
  20. import at.bitfire.davdroid.ui.setup.DavResourceFinder.Configuration.ServiceInfo;
  21. import at.bitfire.davdroid.ui.setup.LoginCredentials;
  22. import okhttp3.OkHttpClient;
  23. import okhttp3.mockwebserver.Dispatcher;
  24. import okhttp3.mockwebserver.MockResponse;
  25. import okhttp3.mockwebserver.MockWebServer;
  26. import okhttp3.mockwebserver.RecordedRequest;
  27. public class DavResourceFinderTest extends InstrumentationTestCase {
  28. MockWebServer server = new MockWebServer();
  29. DavResourceFinder finder;
  30. OkHttpClient client;
  31. LoginCredentials credentials;
  32. private static final String
  33. PATH_NO_DAV = "/nodav",
  34. PATH_CALDAV = "/caldav",
  35. PATH_CARDDAV = "/carddav",
  36. PATH_CALDAV_AND_CARDDAV = "/both-caldav-carddav",
  37. SUBPATH_PRINCIPAL = "/principal",
  38. SUBPATH_ADDRESSBOOK_HOMESET = "/addressbooks",
  39. SUBPATH_ADDRESSBOOK = "/addressbooks/private-contacts";
  40. @Override
  41. protected void setUp() throws Exception {
  42. server.setDispatcher(new TestDispatcher());
  43. server.start();
  44. credentials = new LoginCredentials(URI.create("/"), "mock", "12345");
  45. finder = new DavResourceFinder(getInstrumentation().getContext(), credentials);
  46. client = HttpClient.create();
  47. client = HttpClient.addAuthentication(client, credentials.userName, credentials.password);
  48. }
  49. @Override
  50. protected void tearDown() throws Exception {
  51. server.shutdown();
  52. }
  53. public void testRememberIfAddressBookOrHomeset() throws IOException, HttpException, DavException {
  54. ServiceInfo info;
  55. // before dav.propfind(), no info is available
  56. DavResource dav = new DavResource(client, server.url(PATH_CARDDAV + SUBPATH_PRINCIPAL));
  57. finder.rememberIfAddressBookOrHomeset(dav, info = new ServiceInfo());
  58. assertEquals(0, info.collections.size());
  59. assertEquals(0, info.homeSets.size());
  60. // recognize home set
  61. dav.propfind(0, AddressbookHomeSet.NAME);
  62. finder.rememberIfAddressBookOrHomeset(dav, info = new ServiceInfo());
  63. assertEquals(0, info.collections.size());
  64. assertEquals(1, info.homeSets.size());
  65. assertEquals(server.url(PATH_CARDDAV + SUBPATH_ADDRESSBOOK_HOMESET + "/").uri(), info.homeSets.iterator().next());
  66. // recognize address book
  67. dav = new DavResource(client, server.url(PATH_CARDDAV + SUBPATH_ADDRESSBOOK));
  68. dav.propfind(0, ResourceType.NAME);
  69. finder.rememberIfAddressBookOrHomeset(dav, info = new ServiceInfo());
  70. assertEquals(1, info.collections.size());
  71. assertEquals(server.url(PATH_CARDDAV + SUBPATH_ADDRESSBOOK + "/").uri(), info.collections.keySet().iterator().next());
  72. assertEquals(0, info.homeSets.size());
  73. }
  74. public void testProvidesService() throws IOException {
  75. assertFalse(finder.providesService(server.url(PATH_NO_DAV), DavResourceFinder.Service.CALDAV));
  76. assertFalse(finder.providesService(server.url(PATH_NO_DAV), DavResourceFinder.Service.CARDDAV));
  77. assertTrue(finder.providesService(server.url(PATH_CALDAV), DavResourceFinder.Service.CALDAV));
  78. assertFalse(finder.providesService(server.url(PATH_CALDAV), DavResourceFinder.Service.CARDDAV));
  79. assertTrue(finder.providesService(server.url(PATH_CARDDAV), DavResourceFinder.Service.CARDDAV));
  80. assertFalse(finder.providesService(server.url(PATH_CARDDAV), DavResourceFinder.Service.CALDAV));
  81. assertTrue(finder.providesService(server.url(PATH_CALDAV_AND_CARDDAV), DavResourceFinder.Service.CALDAV));
  82. assertTrue(finder.providesService(server.url(PATH_CALDAV_AND_CARDDAV), DavResourceFinder.Service.CARDDAV));
  83. }
  84. public void testGetCurrentUserPrincipal() throws IOException, HttpException, DavException {
  85. assertNull(finder.getCurrentUserPrincipal(server.url(PATH_NO_DAV), DavResourceFinder.Service.CALDAV));
  86. assertNull(finder.getCurrentUserPrincipal(server.url(PATH_NO_DAV), DavResourceFinder.Service.CARDDAV));
  87. assertEquals(
  88. server.url(PATH_CALDAV + SUBPATH_PRINCIPAL).uri(),
  89. finder.getCurrentUserPrincipal(server.url(PATH_CALDAV), DavResourceFinder.Service.CALDAV)
  90. );
  91. assertNull(finder.getCurrentUserPrincipal(server.url(PATH_CALDAV), DavResourceFinder.Service.CARDDAV));
  92. assertEquals(
  93. server.url(PATH_CARDDAV + SUBPATH_PRINCIPAL).uri(),
  94. finder.getCurrentUserPrincipal(server.url(PATH_CARDDAV), DavResourceFinder.Service.CARDDAV)
  95. );
  96. assertNull(finder.getCurrentUserPrincipal(server.url(PATH_CARDDAV), DavResourceFinder.Service.CALDAV));
  97. }
  98. // mock server
  99. public class TestDispatcher extends Dispatcher {
  100. @Override
  101. public MockResponse dispatch(RecordedRequest rq) throws InterruptedException {
  102. if (!checkAuth(rq)) {
  103. MockResponse authenticate = new MockResponse().setResponseCode(401);
  104. authenticate.setHeader("WWW-Authenticate", "Basic realm=\"test\"");
  105. return authenticate;
  106. }
  107. String path = rq.getPath();
  108. if ("OPTIONS".equalsIgnoreCase(rq.getMethod())) {
  109. String dav = null;
  110. if (path.startsWith(PATH_CALDAV))
  111. dav = "calendar-access";
  112. else if (path.startsWith(PATH_CARDDAV))
  113. dav = "addressbook";
  114. else if (path.startsWith(PATH_CALDAV_AND_CARDDAV))
  115. dav = "calendar-access, addressbook";
  116. MockResponse response = new MockResponse().setResponseCode(200);
  117. if (dav != null)
  118. response.addHeader("DAV", dav);
  119. return response;
  120. } else if ("PROPFIND".equalsIgnoreCase(rq.getMethod())) {
  121. String props = null;
  122. switch (path) {
  123. case PATH_CALDAV:
  124. case PATH_CARDDAV:
  125. props = "<current-user-principal><href>" + path + SUBPATH_PRINCIPAL + "</href></current-user-principal>";
  126. break;
  127. case PATH_CARDDAV + SUBPATH_PRINCIPAL:
  128. props = "<CARD:addressbook-home-set>" +
  129. " <href>" + PATH_CARDDAV + SUBPATH_ADDRESSBOOK_HOMESET + "</href>" +
  130. "</CARD:addressbook-home-set>";
  131. break;
  132. case PATH_CARDDAV + SUBPATH_ADDRESSBOOK:
  133. props = "<resourcetype>" +
  134. " <collection/>" +
  135. " <CARD:addressbook/>" +
  136. "</resourcetype>";
  137. break;
  138. }
  139. App.log.info("Sending props: " + props);
  140. return new MockResponse()
  141. .setResponseCode(207)
  142. .setBody("<multistatus xmlns='DAV:' xmlns:CARD='urn:ietf:params:xml:ns:carddav'>" +
  143. "<response>" +
  144. " <href>" + rq.getPath() + "</href>" +
  145. " <propstat><prop>" + props + "</prop></propstat>" +
  146. "</response>" +
  147. "</multistatus>");
  148. }
  149. return new MockResponse().setResponseCode(404);
  150. }
  151. private boolean checkAuth(RecordedRequest rq) {
  152. return "Basic bW9jazoxMjM0NQ==".equals(rq.getHeader("Authorization"));
  153. }
  154. }
  155. }