summaryrefslogtreecommitdiffstats
path: root/lldb/test/Shell/Reproducer
diff options
context:
space:
mode:
authorJonas Devlieghere <jonas@devlieghere.com>2019-10-09 19:22:02 +0000
committerJonas Devlieghere <jonas@devlieghere.com>2019-10-09 19:22:02 +0000
commit87aa9c9e4d41ed881453e2fab85b3d25f648bb55 (patch)
tree63efe79832bf3de4f63e4e81c62e73923947b882 /lldb/test/Shell/Reproducer
parentfd18e94697c987d5f24e25aa4e27adaffff3cce4 (diff)
downloadbcm5719-llvm-87aa9c9e4d41ed881453e2fab85b3d25f648bb55.tar.gz
bcm5719-llvm-87aa9c9e4d41ed881453e2fab85b3d25f648bb55.zip
Re-land "[test] Split LLDB tests into API, Shell & Unit"
The original patch got reverted because it broke `check-lldb` on a clean build. This fixes that. llvm-svn: 374201
Diffstat (limited to 'lldb/test/Shell/Reproducer')
-rw-r--r--lldb/test/Shell/Reproducer/Functionalities/Inputs/DataFormatter.in7
-rw-r--r--lldb/test/Shell/Reproducer/Functionalities/Inputs/foo.cpp13
-rw-r--r--lldb/test/Shell/Reproducer/Functionalities/Inputs/stepping.c37
-rw-r--r--lldb/test/Shell/Reproducer/Functionalities/TestDataFormatter.test16
-rw-r--r--lldb/test/Shell/Reproducer/Functionalities/TestImageList.test30
-rw-r--r--lldb/test/Shell/Reproducer/Functionalities/TestStepping.test100
-rw-r--r--lldb/test/Shell/Reproducer/Inputs/FileCapture.in4
-rw-r--r--lldb/test/Shell/Reproducer/Inputs/GDBRemoteCapture.in6
-rw-r--r--lldb/test/Shell/Reproducer/Inputs/simple.c18
-rw-r--r--lldb/test/Shell/Reproducer/Modules/Inputs/Bar.h3
-rw-r--r--lldb/test/Shell/Reproducer/Modules/Inputs/Foo.h1
-rw-r--r--lldb/test/Shell/Reproducer/Modules/Inputs/ModuleCXX.in6
-rw-r--r--lldb/test/Shell/Reproducer/Modules/Inputs/main.cpp9
-rw-r--r--lldb/test/Shell/Reproducer/Modules/Inputs/module.modulemap7
-rw-r--r--lldb/test/Shell/Reproducer/Modules/TestModuleCXX.test37
-rw-r--r--lldb/test/Shell/Reproducer/TestDriverOptions.test17
-rw-r--r--lldb/test/Shell/Reproducer/TestDump.test26
-rw-r--r--lldb/test/Shell/Reproducer/TestFileRepro.test24
-rw-r--r--lldb/test/Shell/Reproducer/TestGDBRemoteRepro.test27
-rw-r--r--lldb/test/Shell/Reproducer/TestRelativePath.test8
-rw-r--r--lldb/test/Shell/Reproducer/TestReuseDirectory.test17
-rw-r--r--lldb/test/Shell/Reproducer/TestSynchronous.test14
22 files changed, 427 insertions, 0 deletions
diff --git a/lldb/test/Shell/Reproducer/Functionalities/Inputs/DataFormatter.in b/lldb/test/Shell/Reproducer/Functionalities/Inputs/DataFormatter.in
new file mode 100644
index 00000000000..5c4e821656d
--- /dev/null
+++ b/lldb/test/Shell/Reproducer/Functionalities/Inputs/DataFormatter.in
@@ -0,0 +1,7 @@
+breakpoint set -f foo.cpp -l 11
+run
+frame var foo
+next
+frame var foo
+cont
+reproducer generate
diff --git a/lldb/test/Shell/Reproducer/Functionalities/Inputs/foo.cpp b/lldb/test/Shell/Reproducer/Functionalities/Inputs/foo.cpp
new file mode 100644
index 00000000000..91f27388d0c
--- /dev/null
+++ b/lldb/test/Shell/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) {
+ static Foo foo(1, 2.22);
+ return 0;
+}
diff --git a/lldb/test/Shell/Reproducer/Functionalities/Inputs/stepping.c b/lldb/test/Shell/Reproducer/Functionalities/Inputs/stepping.c
new file mode 100644
index 00000000000..7b56eb22193
--- /dev/null
+++ b/lldb/test/Shell/Reproducer/Functionalities/Inputs/stepping.c
@@ -0,0 +1,37 @@
+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;
+}
diff --git a/lldb/test/Shell/Reproducer/Functionalities/TestDataFormatter.test b/lldb/test/Shell/Reproducer/Functionalities/TestDataFormatter.test
new file mode 100644
index 00000000000..8ee181e8035
--- /dev/null
+++ b/lldb/test/Shell/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.repro
+# RUN: %clangxx %S/Inputs/foo.cpp -g -o %t.out
+
+# RUN: %lldb -x -b -s %S/Inputs/DataFormatter.in --capture --capture-path %t.repro %t.out | FileCheck %s
+# RUN: %lldb --replay %t.repro | 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
diff --git a/lldb/test/Shell/Reproducer/Functionalities/TestImageList.test b/lldb/test/Shell/Reproducer/Functionalities/TestImageList.test
new file mode 100644
index 00000000000..d0abae164f0
--- /dev/null
+++ b/lldb/test/Shell/Reproducer/Functionalities/TestImageList.test
@@ -0,0 +1,30 @@
+# 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.txt
+
+# RUN: echo "CAPTURE" >> %t.txt
+# RUN: %lldb -x -b --capture --capture-path %t.repro \
+# RUN: -o 'run' \
+# RUN: -o 'image list' \
+# RUN: -o 'reproducer generate' \
+# RUN: %t.out >> %t.txt 2>&1
+
+# RUN: echo "REPLAY" >> %t.txt
+# RUN: %lldb -x -b --replay %t.repro >> %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]]
diff --git a/lldb/test/Shell/Reproducer/Functionalities/TestStepping.test b/lldb/test/Shell/Reproducer/Functionalities/TestStepping.test
new file mode 100644
index 00000000000..f43680f3e22
--- /dev/null
+++ b/lldb/test/Shell/Reproducer/Functionalities/TestStepping.test
@@ -0,0 +1,100 @@
+# UNSUPPORTED: system-windows, system-freebsd
+
+# This tests that stepping continues to work when replaying a reproducer.
+
+# RUN: rm -rf %t.repro
+# RUN: %clang %S/Inputs/stepping.c -O0 -g -o %t.out
+# RUN: grep -v '#' %s > %t.in
+
+# RUN: %lldb -x -b -s %t.in --capture --capture-path %t.repro %t.out | FileCheck %s --check-prefix CHECK
+# RUN: %lldb --replay %t.repro | FileCheck %s --check-prefix CHECK
+
+# Set breakpoints in a,b and c and verify we stop there when stepping.
+
+breakpoint set -f stepping.c -l 28
+# CHECK: Breakpoint 1: {{.*}} stepping.c:28
+
+breakpoint set -f stepping.c -l 10
+# CHECK: Breakpoint 2: {{.*}} stepping.c:10
+
+breakpoint set -f stepping.c -l 19
+# CHECK: Breakpoint 3: {{.*}} stepping.c:19
+
+breakpoint set -f stepping.c -l 23
+# CHECK: Breakpoint 4: {{.*}} stepping.c:23
+
+run
+# CHECK: Process {{.*}} stopped
+# CHECK: stop reason = breakpoint 1.1
+
+next
+# CHECK: Process {{.*}} stopped
+# CHECK: stop reason = breakpoint 2.1
+
+next
+# CHECK: Process {{.*}} stopped
+# CHECK: stop reason = breakpoint 3.1
+
+next
+# CHECK: Process {{.*}} stopped
+# CHECK: stop reason = breakpoint 4.1
+
+bt
+# CHECK: frame #0: {{.*}}`c
+# CHECK: frame #1: {{.*}}`b
+# CHECK: frame #2: {{.*}}`a
+
+# Continue and stop resulting from the step overs.
+
+cont
+# CHECK: Process {{.*}} resuming
+# CHECK: Process {{.*}} stopped
+# CHECK: stop reason = step over
+cont
+# CHECK: Process {{.*}} resuming
+# CHECK: Process {{.*}} stopped
+# CHECK: stop reason = step over
+cont
+# CHECK: Process {{.*}} resuming
+# CHECK: Process {{.*}} stopped
+# CHECK: stop reason = step over
+
+breakpoint disable 1
+# CHECK: 1 breakpoints disabled.
+
+breakpoint disable 2
+# CHECK: 1 breakpoints disabled.
+
+breakpoint disable 3
+# CHECK: 1 breakpoints disabled.
+
+breakpoint disable 4
+# CHECK: 1 breakpoints disabled.
+
+# Continue to line 48.
+
+next
+# CHECK: stop reason = step over
+next
+# CHECK: stop reason = step over
+
+# Step into c.
+thread step-in
+# CHECK: stop reason = step in
+thread step-in
+# CHECK: stop reason = step in
+thread step-in
+# CHECK: stop reason = step in
+thread step-in
+# CHECK: stop reason = step in
+thread step-in
+# CHECK: stop reason = step in
+
+# Finally continue until the end.
+
+cont
+# CHECK: Process {{.*}} resuming
+# CHECK: Process {{.*}} exited with status = 0
+
+# Generate the reproducer.
+reproducer generate
diff --git a/lldb/test/Shell/Reproducer/Inputs/FileCapture.in b/lldb/test/Shell/Reproducer/Inputs/FileCapture.in
new file mode 100644
index 00000000000..2c69487575e
--- /dev/null
+++ b/lldb/test/Shell/Reproducer/Inputs/FileCapture.in
@@ -0,0 +1,4 @@
+run
+reproducer status
+reproducer dump -p files
+reproducer generate
diff --git a/lldb/test/Shell/Reproducer/Inputs/GDBRemoteCapture.in b/lldb/test/Shell/Reproducer/Inputs/GDBRemoteCapture.in
new file mode 100644
index 00000000000..e632c821d57
--- /dev/null
+++ b/lldb/test/Shell/Reproducer/Inputs/GDBRemoteCapture.in
@@ -0,0 +1,6 @@
+breakpoint set -f simple.c -l 12
+run
+bt
+cont
+reproducer status
+reproducer generate
diff --git a/lldb/test/Shell/Reproducer/Inputs/simple.c b/lldb/test/Shell/Reproducer/Inputs/simple.c
new file mode 100644
index 00000000000..ef14878bcf9
--- /dev/null
+++ b/lldb/test/Shell/Reproducer/Inputs/simple.c
@@ -0,0 +1,18 @@
+//===-- main.c --------------------------------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include <stdio.h>
+
+void foo() {
+ printf("testing\n");
+}
+
+int main (int argc, char const *argv[]) {
+ foo();
+ return 0;
+}
diff --git a/lldb/test/Shell/Reproducer/Modules/Inputs/Bar.h b/lldb/test/Shell/Reproducer/Modules/Inputs/Bar.h
new file mode 100644
index 00000000000..d004baf3168
--- /dev/null
+++ b/lldb/test/Shell/Reproducer/Modules/Inputs/Bar.h
@@ -0,0 +1,3 @@
+struct Bar {
+ int success;
+};
diff --git a/lldb/test/Shell/Reproducer/Modules/Inputs/Foo.h b/lldb/test/Shell/Reproducer/Modules/Inputs/Foo.h
new file mode 100644
index 00000000000..1fe02e89786
--- /dev/null
+++ b/lldb/test/Shell/Reproducer/Modules/Inputs/Foo.h
@@ -0,0 +1 @@
+struct Foo {};
diff --git a/lldb/test/Shell/Reproducer/Modules/Inputs/ModuleCXX.in b/lldb/test/Shell/Reproducer/Modules/Inputs/ModuleCXX.in
new file mode 100644
index 00000000000..0f5bb7864f2
--- /dev/null
+++ b/lldb/test/Shell/Reproducer/Modules/Inputs/ModuleCXX.in
@@ -0,0 +1,6 @@
+breakpoint set -f main.cpp -l 5
+run
+expr -l Objective-C++ -- @import Foo
+expr -l Objective-C++ -- @import Bar
+expr -- Bar()
+reproducer generate
diff --git a/lldb/test/Shell/Reproducer/Modules/Inputs/main.cpp b/lldb/test/Shell/Reproducer/Modules/Inputs/main.cpp
new file mode 100644
index 00000000000..e6a331bb405
--- /dev/null
+++ b/lldb/test/Shell/Reproducer/Modules/Inputs/main.cpp
@@ -0,0 +1,9 @@
+#include "Foo.h"
+
+void stop() {}
+
+int main(int argc, char **argv) {
+ Foo foo;
+ stop(); // break here.
+ return 0;
+}
diff --git a/lldb/test/Shell/Reproducer/Modules/Inputs/module.modulemap b/lldb/test/Shell/Reproducer/Modules/Inputs/module.modulemap
new file mode 100644
index 00000000000..4221d0f9134
--- /dev/null
+++ b/lldb/test/Shell/Reproducer/Modules/Inputs/module.modulemap
@@ -0,0 +1,7 @@
+module Foo {
+ header "Foo.h"
+}
+
+module Bar {
+ header "Bar.h"
+}
diff --git a/lldb/test/Shell/Reproducer/Modules/TestModuleCXX.test b/lldb/test/Shell/Reproducer/Modules/TestModuleCXX.test
new file mode 100644
index 00000000000..843c7e6d1ff
--- /dev/null
+++ b/lldb/test/Shell/Reproducer/Modules/TestModuleCXX.test
@@ -0,0 +1,37 @@
+# REQUIRES: system-darwin
+
+# Start fresh.
+# RUN: rm -rf %t.repro
+# RUN: rm -rf %t.root
+# RUN: rm -rf %t.clang-cache
+# RUN: rm -rf %t.lldb-cache
+
+# Create a temporary root we can remove later.
+# RUN: mkdir -p %t.root
+# RUN: mkdir -p %t.clang-cache
+# RUN: mkdir -p %t.lldb-cache
+# RUN: cp %S/Inputs/main.cpp %t.root
+# RUN: cp %S/Inputs/Foo.h %t.root
+# RUN: cp %S/Inputs/Bar.h %t.root
+# RUN: cp %S/Inputs/module.modulemap %t.root
+
+# Compile the test case form the temporary root.
+# RUN: %clang %t.root/main.cpp -g -fmodules -fcxx-modules -fmodules-cache-path=%t.clang-cache -o %t.root/a.out
+
+# Capture the debug session.
+# RUN: %lldb -x -b -o 'settings set symbols.clang-modules-cache-path %t.lldb-cache' -s %S/Inputs/ModuleCXX.in --capture --capture-path %t.repro %t.root/a.out | FileCheck %s --check-prefix CAPTURE
+# CAPTURE: (success = 0)
+
+# RUN: cat %t.repro/files.yaml | FileCheck %s --check-prefix YAML
+# YAML-DAG: Foo.h
+# YAML-DAG: Bar.h
+# YAML-DAG: module.modulemap
+
+# Remove the temporary root.
+# RUN: rm -rf %t.root
+# RUN: rm -rf %t.clang-cache
+# RUN: rm -rf %t.lldb-cache
+
+# Replay the debug session.
+# RUN: %lldb -x -b -o 'settings set symbols.clang-modules-cache-path %t.lldb-cache' -s %S/Inputs/ModuleCXX.in --replay %t.repro %t.root/a.out | FileCheck %s --check-prefix REPLAY
+# REPLAY: (success = 0)
diff --git a/lldb/test/Shell/Reproducer/TestDriverOptions.test b/lldb/test/Shell/Reproducer/TestDriverOptions.test
new file mode 100644
index 00000000000..4b5dfbf063c
--- /dev/null
+++ b/lldb/test/Shell/Reproducer/TestDriverOptions.test
@@ -0,0 +1,17 @@
+# Check that errors are propagated to the driver.
+#
+# RUN: not %lldb --capture --capture-path %t/bogus/bogus 2>&1 | FileCheck %s --check-prefix INVALID-CAPTURE
+# RUN: not %lldb --replay %t/bogus/bogus 2>&1 | FileCheck %s --check-prefix INVALID-REPLAY
+#
+# INVALID-CAPTURE: unable to create reproducer directory
+# INVALID-REPLAY: unable to load reproducer index
+
+# Check that all option combination work as expected.
+#
+# RUN: %lldb --capture --capture-path %t.repro -b -o 'reproducer status' 2>&1 | FileCheck %s --check-prefix NO-WARNING --check-prefix STATUS-CAPTURE
+# RUN: %lldb --capture -b -o 'reproducer status' 2>&1 | FileCheck %s --check-prefix NO-WARNING --check-prefix STATUS-CAPTURE
+# RUN: %lldb --capture-path %t.repro -b -o 'reproducer status' 2>&1 | FileCheck %s --check-prefix WARNING --check-prefix STATUS-CAPTURE
+#
+# NO-WARNING-NOT: warning: -capture-path specified without -capture
+# WARNING: warning: -capture-path specified without -capture
+# STATUS-CAPTURE: Reproducer is in capture mode.
diff --git a/lldb/test/Shell/Reproducer/TestDump.test b/lldb/test/Shell/Reproducer/TestDump.test
new file mode 100644
index 00000000000..2e717152057
--- /dev/null
+++ b/lldb/test/Shell/Reproducer/TestDump.test
@@ -0,0 +1,26 @@
+# UNSUPPORTED: system-windows
+# This tests the reproducer dump functionality.
+
+# Generate a reproducer.
+# RUN: mkdir -p %t
+# RUN: rm -rf %t.repro
+# RUN: %clang %S/Inputs/simple.c -g -o %t/reproducer.out
+# RUN: %lldb -x -b -s %S/Inputs/FileCapture.in -o 'reproducer dump -p files' --capture --capture-path %t.repro %t/reproducer.out
+
+# RUN: %lldb -b -o 'reproducer dump -p files -f %t.repro' | FileCheck %s --check-prefix FILES
+# FILES-DAG: 'reproducer.out'
+# FILES-DAG: 'FileCapture.in'
+
+# RUN: %lldb -b -o 'reproducer dump -p version -f %t.repro' | FileCheck %s --check-prefix VERSION
+# VERSION: lldb version
+
+# RUN: %lldb -b -o 'reproducer dump -p commands -f %t.repro' | FileCheck %s --check-prefix COMMANDS
+# COMMANDS: command source
+# COMMANDS: target create
+# COMMANDS: command source
+
+# RUN: %lldb -b -o 'reproducer dump -p gdb -f %t.repro' | FileCheck %s --check-prefix GDB
+# GDB: send packet: $QStartNoAckMode#b0
+# GDB: read packet: $OK#9a
+
+# RUN: %lldb --replay %t.repro | FileCheck %s --check-prefix FILES
diff --git a/lldb/test/Shell/Reproducer/TestFileRepro.test b/lldb/test/Shell/Reproducer/TestFileRepro.test
new file mode 100644
index 00000000000..31b76703689
--- /dev/null
+++ b/lldb/test/Shell/Reproducer/TestFileRepro.test
@@ -0,0 +1,24 @@
+# REQUIRES: system-darwin
+
+# This tests the replaying of GDB remote packets.
+#
+# We issue the same commands and ensure the output is identical to the original
+# process. To ensure we're not actually running the original binary we check
+# that the string "testing" is not printed.
+
+# RUN: rm -rf %t.repro
+# RUN: %clang %S/Inputs/simple.c -g -o %t.out
+# RUN: %lldb -x -b -s %S/Inputs/FileCapture.in --capture --capture-path %t.repro %t.out | FileCheck %s --check-prefix CHECK --check-prefix CAPTURE
+# RUN: rm %t.out
+# RUN: %lldb --replay %t.repro | FileCheck %s --check-prefix CHECK --check-prefix REPLAY
+# RUN: cat %t.repro/version.txt | FileCheck %s --check-prefix VERSION
+
+# CAPTURE: testing
+# REPLAY-NOT: testing
+
+# CHECK: Process {{.*}} exited
+
+# CAPTURE: Reproducer is in capture mode.
+# CAPTURE: Reproducer written
+
+# VERSION: lldb version
diff --git a/lldb/test/Shell/Reproducer/TestGDBRemoteRepro.test b/lldb/test/Shell/Reproducer/TestGDBRemoteRepro.test
new file mode 100644
index 00000000000..09e566ffb95
--- /dev/null
+++ b/lldb/test/Shell/Reproducer/TestGDBRemoteRepro.test
@@ -0,0 +1,27 @@
+# UNSUPPORTED: system-windows, system-freebsd
+
+# This tests the replaying of GDB remote packets.
+#
+# We issue the same commands and ensure the output is identical to the original
+# process. To ensure we're not actually running the original binary we check
+# that the string "testing" is not printed.
+
+# RUN: rm -rf %t.repro
+# RUN: %clang %S/Inputs/simple.c -g -o %t.out
+# RUN: %lldb -x -b -s %S/Inputs/GDBRemoteCapture.in --capture --capture-path %t.repro %t.out | FileCheck %s --check-prefix CHECK --check-prefix CAPTURE
+# RUN: env FOO=BAR %lldb --replay %t.repro | FileCheck %s --check-prefix CHECK --check-prefix REPLAY
+
+# CHECK: Breakpoint 1
+# CHECK: Process {{.*}} stopped
+# CHECK: Process {{.*}} launched
+# CHECK: thread {{.*}} stop reason = breakpoint
+# CHECK: frame {{.*}} simple.c
+
+# CAPTURE: testing
+# REPLAY-NOT: testing
+
+# CHECK: Process {{.*}} resuming
+# CHECK: Process {{.*}} exited
+
+# CAPTURE: Reproducer is in capture mode.
+# CAPTURE: Reproducer written
diff --git a/lldb/test/Shell/Reproducer/TestRelativePath.test b/lldb/test/Shell/Reproducer/TestRelativePath.test
new file mode 100644
index 00000000000..1c871ee81e8
--- /dev/null
+++ b/lldb/test/Shell/Reproducer/TestRelativePath.test
@@ -0,0 +1,8 @@
+# This tests relative capture paths.
+
+# RUN: mkdir -p %t
+# RUN: cd %t
+# RUN: rm -rf ./foo
+# RUN: %clang %S/Inputs/simple.c -g -o %t/reproducer.out
+# RUN: %lldb -x -b -s %S/Inputs/FileCapture.in -o 'reproducer dump -p files' --capture --capture-path ./foo %t/reproducer.out
+# RUN: %lldb --replay ./foo
diff --git a/lldb/test/Shell/Reproducer/TestReuseDirectory.test b/lldb/test/Shell/Reproducer/TestReuseDirectory.test
new file mode 100644
index 00000000000..76c74b7ee1d
--- /dev/null
+++ b/lldb/test/Shell/Reproducer/TestReuseDirectory.test
@@ -0,0 +1,17 @@
+# UNSUPPORTED: system-windows, system-freebsd
+
+# Test that we can capture twice to the same directory without breaking the
+# reproducer functionality.
+
+# RUN: rm -rf %t.repro
+# RUN: %clang %S/Inputs/simple.c -g -o %t.out
+# RUN: %lldb -x -b -s %S/Inputs/GDBRemoteCapture.in --capture --capture-path %t.repro %t.out | FileCheck %S/TestGDBRemoteRepro.test --check-prefix CHECK --check-prefix CAPTURE
+# RUN: %lldb -x -b -s %S/Inputs/GDBRemoteCapture.in --capture --capture-path %t.repro %t.out | FileCheck %S/TestGDBRemoteRepro.test --check-prefix CHECK --check-prefix CAPTURE
+# RUN: %lldb --replay %t.repro | FileCheck %S/TestGDBRemoteRepro.test --check-prefix CHECK --check-prefix REPLAY
+
+# Test that we can replay from a different location, i.e. that the reproducer
+# is relocatable.
+
+# RUN: rm -rf %t.repro_moved
+# RUN: mv %t.repro %t.repro_moved
+# RUN: %lldb --replay %t.repro_moved | FileCheck %S/TestGDBRemoteRepro.test --check-prefix CHECK --check-prefix REPLAY
diff --git a/lldb/test/Shell/Reproducer/TestSynchronous.test b/lldb/test/Shell/Reproducer/TestSynchronous.test
new file mode 100644
index 00000000000..f32ce8c5722
--- /dev/null
+++ b/lldb/test/Shell/Reproducer/TestSynchronous.test
@@ -0,0 +1,14 @@
+# REQUIRES: python
+# Ensure that replay happens in synchronous mode.
+
+# RUN: rm -rf %t.repro
+# RUN: %lldb -x -b --capture --capture-path %t.repro -o 'script lldb.debugger.SetAsync(True)' -o 'script lldb.debugger.GetAsync()' -o 'reproducer generate' | FileCheck %s --check-prefix CAPTURE
+# RUN: %lldb --replay %t.repro | FileCheck %s --check-prefix REPLAY
+
+# CAPTURE: script lldb.debugger.SetAsync(True)
+# CAPTURE-NEXT: script lldb.debugger.GetAsync()
+# CAPTURE-NEXT: True
+
+# REPLAY: script lldb.debugger.SetAsync(True)
+# REPLAY-NEXT: script lldb.debugger.GetAsync()
+# REPLAY-NEXT: False
OpenPOWER on IntegriCloud