perfetto: try to fix CTS (part 3)

Bug: 70524267
Change-Id: Iefd4cc800514f7a3ebb96afc16ea1dbe53408375
diff --git a/test/cts/end_to_end_integrationtest_cts.cc b/test/cts/end_to_end_integrationtest_cts.cc
index 4ee3f56..787be39 100644
--- a/test/cts/end_to_end_integrationtest_cts.cc
+++ b/test/cts/end_to_end_integrationtest_cts.cc
@@ -14,14 +14,14 @@
  * limitations under the License.
  */
 
-#include <gtest/gtest.h>
+#include <random>
 
+#include "gtest/gtest.h"
 #include "perfetto/trace/test_event.pbzero.h"
 #include "perfetto/trace/trace_packet.pb.h"
 #include "perfetto/trace/trace_packet.pbzero.h"
 #include "perfetto/traced/traced.h"
 #include "perfetto/tracing/core/trace_packet.h"
-
 #include "test/fake_consumer.h"
 
 namespace perfetto {
@@ -30,7 +30,6 @@
  protected:
   void TestMockProducer(const std::string& producer_name) {
     base::TestTaskRunner task_runner;
-    auto finish = task_runner.CreateCheckpoint("no.more.packets");
 
     // Setup the trace config.
     TraceConfig trace_config;
@@ -41,26 +40,33 @@
     ds_config->set_name(producer_name);
     ds_config->set_target_buffer(0);
 
+    // The parameters for the producer.
+    static constexpr uint32_t kRandomSeed = 42;
+    static constexpr uint32_t kEventCount = 10;
+
+    // Setup the test to use a random number generator.
+    ds_config->mutable_for_testing()->set_seed(kRandomSeed);
+    ds_config->mutable_for_testing()->set_message_count(kEventCount);
+
+    // Create the random generator with the same seed.
+    std::minstd_rand0 rnd_engine(kRandomSeed);
+
     // Setip the function.
     uint64_t total = 0;
-    auto function = [&total, &finish](std::vector<TracePacket> packets,
-                                      bool has_more) {
-      if (has_more) {
-        for (auto& packet : packets) {
-          packet.Decode();
-          ASSERT_TRUE(packet->has_for_testing());
-          // ASSERT_EQ(protos::TracePacket::kTrustedUid,
-          //          packet->optional_trusted_uid_case());
-          ASSERT_EQ(packet->for_testing().str(), "test");
-        }
-        total += packets.size();
+    auto finish = task_runner.CreateCheckpoint("no.more.packets");
+    auto function = [&total, &finish, &rnd_engine](
+                        std::vector<TracePacket> packets, bool has_more) {
+      for (auto& packet : packets) {
+        ASSERT_TRUE(packet.Decode());
+        ASSERT_TRUE(packet->has_for_testing());
+        ASSERT_EQ(protos::TracePacket::kTrustedUid,
+                  packet->optional_trusted_uid_case());
+        ASSERT_EQ(packet->for_testing().seq_value(), rnd_engine());
+      }
+      total += packets.size();
 
-        // TODO(lalitm): renable this when stiching inside the service is
-        // present.
-        // ASSERT_FALSE(packets->empty());
-      } else {
-        ASSERT_EQ(total, 10u);
-        ASSERT_TRUE(packets.empty());
+      if (!has_more) {
+        ASSERT_EQ(total, kEventCount);
         finish();
       }
     };
@@ -73,7 +79,7 @@
     // and the consumer tries to retrieve it. For now wait a bit until the
     // service is done, but we should add explicit flushing to avoid this.
     task_runner.PostDelayedTask([&consumer]() { consumer.ReadTraceData(); },
-                                2500);
+                                5000);
 
     task_runner.RunUntilCheckpoint("no.more.packets", 10000);
   }
diff --git a/test/cts/producer/AndroidManifest.xml b/test/cts/producer/AndroidManifest.xml
index 6924a9a..6139dca 100755
--- a/test/cts/producer/AndroidManifest.xml
+++ b/test/cts/producer/AndroidManifest.xml
@@ -17,6 +17,8 @@
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="android.perfetto.producer">
+    <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
+
     <application>
         <activity android:name=".ProducerActivity" >
             <intent-filter>
diff --git a/test/cts/producer/res/mipmap-hdpi/ic_launcher.png b/test/cts/producer/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000..7e5732c
--- /dev/null
+++ b/test/cts/producer/res/mipmap-hdpi/ic_launcher.png
Binary files differ
diff --git a/test/cts/producer/res/mipmap-mdpi/ic_launcher.png b/test/cts/producer/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000..8fc5d07
--- /dev/null
+++ b/test/cts/producer/res/mipmap-mdpi/ic_launcher.png
Binary files differ
diff --git a/test/cts/producer/res/mipmap-xhdpi/ic_launcher.png b/test/cts/producer/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..0bef6d9
--- /dev/null
+++ b/test/cts/producer/res/mipmap-xhdpi/ic_launcher.png
Binary files differ
diff --git a/test/cts/producer/res/mipmap-xxhdpi/ic_launcher.png b/test/cts/producer/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000..7144af0
--- /dev/null
+++ b/test/cts/producer/res/mipmap-xxhdpi/ic_launcher.png
Binary files differ
diff --git a/test/cts/producer/res/mipmap-xxxhdpi/ic_launcher.png b/test/cts/producer/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000..2dbbdfc
--- /dev/null
+++ b/test/cts/producer/res/mipmap-xxxhdpi/ic_launcher.png
Binary files differ
diff --git a/test/cts/producer/src/android/perfetto/producer/ProducerActivity.java b/test/cts/producer/src/android/perfetto/producer/ProducerActivity.java
index 2dfa0ce..1eedfe3 100644
--- a/test/cts/producer/src/android/perfetto/producer/ProducerActivity.java
+++ b/test/cts/producer/src/android/perfetto/producer/ProducerActivity.java
@@ -17,48 +17,49 @@
 package android.perfetto.producer;
 
 import android.app.Activity;
+import android.app.Notification;
+import android.app.NotificationChannel;
+import android.app.NotificationManager;
+import android.content.Context;
 import android.content.Intent;
 import android.os.Bundle;
 import android.os.Handler;
 
 public class ProducerActivity extends Activity {
-    private boolean paused = true;
-    private final Handler handler = new Handler();
 
     @Override
     public void onResume() {
         super.onResume();
 
-        paused = false;
-        handler.post(new Runnable() {
-            @Override
+        NotificationManager manager =
+                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
+
+        NotificationChannel serviceChannel =
+                new NotificationChannel("service", "service", NotificationManager.IMPORTANCE_LOW);
+        serviceChannel.setDescription("Perfetto service");
+        serviceChannel.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);
+        manager.createNotificationChannel(serviceChannel);
+
+        NotificationChannel isolatedChannel = new NotificationChannel(
+                "isolated_service", "isolated_service", NotificationManager.IMPORTANCE_LOW);
+        isolatedChannel.setDescription("Perfetto isolated service");
+        isolatedChannel.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);
+        manager.createNotificationChannel(isolatedChannel);
+
+        startForegroundService(new Intent(ProducerActivity.this, ProducerService.class));
+        startForegroundService(new Intent(ProducerActivity.this, ProducerIsolatedService.class));
+
+        System.loadLibrary("perfettocts_jni");
+        new Thread(new Runnable() {
             public void run() {
-                if (paused) {
-                    return;
+                try {
+                    setupProducer();
+                } catch (Exception ex) {
+                    ex.printStackTrace();
                 }
-
-                startService(new Intent(ProducerActivity.this, ProducerService.class));
-                startService(new Intent(ProducerActivity.this, ProducerIsolatedService.class));
-
-                System.loadLibrary("perfettocts_jni");
-                new Thread(new Runnable() {
-                    public void run() {
-                        try {
-                            setupProducer();
-                        } catch (Exception ex) {
-                            ex.printStackTrace();
-                        }
-                    }
-                })
-                        .start();
             }
-        });
-    }
-
-    @Override
-    public void onPause() {
-        super.onPause();
-        paused = true;
+        })
+                .start();
     }
 
     private static native void setupProducer();
diff --git a/test/cts/producer/src/android/perfetto/producer/ProducerIsolatedService.java b/test/cts/producer/src/android/perfetto/producer/ProducerIsolatedService.java
index cde5c32..9f26f54 100644
--- a/test/cts/producer/src/android/perfetto/producer/ProducerIsolatedService.java
+++ b/test/cts/producer/src/android/perfetto/producer/ProducerIsolatedService.java
@@ -16,13 +16,23 @@
 
 package android.perfetto.producer;
 
+import android.app.Notification;
 import android.app.Service;
 import android.os.IBinder;
 import android.content.Intent;
 
 public class ProducerIsolatedService extends Service {
+    private static final int NOTIFICATION_ID = 123;
+
     @Override
     public void onCreate() {
+        Notification.Builder builder = new Notification.Builder(this, "isolated_service");
+        builder.setContentTitle("Perfetto isolated service")
+                .setContentText("Perfetto isolated service")
+                .setSmallIcon(R.mipmap.ic_launcher);
+
+        startForeground(NOTIFICATION_ID, builder.build());
+
         System.loadLibrary("perfettocts_jni");
         new Thread(new Runnable() {
             @Override
diff --git a/test/cts/producer/src/android/perfetto/producer/ProducerService.java b/test/cts/producer/src/android/perfetto/producer/ProducerService.java
index f649ddc..a86267a 100644
--- a/test/cts/producer/src/android/perfetto/producer/ProducerService.java
+++ b/test/cts/producer/src/android/perfetto/producer/ProducerService.java
@@ -16,13 +16,22 @@
 
 package android.perfetto.producer;
 
+import android.app.Notification;
 import android.app.Service;
 import android.os.IBinder;
 import android.content.Intent;
 
 public class ProducerService extends Service {
+    private static final int NOTIFICATION_ID = 456;
+
     @Override
     public void onCreate() {
+        Notification.Builder builder = new Notification.Builder(this, "service");
+        builder.setContentTitle("Perfetto service")
+                .setContentText("Perfetto service")
+                .setSmallIcon(R.mipmap.ic_launcher);
+        startForeground(NOTIFICATION_ID, builder.build());
+
         System.loadLibrary("perfettocts_jni");
         new Thread(new Runnable() {
             @Override