+
+ std::string policy = "{\"policy_type_id\":21000, \"policy_instance_id\":\"hello-there\", \"operation\":\"CREATE\", \"payload\":{\"blocking_rate\":20, \"enforce\":true, \"window_length\":50, \"trigger_threshold\":10, \"class\":14}}";
+
+ bool res;
+ std::string response, test_policy, policy_instance_id;
+ rapidjson::Document doc;
+ rapidjson::StringBuffer s_buffer;
+ rapidjson::Writer<rapidjson::StringBuffer> writer(s_buffer);
+
+ int num_policies = 10;
+ admission adm_plugin(SCHEMA_FILE, SAMPLE_FILE, VES_FILE, 1, xapp_id);
+ doc.Parse(policy.c_str());
+ // Add some policies first
+ for(int i = 1; i <= num_policies; i++){
+ policy_instance_id = "rate_control_policy_" + std::to_string(i);
+ rapidjson::SetValueByPointer(doc, "/policy_instance_id", policy_instance_id.c_str());
+ rapidjson::SetValueByPointer(doc, "/payload/class", i);
+ s_buffer.Clear();
+ writer.Reset(s_buffer);
+ doc.Accept(writer);
+ test_policy.assign(s_buffer.GetString(), s_buffer.GetLength());
+
+ // valid policy should succeed
+ res = adm_plugin.setPolicy(test_policy.c_str(), test_policy.length(), response);
+ REQUIRE(res == true);
+ //REQUIRE_THAT(response, Catch::Matchers::Contains("SUCCESS"));
+ }
+
+
+ // now get metrics
+ // First time, measurementInterval should be zero
+ std::vector<std::string> metrics;
+ adm_plugin.getMetrics(metrics);
+ REQUIRE(metrics.size() == num_policies + 1);
+ for(auto const e : metrics){
+ std::cout << e<< std::endl;
+ REQUIRE_THAT(e, Catch::Matchers::Contains("\"Class Id\""));
+ REQUIRE_THAT(e, Catch::Matchers::Contains("\"measurementInterval\":\"0\""));
+ }
+
+ int interval = 5;
+ // wait for 'x' seconds and try again
+ std::this_thread::sleep_for(std::chrono::seconds(interval));
+ rapidjson::Pointer int_ref("/event/measurementFields/measurementInterval");
+
+ metrics.clear();
+ adm_plugin.getMetrics(metrics);
+ REQUIRE(metrics.size() == num_policies + 1);
+ for(auto const e : metrics){
+ REQUIRE(doc.Parse(e.c_str()).HasParseError() == 0);
+ std::cout << e<< std::endl;
+ REQUIRE_THAT(e, Catch::Matchers::Contains("\"Class Id\""));
+ // extract measurement interval
+ rapidjson::Value *interval_val = int_ref.Get(doc);
+ REQUIRE(interval_val != NULL);
+ double read_interval_approx = atof(interval_val->GetString());
+ REQUIRE(read_interval_approx == Approx(interval).margin(1));
+ }
+