@Test
  public void testWindowsPerfmonInputCrud() {
    Service service = connect();
    InputCollection inputCollection = service.getInputs();
    ServiceInfo info = service.getInfo();

    if (info.getOsName().equals("Windows")) {
      String name = "sdk-input-wp";
      Args args = new Args();

      if (inputCollection.containsKey(name)) {
        inputCollection.remove(name);
        inputCollection.refresh();
      }
      assertFalse(assertRoot + "#57", inputCollection.containsKey(name));

      // CRUD Windows Perfmon Input
      args.put("interval", 600);
      args.put("object", "Server");
      inputCollection.create(name, InputKind.WindowsPerfmon, args);
      assertTrue(assertRoot + "#58", inputCollection.containsKey(name));
      WindowsPerfmonInput windowsPerfmonInput = (WindowsPerfmonInput) inputCollection.get(name);

      windowsPerfmonInput.setIndex("main");
      windowsPerfmonInput.setCounters("% Privileged Time");
      windowsPerfmonInput.setInstances("wininit");
      windowsPerfmonInput.setObject("Process");
      windowsPerfmonInput.setInterval(1200);
      windowsPerfmonInput.update();

      assertEquals(assertRoot + "#59", 1, windowsPerfmonInput.getCounters().length);
      assertTrue(
          assertRoot + "#60", contains(windowsPerfmonInput.getCounters(), "% Privileged Time"));
      assertEquals(windowsPerfmonInput.getIndex(), "main");
      assertTrue(assertRoot + "#61", contains(windowsPerfmonInput.getInstances(), "wininit"));
      assertEquals(assertRoot + "#62", 1200, windowsPerfmonInput.getInterval());
      assertEquals(assertRoot + "#63", "Process", windowsPerfmonInput.getObject());

      // set multi-series values and update.
      windowsPerfmonInput.setCounters(new String[] {"% Privileged Time", "% User Time"});
      windowsPerfmonInput.setInstances(new String[] {"smss", "csrss"});
      windowsPerfmonInput.update();

      assertEquals(assertRoot + "#64", 2, windowsPerfmonInput.getCounters().length);
      assertTrue(
          assertRoot + "#65", contains(windowsPerfmonInput.getCounters(), "% Privileged Time"));
      assertTrue(assertRoot + "#66", contains(windowsPerfmonInput.getCounters(), "% User Time"));

      assertEquals(assertRoot + "#67", 2, windowsPerfmonInput.getInstances().length);
      assertTrue(assertRoot + "#68", contains(windowsPerfmonInput.getInstances(), "smss"));
      assertTrue(assertRoot + "#69", contains(windowsPerfmonInput.getInstances(), "csrss"));

      windowsPerfmonInput.remove();
      inputCollection.refresh();
      assertFalse(assertRoot + "#70", inputCollection.containsKey(name));
    }
  }
  @Test
  public void testWindowsRegistryInputCrud() {
    Service service = connect();
    InputCollection inputCollection = service.getInputs();
    ServiceInfo info = service.getInfo();

    if (info.getOsName().equals("Windows")) {
      String name = "sdk-input-wr";
      Args args = new Args();

      if (service.versionCompare("4.3") < 0) return;

      if (inputCollection.containsKey(name)) {
        inputCollection.remove(name);
        inputCollection.refresh();
      }
      assertFalse(assertRoot + "#71", inputCollection.containsKey(name));

      // CRUD Windows Registry Input
      args.put("disabled", true);
      args.put("baseline", false);
      args.put("hive", "HKEY_USERS");
      args.put("proc", "*");
      args.put("type", "*");
      inputCollection.create(name, InputKind.WindowsRegistry, args);
      assertTrue(assertRoot + "#72", inputCollection.containsKey(name));
      WindowsRegistryInput windowsRegistryInput = (WindowsRegistryInput) inputCollection.get(name);

      windowsRegistryInput.setIndex("main");
      windowsRegistryInput.setMonitorSubnodes(true);
      windowsRegistryInput.update();

      assertFalse(assertRoot + "#73", windowsRegistryInput.getBaseline());
      assertEquals(assertRoot + "#74", "main", windowsRegistryInput.getIndex());

      // adjust a few of the arguments
      windowsRegistryInput.setType("create,delete");
      windowsRegistryInput.setBaseline(false);
      windowsRegistryInput.update();

      assertEquals(assertRoot + "#75", "*", windowsRegistryInput.getProc());
      assertTrue(assertRoot + "#76", windowsRegistryInput.getType().contains("create"));
      assertTrue(assertRoot + "#77", windowsRegistryInput.getType().contains("delete"));
      assertFalse(assertRoot + "#78", windowsRegistryInput.getBaseline());

      windowsRegistryInput.remove();
      inputCollection.refresh();
      assertFalse(assertRoot + "#79", inputCollection.containsKey(name));
    }
  }
  public void installApplicationFromTestData(String applicationName) {
    String collectionName = "sdk-app-collection";
    if (!service.getApplications().containsKey("sdk-app-collection")) {
      throw new TestDataNotInstalledException();
    }

    String splunkHome = service.getSettings().getSplunkHome();

    // This is the filename separator sequence for splunkd, not
    // the Splunk SDK. Therefore we can't just use File.separator here.
    String separator;
    if (splunkHome.contains("/") && splunkHome.contains("\\")) {
      // Windows - allows mixed paths
      separator = "\\";
    } else if (splunkHome.contains("/")) {
      // Unix or Mac OS X
      separator = "/";
    } else if (splunkHome.contains("\\")) {
      // Windows
      separator = "\\";
    } else {
      throw new RuntimeException(
          "Couldn't determine what the path separator was " + "for splunkd.");
    }

    String[] pathComponents = {
      splunkHome, "etc", "apps", collectionName, "build", applicationName + ".tar"
    };
    String appPath = Util.join(separator, pathComponents);

    Args args = new Args();
    args.put("name", appPath);
    args.put("update", "1");
    service.post("apps/appinstall", args);

    installedApps.add(applicationName);
  }
  @Test
  public void testScriptInputCrud() {
    Service service = connect();
    InputCollection inputCollection = service.getInputs();
    ServiceInfo info = service.getInfo();

    // CRUD Script input
    String filename;
    if (info.getOsName().equals("Windows")) filename = "echo.bat";
    else filename = "echo.sh";

    Args args = new Args();
    args.clear();
    args.put("interval", "60");
    if (inputCollection.get(filename) != null) {
      inputCollection.remove(filename);
    }
    inputCollection.create(filename, InputKind.Script, args);
    assertTrue(assertRoot + "#11", inputCollection.containsKey(filename));
    ScriptInput scriptInput = (ScriptInput) inputCollection.get(filename);

    scriptInput.setHost("three.four.com");
    scriptInput.setIndex("main");
    scriptInput.setInterval("120");
    if (service.versionCompare("4.2.4") >= 0) {
      scriptInput.setPassAuth("admin");
    }
    scriptInput.setRenameSource("renamedSource");
    scriptInput.setSource("source");
    scriptInput.setSourcetype("script");
    scriptInput.update();

    assertEquals(assertRoot + "#12", "three.four.com", scriptInput.getHost());
    assertEquals(assertRoot + "#13", "main", scriptInput.getIndex());
    assertEquals(assertRoot + "#14", "120", scriptInput.getInterval());
    if (service.versionCompare("4.2.4") >= 0) {
      assertEquals(assertRoot + "#15", "admin", scriptInput.getPassAuth());
    }
    assertEquals(assertRoot + "#16", "renamedSource", scriptInput.getSource());
    assertEquals(assertRoot + "#17", "script", scriptInput.getSourceType());

    scriptInput.remove();
    inputCollection.refresh();
    assertFalse(assertRoot + "#18", inputCollection.containsKey(filename));
  }
  @Test
  public void testWindowsEventLogInputCrud() {
    Service service = connect();
    InputCollection inputCollection = service.getInputs();
    ServiceInfo info = service.getInfo();

    if (info.getOsName().equals("Windows")) {
      String name = "sdk-input-wel";
      Args args = new Args();

      if (inputCollection.containsKey(name)) {
        inputCollection.remove(name);
        inputCollection.refresh();
      }
      assertFalse(assertRoot + "#52", inputCollection.containsKey(name));

      // CRUD Windows Event Log Input
      args.put("lookup_host", "127.0.0.1");
      inputCollection.create(name, InputKind.WindowsEventLog, args);
      assertTrue(assertRoot + "#53", inputCollection.containsKey(name));
      WindowsEventLogInput windowsEventLogInput = (WindowsEventLogInput) inputCollection.get(name);

      windowsEventLogInput.setIndex("main");
      windowsEventLogInput.setLookupHost("127.0.0.1");
      windowsEventLogInput.setHosts("one.two.three,four.five.six");
      windowsEventLogInput.update();

      assertEquals(assertRoot + "#54", "127.0.0.1", windowsEventLogInput.getLookupHost());
      assertEquals(
          assertRoot + "#55", "one.two.three,four.five.six", windowsEventLogInput.getHosts());
      assertEquals(assertRoot + "#55", "main", windowsEventLogInput.getIndex());

      windowsEventLogInput.remove();
      inputCollection.refresh();
      assertFalse(assertRoot + "#56", inputCollection.containsKey(name));
    }
  }
  @Test
  public void testWmiInputCrud() {
    Service service = connect();
    InputCollection inputCollection = service.getInputs();
    ServiceInfo info = service.getInfo();

    if (info.getOsName().equals("Windows")) {
      String name = "sdk-input-wmi";
      Args args = new Args();

      if (inputCollection.containsKey(name)) {
        inputCollection.remove(name);
        inputCollection.refresh();
      }
      assertFalse(assertRoot + "#80", inputCollection.containsKey(name));

      // CRUD Windows Wmi Input
      args.put("classes", "PerfOS_Processor");
      args.put("interval", 600);
      args.put("lookup_host", "127.0.0.1");
      inputCollection.create(name, InputKind.WindowsWmi, args);
      assertTrue(assertRoot + "#81", inputCollection.containsKey(name));
      WindowsWmiInput windowsWmiInput = (WindowsWmiInput) inputCollection.get(name);

      assertEquals(
          assertRoot + "#82",
          "Win32_PerfFormattedData_PerfOS_Processor",
          windowsWmiInput.getClasses());
      assertEquals(assertRoot + "#83", 600, windowsWmiInput.getInterval());
      assertEquals(assertRoot + "#84", "127.0.0.1", windowsWmiInput.getLookupHost());

      windowsWmiInput.setClasses("PerfDisk_LogicalDisk");
      windowsWmiInput.setFields("Caption");
      windowsWmiInput.setIndex("main");
      windowsWmiInput.setInterval(1200);
      windowsWmiInput.setInstances("_Total");
      windowsWmiInput.setServers("host1.splunk.com,host2.splunk.com");
      windowsWmiInput.update();

      assertEquals(
          assertRoot + "#85",
          "Win32_PerfFormattedData_PerfDisk_LogicalDisk",
          windowsWmiInput.getClasses());
      assertEquals(assertRoot + "#86", 1, windowsWmiInput.getFields().length);
      assertTrue(assertRoot + "#87", contains(windowsWmiInput.getFields(), "Caption"));
      assertEquals(assertRoot + "#88", "main", windowsWmiInput.getIndex());
      assertEquals(assertRoot + "#89", 1200, windowsWmiInput.getInterval());
      assertEquals(assertRoot + "#90", 1, windowsWmiInput.getInstances().length);
      assertTrue(assertRoot + "#91", contains(windowsWmiInput.getInstances(), "_Total"));
      assertEquals(
          assertRoot + "#92", "host1.splunk.com,host2.splunk.com", windowsWmiInput.getServers());

      // set list fields
      windowsWmiInput.setFields(new String[] {"Caption", "Description"});
      windowsWmiInput.update();

      assertEquals(assertRoot + "#93", 2, windowsWmiInput.getFields().length);
      assertTrue(assertRoot + "#94", contains(windowsWmiInput.getFields(), "Caption"));
      assertTrue(assertRoot + "#95", contains(windowsWmiInput.getFields(), "Description"));

      windowsWmiInput.remove();
      inputCollection.refresh();
      assertFalse(assertRoot + "#96", inputCollection.containsKey(name));
    }
  }