From cad4ed4711c76f56a7e9c37f15ca0a8ef2e36e99 Mon Sep 17 00:00:00 2001 From: Sebastian Lorenzo Date: Thu, 18 Feb 2021 09:45:53 -0300 Subject: [PATCH] Fix issue regarding tab input and screen --- docs/blazemeter-labs-logo.png | Bin 9036 -> 7828 bytes pom.xml | 2 +- .../jmeter/rte/core/NavigationInput.java | 2 +- .../rte/core/wait/TextWaitCondition.java | 2 +- .../rte/protocols/tn3270/Tn3270Client.java | 72 +++++++++++------- .../recorder/emulator/FieldBasedEmulator.java | 4 +- .../rte/recorder/emulator/StatusPanel.java | 22 +----- .../rte/sampler/gui/BlazemeterLabsLogo.java | 22 +----- .../dark-theme/blazemeter-labs-logo.png | Bin 7921 -> 6828 bytes .../light-theme/blazemeter-labs-logo.png | Bin 9018 -> 7828 bytes .../rte/protocols/tn3270/Tn3270ClientIT.java | 42 +++++----- .../emulator/Xtn5250TerminalEmulatorIT.java | 35 ++++++--- .../login-mixed-fields-and-plain-text.yml | 29 +++++++ .../tn3270/login-success-screen.html | 6 +- .../tn3270/login-welcome-screen.html | 6 +- .../protocols/tn3270/user-menu-screen.html | 34 ++++----- 16 files changed, 150 insertions(+), 128 deletions(-) create mode 100644 src/test/resources/com/blazemeter/jmeter/rte/protocols/tn3270/login-mixed-fields-and-plain-text.yml diff --git a/docs/blazemeter-labs-logo.png b/docs/blazemeter-labs-logo.png index 8694cf143954e6b8c5655c27c4e0ba067aca79b5..beb7b9b9b06aaa82aa206d7c8d54284b79a1a72e 100644 GIT binary patch delta 7514 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 delta 8771 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�py| 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 diff --git a/pom.xml b/pom.xml index d0f754c6..fe2d4b90 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ com.blazemeter.jmeter jmeter-bzm-rte jar - 3.1.0 + 3.1.1 RTEPlugin Sampler as JMeter plugin diff --git a/src/main/java/com/blazemeter/jmeter/rte/core/NavigationInput.java b/src/main/java/com/blazemeter/jmeter/rte/core/NavigationInput.java index 2a211543..b81e1931 100644 --- a/src/main/java/com/blazemeter/jmeter/rte/core/NavigationInput.java +++ b/src/main/java/com/blazemeter/jmeter/rte/core/NavigationInput.java @@ -61,7 +61,7 @@ public Position calculateInputFinalPosition(Position currentPos, @Override public String getCsv() { - return "<" + navigationType + "*" + repeat + ">\t" + input; + return "<" + navigationType + "*" + repeat + ">," + input; } public int getRepeat() { diff --git a/src/main/java/com/blazemeter/jmeter/rte/core/wait/TextWaitCondition.java b/src/main/java/com/blazemeter/jmeter/rte/core/wait/TextWaitCondition.java index 13820069..6e2d0802 100644 --- a/src/main/java/com/blazemeter/jmeter/rte/core/wait/TextWaitCondition.java +++ b/src/main/java/com/blazemeter/jmeter/rte/core/wait/TextWaitCondition.java @@ -38,7 +38,7 @@ public Area getSearchArea() { @Override public String getDescription() { - return "emulator screen area " + searchArea + " to contain " + regex.getPattern(); + return "emulator screen area " + searchArea + " to contain '" + regex.getPattern() + "'"; } public boolean matchesScreen(Screen screen) { diff --git a/src/main/java/com/blazemeter/jmeter/rte/protocols/tn3270/Tn3270Client.java b/src/main/java/com/blazemeter/jmeter/rte/protocols/tn3270/Tn3270Client.java index 6d620073..bc4fdafb 100644 --- a/src/main/java/com/blazemeter/jmeter/rte/protocols/tn3270/Tn3270Client.java +++ b/src/main/java/com/blazemeter/jmeter/rte/protocols/tn3270/Tn3270Client.java @@ -49,8 +49,8 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executors; import java.util.concurrent.TimeoutException; +import java.util.stream.Collectors; import javax.naming.OperationNotSupportedException; -import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -62,7 +62,7 @@ public class Tn3270Client extends BaseProtocolClient { private static final Map AID_COMMANDS = buildAIdCommandsKeysMapping(); private TerminalClient client; - private Map listenersProxies = + private final Map listenersProxies = new ConcurrentHashMap<>(); private static List buildTerminalTypes() { @@ -247,7 +247,7 @@ private void setFieldByNavigationType(NavigationInput i) { } else { exceptionHandler .setPendingError(new OperationNotSupportedException( - "The navigation type \'" + i.getNavigationType() + "\' is not supported")); + "The navigation type '" + i.getNavigationType() + "' is not supported")); } } } @@ -284,12 +284,41 @@ protected ConditionWaiter buildWaiter(WaitCondition waitCondition) { @Override public Screen getScreen() { - // when sscp lu data screen or screens without explicit fields - if (client.getFields().isEmpty()) { - return buildScreenFromText(client.getScreenText().replace("\n", "")); - } else { - return buildScreenFromFields(client.getFields()); + List fields = client.getFields(); + Dimension size = getScreenSize(); + Screen screen = new Screen(size); + String screenText = client.getScreenText().replace("\n", ""); + if (fields.isEmpty()) { + return buildScreenFromText(screenText); + } + int linealPosition = 0; + List unProtectedFields = fields.stream().filter(Field::isUnprotected) + .collect(Collectors.toList()); + for (Field field : unProtectedFields) { + // FirstLocation is the first location of text not counting the position consumed by + // field attributes. First location can be 0 when last empty field of screen. + if (field.getFirstLocation() != 0 && field.getFirstLocation() - 1 != linealPosition) { + String chunk = getChunkOfScreenFrom(screenText, linealPosition, + field.getFirstLocation() - 1); + screen.addSegment(linealPosition, chunk); + linealPosition += chunk.length(); + } + screen.addSegment(linealPosition, " "); + if (!field.getText().isEmpty()) { + if (field.isHidden()) { + screen.addSecretField(linealPosition + 1, field.getText()); + } else { + screen.addField(linealPosition + 1, field.getText()); + } + } + linealPosition += field.getText().length() + 1; + } + if (linealPosition < size.width * size.height) { + String chunk = getChunkOfScreenFrom(screenText, linealPosition, size.height * size.width); + screen.addSegment(linealPosition, chunk); + } + return screen; } private Screen buildScreenFromText(String screenText) { @@ -311,28 +340,13 @@ private Screen buildScreenFromText(String screenText) { return ret; } - private Screen buildScreenFromFields(List fields) { - Dimension size = getScreenSize(); - Screen ret = new Screen(size); - for (Field f : fields) { - int linealPosition = - (f.getFirstLocation() != 0 ? f.getFirstLocation() : size.height * size.width) - 1; - String text = f.isVisible() ? f.getText() : StringUtils.repeat(' ', f.getDisplayLength()); - if (f.isProtected()) { - ret.addSegment(linealPosition, " " + text); - } else { - ret.addSegment(linealPosition, " "); - if (linealPosition + 1 < size.height * size.width) { - if (f.isHidden()) { - ret.addSecretField(linealPosition + 1, text); - } else { - ret.addField(linealPosition + 1, text); - } - - } - } + private String getChunkOfScreenFrom(String screen, int segmentBegin, + int segmentEnd) { + StringBuilder sb = new StringBuilder(); + for (int i = segmentBegin; i < segmentEnd; i++) { + sb.append(screen.charAt(i)); } - return ret; + return sb.toString(); } public Dimension getScreenSize() { diff --git a/src/main/java/com/blazemeter/jmeter/rte/recorder/emulator/FieldBasedEmulator.java b/src/main/java/com/blazemeter/jmeter/rte/recorder/emulator/FieldBasedEmulator.java index 8d8beaf7..8112775b 100644 --- a/src/main/java/com/blazemeter/jmeter/rte/recorder/emulator/FieldBasedEmulator.java +++ b/src/main/java/com/blazemeter/jmeter/rte/recorder/emulator/FieldBasedEmulator.java @@ -49,7 +49,7 @@ protected List getInputFields() { } Iterator it = getFields().listIterator(initialField); int index = 0; - int offset = 1; + int offset = 0; Position lastFieldPosition = null; while (it.hasNext() && index < getFields().size()) { XI5250Field f = it.next(); @@ -61,7 +61,7 @@ protected List getInputFields() { fields.add(label != null ? new LabelInput(label, trimmedInput) : new NavigationInput(f.equals(fieldFromPos) ? 0 : offset, NavigationType.TAB, trimmedInput)); - offset = 1; + offset = trimmedInput.trim().length() == f.getLength() ? 0 : 1; } else { offset++; } diff --git a/src/main/java/com/blazemeter/jmeter/rte/recorder/emulator/StatusPanel.java b/src/main/java/com/blazemeter/jmeter/rte/recorder/emulator/StatusPanel.java index 10ba0479..e24a2789 100644 --- a/src/main/java/com/blazemeter/jmeter/rte/recorder/emulator/StatusPanel.java +++ b/src/main/java/com/blazemeter/jmeter/rte/recorder/emulator/StatusPanel.java @@ -2,6 +2,7 @@ import com.blazemeter.jmeter.rte.sampler.gui.SwingUtils; import com.blazemeter.jmeter.rte.sampler.gui.ThemedIconLabel; +import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import javax.swing.GroupLayout; @@ -76,31 +77,14 @@ private void initIntermittentLabels() { } private MouseListener buildShowHelpOnMouseClickListener() { - return new MouseListener() { + return new MouseAdapter() { @Override - public void mouseClicked(MouseEvent mouseEvent) { + public void mouseClicked(MouseEvent e) { if (helpFrame == null) { helpFrame = new HelpFrame(); } helpFrame.open(); } - - @Override - public void mousePressed(MouseEvent mouseEvent) { - } - - @Override - public void mouseReleased(MouseEvent mouseEvent) { - } - - @Override - public void mouseEntered(MouseEvent mouseEvent) { - } - - @Override - public void mouseExited(MouseEvent mouseEvent) { - } - }; } diff --git a/src/main/java/com/blazemeter/jmeter/rte/sampler/gui/BlazemeterLabsLogo.java b/src/main/java/com/blazemeter/jmeter/rte/sampler/gui/BlazemeterLabsLogo.java index 8e7e2ba8..befd031a 100644 --- a/src/main/java/com/blazemeter/jmeter/rte/sampler/gui/BlazemeterLabsLogo.java +++ b/src/main/java/com/blazemeter/jmeter/rte/sampler/gui/BlazemeterLabsLogo.java @@ -2,8 +2,8 @@ import java.awt.Cursor; import java.awt.Desktop; +import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; @@ -21,7 +21,7 @@ public BlazemeterLabsLogo() { private void setBrowseOnClick(String url) { setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); - addMouseListener(new MouseListener() { + addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent mouseEvent) { if (Desktop.isDesktopSupported()) { @@ -32,24 +32,6 @@ public void mouseClicked(MouseEvent mouseEvent) { } } } - - @Override - public void mousePressed(MouseEvent mouseEvent) { - } - - @Override - public void mouseReleased(MouseEvent mouseEvent) { - } - - @Override - public void mouseEntered(MouseEvent mouseEvent) { - } - - @Override - public void mouseExited(MouseEvent mouseEvent) { - } - }); } - } diff --git a/src/main/resources/dark-theme/blazemeter-labs-logo.png b/src/main/resources/dark-theme/blazemeter-labs-logo.png index de66df6399bb59dbca29fe26306e4d7a56ab6f39..917ecb1b05c0bc6097bacffb4b48b2a6de8d30ae 100644 GIT binary patch delta 6384 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 delta 7486 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 diff --git a/src/main/resources/light-theme/blazemeter-labs-logo.png b/src/main/resources/light-theme/blazemeter-labs-logo.png index becb7beb07d26bb55d6882f438e7fe8b12272d81..beb7b9b9b06aaa82aa206d7c8d54284b79a1a72e 100644 GIT binary patch delta 7189 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 XBajv|ITV-q00000NkvXXu0mjf>{IHc delta 8389 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 bEsy { @@ -151,8 +149,8 @@ private void sendUsernameWithSyncWait() throws Exception { awaitSync(); } - private List buildUsernameField() { - return Collections.singletonList(new CoordInput(new Position(2, 1), USERNAME)); + private Input buildUsernameField() { + return new CoordInput(new Position(2, 1), USERNAME); } @Test @@ -231,8 +229,8 @@ public void shouldThrowTimeoutExceptionWhenSyncWaitAndSlowResponse() throws Exce awaitSync(); } - private void sendEnterAttentionKey(List inputs) throws RteIOException { - client.send(inputs, AttentionKey.ENTER, 0); + private void sendEnterAttentionKey(Input... inputs) throws RteIOException { + client.send(Arrays.asList(inputs), AttentionKey.ENTER, 0); } @Test(expected = TimeoutException.class) @@ -261,13 +259,7 @@ public void shouldThrowTimeoutExceptionWhenTextWaitWithNoMatchingRegex() loadLoginFlow(); connectToVirtualService(); sendEnterAttentionKey(buildUsernameField()); - client.await(Collections - .singletonList(new TextWaitCondition(new Perl5Compiler().compile("testing-wait-text"), - new Perl5Matcher(), - Area.fromTopLeftBottomRight(1, 1, Position.UNSPECIFIED_INDEX, - Position.UNSPECIFIED_INDEX), - TIMEOUT_MILLIS, - STABLE_TIMEOUT_MILLIS))); + awaitText("testing-wait-text"); } @Test @@ -294,7 +286,7 @@ public void shouldThrowUnsupportedOperationExceptionWhenSelectAttentionKeyUnsupp throws Exception { loadFlow("login.yml"); connectToVirtualService(); - client.send(buildUsernameField(), AttentionKey.ROLL_UP, 0); + client.send(Collections.singletonList(buildUsernameField()), AttentionKey.ROLL_UP, 0); } @Test @@ -371,8 +363,12 @@ public void shouldThrowTimeoutExceptionWhenMatchedScreenChangedBeforeStablePerio loadFlow("login-with-multiple-flash-screen.yml"); client.connect(VIRTUAL_SERVER_HOST, server.getPort(), SSLType.NONE, getDefaultTerminalType(), TIMEOUT_MILLIS); + awaitText("AAAAA"); + } - client.await(Collections.singletonList(new TextWaitCondition(JMeterUtils.getPattern("AAAAA"), + private void awaitText(String text) + throws InterruptedException, TimeoutException, RteIOException { + client.await(Collections.singletonList(new TextWaitCondition(JMeterUtils.getPattern(text), JMeterUtils.getMatcher(), Area.fromTopLeftBottomRight(1, 1, Position.UNSPECIFIED_INDEX, Position.UNSPECIFIED_INDEX), TIMEOUT_MILLIS, STABLE_TIMEOUT_MILLIS))); @@ -382,14 +378,22 @@ public void shouldThrowTimeoutExceptionWhenMatchedScreenChangedBeforeStablePerio public void shouldGetUserMenuScreenWhenSendUserNameWithArrows() throws Exception { loadFlow("login.yml"); connectToVirtualService(); - List inputs = Arrays.asList( - new NavigationInput(1, NavigationType.DOWN, ""), + sendEnterAttentionKey(new NavigationInput(1, NavigationType.DOWN, ""), new NavigationInput(27, NavigationType.RIGHT, ""), new NavigationInput(2, NavigationType.UP, ""), new NavigationInput(1, NavigationType.LEFT, "testusr")); - sendEnterAttentionKey(inputs); awaitSync(); assertThat(client.getScreen().withInvisibleCharsToSpaces()) .isEqualTo(buildScreenFromHtmlFile("user-menu-screen.html")); } + + @Test + public void shouldValidateTextOnScreeWhenScreenBuiltFromPlainTextAndFields() throws Exception { + loadFlow("login-mixed-fields-and-plain-text.yml"); + connectExtendedProtocolClientToVirtualService(); + sendEnterAttentionKey(new NavigationInput(0, NavigationType.TAB, "TESTUSR "), + new NavigationInput(1, NavigationType.TAB, + "TESTPSW" + IntStream.range(0, 35).mapToObj(i -> " ").collect(Collectors.joining()))); + awaitText("Ready"); + } } diff --git a/src/test/java/com/blazemeter/jmeter/rte/recorder/emulator/Xtn5250TerminalEmulatorIT.java b/src/test/java/com/blazemeter/jmeter/rte/recorder/emulator/Xtn5250TerminalEmulatorIT.java index 04347e66..64b884f9 100644 --- a/src/test/java/com/blazemeter/jmeter/rte/recorder/emulator/Xtn5250TerminalEmulatorIT.java +++ b/src/test/java/com/blazemeter/jmeter/rte/recorder/emulator/Xtn5250TerminalEmulatorIT.java @@ -119,7 +119,6 @@ public class Xtn5250TerminalEmulatorIT { @Mock private TerminalEmulatorListener listener; - private String samplerName; private static Screen buildScreen(String text, boolean withFields) { Dimension screenSize = new Dimension(80, 24); @@ -315,10 +314,14 @@ public void shouldCallTheListenerWhenPressAnyAttentionKey() { xtn5250TerminalEmulator.addTerminalEmulatorListener(listener); sendKeyWithCursorUpdate(KeyEvent.VK_F1, 0, 2, 2); verify(listener, timeout(PAUSE_TIMEOUT)).onAttentionKey(AttentionKey.F1, - Collections.singletonList(new CoordInput(new Position(2,2), "")), + Collections.singletonList(buildCoordInput(2, 2)), ""); } + private static CoordInput buildCoordInput(int row, int col) { + return new CoordInput(new Position(row, col), ""); + } + @Test public void shouldCallTheListenerWhenPressControlAttentionKey() { setScreen(""); @@ -326,7 +329,7 @@ public void shouldCallTheListenerWhenPressControlAttentionKey() { sendKeyWithCursorUpdate(KeyEvent.VK_CONTROL, KeyEvent.CTRL_MASK, 2, 2); verify(listener, timeout(PAUSE_TIMEOUT)) .onAttentionKey(AttentionKey.RESET, - Collections.singletonList(new CoordInput(new Position(2, 2), "")), ""); + Collections.singletonList(buildCoordInput(2, 2)), ""); } @Test @@ -433,7 +436,7 @@ public void shouldSendInputByLabelThroughListenerWhenInputByLabel() { sendKeyWithCursorUpdate(KeyEvent.VK_ENTER, 0, 2, 5); List inputs = new ArrayList<>(); inputs.add(new LabelInput(CHUNK_OF_SCREEN, input)); - inputs.add(new CoordInput(new Position(2, 5), "")); + inputs.add(buildCoordInput(2, 5)); verify(listener).onAttentionKey(AttentionKey.ENTER, inputs, ""); } @@ -539,7 +542,7 @@ public void shouldNotifyListenerWhenInputInhibitedOnSampleName() { setSampleName(CONNECTING_LITERAL); sendKeyWithCursorUpdate(KeyEvent.VK_ENTER, 0, 2, 1); verify(listener).onAttentionKey(AttentionKey.ENTER, - Collections.singletonList(new CoordInput(new Position(2, 1), "")), + Collections.singletonList(buildCoordInput(2, 1)), CONNECTING_LITERAL); } @@ -568,6 +571,19 @@ public void shouldSwitchCredentialVisibilityIconWhenClickIcon() { assertThat(((ImageIcon) actual).getImage().equals(expected.getImage())); } + @Test + public void shouldSendTabInputWithoutRepetitionWhenCursorJumpsToNextField() throws Exception { + setScreenWithUserNameAndPasswordFields(); + xtn5250TerminalEmulator.addTerminalEmulatorListener(listener); + sendNavigationKey(KeyEvent.VK_TAB, 0); + sendNavigationKey(KeyEvent.VK_T, 0); + sendNavigationKey(KeyEvent.VK_T, 0); + sendNavigationKey(KeyEvent.VK_ENTER, 0); + verify(listener).onAttentionKey(AttentionKey.ENTER, + Arrays.asList(new NavigationInput(0, NavigationType.TAB, "T"), new NavigationInput(0, + NavigationType.TAB, "T"), buildCoordInput(1, 14)), ""); + } + @Test public void shouldProperBuildInputsWithTabsWhenSendCredentialsUsingVT() { updateCharacterBasedWelcomeScreen(); @@ -635,7 +651,6 @@ private void setupCharacterEmulator(boolean interactive) { xtn5250TerminalEmulator.addTerminalEmulatorListener(listener); xtn5250TerminalEmulator.setScreenSize(COLUMNS, ROWS); xtn5250TerminalEmulator.setScreen(screen); - xtn5250TerminalEmulator.setScreenName(samplerName); characterBasedEmulator.setKeyboardStatus(true); characterBasedEmulator.screenChanged(screen.getText()); if (interactive) { @@ -998,7 +1013,7 @@ public void shouldProperBuildMixedInputsWhenFirstPositionIsMiddleField() throws sendKeyWithCursorUpdate(KeyEvent.VK_Y, 0, 2, 18); assertThat(xtn5250TerminalEmulator.getInputs()).isEqualTo(Arrays.asList(new NavigationInput(0 , NavigationType.TAB, "y"), new LabelInput("Insert Name", "t"), - new CoordInput(new Position(1, 14), ""))); + buildCoordInput(1, 14))); } @@ -1057,7 +1072,7 @@ public void shouldSendAttentionKeyWhenScreenNotConstitutedByFields() { xtn5250TerminalEmulator.addTerminalEmulatorListener(listener); sendKeyWithCursorUpdate(KeyEvent.VK_ENTER, 0, 2, 1); verify(listener).onAttentionKey(AttentionKey.ENTER, - Collections.singletonList(new CoordInput(new Position(2, 1), "")), + Collections.singletonList(buildCoordInput(2, 1)), "sample-name"); } @@ -1067,7 +1082,7 @@ public void shouldSendAttentionKeyAtDesiredPositionWhenSendingAttentionKeyAndScr xtn5250TerminalEmulator.addTerminalEmulatorListener(listener); sendKeyWithCursorUpdate(KeyEvent.VK_ENTER, 0, 2, 18); verify(listener).onAttentionKey(AttentionKey.ENTER, - Collections.singletonList(new CoordInput(new Position(2, 18), "")), ""); + Collections.singletonList(buildCoordInput(2, 18)), ""); } - + } diff --git a/src/test/resources/com/blazemeter/jmeter/rte/protocols/tn3270/login-mixed-fields-and-plain-text.yml b/src/test/resources/com/blazemeter/jmeter/rte/protocols/tn3270/login-mixed-fields-and-plain-text.yml new file mode 100644 index 00000000..551cea5a --- /dev/null +++ b/src/test/resources/com/blazemeter/jmeter/rte/protocols/tn3270/login-mixed-fields-and-plain-text.yml @@ -0,0 +1,29 @@ +- !server { data: FFFD28 } +- !client { data: FFFB28 } +- !server { data: FFFA280802FFF0 } +- !client { data: FFFA28020749424D2D333237382D322D45FFF0 } +- !server { data: FFFE28FFFD18 } +- !client { data: FFFB18 } +- !server { data: FFFA1801FFF0 } +- !client { data: FFFA180049424D2D333237382D322D45FFF0 } +- !server { data: FFFD19FFFB19FFFD00FFFB00 } +- !client { data: FFFB19 } +- !client { data: FFFD19 } +- !client { data: FFFB00 } +- !client { data: FFFD00 } +- !server { data: FFFD00FFFB001100064000F1C2000501FFFF02FFEF } +# Client capabilities +- !client { data: 8800268186001000F4F1F1F2F2F3F3F4F4F5F5F6F6F7F7F8F8F9F9FAFAFBFBFCFCFDFDFEFEFFFFFFFF000F81870500F0F1F1F2F2F4F4F8F8001781810100005000180100D30320009E0258070C0780001181A600000B0100005000180050001800078188000102001B81858200070C000000000700000002B904170100F103C30136FFEF } +- !server { data: 05C7115D6B1D60D9E4D5D5C9D5C7404040E4E2C9D3C4C1E5E540401DE8A961E5D440D6D5D3C9D5C51D60110051404040404040404040404040404040404040404040402842F140404040404083838340404040404040404040402842F44040404040404040404040404040404040404040404040404040404040401100A1404040404040404040404040404040404040404040402842F1404040408383834040404040404040404040402842F4404040404040404040404040404040404040404040404040404040404040401100F1404040404040404040404040404040404040404040402842F14040404040404040404040404040404040402842F44040404040404040404040404040404040404040404040404040404040404040110141404040404040404040404040404040404040404040402842F1404040404040404040404040404040404040402842F440404040404040404040404040404040404040404040404040404040404040110191404040404040404040404040404040404040404040402842F140404040404040404040404040404040404040402842F44040404040404040404040404040814040404040404040404040404040401101E1404040404040404040404040404040404040404040402842F140404040404040404040404040404040404040402842F4404040404040404040404040404040404040404040404040404040404040110231404040404040404040404040404040404040404040402842F140404040404040404040404040404040404040402842F44040404040404040404040404040812842F740D381A2404040404040404011028140404040404040404040402842F6A961E5D440F74BF14BF0402842F14040404040404040404040404040404040402842F440404040404040404040404040404040812842F740E5858781A26BD5E51102D140404040404040404040402842F640D9E2E440F2F0F0F140402842F140404040404040404040404040404040402842F44040404040404040404040404040404081812842F740E2A8A2A3859460E5110321404040404040404040404040404040404040404040402842F1404040404040404040404040404040402842F440404040404040404040404040404040404040404040404040404040404040404040110371404040404040404040404040404040404040404040402842F1404040404040404040404040404040402842F4404040404040404040404040404040404040812842F240C1404040404040404040401103C1404040404040404040404040404040404040404040402842F1404040404040404040404040404040402842F4404040404040404040404040404040404040812842F2404e385a2a38995874004040110411404040404040404040404040404040404040404040402842F1404040404040404040404040404040402842F4404040404040404040404040404040404040812842F240C39694978195A840404040110461404040404040404040404040404040404040404040402842F140404040404040404040404040404040402842F44040404040404040404040404040404040814040404040404040404040404040401104B1404040404040404040404040404040404040404040402842F14040404040404040404040404040404040402842F44040404040404040404040404040404081404040404040404040404040404040110501404040404040404040404040404040404040404040402842F140404040404040404040404040404040404040402842F44040404040404040404040404040408128427F40404040404040404040401105501DF8C689939340899540A896A49940E4E2C5D9C9C44081958440D7C1E2E2E6D6D9C44081958440979985A2A240C5D5E3C5D90000000000000000001105A01DF84DE896A499409781A2A2A696998440A6899393409596A34081979785819940A688859540A896A440A3A897854089A35D0000000000000000001105F01DF8E4E2C5D9C9C44040407E7E7E6E1D401300000000000000001D70000000000000000000000000000000000000000000000000000000000000001106401DF8D7C1E2E2E6D6D9C4407E7E7E6E1D4C0000000000000000000000000000000000000000000000000000000000000000000000000000000000001106901D700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001106E01DF8C3D6D4D4C1D5C440407E7E7E6E1D40000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFEF } +# Send TESTUSR and TESTPSW then press ENTER key +- !client { data: 7DD9D611D77Fe3c5e2e3e4e2d94011D94Fe3c5e2e3d7e2e64040404040404040404040404040404040404040404040404040404040404040404040FFEF } +# Plain text screen with some fields. Considered as special screen, due to the fact +# that some fields don't have fields attributes +- !server { data: 01C2115B5F05133C5D6B0011077F1D60115B5F290342004100C0C1115D6B2903 } +- !server { data: 42004100C060D9E4D5D5C9D5C7404040E4E2C9D3C4C1E5E51D60FFEF } +- !server { data: 01C21101E0284100284200C228000011077F1D60115B5F290342004100C0C111 } +- !server { data: 5D6B290342004100C060D9E4D5D5C9D5C7404040E4E2C9D3C4C1E5E51D60FFEF } +- !server { data: 01C2110230284100284200D9858184A85E28000011077F1D60115B5F29034200 } +- !server { data: 4100C0C1115D6B290342004100C060D9E4D5D5C9D5C7404040E4E2C9D3C4C1E5 } +- !server { data: E51D60FFEF } +- !client { data: FFFF } diff --git a/src/test/resources/com/blazemeter/jmeter/rte/protocols/tn3270/login-success-screen.html b/src/test/resources/com/blazemeter/jmeter/rte/protocols/tn3270/login-success-screen.html index 988df5d3..7df36d6f 100644 --- a/src/test/resources/com/blazemeter/jmeter/rte/protocols/tn3270/login-success-screen.html +++ b/src/test/resources/com/blazemeter/jmeter/rte/protocols/tn3270/login-success-screen.html @@ -1,5 +1,4 @@ - -

 
TSS7000I TESTUSR Last-Used 05 Apr 18 16:12 System=XE49 Facility=TSO
 
           
+
 
TSS7000I TESTUSR Last-Used 05 Apr 18 16:12 System=XE49 Facility=TSO
 
           
 
 
TSS7001I Count=00003 Mode=Fail Locktime=None Name=TESTING USER1
 
               
 
 
IKJ56455I TESTUSR LOGON IN PROGRESS AT 16:17:45 ON APRIL 5, 2018
 
              
 
 
 **************************************************************
 
               
@@ -23,5 +22,4 @@
 
 
READY 
 
                                                                        
                                                                                 
                                                                                 
-
- +
\ No newline at end of file diff --git a/src/test/resources/com/blazemeter/jmeter/rte/protocols/tn3270/login-welcome-screen.html b/src/test/resources/com/blazemeter/jmeter/rte/protocols/tn3270/login-welcome-screen.html index 30dd3074..ca76876e 100644 --- a/src/test/resources/com/blazemeter/jmeter/rte/protocols/tn3270/login-welcome-screen.html +++ b/src/test/resources/com/blazemeter/jmeter/rte/protocols/tn3270/login-welcome-screen.html @@ -1,5 +1,4 @@ - -
 
AAAAAAAAA ENTER USERID -
 
                                                      
+
 
AAAAAAAAA ENTER USERID -
 
                                                      
                                                                                 
                                                                                 
                                                                                 
@@ -23,5 +22,4 @@
                                                                                 
                                                                                 
                                                                                
 
-
- +
\ No newline at end of file diff --git a/src/test/resources/com/blazemeter/jmeter/rte/protocols/tn3270/user-menu-screen.html b/src/test/resources/com/blazemeter/jmeter/rte/protocols/tn3270/user-menu-screen.html index 3bb800bc..fde3d1a2 100644 --- a/src/test/resources/com/blazemeter/jmeter/rte/protocols/tn3270/user-menu-screen.html +++ b/src/test/resources/com/blazemeter/jmeter/rte/protocols/tn3270/user-menu-screen.html @@ -1,27 +1,25 @@ - -
 ------------------------------- TSO/E LOGON -----------------------------------
-
                                                                                
-
                                                                                
-   
 Enter LOGON parameters below:                  
 RACF LOGON parameters:      
+
 ------------------------------- TSO/E LOGON -----------------------------------
                                                                                 
-  
  Userid    ===>
 TESTUSR 
                       
                   
         
  
                                                                                 
-  
  Password  ===>
 
        
                       
  New Password ===>
 
        
  
+    Enter LOGON parameters below:                   RACF LOGON parameters:      
                                                                                 
-  
  Procedure ===>
 
PROC394 
                       
  Group Ident  ===>
 
        
  
+    Userid    ===> TESTUSR                                                      
                                                                                 
-  
  Acct Nmbr ===>
 
1000000                                 
                     
+    Password  ===>
 
        
                         New Password ===>
 
        
  
                                                                                 
-  
  Size      ===>
 
4096   
                                                      
+    Procedure ===>
 
PROC394 
                         Group Ident  ===>
 
        
  
                                                                                 
-  
  Perform   ===>
 
   
                                                          
+    Acct Nmbr ===>
 
1000000                                 
                     
                                                                                 
-  
  Command   ===>
 
                                                             
+    Size      ===>
 
4096   
                                                      
+                                                                                
+    Perform   ===>
 
   
                                                          
+                                                                                
+    Command   ===>
 
                                                             
                    
                                                             
-   
 Enter an 'S' before each option desired below:
                              
-       
  
 
 
 -Nomail
    
  
 
 
 -Nonotice
   
  
 
 
 -Reconnect
   
  
 
 
 -OIDcard 
        
+    Enter an 'S' before each option desired below:                              
+         
 
 
 -Nomail      
 
 
 -Nonotice     
 
 
 -Reconnect     
 
 
 -OIDcard         
                                                                                 
-
 PF1/PF13 ==> Help    PF3/PF15 ==> Logoff    PA1 ==> Attention    PA2 ==> Reshow
-
 You may request specific help information by entering a '?' in any entry field 
-
- + PF1/PF13 ==> Help PF3/PF15 ==> Logoff PA1 ==> Attention PA2 ==> Reshow + You may request specific help information by entering a '?' in any entry field +
\ No newline at end of file