ConcJUnit: Unit Testing for Concurrent Programs PPPJ 2009 Mathias Ricken and Robert Cartwright Rice University August 28, 2009.

Slides:



Advertisements
Similar presentations
11-Jun-14 The assert statement. 2 About the assert statement The purpose of the assert statement is to give you a way to catch program errors early The.
Advertisements

Liang, Introduction to Java Programming, Eighth Edition, (c) 2011 Pearson Education, Inc. All rights reserved Chapter 13 Exception Handling.
COP 2800 Lake Sumter State College Mark Wilson, Instructor.
/ PSWLAB Concurrent Bug Patterns and How to Test Them by Eitan Farchi, Yarden Nir, Shmuel Ur published in the proceedings of IPDPS’03 (PADTAD2003)
Multithreading The objectives of this chapter are:
CS220 Software Development Lecture: Multi-threading A. O’Riordan, 2009.
Definitions Process – An executing program
Multithreading in Java Nelson Padua-Perez Chau-Wen Tseng Department of Computer Science University of Maryland, College Park.
Unit testing C# classes “If it isn’t tested it doesn’t work” Unit testing C# classes1.
Advanced Java Course Exception Handling. Throwables Class Throwable has two subclasses: –Error So bad that you never even think about trying to catch.
50.003: Elements of Software Construction Week 5 Basics of Threads.
Testing Concurrent Programs COMP Production Programming Mathias Ricken Rice University Spring 2009.
Unit Testing in Java with an Emphasis on Concurrency Corky Cartwright Rice and Halmstad Universities Summer 2013.
1 Advanced Computer Programming Concurrency Multithreaded Programs Copyright © Texas Education Agency, 2013.
And other languages…. must remember to check return value OR, must pass label/exception handler to every function Caller Function return status Caller.
Internet Software Development More stuff on Threads Paul Krause.
Design and Programming Chapter 7 Applied Software Project Management, Stellman & Greene See also:
Test-First Java Concurrency for the Classroom SIGCSE 2010 Mathias Ricken and Robert Cartwright Rice University March 12, 2009.
Multi-Threaded Application CSNB534 Asma Shakil. Overview Software applications employ a strategy called multi- threaded programming to split tasks into.
Multithreading in Java Project of COCS 513 By Wei Li December, 2000.
Today’s Agenda  Quick Review  Finish Java Threads  The CS Problem Advanced Topics in Software Engineering 1.
Dr. R R DOCSIT, Dr BAMU. Basic Java : Multi Threading 2 Objectives of This Session State what is Multithreading. Describe the life cycle of Thread.
Java Threads. What is a Thread? A thread can be loosely defined as a separate stream of execution that takes place simultaneously with and independently.
Threads in Java. Processes and Threads Processes –A process has a self-contained execution environment. –Has complete set of runtime resources including.
Testing Concurrent Programs, A 7-Minute Jargon-Free Introduction Thesis Writing Seminar Mathias Ricken Rice University February 25, 2010.
CS 346 – Chapter 4 Threads –How they differ from processes –Definition, purpose Threads of the same process share: code, data, open files –Types –Support.
First BlueJ Day Houston, 2006 Unit Testing with BlueJ Bruce Quig Deakin University.
1 A Framework for Testing Concurrent Programs PhD Thesis Defense Mathias Ricken Rice University January 10, 2011.
A Framework for Testing Concurrent Programs COMP 600 Mathias Ricken Rice University August 27, 2007.
A Framework for Testing Concurrent Programs MS Thesis Defense Mathias Ricken Rice University June 14, 2007.
Threads.
ICS 313: Programming Language Theory Chapter 13: Concurrency.
SilkTest 2008 R2 SP1: Silk4J Introduction. ConfidentialCopyright © 2008 Borland Software Corporation. 2 What is Silk4J? Silk4J enables you to create functional.
Introduction to Threads Session 01 Java Simplified / Session 14 / 2 of 28 Objectives Define a thread Define multithreading List benefits of multithreading.
Threads Doing Several Things at Once. Threads n What are Threads? n Two Ways to Obtain a New Thread n The Lifecycle of a Thread n Four Kinds of Thread.
Java 3: Odds & Ends Advanced Programming Techniques.
Threads in Java1 Concurrency Synchronizing threads, thread pools, etc.
David Streader Computer Science Victoria University of Wellington Copyright: David Streader, Victoria University of Wellington Debugging COMP T1.
Multi-Threading in Java
CS533 – Spring Jeanie M. Schwenk Experiences and Processes and Monitors with Mesa What is Mesa? “Mesa is a strongly typed, block structured programming.
Polytechnic University of Tirana Faculty of Information Technology Computer Engineering Department A MULTITHREADED SEARCH ENGINE AND TESTING OF MULTITHREADED.
1 A Framework for Testing Concurrent Programs PhD Proposal Mathias Ricken Rice University December 2, 2010.
ConcJUnit: Unit Testing for Concurrent Programs COMP 600 Mathias Ricken Rice University August 24, 2009.
Threads b A thread is a flow of control in a program. b The Java Virtual Machine allows an application to have multiple threads of execution running concurrently.
1 Threads in Java Jingdi Wang. 2 Introduction A thread is a single sequence of execution within a program Multithreading involves multiple threads of.
CS 151: Object-Oriented Design November 19 Class Meeting Department of Computer Science San Jose State University Fall 2013 Instructor: Ron Mak
Concurrency in Java MD. ANISUR RAHMAN. slide 2 Concurrency  Multiprogramming  Single processor runs several programs at the same time  Each program.
CHAPTER 18 C – C++ Section 1: Exceptions. Error Handling with Exceptions Forces you to defend yourself Separates error handling code from the source.
Java Thread Programming
SCJP 9/10 Threads.
Multithreading The objectives of this chapter are:
Jim Fawcett CSE687-OnLine – Object Oriented Design Summer 2017
Jim Fawcett CSE687 – Object Oriented Design Spring 2001
Multi Threading.
Java Programming Language
Multithreaded Programming in Java
Java Concurrency.
More About Threads.
Software Engineering 1, CS 355 Unit Testing with JUnit
Threads Chate Patanothai.
Definitions Concurrent program – Program that executes multiple instructions at the same time. Process – An executing program (the running JVM for Java.
Java Concurrency.
Multithreaded Programming in Java
Multithreading.
Multithreading.
Dr. Mustafa Cem Kasapbaşı
21 Threads.
CS 240 – Advanced Programming Concepts
Multithreading The objectives of this chapter are:
Testing Concurrent Programs
Presentation transcript:

ConcJUnit: Unit Testing for Concurrent Programs PPPJ 2009 Mathias Ricken and Robert Cartwright Rice University August 28, 2009

2 Brian Goetz, Java Concurrency in Practice, Addison-Wesley, 2006 Concurrency in Practice

3 Concurrency Practiced Badly *1

4 Unit Tests… Occur early Automate testing Keep the shared repository clean Serve as documentation Prevent bugs from reoccurring Allow safe refactoring

5 Existing Unit Testing Frameworks JUnit, TestNG Don’t detect test failures in child threads Don’t ensure that child threads terminate Tests that should fail may succeed

6 ConcJUnit Replacement for JUnit  Backward compatible, just replace junit.jar file  Available at 1. Detects failures in all threads 2. Warns if child threads outlive main thread 3. Warns if child threads are not joined

7 Sample JUnit Tests public class Test extends TestCase { public void testException() { throw new RuntimeException("booh!"); } public void testAssertion() { assertEquals(0, 1); } } if (0!=1) throw new AssertionFailedError(); } Both tests fail.

