From d8e44865b25e80d7b5e7f2f9b8ccbe1546340f5e Mon Sep 17 00:00:00 2001 From: Trial97 Date: Mon, 19 Jul 2021 15:51:04 +0300 Subject: [PATCH] Updated resources unit tests --- data/conf/cgrates/cgrates.json | 40 ++++++++++++++++++++++++++++++---- engine/resources.go | 2 +- engine/z_resources_test.go | 35 +++++++++++++++++++---------- 3 files changed, 60 insertions(+), 17 deletions(-) diff --git a/data/conf/cgrates/cgrates.json b/data/conf/cgrates/cgrates.json index 19f729fc3..b3e53e805 100755 --- a/data/conf/cgrates/cgrates.json +++ b/data/conf/cgrates/cgrates.json @@ -299,7 +299,6 @@ // "enabled": false, // enable Rating/Accounting service: // "thresholds_conns": [], // connections to ThresholdS for account/balance updates, empty to disable thresholds functionality: <""|*internal|$rpc_conns_id> // "stats_conns": [], // connections to StatS for account/balance updates, empty to disable stats functionality: <""|*internal|$rpc_conns_id> -// "caches_conns":["*internal"], // connections to CacheS for account/balance updates // "rp_subject_prefix_matching": false, // enables prefix matching for the rating profile subject // "remove_expired":true, // enables automatic removal of expired balances // "max_computed_usage": { // do not compute usage higher than this, prevents memory overload @@ -314,6 +313,7 @@ // "*any": "*zero1ns", // "*voice": "*zero1s" // }, + // }, @@ -348,7 +348,7 @@ // "opts": { // // Partial // // "partialPath": "/", // the path were the partial events will be sent -// // "partialCacheAction": "*none", // the action that will be executed for the partial CSVs that are not matched<*none|*post_cdr|*dump_to_file> +// "partialCacheAction": "*none", // the action that will be executed for the partial CSVs that are not matched<*none|*post_cdr|*dump_to_file> // "partialOrderField": "~*req.AnswerTime", // the field after what the events are order when merged // // "partialcsvFieldSeparator": "," // separator used when dumping the fields @@ -413,6 +413,27 @@ // // "s3FolderPathProcessed": "", // only for S3 event posting // // "s3BucketIDProcessed": "cgrates_cdrs", // the bucket id for S3 readers were the events are sent after they are processed + +// // nats +// // "natsJetStream": false, // controls if the nats reader uses the JetStream +// // "natsConsumerName": "cgrates", // in case of JetStream the name of the consumer +// "natsSubject": "cgrates_cdrs", // the subject from were the events are read +// // "natsQueueID": "", // the queue id the consumer listen to +// // "natsJWTFile": "", // the path to the JWT file( can be the chained file or the user file) +// // "natsSeedFile": "", // the path to the seed files( if the JWT file is mention this is used as seedFile for the JWT user mentioned above) +// // "natsCertificateAuthority": "", // the path to a custom certificate authority file( used by tls) +// // "natsClientCertificate": "", // the path to a client certificate( used by tls) +// // "natsClientKey": "", // the path to a client key( used by tls) +// // "natsJetStreamMaxWait": "5s", // the maximum amount of time to wait for a response + +// // "natsJetStreamProcessed": false, // controls if the nats poster uses the JetStream +// // "natsSubjectProcessed": "cgrates_cdrs", // the subject were the events are posted +// // "natsJWTFileProcessed": "", // the path to the JWT file( can be the chained file or the user file) +// // "natsSeedFileProcessed": "", // the path to the seed files( if the JWT file is mention this is used as seedFile for the JWT user mentioned above) +// // "natsCertificateAuthorityProcessed": "", // the path to a custom certificate authority file( used by tls) +// // "natsClientCertificateProcessed": "", // the path to a client certificate( used by tls) +// // "natsClientKeyProcessed": "", // the path to a client key( used by tls) +// // "natsJetStreamMaxWaitProcessed": "5s ", // the maximum amount of time to wait for a response // }, // "tenant": "", // tenant used by import // "timezone": "", // timezone for timestamps where not specified <""|UTC|Local|$IANA_TZ_DB> @@ -503,6 +524,15 @@ // // "s3BucketID": "cgrates_cdrs", // the bucket id for S3 readers from where the events that are exported // // "s3FolderPath": "", // S3FolderPath +// // Nats +// // "natsJetStream": false, // controls if the nats poster uses the JetStream +// // "natsSubject": "cgrates_cdrs", // the subject were the events are exported +// // "natsJWTFile": "", // the path to the JWT file( can be the chained file or the user file) +// // "natsSeedFile": "", // the path to the seed files( if the JWT file is mention this is used as seedFile for the JWT user mentioned above) +// // "natsCertificateAuthority": "", // the path to a custom certificate authority file( used by tls) +// // "natsClientCertificate": "", // the path to a client certificate( used by tls) +// // "natsClientKey": "", // the path to a client key( used by tls) +// // "natsJetStreamMaxWait": "5s", // the maximum amount of time to wait for a response // }, // extra options for exporter // "timezone": "", // timezone for timestamps where not specified <""|UTC|Local|$IANA_TZ_DB> // "filters": [], // limit parsing based on the filters @@ -660,6 +690,7 @@ // "suffix_indexed_fields": [], // query indexes based on these fields for faster processing // "nested_fields": false, // determines which field is checked when matching indexed filters(true: all; false: only the one on the first level) // "process_runs": 1, // number of run loops when processing event +// "any_context": true, // if we match the *any context // }, @@ -977,6 +1008,7 @@ // "suffix_indexed_fields": [], // query indexes based on these fields for faster processing // "nested_fields": false, // determines which field is checked when matching indexed filters(true: all; false: only the one on the first level) // "attributes_conns": [], // connections to AttributeS for API authorization, empty to disable auth functionality: <""|*internal|$rpc_conns_id> +// "any_subsystem": true, // if we match the *any subsystem // }, @@ -984,13 +1016,13 @@ // "rpc":{ // "enabled": false, // "registrars_conns": [], -// "hosts": [], +// "hosts": [], // "refresh_interval": "5m", // }, // "dispatchers":{ // "enabled": false, // "registrars_conns": [], -// "hosts": [], +// "hosts": [], // "refresh_interval": "5m", // }, // }, diff --git a/engine/resources.go b/engine/resources.go index fd5af0c2f..494154247 100644 --- a/engine/resources.go +++ b/engine/resources.go @@ -453,6 +453,7 @@ func (rS *ResourceService) storeResources() { rIf, ok := Cache.Get(utils.CacheResources, rID) if !ok || rIf == nil { utils.Logger.Warning(fmt.Sprintf("<%s> failed retrieving from cache resource with ID: %s", utils.ResourceS, rID)) + continue } r := rIf.(*Resource) r.lock(utils.EmptyString) @@ -562,7 +563,6 @@ func (rS *ResourceService) matchingResourcesForEvent(tnt string, ev *utils.CGREv err = errCh } } - return }() } else { // select the resourceIDs out of dataDB diff --git a/engine/z_resources_test.go b/engine/z_resources_test.go index 6846375cd..562bb718d 100644 --- a/engine/z_resources_test.go +++ b/engine/z_resources_test.go @@ -135,7 +135,7 @@ func TestResourceTotalUsage1(t *testing.T) { }, }, } - result := testStruct.totalUsage() + result := testStruct.TotalUsage() if reflect.DeepEqual(3, result) { t.Errorf("\nExpecting <3>,\n Received <%+v>", result) } @@ -443,7 +443,7 @@ func TestResourceUsedUnits(t *testing.T) { ru1.ID: ru1, } r1.tUsage = nil - if usedUnits := r1.totalUsage(); usedUnits != 1 { + if usedUnits := r1.TotalUsage(); usedUnits != 1 { t.Errorf("Expecting: %+v, received: %+v", 1, usedUnits) } } @@ -631,7 +631,7 @@ func TestResourceClearUsage(t *testing.T) { if len(r1.Usages) != 0 { t.Errorf("Expecting: %+v, received: %+v", 0, len(r1.Usages)) } - if r1.totalUsage() != 0 { + if r1.TotalUsage() != 0 { t.Errorf("Expecting: %+v, received: %+v", 0, r1.tUsage) } if err := r2.clearUsage(ru2.ID); err != nil { @@ -1297,6 +1297,7 @@ func TestResourceMatchingResourcesForEvent(t *testing.T) { if err != nil { t.Errorf("Error: %+v", err) } + mres.unlock() if !reflect.DeepEqual(resourceTest[0].Tenant, mres[0].Tenant) { t.Errorf("Expecting: %+v, received: %+v", resourceTest[0].Tenant, mres[0].Tenant) } else if !reflect.DeepEqual(resourceTest[0].ID, mres[0].ID) { @@ -1310,6 +1311,7 @@ func TestResourceMatchingResourcesForEvent(t *testing.T) { if err != nil { t.Errorf("Error: %+v", err) } + mres.unlock() if !reflect.DeepEqual(resourceTest[1].Tenant, mres[0].Tenant) { t.Errorf("Expecting: %+v, received: %+v", resourceTest[1].Tenant, mres[0].Tenant) } else if !reflect.DeepEqual(resourceTest[1].ID, mres[0].ID) { @@ -1323,6 +1325,7 @@ func TestResourceMatchingResourcesForEvent(t *testing.T) { if err != nil { t.Errorf("Error: %+v", err) } + mres.unlock() if !reflect.DeepEqual(resourceTest[2].Tenant, mres[0].Tenant) { t.Errorf("Expecting: %+v, received: %+v", resourceTest[2].Tenant, mres[0].Tenant) } else if !reflect.DeepEqual(resourceTest[2].ID, mres[0].ID) { @@ -1528,6 +1531,7 @@ func TestResourceUsageTTLCase1(t *testing.T) { if err != nil { t.Errorf("Error: %+v", err) } + mres.unlock() if !reflect.DeepEqual(resourceTest[0].Tenant, mres[0].Tenant) { t.Errorf("Expecting: %+v, received: %+v", resourceTest[0].Tenant, mres[0].Tenant) } else if !reflect.DeepEqual(resourceTest[0].ID, mres[0].ID) { @@ -1733,6 +1737,7 @@ func TestResourceUsageTTLCase2(t *testing.T) { if err != nil { t.Errorf("Error: %+v", err) } + mres.unlock() if !reflect.DeepEqual(resourceTest[0].Tenant, mres[0].Tenant) { t.Errorf("Expecting: %+v, received: %+v", resourceTest[0].Tenant, mres[0].Tenant) } else if !reflect.DeepEqual(resourceTest[0].ID, mres[0].ID) { @@ -1938,6 +1943,7 @@ func TestResourceUsageTTLCase3(t *testing.T) { if err != nil { t.Errorf("Error: %+v", err) } + mres.unlock() if !reflect.DeepEqual(resourceTest[0].Tenant, mres[0].Tenant) { t.Errorf("Expecting: %+v, received: %+v", resourceTest[0].Tenant, mres[0].Tenant) } else if !reflect.DeepEqual(resourceTest[0].ID, mres[0].ID) { @@ -2144,6 +2150,7 @@ func TestResourceUsageTTLCase4(t *testing.T) { if err != nil { t.Errorf("Error: %+v", err) } + mres.unlock() if !reflect.DeepEqual(resourceTest[0].Tenant, mres[0].Tenant) { t.Errorf("Expecting: %+v, received: %+v", resourceTest[0].Tenant, mres[0].Tenant) } else if !reflect.DeepEqual(resourceTest[0].ID, mres[0].ID) { @@ -2571,6 +2578,7 @@ func TestResourceMatchWithIndexFalse(t *testing.T) { t.Errorf("Error: %+v", err) } + mres.unlock() if !reflect.DeepEqual(resourceTest[0].Tenant, mres[0].Tenant) { t.Errorf("Expecting: %+v, received: %+v", resourceTest[0].Tenant, mres[0].Tenant) } else if !reflect.DeepEqual(resourceTest[0].ID, mres[0].ID) { @@ -2584,6 +2592,7 @@ func TestResourceMatchWithIndexFalse(t *testing.T) { if err != nil { t.Errorf("Error: %+v", err) } + mres.unlock() if !reflect.DeepEqual(resourceTest[1].Tenant, mres[0].Tenant) { t.Errorf("Expecting: %+v, received: %+v", resourceTest[1].Tenant, mres[0].Tenant) } else if !reflect.DeepEqual(resourceTest[1].ID, mres[0].ID) { @@ -2597,6 +2606,7 @@ func TestResourceMatchWithIndexFalse(t *testing.T) { if err != nil { t.Errorf("Error: %+v", err) } + mres.unlock() if !reflect.DeepEqual(resourceTest[2].Tenant, mres[0].Tenant) { t.Errorf("Expecting: %+v, received: %+v", resourceTest[2].Tenant, mres[0].Tenant) } else if !reflect.DeepEqual(resourceTest[2].ID, mres[0].ID) { @@ -2817,6 +2827,7 @@ func TestResourceCaching(t *testing.T) { if err != nil { t.Errorf("Error: %+v", err) } + mres.unlock() if !reflect.DeepEqual(resources[0].Tenant, mres[0].Tenant) { t.Errorf("Expecting: %+v, received: %+v", resources[0].Tenant, mres[0].Tenant) } else if !reflect.DeepEqual(resources[0].ID, mres[0].ID) { @@ -3500,7 +3511,7 @@ func TestResourcesProcessThresholdsNoConns(t *testing.T) { } opts := map[string]interface{}{} - err := rS.processThresholds(r, opts) + err := rS.processThresholds(Resources{r}, opts) if err != nil { t.Errorf("\nexpected nil, received %+v", err) @@ -3561,7 +3572,7 @@ func TestResourcesProcessThresholdsOK(t *testing.T) { }, } - err := rS.processThresholds(r, nil) + err := rS.processThresholds(Resources{r}, nil) if err != nil { t.Errorf("\nexpected nil, received %+v", err) @@ -3635,8 +3646,8 @@ func TestResourcesProcessThresholdsCallErr(t *testing.T) { }, } - experr := utils.ErrExists - err := rS.processThresholds(r, nil) + experr := utils.ErrPartiallyExecuted + err := rS.processThresholds(Resources{r}, nil) if err == nil || err != experr { t.Errorf("\nexpected: <%+v>, \nreceived: <%+v>", experr, err) @@ -3662,7 +3673,7 @@ func TestResourcesProcessThresholdsThdConnMetaNone(t *testing.T) { } opts := map[string]interface{}{} - err := rS.processThresholds(r, opts) + err := rS.processThresholds(Resources{r}, opts) if err != nil { t.Errorf("\nexpected nil, received: %+v", err) @@ -5760,8 +5771,8 @@ func TestResourcesV1AllocateResourcesProcessThErr(t *testing.T) { var reply string if err := rS.V1AllocateResources(args, &reply); err == nil || - err != utils.ErrExists { - t.Errorf("expected: <%+v>, \nreceived: <%+v>", utils.ErrExists, err) + err != utils.ErrPartiallyExecuted { + t.Errorf("expected: <%+v>, \nreceived: <%+v>", utils.ErrPartiallyExecuted, err) } dm.DataDB().Flush(utils.EmptyString) } @@ -6287,8 +6298,8 @@ func TestResourcesV1ReleaseResourcesProcessThErr(t *testing.T) { } if err := rS.V1ReleaseResources(args, &reply); err == nil || - err != utils.ErrExists { - t.Errorf("expected: <%+v>, \nreceived: <%+v>", utils.ErrExists, err) + err != utils.ErrPartiallyExecuted { + t.Errorf("expected: <%+v>, \nreceived: <%+v>", utils.ErrPartiallyExecuted, err) } dm.DataDB().Flush(utils.EmptyString)