@Test
public void testAddCatalogue_MultiThreads_shouldWork() throws Exception {

  final boolean[] threwException = new boolean[3];
  Thread thread1 =
      new Thread(
          new Runnable() {
            @Override
            public void run() {
              try {
                Registry.addCatalogue("catalogue", new Catalogue1());
                threwException[0] = false;
              } catch (GeneralSecurityException e) {
                threwException[0] = true;
              }
            }
          });
  Thread thread2 =
      new Thread(
          new Runnable() {
            @Override
            public void run() {
              try {
                Registry.addCatalogue("catalogue", new Catalogue2());
                threwException[1] = false;
              } catch (GeneralSecurityException e) {
                threwException[1] = true;
              }
            }
          });
  Thread thread3 =
      new Thread(
          new Runnable() {
            @Override
            public void run() {
              try {
                Registry.addCatalogue("catalogue", new Catalogue3());
                threwException[2] = false;
              } catch (GeneralSecurityException e) {
                threwException[2] = true;
              }
            }
          });
  // Start the threads.
  thread1.start();
  thread2.start();
  thread3.start();
  // Wait until all threads finished.
  thread1.join();
  thread2.join();
  thread3.join();
  // Count threads that threw exception.
  int count = 0;
  for (int i = 0; i < 3; i++) {
    if (threwException[i]) {
      count++;
    }
  }
  assertThat(count).isEqualTo(2);
}