jmark99 commented on a change in pull request #409: ACCUMULO-4791 fix 
setshelliter usage
URL: https://github.com/apache/accumulo/pull/409#discussion_r178321120
 
 

 ##########
 File path: test/src/main/java/org/apache/accumulo/test/ShellServerIT.java
 ##########
 @@ -1737,60 +1737,112 @@ public void scansWithClassLoaderContext() throws 
Exception {
       assertTrue(true);
     }
     ts.exec("createtable t");
+    // Assert that the TabletServer does not know anything about our class
+    String result = ts.exec("setiter -scan -n reverse -t t -p 21 -class 
org.apache.accumulo.test.functional.ValueReversingIterator");
+    assertTrue(result.contains("class not found"));
     make10();
     setupFakeContextPath();
-    // Add the context to the table so that setscaniter works. After 
setscaniter succeeds, then
-    // remove the property from the table.
-    ts.exec("config -s " + Property.VFS_CONTEXT_CLASSPATH_PROPERTY + 
FAKE_CONTEXT + "=" + FAKE_CONTEXT_CLASSPATH);
-    ts.exec("config -t t -s table.classpath.context=" + FAKE_CONTEXT);
-    ts.exec("setscaniter -n reverse -t t -p 21 -class 
org.apache.accumulo.test.functional.ValueReversingIterator");
-    String result = ts.exec("scan -np -b row1 -e row1");
+    // Add the context to the table so that setiter works.
+    result = ts.exec("config -s " + Property.VFS_CONTEXT_CLASSPATH_PROPERTY + 
FAKE_CONTEXT + "=" + FAKE_CONTEXT_CLASSPATH);
+    assertEquals("root@miniInstance t> config -s " + 
Property.VFS_CONTEXT_CLASSPATH_PROPERTY + FAKE_CONTEXT + "=" + 
FAKE_CONTEXT_CLASSPATH + "\n", result);
+
+    result = ts.exec("config -t t -s table.classpath.context=" + FAKE_CONTEXT);
+    assertEquals("root@miniInstance t> config -t t -s 
table.classpath.context=" + FAKE_CONTEXT + "\n", result);
+
+    result = ts.exec("setshelliter -pn baz -n reverse -p 21 -class 
org.apache.accumulo.test" + ".functional.ValueReversingIterator");
+    assertTrue(result.contains("The iterator class does not implement 
OptionDescriber"));
+
+    // The implementation of ValueReversingIterator in the FAKE context does 
nothing, the value is not reversed.
+    result = ts.exec("scan -pn baz -np -b row1 -e row1");
     assertEquals(2, result.split("\n").length);
-    log.error(result);
     assertTrue(result.contains("value"));
-    result = ts.exec("scan -np -b row3 -e row5");
+    result = ts.exec("scan -pn baz -np -b row3 -e row5");
     assertEquals(4, result.split("\n").length);
     assertTrue(result.contains("value"));
-    result = ts.exec("scan -np -r row3");
+    result = ts.exec("scan -pn baz -np -r row3");
     assertEquals(2, result.split("\n").length);
     assertTrue(result.contains("value"));
-    result = ts.exec("scan -np -b row:");
+    result = ts.exec("scan -pn baz -np -b row:");
     assertEquals(1, result.split("\n").length);
-    result = ts.exec("scan -np -b row");
+    result = ts.exec("scan -pn baz -np -b row");
     assertEquals(11, result.split("\n").length);
     assertTrue(result.contains("value"));
-    result = ts.exec("scan -np -e row:");
+    result = ts.exec("scan -pn baz -np -e row:");
     assertEquals(11, result.split("\n").length);
     assertTrue(result.contains("value"));
 
     setupRealContextPath();
-    ts.exec("config -s " + Property.VFS_CONTEXT_CLASSPATH_PROPERTY + 
REAL_CONTEXT + "=" + REAL_CONTEXT_CLASSPATH);
-    result = ts.exec("scan -np -b row1 -e row1 -cc " + REAL_CONTEXT);
-    log.error(result);
+    // Define a new classloader context, but don't set it on the table
+    result = ts.exec("config -s " + Property.VFS_CONTEXT_CLASSPATH_PROPERTY + 
REAL_CONTEXT + "=" + REAL_CONTEXT_CLASSPATH);
+    assertEquals("root@miniInstance t> config -s " + 
Property.VFS_CONTEXT_CLASSPATH_PROPERTY + REAL_CONTEXT + "=" + 
REAL_CONTEXT_CLASSPATH + "\n", result);
+    // Override the table classloader context with the REAL implementation of 
ValueReversingIterator, which does reverse the value.
+    result = ts.exec("scan -pn baz -np -b row1 -e row1 -cc " + REAL_CONTEXT);
     assertEquals(2, result.split("\n").length);
     assertTrue(result.contains("eulav"));
     assertFalse(result.contains("value"));
-    result = ts.exec("scan -np -b row3 -e row5 -cc " + REAL_CONTEXT);
+    result = ts.exec("scan -pn baz -np -b row3 -e row5 -cc " + REAL_CONTEXT);
     assertEquals(4, result.split("\n").length);
     assertTrue(result.contains("eulav"));
     assertFalse(result.contains("value"));
-    result = ts.exec("scan -np -r row3 -cc " + REAL_CONTEXT);
+    result = ts.exec("scan -pn baz -np -r row3 -cc " + REAL_CONTEXT);
     assertEquals(2, result.split("\n").length);
     assertTrue(result.contains("eulav"));
     assertFalse(result.contains("value"));
-    result = ts.exec("scan -np -b row: -cc " + REAL_CONTEXT);
+    result = ts.exec("scan -pn baz -np -b row: -cc " + REAL_CONTEXT);
     assertEquals(1, result.split("\n").length);
-    result = ts.exec("scan -np -b row -cc " + REAL_CONTEXT);
+    result = ts.exec("scan -pn baz -np -b row -cc " + REAL_CONTEXT);
     assertEquals(11, result.split("\n").length);
     assertTrue(result.contains("eulav"));
     assertFalse(result.contains("value"));
-    result = ts.exec("scan -np -e row: -cc " + REAL_CONTEXT);
+    result = ts.exec("scan -pn baz -np -e row: -cc " + REAL_CONTEXT);
     assertEquals(11, result.split("\n").length);
     assertTrue(result.contains("eulav"));
     assertFalse(result.contains("value"));
     ts.exec("deletetable -f t");
   }
 
+  /**
+   * The purpose of this test is to verify that you can successfully scan a 
table that has an iterator set but not via the shellIter capability. Purpose is 
to
+   * verify that the scansWithClassLoaderContext test can handle situations 
with both normal iterators and shell iterators.
+   */
+  @Test
+  public void testScanTableWithIterSetWithoutProfile() throws Exception {
+    final String table = name.getMethodName();
+
+    // create a table
+    ts.exec("createtable " + table, true);
+
+    // add some data
+    ts.exec("insert foo a b c", true);
+    ts.exec("scan", true, "foo a:b []    c");
+
+    // create a normal iterator while in current table context
+    ts.input.set("\n5000\n\n");
 
 Review comment:
   done

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
[email protected]


With regards,
Apache Git Services

Reply via email to