@Test
  public void testDropPrimaryKey() throws Exception {
    Connection conn = connectionMock;
    String tableName = "tableName";

    DbUpgradeUtils.dropPrimaryKeyIfExists(conn, tableName);

    verify(daoMock, times(1)).dropPrimaryKey(conn, tableName);
  }
  @Test
  public void testDropTableColumnsIfExistWhenNoKeysAreSupplied() throws Exception {
    Connection conn = connectionMock;
    String tableName = "tableName";
    List<String> columns = new ArrayList<String>();

    DbUpgradeUtils.dropTableColumnsIfExist(conn, tableName, columns);

    verify(daoMock, times(0)).columnExists(eq(conn), eq(tableName), anyString());
    verify(daoMock, times(0)).dropColumn(eq(conn), eq(tableName), anyString());
  }
  @Test
  public void testDropKeyIfExistWhenNoKeysAreSupplied() throws Exception {
    Connection conn = connectionMock;
    String tableName = "tableName";
    List<String> keys = new ArrayList<String>();
    boolean isForeignKey = false;

    DbUpgradeUtils.dropKeysIfExist(conn, tableName, keys, isForeignKey);

    verify(daoMock, times(0)).dropKey(eq(conn), eq(tableName), anyString(), eq(isForeignKey));
  }
  @Test
  public void testDropKeyIfExistWhenOneKeysIsSupplied() throws Exception {
    Connection conn = connectionMock;
    String tableName = "tableName";
    String key = "key";
    List<String> keys = Arrays.asList(new String[] {key});
    boolean isForeignKey = false;

    DbUpgradeUtils.dropKeysIfExist(conn, tableName, keys, isForeignKey);

    verify(daoMock, times(1)).dropKey(conn, tableName, key, isForeignKey);
  }
  @Test
  public void testDropTableColumnsIfExistWhenOneKeysIsSuppliedAndColumnExists() throws Exception {
    Connection conn = connectionMock;
    String tableName = "tableName";
    String column = "column";
    when(daoMock.columnExists(conn, tableName, column)).thenReturn(true);
    List<String> columns = Arrays.asList(new String[] {column});

    DbUpgradeUtils.dropTableColumnsIfExist(conn, tableName, columns);

    verify(daoMock, times(1)).columnExists(conn, tableName, column);
    verify(daoMock, times(1)).dropColumn(conn, tableName, column);
  }
  private void fixForeignKeys(Connection conn) {
    HashMap<String, List<String>> foreignKeys = new HashMap<String, List<String>>();
    List<String> keys = new ArrayList<String>();
    keys.add("fk_networks__data_center_id");
    foreignKeys.put("networks", keys);

    // drop all foreign keys
    s_logger.debug("Dropping old key fk_networks__data_center_id...");
    for (String tableName : foreignKeys.keySet()) {
      DbUpgradeUtils.dropKeysIfExist(conn, tableName, foreignKeys.get(tableName), true);
    }

    try {
      PreparedStatement pstmt =
          conn.prepareStatement(
              "ALTER TABLE `cloud`.`networks` ADD CONSTRAINT `fk_networks__data_center_id` FOREIGN KEY (`data_center_id`) REFERENCES `data_center`(`id`) ON DELETE CASCADE");
      pstmt.executeUpdate();
    } catch (SQLException e) {
      throw new CloudRuntimeException("Unable to reinsert data center key for the network", e);
    }

    // drop primary keys
    DbUpgradeUtils.dropPrimaryKeyIfExists(conn, "cloud_usage.usage_load_balancer_policy");
    DbUpgradeUtils.dropPrimaryKeyIfExists(conn, "cloud_usage.usage_port_forwarding");

    // Drop usage_network_offering unique key
    try {
      PreparedStatement pstmt =
          conn.prepareStatement(
              "drop index network_offering_id on cloud_usage.usage_network_offering");
      pstmt.executeUpdate();
      s_logger.debug("Dropped usage_network_offering unique key");
    } catch (Exception e) {
      // Ignore error if the usage_network_offering table or the unique key doesn't exist
    }
  }
  @Test
  public void testDropTableColumnsIfExistWhenThreeKeysAreSuppliedAnOneDoesnotExist()
      throws Exception {
    Connection conn = connectionMock;
    String tableName = "tableName";
    String column1 = "column1";
    String column2 = "column2";
    String column3 = "column3";
    when(daoMock.columnExists(conn, tableName, column1)).thenReturn(true);
    when(daoMock.columnExists(conn, tableName, column2)).thenReturn(false);
    when(daoMock.columnExists(conn, tableName, column3)).thenReturn(true);
    List<String> keys = Arrays.asList(new String[] {column1, column2, column3});

    DbUpgradeUtils.dropTableColumnsIfExist(conn, tableName, keys);

    verify(daoMock, times(1)).columnExists(conn, tableName, column1);
    verify(daoMock, times(1)).dropColumn(conn, tableName, column1);
    verify(daoMock, times(1)).columnExists(conn, tableName, column2);
    verify(daoMock, times(0)).dropColumn(conn, tableName, column2);
    verify(daoMock, times(1)).columnExists(conn, tableName, column3);
    verify(daoMock, times(1)).dropColumn(conn, tableName, column3);
  }