/**
   * Finds the menu that can be used by the owner to control the participant. Hovers over it. Finds
   * the mute link and mute it. Then checks in the second participant page whether it is muted
   */
  public void ownerMutesParticipantAndCheck() {
    System.err.println("Start ownerMutesParticipantAndCheck.");

    WebDriver owner = ConferenceFixture.getOwner();

    WebElement elem =
        owner.findElement(By.xpath("//div[@class='remotevideomenu']/i[@class='fa fa-angle-down']"));

    Actions action = new Actions(owner);
    action.moveToElement(elem);
    action.perform();

    TestUtils.waitForDisplayedElementByXPath(
        owner, "//ul[@class='popupmenu']/li/a[@class='mutelink']", 5);

    owner.findElement(By.xpath("//ul[@class='popupmenu']/li/a[@class='mutelink']")).click();

    // and now check whether second participant is muted
    TestUtils.waitForElementByXPath(
        ConferenceFixture.getSecondParticipant(),
        "//span[@class='audioMuted']/i[@class='icon-mic-disabled']",
        5);

    action.release();
  }
  /**
   * UnMutes once again the second participant and checks in the owner page does this change is
   * reflected.
   */
  public void participantUnMutesAfterOwnerMutedHimAndCheck() {
    MeetUIUtils.clickOnToolbarButton(ConferenceFixture.getSecondParticipant(), "mute");

    TestUtils.waitsForElementNotPresentByXPath(
        ConferenceFixture.getOwner(),
        "//span[@class='audioMuted']/i[@class='icon-mic-disabled']",
        5);

    // lets give time to the ui to reflect the change in the ui of the owner
    TestUtils.waits(1000);
  }
  /**
   * Closes the participant and leaves the owner alone in the room. Mutes the owner and then joins
   * new participant and checks the status of the mute icon. At the end unmutes to clear the state.
   */
  public void muteOwnerBeforeSecondParticipantJoins() {
    System.err.println("Start muteOwnerBeforeSecondParticipantJoins.");

    WebDriver owner = ConferenceFixture.getOwner();
    ConferenceFixture.close(ConferenceFixture.getSecondParticipant());

    // just in case wait
    TestUtils.waitMillis(1000);

    MeetUIUtils.clickOnToolbarButton(owner, "toolbar_button_mute");

    WebDriver secondParticipant = ConferenceFixture.startSecondParticipant();

    MeetUtils.waitForParticipantToJoinMUC(secondParticipant, 15);

    MeetUtils.waitForIceConnected(secondParticipant);

    MeetUIUtils.assertMuteIconIsDisplayed(
        secondParticipant,
        owner,
        true, // should be muted
        false, // audio
        "owner");

    // now lets unmute
    unMuteOwnerAndCheck();
  }
  /** Mutes the owner and checks at other participant is this is visible. */
  public void muteOwnerAndCheck() {
    toggleMuteAndCheck(
        "muteOwnerAndCheck",
        ConferenceFixture.getOwner(),
        "owner",
        ConferenceFixture.getSecondParticipant(),
        true);

    TestUtils.waitMillis(2000);
  }
  /**
   * UnMutes once again the second participant and checks in the owner page does this change is
   * reflected.
   */
  public void participantUnMutesAfterOwnerMutedHimAndCheck() {
    System.err.println("Start participantUnMutesAfterOwnerMutedHimAndCheck.");

    TestUtils.waitMillis(1000);

    MeetUIUtils.clickOnToolbarButton(
        ConferenceFixture.getSecondParticipant(), "toolbar_button_mute");

    TestUtils.waitMillis(1000);

    MeetUIUtils.assertMuteIconIsDisplayed(
        ConferenceFixture.getOwner(),
        ConferenceFixture.getSecondParticipant(),
        false, // should be unmuted
        false, // audio
        "participant2");

    // lets give time to the ui to reflect the change in the ui of the owner
    TestUtils.waitMillis(1000);
  }
  /**
   * Closes the participant and leaves the owner alone in the room. Mutes the owner and then joins
   * new participant and checks the status of the mute icon. At the end unmutes to clear the state.
   */
  public void muteOwnerBeforeSecondParticipantJoins() {
    ConferenceFixture.quit(ConferenceFixture.getSecondParticipant());

    // just in case wait
    TestUtils.waits(1000);

    MeetUIUtils.clickOnToolbarButton(ConferenceFixture.getOwner(), "mute");

    ConferenceFixture.startParticipant();

    ConferenceFixture.checkParticipantToJoinRoom(ConferenceFixture.getSecondParticipant(), 10);

    ConferenceFixture.waitsParticipantToJoinConference(ConferenceFixture.getSecondParticipant());

    TestUtils.waitsForElementByXPath(
        ConferenceFixture.getSecondParticipant(),
        "//span[@class='audioMuted']/i[@class='icon-mic-disabled']",
        5);

    // now lets unmute
    unMuteOwnerAndCheck();
  }
  public void testCoordVar(NetcdfFile ncfile) {

    Variable lat = ncfile.findVariable("lat");
    assert null != lat;
    assert lat.getShortName().equals("lat");
    assert lat.getRank() == 1;
    assert lat.getSize() == 3;
    assert lat.getShape()[0] == 3;
    assert lat.getDataType() == DataType.FLOAT;

    assert !lat.isUnlimited();
    assert lat.getDimension(0).equals(ncfile.findDimension("lat"));

    Attribute att = lat.findAttribute("units");
    assert null != att;
    assert !att.isArray();
    assert att.isString();
    assert att.getDataType() == DataType.STRING;
    assert att.getStringValue().equals("degrees_north");
    assert att.getNumericValue() == null;
    assert att.getNumericValue(3) == null;

    try {
      Array data = lat.read();
      assert data.getRank() == 1;
      assert data.getSize() == 3;
      assert data.getShape()[0] == 3;
      assert data.getElementType() == float.class;

      IndexIterator dataI = data.getIndexIterator();
      assert TestUtils.close(dataI.getDoubleNext(), 41.0);
      assert TestUtils.close(dataI.getDoubleNext(), 40.0);
      assert TestUtils.close(dataI.getDoubleNext(), 39.0);
    } catch (IOException io) {
    }
  }
  public void readSlice(NetcdfFile ncfile, int[] origin, int[] shape, String name)
      throws IOException, InvalidRangeException {

    Variable v = ncfile.findVariable(name);

    Array data = v.read(origin, shape);
    assert data.getRank() == 3;
    assert data.getSize() == shape[0] * shape[1] * shape[2];
    assert data.getShape()[0] == shape[0] : data.getShape()[0] + " " + shape[0];
    assert data.getShape()[1] == shape[1];
    assert data.getShape()[2] == shape[2];
    assert data.getElementType() == double.class;

    Index tIndex = data.getIndex();
    for (int i = 0; i < shape[0]; i++)
      for (int j = 0; j < shape[1]; j++)
        for (int k = 0; k < shape[2]; k++) {
          double val = data.getDouble(tIndex.set(i, j, k));
          // System.out.println(" "+val);
          assert TestUtils.close(val, 100 * (i + origin[0]) + 10 * j + k) : val;
        }
  }
  public void testReadData(NetcdfFile ncfile, String name) throws IOException {

    Variable v = ncfile.findVariable(name);
    assert null != v;
    assert v.getShortName().equals(name);
    assert v.getRank() == 3;
    assert v.getSize() == 36 : v.getSize();
    assert v.getShape()[0] == 3;
    assert v.getShape()[1] == 3;
    assert v.getShape()[2] == 4;
    assert v.getDataType() == DataType.DOUBLE;

    assert !v.isCoordinateVariable();

    assert v.getDimension(0) == ncfile.findDimension("time");
    assert v.getDimension(1) == ncfile.findDimension("lat");
    assert v.getDimension(2) == ncfile.findDimension("lon");

    Array data = v.read();
    assert data.getRank() == 3;
    assert data.getSize() == 36;
    assert data.getShape()[0] == 3;
    assert data.getShape()[1] == 3;
    assert data.getShape()[2] == 4;
    assert data.getElementType() == double.class;

    int[] shape = data.getShape();
    Index tIndex = data.getIndex();
    for (int i = 0; i < shape[0]; i++)
      for (int j = 0; j < shape[1]; j++)
        for (int k = 0; k < shape[2]; k++) {
          double val = data.getDouble(tIndex.set(i, j, k));
          // System.out.println(" "+val);
          assert TestUtils.close(val, 100 * i + 10 * j + k) : val;
        }
  }