JDevlieghere created this revision.
JDevlieghere added reviewers: labath, davide, aprantl, zturner.
JDevlieghere added a project: LLDB.
Herald added a subscriber: teemperor.

This patch adds test that check that functionality in lldb continues to work 
when replaying a reproducer.

Currently the patch checks that:

- Entries in image list are identical.
- That stepping behaves the same.
- That the data formatters behave the same.


Repository:
  rLLDB LLDB

https://reviews.llvm.org/D55626

Files:
  lit/Reproducer/Functionalities/Inputs/DataFormatter.in
  lit/Reproducer/Functionalities/Inputs/Stepping.in
  lit/Reproducer/Functionalities/Inputs/foo.cpp
  lit/Reproducer/Functionalities/Inputs/stepping.c
  lit/Reproducer/Functionalities/TestDataFormatter.test
  lit/Reproducer/Functionalities/TestImagineList.test
  lit/Reproducer/Functionalities/TestStepping.test

Index: lit/Reproducer/Functionalities/TestStepping.test
===================================================================
--- /dev/null
+++ lit/Reproducer/Functionalities/TestStepping.test
@@ -0,0 +1,51 @@
+# UNSUPPORTED: system-windows, system-freebsd
+
+# This tests that stepping continues to work when replaying a reproducer.
+
+# RUN: rm -rf %T/stepping
+# RUN: %clang %S/Inputs/stepping.c -g -o %t.out
+
+# RUN: %lldb -x -b -s %S/Inputs/Stepping.in --capture %T/stepping %t.out | FileCheck %s --check-prefix CHECK --check-prefix CAPTURE
+# RUN: %lldb --replay %T/stepping %t.out | FileCheck %s --check-prefix CHECK --check-prefix REPLAY
+
+# CHECK: Breakpoint 1: {{.*}} stepping.c:42
+# CHECK: Breakpoint 2: {{.*}} stepping.c:20
+# CHECK: Breakpoint 3: {{.*}} stepping.c:29
+# CHECK: Breakpoint 4: {{.*}} stepping.c:34
+
+# CHECK: Process {{.*}} stopped
+# CHECK: stop reason = breakpoint 1.1
+# CHECK: Process {{.*}} stopped
+# CHECK: stop reason = breakpoint 2.1
+# CHECK: Process {{.*}} stopped
+# CHECK: stop reason = breakpoint 3.1
+# CHECK: Process {{.*}} stopped
+# CHECK: stop reason = breakpoint 4.1
+
+# CHECK: frame #0: {{.*}}`c
+# CHECK: frame #1: {{.*}}`b
+# CHECK: frame #2: {{.*}}`a
+
+# CHECK: Process {{.*}} resuming
+# CHECK: Process {{.*}} stopped
+
+# CHECK: stop reason = step over
+# CHECK: stop reason = step over
+# CHECK: stop reason = step over
+
+# CHECK: 1 breakpoints disabled.
+# CHECK: 1 breakpoints disabled.
+# CHECK: 1 breakpoints disabled.
+# CHECK: 1 breakpoints disabled.
+
+# CHECK: stop reason = step over
+# CHECK: stop reason = step over
+
+# CHECK: stop reason = step in
+# CHECK: stop reason = step in
+# CHECK: stop reason = step in
+# CHECK: stop reason = step in
+# CHECK: stop reason = step in
+
+# CHECK: Process {{.*}} resuming
+# CHECK: Process {{.*}} exited with status = 0
Index: lit/Reproducer/Functionalities/TestImagineList.test
===================================================================
--- /dev/null
+++ lit/Reproducer/Functionalities/TestImagineList.test
@@ -0,0 +1,32 @@
+# UNSUPPORTED: system-windows, system-freebsd
+
+# This tests that image list works when replaying. We arbitrarily assume
+# there's at least two entries and compare that they're identical.
+
+# RUN: %clang %S/Inputs/stepping.c -g -o %t.out
+
+# RUN: rm -rf %T/imagelist
+# RUN: rm -rf %t.txt
+
+# RUN: echo "CAPTURE" >> %t.txt
+# RUN: %lldb -x -b  --capture %T/imagelist \
+# RUN:    -o 'image list' \
+# RUN:    -o 'reproducer generate' \
+# RUN:    %t.out >> %t.txt 2>&1
+
+# RUN: rm -rf
+
+# RUN: echo "REPLAY" >> %t.txt
+# RUN: %lldb -x -b --replay %T/imagelist  %t.out >> %t.txt 2>&1
+
+# RUN: cat %t.txt | FileCheck %s
+
+# CHECK: CAPTURE
+# CHECK: image list
+# CHECK: [  0] [[ZERO:.*]]
+# CHECK: [  1] [[ONE:.*]]
+
+# CHECK: REPLAY
+# CHECK: image list
+# CHECK: [  0] {{.*}}[[ZERO]]
+# CHECK: [  1] {{.*}}[[ONE]]
Index: lit/Reproducer/Functionalities/TestDataFormatter.test
===================================================================
--- /dev/null
+++ lit/Reproducer/Functionalities/TestDataFormatter.test
@@ -0,0 +1,16 @@
+# UNSUPPORTED: system-windows, system-freebsd
+
+# This tests that data formatters continue to work when replaying a reproducer.
+
+# RUN: rm -rf %T/dataformatter
+# RUN: %clang -x c++ %S/Inputs/foo.cpp -g -o %t.out
+
+# RUN: %lldb -x -b -s %S/Inputs/DataFormatter.in --capture %T/dataformatter %t.out | FileCheck %s
+# RUN: %lldb --replay %T/dataformatter %t.out | FileCheck %s
+
+# CHECK: stop reason = breakpoint 1.1
+# CHECK: (Foo) foo = (m_i = 0, m_d = 0)
+# CHECK: stop reason = step over
+# CHECK: (Foo) foo = (m_i = 1, m_d = 2)
+# CHECK: Process {{.*}} resuming
+# CHECK: Process {{.*}} exited with status = 0
Index: lit/Reproducer/Functionalities/Inputs/stepping.c
===================================================================
--- /dev/null
+++ lit/Reproducer/Functionalities/Inputs/stepping.c
@@ -0,0 +1,51 @@
+//===-- stepping.c ----------------------------------------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+#include <stdio.h>
+
+int a(int);
+int b(int);
+int c(int);
+int complex(int, int, int);
+
+int a(int val) {
+  int return_value = val;
+
+  if (val <= 1) {
+    return_value = b(val);
+  } else if (val >= 3) {
+    return_value = c(val);
+  }
+
+  return return_value;
+}
+
+int b(int val) {
+  int rc = c(val);
+  return rc;
+}
+
+int c(int val) {
+  return val + 3;
+}
+
+int complex(int first, int second, int third) {
+  return first + second + third;
+}
+
+int main(int argc, char const *argv[]) {
+  int A1 = a(1);
+
+  int B2 = b(2);
+
+  int A3 = a(3);
+
+  int A4 = complex(a(1), b(2), c(3));
+
+  return 0;
+}
Index: lit/Reproducer/Functionalities/Inputs/foo.cpp
===================================================================
--- /dev/null
+++ lit/Reproducer/Functionalities/Inputs/foo.cpp
@@ -0,0 +1,13 @@
+class Foo {
+public:
+  Foo(int i, double d) : m_i(i), m_d(d){};
+
+private:
+  int m_i;
+  int m_d;
+};
+
+int main(int argc, char **argv) {
+  Foo foo(1, 2.22);
+  return 0;
+}
Index: lit/Reproducer/Functionalities/Inputs/Stepping.in
===================================================================
--- /dev/null
+++ lit/Reproducer/Functionalities/Inputs/Stepping.in
@@ -0,0 +1,51 @@
+# Set breakpoints in a,b and c and verify we stop there when stepping.
+breakpoint set -f stepping.c -l 42
+breakpoint set -f stepping.c -l 20
+breakpoint set -f stepping.c -l 29
+breakpoint set -f stepping.c -l 34
+
+# Start the process.
+run
+
+# Stop in main because of breakpoint 1.
+next
+
+# Stop in a because of breakpoint 2.
+next
+
+# Stop in b because of breakpoint 3.
+next
+
+# Stop in c because of breakpoint 4.
+bt
+
+# Continue and stop resulting from the step overs.
+cont
+cont
+cont
+
+# Disable our breakpoints.
+breakpoint disable 1
+breakpoint disable 2
+breakpoint disable 3
+breakpoint disable 4
+
+# Continue to line 48.
+next
+next
+
+# Step into C.
+thread step-in
+thread step-in
+thread step-in
+thread step-in
+thread step-in
+
+# Verify that we're in C.
+bt
+
+# Finally continue until the end.
+cont
+
+# Generate the reproducer.
+reproducer generate
Index: lit/Reproducer/Functionalities/Inputs/DataFormatter.in
===================================================================
--- /dev/null
+++ lit/Reproducer/Functionalities/Inputs/DataFormatter.in
@@ -0,0 +1,7 @@
+breakpoint set -f foo.cpp -l 11
+run
+frame var
+next
+frame var
+cont
+reproducer generate
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to