From cb3e76e6c2f0cc7c951df7d9bf1b613353616f35 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Tue, 25 Sep 2018 15:28:05 +0300 Subject: [PATCH] Added tests with FilterIDs for fwv --- cdrc/fwv_it_test.go | 109 ++++++++++++++++++ .../samples/cdrcfwvwithfilter/cgrates.json | 42 +++++++ 2 files changed, 151 insertions(+) diff --git a/cdrc/fwv_it_test.go b/cdrc/fwv_it_test.go index 427ffd195..33a7525b6 100644 --- a/cdrc/fwv_it_test.go +++ b/cdrc/fwv_it_test.go @@ -257,3 +257,112 @@ func TestFwvit2KillEngine(t *testing.T) { t.Error(err) } } + +// Begin tests for cdrc fwv with new filters +func TestFwvit3InitCfg(t *testing.T) { + var err error + fwvCfgPath = path.Join(*dataDir, "conf", "samples", "cdrcfwvwithfilter") + if fwvCfg, err = config.NewCGRConfigFromFolder(fwvCfgPath); err != nil { + t.Fatal("Got config error: ", err.Error()) + } +} + +// InitDb so we can rely on count +func TestFwvit3InitCdrDb(t *testing.T) { + if err := engine.InitStorDb(fwvCfg); err != nil { + t.Fatal(err) + } +} + +// Creates cdr files and moves them into processing folder +func TestFwvit3CreateCdrFiles(t *testing.T) { + if fwvCfg == nil { + t.Fatal("Empty default cdrc configuration") + } + for _, cdrcCfg := range fwvCfg.CdrcProfiles["/tmp/cgr_fwv/cdrc/in"] { + if cdrcCfg.ID == "FWVWithFilterID" { + fwvCdrcCfg = cdrcCfg + } + } + if err := os.RemoveAll(fwvCdrcCfg.CdrInDir); err != nil { + t.Fatal("Error removing folder: ", fwvCdrcCfg.CdrInDir, err) + } + if err := os.MkdirAll(fwvCdrcCfg.CdrInDir, 0755); err != nil { + t.Fatal("Error creating folder: ", fwvCdrcCfg.CdrInDir, err) + } + if err := os.RemoveAll(fwvCdrcCfg.CdrOutDir); err != nil { + t.Fatal("Error removing folder: ", fwvCdrcCfg.CdrOutDir, err) + } + if err := os.MkdirAll(fwvCdrcCfg.CdrOutDir, 0755); err != nil { + t.Fatal("Error creating folder: ", fwvCdrcCfg.CdrOutDir, err) + } +} + +func TestFwvit3StartEngine(t *testing.T) { + if _, err := engine.StopStartEngine(fwvCfgPath, *waitRater); err != nil { + t.Fatal(err) + } +} + +// Connect rpc client to rater +func TestFwvit3RpcConn(t *testing.T) { + var err error + fwvRpc, err = jsonrpc.Dial("tcp", fwvCfg.RPCJSONListen) // We connect over JSON so we can also troubleshoot if needed + if err != nil { + t.Fatal("Could not connect to rater: ", err.Error()) + } +} + +func TestFwvit3AddFilters(t *testing.T) { + filter := &engine.Filter{ + Tenant: "cgrates.org", + ID: "FLTR_FWV", + Rules: []*engine.FilterRule{ + { + Type: "*string", + FieldName: "0-10", + Values: []string{"CDR0000010"}, + }, + }, + } + var result string + if err := fwvRpc.Call("ApierV1.SetFilter", filter, &result); err != nil { + t.Error(err) + } else if result != utils.OK { + t.Error("Unexpected reply returned", result) + } +} + +func TestFwvit3ProcessFiles(t *testing.T) { + fileName := "test1.fwv" + if err := ioutil.WriteFile(path.Join("/tmp", fileName), []byte(FW_CDR_FILE1), 0644); err != nil { + t.Fatal(err.Error()) + } + if err := os.Rename(path.Join("/tmp", fileName), path.Join(fwvCdrcCfg.CdrInDir, fileName)); err != nil { + t.Fatal(err) + } + time.Sleep(time.Duration(1) * time.Second) + filesInDir, _ := ioutil.ReadDir(fwvCdrcCfg.CdrInDir) + if len(filesInDir) != 0 { + t.Errorf("Files in cdrcInDir: %d", len(filesInDir)) + } + filesOutDir, _ := ioutil.ReadDir(fwvCdrcCfg.CdrOutDir) + if len(filesOutDir) != 1 { + t.Errorf("In CdrcOutDir, expecting 1 files, got: %d", len(filesOutDir)) + } +} + +func TestFwvit3AnalyseCDRs(t *testing.T) { + var reply []*engine.ExternalCDR + if err := fwvRpc.Call("ApierV2.GetCdrs", utils.RPCCDRsFilter{}, &reply); err != nil { + t.Error("Unexpected error: ", err.Error()) + } else if len(reply) != 2 { + t.Error("Unexpected number of CDRs returned: ", len(reply)) + } +} + +func TestFwvit3KillEngine(t *testing.T) { + if err := engine.KillEngine(*waitRater); err != nil { + t.Error(err) + } +} diff --git a/data/conf/samples/cdrcfwvwithfilter/cgrates.json b/data/conf/samples/cdrcfwvwithfilter/cgrates.json index 2dd04a292..616dd21e4 100755 --- a/data/conf/samples/cdrcfwvwithfilter/cgrates.json +++ b/data/conf/samples/cdrcfwvwithfilter/cgrates.json @@ -71,6 +71,48 @@ {"tag": "TotalDuration", "type": "metatag", "metatag_id":"total_duration", "value": "~150-162"}, ], }, + + { + "id": "FWVWithFilterID", + "enabled": true, // enable CDR client functionality + "dry_run": false, + "cdrs_conns": [ + {"address": "*internal"} // address where to reach CDR server. <*internal|x.y.z.y:1234> + ], + "cdr_format": "fwv", // CDR file format + "cdr_in_dir": "/tmp/cgr_fwv/cdrc/in", // absolute path towards the directory where the CDRs are stored + "cdr_out_dir": "/tmp/cgr_fwv/cdrc/out", // absolute path towards the directory where processed CDRs will be moved + "cdr_source_id": "cdrc", // free form field, id identifying the source of the CDRs within CDRS database + "filters":["FLTR_FWV"], + "header_fields": [ + {"tag": "FileName", "field_id": "CdrFileName", "type": "*composed", "value": "~95-135", "padding":"right"}, + {"tag": "FileSeqNr", "field_id": "FileSeqNr", "type": "*composed", "value": "~135-141", "padding":"zeroleft"}, + {"tag": "AccId1", "field_id": "AccId1", "type": "*composed", "value": "~135-141", "padding":"zeroleft"}, + ], + "content_fields": [ // import template, id will match internally CDR field, in case of .csv value will be represented by index of the field value + {"tag": "Tor", "field_id": "ToR", "type": "*composed", "value": "*voice", "mandatory": true}, + {"tag": "RequestType", "field_id": "RequestType", "type": "*composed", "value": "rated", "mandatory": true}, + {"tag": "Direction", "field_id": "Direction", "type": "*composed", "value": "*out", "mandatory": true}, + {"tag": "OriginID", "field_id": "OriginID", "type": "*composed", "value": "~0-10", "padding":"right", "mandatory": true}, + {"tag": "Tenant", "field_id": "Tenant", "type": "*composed", "value": "cgrates.org", "mandatory": true}, + {"tag": "Category", "field_id": "Category", "type": "*composed", "value": "call", "mandatory": true}, + {"tag": "Account", "field_id": "Account", "type": "*composed", "value": "~30-49", "padding":"right", "mandatory": true}, + {"tag": "Subject", "field_id": "Subject", "type": "*composed", "value": "~30-49", "padding":"right", "mandatory": true}, + {"tag": "Destination", "field_id": "Destination", "type": "*composed", "value": "~52-80", "padding":"right", "mandatory": true}, + {"tag": "SetupTime", "field_id": "SetupTime", "type": "*composed", "value": "~14-30:s/(\\d{4})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{2})/${1}-${2}-${3} ${4}:${5}:${6}/", "mandatory": true}, + {"tag": "AnswerTime", "field_id": "AnswerTime", "type": "*composed", "value": "~14-30:s/(\\d{4})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{2})/${1}-${2}-${3} ${4}:${5}:${6}/", "mandatory": true}, + {"tag": "Usage", "field_id": "Usage", "type": "*composed", "value": "~127-135:s/(\\d{2})(\\d{2})(\\d{2})(\\d{2})/${1}h${2}m${3}s/", "mandatory": true}, + {"tag": "DisconnectCause", "field_id": "DisconnectCause", "type": "*composed", "value": "~138-139", "mandatory": true}, + {"tag": "RetailAmount", "field_id": "RetailAmount", "type": "*composed", "value": "~103-111", "padding":"zeroleft"}, + {"tag": "WholesaleAmount", "field_id": "RetailAmount", "type": "*composed", "value": "~115-123", "padding":"zeroleft"}, + {"tag": "AccId1", "field_id": "AccId1", "type": "*composed", "value": "~3-6", "padding":"zeroleft", "mandatory": true}, + {"tag": "AccId2", "field_id": "AccId2", "type": "*composed", "value": "~14-30", "padding":"right", "mandatory": true}, + ], + "trailer_fields": [ + {"tag": "NrOfCdrs", "type": "metatag", "metatag_id":"total_cdrs", "value": "~142-150"}, + {"tag": "TotalDuration", "type": "metatag", "metatag_id":"total_duration", "value": "~150-162"}, + ], + }, ], }