@Test
  public void testEquals() throws Exception {
    KeyBundle kb1 = KeyBundle.withRandomKeys();
    KeyBundle kb2 = KeyBundle.withRandomKeys();
    CollectionKeys a = CollectionKeys.generateCollectionKeys();
    CollectionKeys b = CollectionKeys.generateCollectionKeys();

    // Random keys are different.
    assertFalse(a.equals(b));
    assertFalse(b.equals(a));

    // keys with unset default key bundles are different.
    b.setDefaultKeyBundle(null);
    assertFalse(a.equals(b));

    // keys with equal default key bundles and no other collections are the same.
    b.setDefaultKeyBundle(a.defaultKeyBundle());
    assertTrue(a.equals(b));

    // keys with equal defaults and equal collections are the same.
    a.setKeyBundleForCollection("1", kb1);
    b.setKeyBundleForCollection("1", kb1);
    assertTrue(a.equals(b));

    // keys with equal defaults but some collection missing are different.
    a.setKeyBundleForCollection("2", kb2);
    assertFalse(a.equals(b));
    assertFalse(b.equals(a));

    // keys with equal defaults and some collection set to the default are the same.
    a.setKeyBundleForCollection("2", a.defaultKeyBundle());
    b.setKeyBundleForCollection("3", b.defaultKeyBundle());
    assertTrue(a.equals(b));
    assertTrue(b.equals(a));
  }
  @Test
  public void testKeyForCollection() throws CryptoException, NoCollectionKeysSetException {
    CollectionKeys ck = new CollectionKeys();
    try {
      ck.keyBundleForCollection("test");
      fail("keyForCollection should throw.");
    } catch (NoCollectionKeysSetException ex) {
      // Good.
    }
    KeyBundle testKeys = KeyBundle.withRandomKeys();
    KeyBundle otherKeys = KeyBundle.withRandomKeys();

    ck.setDefaultKeyBundle(testKeys);
    assertEquals(testKeys, ck.defaultKeyBundle());
    assertEquals(testKeys, ck.keyBundleForCollection("test")); // Returns default.

    ck.setKeyBundleForCollection("test", otherKeys);
    assertEquals(otherKeys, ck.keyBundleForCollection("test")); // Returns default.
  }
 @Test
 public void testDefaultKeys() throws CryptoException, NoCollectionKeysSetException {
   CollectionKeys ck = new CollectionKeys();
   try {
     ck.defaultKeyBundle();
     fail("defaultKeys should throw.");
   } catch (NoCollectionKeysSetException ex) {
     // Good.
   }
   KeyBundle testKeys = KeyBundle.withRandomKeys();
   ck.setDefaultKeyBundle(testKeys);
   assertEquals(testKeys, ck.defaultKeyBundle());
 }
  @Test
  public void testDifferences() throws Exception {
    KeyBundle kb1 = KeyBundle.withRandomKeys();
    KeyBundle kb2 = KeyBundle.withRandomKeys();
    KeyBundle kb3 = KeyBundle.withRandomKeys();
    CollectionKeys a = CollectionKeys.generateCollectionKeys();
    CollectionKeys b = CollectionKeys.generateCollectionKeys();
    Set<String> diffs;

    a.setKeyBundleForCollection("1", kb1);
    b.setKeyBundleForCollection("1", kb1);
    diffs = CollectionKeys.differences(a, b);
    assertTrue(diffs.isEmpty());

    a.setKeyBundleForCollection("2", kb2);
    diffs = CollectionKeys.differences(a, b);
    assertArrayEquals(new String[] {"2"}, diffs.toArray(new String[diffs.size()]));

    b.setKeyBundleForCollection("3", kb3);
    diffs = CollectionKeys.differences(a, b);
    assertEquals(2, diffs.size());
    assertTrue(diffs.contains("2"));
    assertTrue(diffs.contains("3"));

    b.setKeyBundleForCollection("1", KeyBundle.withRandomKeys());
    diffs = CollectionKeys.differences(a, b);
    assertEquals(3, diffs.size());

    // This tests that explicitly setting a default key works.
    a = CollectionKeys.generateCollectionKeys();
    b = CollectionKeys.generateCollectionKeys();
    b.setDefaultKeyBundle(a.defaultKeyBundle());
    a.setKeyBundleForCollection("a", a.defaultKeyBundle());
    b.setKeyBundleForCollection("b", b.defaultKeyBundle());
    assertTrue(CollectionKeys.differences(a, b).isEmpty());
    assertTrue(CollectionKeys.differences(b, a).isEmpty());
  }