Merge "Add support for building presterastats tool"
diff --git a/ginstall/ginstall.py b/ginstall/ginstall.py
index 1d233c6..fd95163 100755
--- a/ginstall/ginstall.py
+++ b/ginstall/ginstall.py
@@ -771,10 +771,6 @@
   Raises:
     Fatal: if install fails
   """
-  if GetPlatform() == 'GFHD254' and GetMemTotal() < 4*1e9:
-    print 'Skipping bootloader on 2GB lockdown.'
-    return
-
   loader_start = loader.filelike.tell()
   installed = False
   for i in ['cfe', 'loader', 'loader0', 'loader1', 'flash0.bolt']:
diff --git a/libexperiments/experiments.cc b/libexperiments/experiments.cc
index d3dcb2b..89fec64 100644
--- a/libexperiments/experiments.cc
+++ b/libexperiments/experiments.cc
@@ -64,13 +64,17 @@
   register_func_ = register_func;
   min_time_between_refresh_usec_ = min_time_between_refresh_usec;
 
-  if (!Register_Locked(names_to_register))
-    return false;
+  initialized_ = true;  // initialization part succeeded at this point
 
-  // initial read of registered experiments states
-  Refresh();
+  // register any provided experiments
+  if (!names_to_register.empty()) {
+    if (!Register_Locked(names_to_register))
+      return false;
 
-  initialized_ = true;
+    // initial read of registered experiments states
+    Refresh();
+  }
+
   return true;
 }
 
@@ -156,7 +160,7 @@
 
   experiments = new Experiments();
   return experiments->Initialize(config_dir, min_time_between_refresh_usec,
-                                 register_func, {""});
+                                 register_func, {});
 }
 
 int experiments_is_initialized() {
@@ -171,6 +175,10 @@
   return experiments ? experiments->IsRegistered(name) : false;
 }
 
+int experiments_get_num_of_registered_experiments() {
+  return experiments ? experiments->GetNumOfRegisteredExperiments() : 0;
+}
+
 int experiments_is_enabled(const char *name) {
   return experiments ? experiments->IsEnabled(name) : false;
 }
diff --git a/libexperiments/experiments.h b/libexperiments/experiments.h
index 54c6389..1f086ba 100644
--- a/libexperiments/experiments.h
+++ b/libexperiments/experiments.h
@@ -84,8 +84,10 @@
         last_time_refreshed_usec_(0) {}
   virtual ~Experiments() {}
 
-  // Initializes the instance:
-  // * Sets the provided experiments config directory and register function.
+  // Initializes the instance and registers any provided experiments. In detail:
+  // * Sets the provided experiments config directory and register function and
+  //   makes sure they are valid. If successful the instance is marked as
+  //   initialized.
   // * Calls the register function for the provided experiment names.
   // * Scans the config folder to determine initial state of all registered
   //   experiments.
@@ -113,6 +115,10 @@
     return Register(names);
   }
 
+  int GetNumOfRegisteredExperiments() const {
+    return registered_experiments_.size();
+  }
+
   // Returns true if the given experiment is registered.
   bool IsRegistered(const std::string &name);
 
@@ -205,6 +211,9 @@
 // else 0 (boolean false).
 int experiments_is_registered(const char *name);
 
+// Returns the number of experiments registered.
+int experiments_get_num_of_registered_experiments();
+
 // Returns non-zero (boolean true) if the given experiment is active, else 0
 // (boolean false). If the minimum time between refreshes has passed, re-scans
 // the config folder for updates first.
diff --git a/libexperiments/experiments_test.cc b/libexperiments/experiments_test.cc
index e0370cc..5f0178d 100644
--- a/libexperiments/experiments_test.cc
+++ b/libexperiments/experiments_test.cc
@@ -131,6 +131,7 @@
   ASSERT_TRUE(e.Initialize(test_folder_path_, 0, &DummyExperimentsRegisterFunc,
                            {"exp1"}));
   EXPECT_TRUE(e.IsRegistered("exp1"));
+  EXPECT_EQ(1, e.GetNumOfRegisteredExperiments());
 
   // add one more
   EXPECT_FALSE(e.IsRegistered("exp2"));
@@ -160,6 +161,7 @@
   ASSERT_TRUE(e.Initialize(test_folder_path_, 0, &DummyExperimentsRegisterFunc,
                            {"exp1"}));
   EXPECT_FALSE(e.IsEnabled("exp1"));
+  EXPECT_EQ(1, e.GetNumOfRegisteredExperiments());
 
   EXPECT_TRUE(SetActive(&e, "exp1"));
   EXPECT_TRUE(e.IsEnabled("exp1"));
@@ -178,6 +180,7 @@
   Experiments e;
   ASSERT_TRUE(e.Initialize(test_folder_path_, 0, &DummyExperimentsRegisterFunc,
                            {"exp1", "exp2", "exp3"}));
+  EXPECT_EQ(3, e.GetNumOfRegisteredExperiments());
   EXPECT_FALSE(e.IsEnabled("exp1"));
   EXPECT_FALSE(e.IsEnabled("exp2"));
   EXPECT_FALSE(e.IsEnabled("exp3"));
@@ -233,6 +236,7 @@
   Experiments e;
   ASSERT_TRUE(e.Initialize(test_folder_path_, kMinTimeBetweenRefresh,
                            &DummyExperimentsRegisterFunc, {"exp1"}));
+  EXPECT_EQ(1, e.GetNumOfRegisteredExperiments());
   EXPECT_FALSE(e.IsEnabled("exp1"));
   EXPECT_TRUE(SetActive(&e, "exp1"));
 
@@ -263,9 +267,11 @@
   // initialize
   EXPECT_TRUE(test_experiments_initialize(test_folder_path_));
   EXPECT_TRUE(test_experiments_is_initialized());
+  EXPECT_EQ(0, experiments_get_num_of_registered_experiments());
 
   EXPECT_TRUE(test_experiments_register("exp1"));
   EXPECT_TRUE(test_experiments_is_registered("exp1"));
+  EXPECT_EQ(1, experiments_get_num_of_registered_experiments());
 
   EXPECT_FALSE(test_experiments_is_enabled("exp1"));
   EXPECT_TRUE(SetActive(experiments, "exp1"));