8 JUnit Test with Child Thread public class Test extends TestCase { public void testException() { new Thread() { public void run() { throw new RuntimeException("booh!"); } }.start(); } new Thread() { public void run() { throw new RuntimeException("booh!"); } }.start(); throw new RuntimeException("booh!"); Main thread Child thread Main thread Child thread spawns uncaught! end of test success!

9 JUnit Test with Child Thread public class Test extends TestCase { public void testException() { new Thread() { public void run() { throw new RuntimeException("booh!"); } }.start(); } new Thread() { public void run() { throw new RuntimeException("booh!"); } }.start(); throw new RuntimeException("booh!"); Uncaught exception, test should fail but does not! By default, no uncaught exception handler installed for child threads

10 Changes to JUnit (1 of 3) Thread group with exception handler  JUnit test runs in a separate thread, not main thread  Child threads are created in same thread group  When test ends, check if handler was invoked Reasoning: Uncaught exceptions in all threads must cause failure

11 JUnit Test with Child Thread public class Test extends TestCase { public void testException() { new Thread() { public void run() { throw new RuntimeException("booh!"); } }.start(); } new Thread() { public void run() { throw new RuntimeException("booh!"); } }.start(); throw new RuntimeException("booh!"); Test thread Child thread uncaught! end of test Main thread spawns and joinsresumes check group’s handler invokes group’s handler failure!

12 Child Thread Outlives Parent public class Test extends TestCase { public void testException() { new Thread() { public void run() { throw new RuntimeException("booh!"); } }.start(); } new Thread() { public void run() { throw new RuntimeException("booh!"); } }.start(); throw new RuntimeException("booh!"); Test thread Child thread uncaught! end of test success! invokes group’s handler Main thread check group’s handler Too late!

13 Changes to JUnit (2 of 3) Check for living child threads after test ends Reasoning: Uncaught exceptions in all threads must cause failure If the test is declared a success before all child threads have ended, failures may go unnoticed Therefore, all child threads must terminate before test ends

14 Check for Living Child Threads public class Test extends TestCase { public void testException() { new Thread() { public void run() { throw new RuntimeException("booh!"); } }.start(); } new Thread() { public void run() { throw new RuntimeException("booh!"); } }.start(); throw new RuntimeException("booh!"); Test thread Child thread uncaught! end of test failure! invokes group’s handler Main thread check for living child threads check group’s handler

15 Correctly Written Test public class Test extends TestCase { public void testException() { Thread t = new Thread() { public void run() { /* child thread */ } }; t.start(); t.join(); } Thread t = new Thread() { public void run() { /* child thread */ } }; t.start(); t.join(); // wait until child thread has ended /* child thread */ Test thread Child thread end of test success! Main thread check for living child threads check group’s handler *4

16 Changes to JUnit (3 of 3) Check if any child threads were not joined Reasoning: All child threads must terminate before test ends Without join() operation, a test may get “lucky” Require all child threads to be joined

17 Fork/Join Model Parent thread joins with each of its child threads May be too limited for a general-purpose programming language Child thread 1 Child thread 2 Main thread

18 Example of Other Join Models Chain of child threads guaranteed to outlive parent Main thread joins with last thread of chain Child thread 1 Child thread 2 Main thread Child thread 3

19 Generalize to Join Graph Threads as nodes; edges to joined thread Test is well-formed as long as all threads are reachable from main thread Child thread 1 Child thread 2 Main thread Child thread 3 MT CT1 CT2 CT3

20 Child thread 1 Child thread 2 Main thread MT CT1 CT2 Unreachable Nodes An unreachable node has not been joined  Child thread may outlive the test

21 child Thread main Thread MT CT Constructing the Graph: start() // in mainThread childThread.start(); Add node for childThread

22 // in mainThread childThread.join(); When leaving join(), add edge from mainThread to childThread child Thread main Thread MT CT Constructing the Graph : join() *3

23 Modifying the Java Runtime Changing Thread.start() and join()  Need to modify Java Runtime Library  Utility to process user’s rt.jar file  Put new jar file on boot classpath: -Xbootclasspath/p:newrt.jar Still works without modified Thread class  Just does not emit “lucky” warnings

24 Evaluation JFreeChart  All tests passed; tests are not concurrent DrJava: 900 unit tests  Passed:880  No join: 1  Lucky: 18  Timeout: 1  Runtime overhead: ~1 percent

25 Limitations Only checks chosen schedule  A different schedule may still fail Example: Thread t = new Thread(…); if (nondeterministic()) t.join(); *2

26 Future Work Insert sleeps or yields in critical code locations  Example:If a notify() is delayed, a wait() may time out.  Can detect a number of sample problems Run tests several times on build server Record schedule, replay if test fails  Makes failures reproducible if found *5

27 ConcJUnit Demo

28 Thank you!

29 Notes

30 Notes 1. Probably not caused by concurrency problems; just a metaphor. ←← 2. Also cannot detect uncaught exceptions in a program’s uncaught exception handler (JLS limitation) ←← 3. Only add edge if joined thread is really dead; do not add if join ended spuriously. ←←

31 public class Test extends TestCase { public void testException() { Thread t = new Thread(new Runnable() { public void run() { throw new RuntimeException("booh!"); } }); t.start(); while(t.isAlive()) { try { t.join(); } catch(InterruptedException ie) { } } Thread t = new Thread(new Runnable() { public void run() { throw new RuntimeException("booh!"); } }); t.start(); while(t.isAlive()) { try { t.join(); } catch(InterruptedException ie) { } } throw new RuntimeException("booh!"); Loop since join() may end spuriously 4. Spurious Wakeup ←

32 Notes 5. Have not studied probabilities or durations for sleeps/yields: One inserted delay may negatively impact a second inserted delay Example: If both notify() and wait() are delayed. ←←

33 Extra Slides

34 JUnit Test with Child Thread public class Test extends TestCase { public void testException() { new Thread(new Runnable() { public void run() { throw new RuntimeException("booh!"); } }).start(); } new Thread(new Runnable() { public void run() { throw new RuntimeException("booh!"); } }).start(); throw new RuntimeException("booh!"); invokes checks TestGroup’s Uncaught Exception Handler

35 Join with All Offspring Threads Main thread joins with all offspring threads, regardless of what thread spawned them Child thread 1 Child thread 2 Main thread

36 Child thread 1 Child thread 2 Main thread MT CT1 CT2 Child thread 1 Child thread 2 Main thread MT CT1 CT2 Join Graph Examples

37 Thread Creation Context In Thread.start() – also record stack trace of Thread.currentThread(  Easy to find source code of a child thread that is not joined  Also available for uncaught exception stack traces

38 Creation Context Example class Main { void foo() { // which one? new Helper().start(); //... } AssertionError: at Helper.m(Helper.java:2) at Helper.run(Helper.java:3) Started at: at Main.foo(Main.java:4) at Main.bar(Main.java:15) at Main.main(Main.java:25) class Helper extends Thread { void m() { Assert.fail(); } public void run() { m(); } }

39 Many Thanks To… My advisor  Corky Cartwright My committee members  Walid Taha  David Scott  Bill Scherer NSF and Texas ATP  For providing partial funding

40 Concurrency Problems Not Found During Testing *1