diff options
author | TreeHugger Robot <treehugger-gerrit@google.com> | 2019-05-14 13:59:42 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2019-05-14 13:59:42 +0000 |
commit | 52f7022db3ae774d0cb1f8dd1cb86d741edab4ba (patch) | |
tree | 6d930a2a9263f7f729cbdfd9ec7aa3ad9459be16 | |
parent | 90122592ff1a38438f35a9a8ff4090c18cea969d (diff) | |
parent | 8527b23eeea810b42fc38242d11fd00cc1202ff0 (diff) |
Merge "Fix testKeyValue_Concurrency flakyness" into qt-dev
-rw-r--r-- | services/tests/servicestests/src/com/android/server/locksettings/LockSettingsStorageTests.java | 55 |
1 files changed, 38 insertions, 17 deletions
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsStorageTests.java b/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsStorageTests.java index 8af4edda3b8b..18453aa13264 100644 --- a/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsStorageTests.java +++ b/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsStorageTests.java @@ -27,6 +27,7 @@ import android.app.trust.TrustManager; import android.content.pm.UserInfo; import android.database.sqlite.SQLiteDatabase; import android.os.FileUtils; +import android.os.SystemClock; import android.os.UserManager; import android.os.storage.StorageManager; import android.platform.test.annotations.Presubmit; @@ -125,7 +126,7 @@ public class LockSettingsStorageTests extends AndroidTestCase { List<Thread> threads = new ArrayList<>(); for (int i = 0; i < 100; i++) { final int threadId = i; - threads.add(new Thread() { + threads.add(new Thread("testKeyValue_Concurrency_" + i) { @Override public void run() { synchronized (monitor) { @@ -134,17 +135,17 @@ public class LockSettingsStorageTests extends AndroidTestCase { } catch (InterruptedException e) { return; } - mStorage.writeKeyValue("key", "1 from thread " + threadId, 0); - mStorage.readKeyValue("key", "default", 0); - mStorage.writeKeyValue("key", "2 from thread " + threadId, 0); - mStorage.readKeyValue("key", "default", 0); - mStorage.writeKeyValue("key", "3 from thread " + threadId, 0); - mStorage.readKeyValue("key", "default", 0); - mStorage.writeKeyValue("key", "4 from thread " + threadId, 0); - mStorage.readKeyValue("key", "default", 0); - mStorage.writeKeyValue("key", "5 from thread " + threadId, 0); - mStorage.readKeyValue("key", "default", 0); } + mStorage.writeKeyValue("key", "1 from thread " + threadId, 0); + mStorage.readKeyValue("key", "default", 0); + mStorage.writeKeyValue("key", "2 from thread " + threadId, 0); + mStorage.readKeyValue("key", "default", 0); + mStorage.writeKeyValue("key", "3 from thread " + threadId, 0); + mStorage.readKeyValue("key", "default", 0); + mStorage.writeKeyValue("key", "4 from thread " + threadId, 0); + mStorage.readKeyValue("key", "default", 0); + mStorage.writeKeyValue("key", "5 from thread " + threadId, 0); + mStorage.readKeyValue("key", "default", 0); } }); threads.get(i).start(); @@ -153,12 +154,7 @@ public class LockSettingsStorageTests extends AndroidTestCase { synchronized (monitor) { monitor.notifyAll(); } - for (int i = 0; i < threads.size(); i++) { - try { - threads.get(i).join(); - } catch (InterruptedException e) { - } - } + joinAll(threads, 10000); assertEquals('5', mStorage.readKeyValue("key", "default", 0).charAt(0)); mStorage.clearCache(); assertEquals('5', mStorage.readKeyValue("key", "default", 0).charAt(0)); @@ -515,4 +511,29 @@ public class LockSettingsStorageTests extends AndroidTestCase { } return captured[0]; } + + private static void joinAll(List<Thread> threads, long timeoutMillis) { + long deadline = SystemClock.uptimeMillis() + timeoutMillis; + for (Thread t : threads) { + try { + t.join(deadline - SystemClock.uptimeMillis()); + if (t.isAlive()) { + t.interrupt(); + throw new RuntimeException( + "Joining " + t + " timed out. Stack: \n" + getStack(t)); + } + } catch (InterruptedException e) { + throw new RuntimeException("Interrupted while joining " + t, e); + } + } + } + + private static String getStack(Thread t) { + StringBuilder sb = new StringBuilder(); + sb.append(t.toString()).append('\n'); + for (StackTraceElement ste : t.getStackTrace()) { + sb.append("\tat ").append(ste.toString()).append('\n'); + } + return sb.toString(); + } } |