Added DynamicDataProvider to AgentRequest

This commit is contained in:
Trial97
2020-05-20 10:39:05 +03:00
committed by Dan Christian Bogos
parent da9344128c
commit 1fd9ac009e
13 changed files with 316 additions and 294 deletions

View File

@@ -65,6 +65,7 @@ func NewAgentRequest(req utils.DataProvider,
Trailer: trailer,
Opts: opts,
}
ar.dynamicProvider = utils.NewDynamicDataProvider(ar)
// populate tenant
if tntIf, err := ar.ParseField(
&config.FCTemplate{Type: utils.META_COMPOSED,
@@ -80,19 +81,20 @@ func NewAgentRequest(req utils.DataProvider,
// AgentRequest represents data related to one request towards agent
// implements utils.DataProvider so we can pass it to filters
type AgentRequest struct {
Request utils.DataProvider // request
Vars utils.NavigableMap2 // shared data
CGRRequest *utils.OrderedNavigableMap // Used in reply to access the request that was send
CGRReply *utils.NavigableMap2
Reply *utils.OrderedNavigableMap
Tenant string
Timezone string
filterS *engine.FilterS
Header utils.DataProvider
Trailer utils.DataProvider
diamreq *utils.OrderedNavigableMap // used in case of building requests (ie. DisconnectSession)
tmp utils.NavigableMap2 // used in case you want to store temporary items and access them later
Opts *utils.OrderedNavigableMap
Request utils.DataProvider // request
Vars utils.NavigableMap2 // shared data
CGRRequest *utils.OrderedNavigableMap // Used in reply to access the request that was send
CGRReply *utils.NavigableMap2
Reply *utils.OrderedNavigableMap
Tenant string
Timezone string
filterS *engine.FilterS
Header utils.DataProvider
Trailer utils.DataProvider
diamreq *utils.OrderedNavigableMap // used in case of building requests (ie. DisconnectSession)
tmp utils.NavigableMap2 // used in case you want to store temporary items and access them later
Opts *utils.OrderedNavigableMap
dynamicProvider *utils.DynamicDataProvider
}
// String implements utils.DataProvider
@@ -357,18 +359,18 @@ func (ar *AgentRequest) ParseField(
out = ar.RemoteHost().String()
isString = true
case utils.MetaVariable, utils.META_COMPOSED, utils.MetaGroup:
out, err = cfgFld.Value.ParseDataProvider(ar, utils.NestingSep)
out, err = cfgFld.Value.ParseDataProvider(ar.dynamicProvider, utils.NestingSep)
isString = true
case utils.META_USAGE_DIFFERENCE:
if len(cfgFld.Value) != 2 {
return nil, fmt.Errorf("invalid arguments <%s> to %s",
utils.ToJSON(cfgFld.Value), utils.META_USAGE_DIFFERENCE)
}
strVal1, err := cfgFld.Value[0].ParseDataProvider(ar, utils.NestingSep)
strVal1, err := cfgFld.Value[0].ParseDataProvider(ar.dynamicProvider, utils.NestingSep)
if err != nil {
return "", err
}
strVal2, err := cfgFld.Value[1].ParseDataProvider(ar, utils.NestingSep)
strVal2, err := cfgFld.Value[1].ParseDataProvider(ar.dynamicProvider, utils.NestingSep)
if err != nil {
return "", err
}
@@ -387,7 +389,7 @@ func (ar *AgentRequest) ParseField(
return nil, fmt.Errorf("invalid arguments <%s> to %s",
utils.ToJSON(cfgFld.Value), utils.MetaCCUsage)
}
strVal1, err := cfgFld.Value[0].ParseDataProvider(ar, utils.NestingSep) // ReqNr
strVal1, err := cfgFld.Value[0].ParseDataProvider(ar.dynamicProvider, utils.NestingSep) // ReqNr
if err != nil {
return "", err
}
@@ -396,7 +398,7 @@ func (ar *AgentRequest) ParseField(
return "", fmt.Errorf("invalid requestNumber <%s> to %s",
strVal1, utils.MetaCCUsage)
}
strVal2, err := cfgFld.Value[1].ParseDataProvider(ar, utils.NestingSep) // TotalUsage
strVal2, err := cfgFld.Value[1].ParseDataProvider(ar.dynamicProvider, utils.NestingSep) // TotalUsage
if err != nil {
return "", err
}
@@ -405,7 +407,7 @@ func (ar *AgentRequest) ParseField(
return "", fmt.Errorf("invalid usedCCTime <%s> to %s",
strVal2, utils.MetaCCUsage)
}
strVal3, err := cfgFld.Value[2].ParseDataProvider(ar, utils.NestingSep) // DebitInterval
strVal3, err := cfgFld.Value[2].ParseDataProvider(ar.dynamicProvider, utils.NestingSep) // DebitInterval
if err != nil {
return "", err
}
@@ -422,7 +424,7 @@ func (ar *AgentRequest) ParseField(
case utils.MetaSum:
iFaceVals := make([]interface{}, len(cfgFld.Value))
for i, val := range cfgFld.Value {
strVal, err := val.ParseDataProvider(ar, utils.NestingSep)
strVal, err := val.ParseDataProvider(ar.dynamicProvider, utils.NestingSep)
if err != nil {
return "", err
}
@@ -432,7 +434,7 @@ func (ar *AgentRequest) ParseField(
case utils.MetaDifference:
iFaceVals := make([]interface{}, len(cfgFld.Value))
for i, val := range cfgFld.Value {
strVal, err := val.ParseDataProvider(ar, utils.NestingSep)
strVal, err := val.ParseDataProvider(ar.dynamicProvider, utils.NestingSep)
if err != nil {
return "", err
}
@@ -442,7 +444,7 @@ func (ar *AgentRequest) ParseField(
case utils.MetaMultiply:
iFaceVals := make([]interface{}, len(cfgFld.Value))
for i, val := range cfgFld.Value {
strVal, err := val.ParseDataProvider(ar, utils.NestingSep)
strVal, err := val.ParseDataProvider(ar.dynamicProvider, utils.NestingSep)
if err != nil {
return "", err
}
@@ -452,7 +454,7 @@ func (ar *AgentRequest) ParseField(
case utils.MetaDivide:
iFaceVals := make([]interface{}, len(cfgFld.Value))
for i, val := range cfgFld.Value {
strVal, err := val.ParseDataProvider(ar, utils.NestingSep)
strVal, err := val.ParseDataProvider(ar.dynamicProvider, utils.NestingSep)
if err != nil {
return "", err
}
@@ -464,7 +466,7 @@ func (ar *AgentRequest) ParseField(
return nil, fmt.Errorf("invalid arguments <%s> to %s",
utils.ToJSON(cfgFld.Value), utils.MetaValueExponent)
}
strVal1, err := cfgFld.Value[0].ParseDataProvider(ar, utils.NestingSep) // String Value
strVal1, err := cfgFld.Value[0].ParseDataProvider(ar.dynamicProvider, utils.NestingSep) // String Value
if err != nil {
return "", err
}
@@ -473,7 +475,7 @@ func (ar *AgentRequest) ParseField(
return "", fmt.Errorf("invalid value <%s> to %s",
strVal1, utils.MetaValueExponent)
}
strVal2, err := cfgFld.Value[1].ParseDataProvider(ar, utils.NestingSep) // String Exponent
strVal2, err := cfgFld.Value[1].ParseDataProvider(ar.dynamicProvider, utils.NestingSep) // String Exponent
if err != nil {
return "", err
}
@@ -484,7 +486,7 @@ func (ar *AgentRequest) ParseField(
out = strconv.FormatFloat(utils.Round(val*math.Pow10(exp),
config.CgrConfig().GeneralCfg().RoundingDecimals, utils.ROUNDING_MIDDLE), 'f', -1, 64)
case utils.MetaUnixTimestamp:
val, err := cfgFld.Value.ParseDataProvider(ar, utils.NestingSep)
val, err := cfgFld.Value.ParseDataProvider(ar.dynamicProvider, utils.NestingSep)
if err != nil {
return nil, err
}

View File

@@ -54,9 +54,9 @@ func TestTPDestinationAsExportSlice(t *testing.T) {
Prefixes: []string{"49", "49176", "49151"},
}
expectedSlc := [][]string{
[]string{"TEST_DEST", "49"},
[]string{"TEST_DEST", "49176"},
[]string{"TEST_DEST", "49151"},
{"TEST_DEST", "49"},
{"TEST_DEST", "49176"},
{"TEST_DEST", "49151"},
}
mdst := APItoModelDestination(tpDst)
var slc [][]string
@@ -76,7 +76,7 @@ func TestTpDestinationsAsTPDestinations(t *testing.T) {
tpd1 := TpDestination{Tpid: "TEST_TPID", Tag: "TEST_DEST", Prefix: "+491"}
tpd2 := TpDestination{Tpid: "TEST_TPID", Tag: "TEST_DEST", Prefix: "+492"}
tpd3 := TpDestination{Tpid: "TEST_TPID", Tag: "TEST_DEST", Prefix: "+493"}
eTPDestinations := []*utils.TPDestination{&utils.TPDestination{TPid: "TEST_TPID", ID: "TEST_DEST",
eTPDestinations := []*utils.TPDestination{{TPid: "TEST_TPID", ID: "TEST_DEST",
Prefixes: []string{"+491", "+492", "+493"}}}
if tpDst := TpDestinations([]TpDestination{tpd1, tpd2, tpd3}).AsTPDestinations(); !reflect.DeepEqual(eTPDestinations, tpDst) {
t.Errorf("Expecting: %+v, received: %+v", eTPDestinations, tpDst)
@@ -89,13 +89,13 @@ func TestTPRateAsExportSlice(t *testing.T) {
TPid: "TEST_TPID",
ID: "TEST_RATEID",
RateSlots: []*utils.RateSlot{
&utils.RateSlot{
{
ConnectFee: 0.100,
Rate: 0.200,
RateUnit: "60",
RateIncrement: "60",
GroupIntervalStart: "0"},
&utils.RateSlot{
{
ConnectFee: 0.0,
Rate: 0.1,
RateUnit: "1",
@@ -104,8 +104,8 @@ func TestTPRateAsExportSlice(t *testing.T) {
},
}
expectedSlc := [][]string{
[]string{"TEST_RATEID", "0.1", "0.2", "60", "60", "0"},
[]string{"TEST_RATEID", "0", "0.1", "1", "60", "60"},
{"TEST_RATEID", "0.1", "0.2", "60", "60", "0"},
{"TEST_RATEID", "0", "0.1", "1", "60", "60"},
}
ms := APItoModelRate(tpRate)
@@ -127,12 +127,12 @@ func TestTPDestinationRateAsExportSlice(t *testing.T) {
TPid: "TEST_TPID",
ID: "TEST_DSTRATE",
DestinationRates: []*utils.DestinationRate{
&utils.DestinationRate{
{
DestinationId: "TEST_DEST1",
RateId: "TEST_RATE1",
RoundingMethod: "*up",
RoundingDecimals: 4},
&utils.DestinationRate{
{
DestinationId: "TEST_DEST2",
RateId: "TEST_RATE2",
RoundingMethod: "*up",
@@ -140,8 +140,8 @@ func TestTPDestinationRateAsExportSlice(t *testing.T) {
},
}
expectedSlc := [][]string{
[]string{"TEST_DSTRATE", "TEST_DEST1", "TEST_RATE1", "*up", "4", "0", ""},
[]string{"TEST_DSTRATE", "TEST_DEST2", "TEST_RATE2", "*up", "4", "0", ""},
{"TEST_DSTRATE", "TEST_DEST1", "TEST_RATE1", "*up", "4", "0", ""},
{"TEST_DSTRATE", "TEST_DEST2", "TEST_RATE2", "*up", "4", "0", ""},
}
ms := APItoModelDestinationRate(tpDstRate)
var slc [][]string
@@ -169,7 +169,7 @@ func TestApierTPTimingAsExportSlice(t *testing.T) {
WeekDays: "1;2;4",
Time: "00:00:01"}
expectedSlc := [][]string{
[]string{"TEST_TIMING", "*any", "*any", "*any", "1;2;4", "00:00:01"},
{"TEST_TIMING", "*any", "*any", "*any", "1;2;4", "00:00:01"},
}
ms := APItoModelTiming(tpTiming)
var slc [][]string
@@ -190,18 +190,18 @@ func TestTPRatingPlanAsExportSlice(t *testing.T) {
TPid: "TEST_TPID",
ID: "TEST_RPLAN",
RatingPlanBindings: []*utils.TPRatingPlanBinding{
&utils.TPRatingPlanBinding{
{
DestinationRatesId: "TEST_DSTRATE1",
TimingId: "TEST_TIMING1",
Weight: 10.0},
&utils.TPRatingPlanBinding{
{
DestinationRatesId: "TEST_DSTRATE2",
TimingId: "TEST_TIMING2",
Weight: 20.0},
}}
expectedSlc := [][]string{
[]string{"TEST_RPLAN", "TEST_DSTRATE1", "TEST_TIMING1", "10"},
[]string{"TEST_RPLAN", "TEST_DSTRATE2", "TEST_TIMING2", "20"},
{"TEST_RPLAN", "TEST_DSTRATE1", "TEST_TIMING1", "10"},
{"TEST_RPLAN", "TEST_DSTRATE2", "TEST_TIMING2", "20"},
}
ms := APItoModelRatingPlan(tpRpln)
@@ -226,19 +226,19 @@ func TestTPRatingProfileAsExportSlice(t *testing.T) {
Category: "call",
Subject: "*any",
RatingPlanActivations: []*utils.TPRatingActivation{
&utils.TPRatingActivation{
{
ActivationTime: "2014-01-14T00:00:00Z",
RatingPlanId: "TEST_RPLAN1",
FallbackSubjects: "subj1;subj2"},
&utils.TPRatingActivation{
{
ActivationTime: "2014-01-15T00:00:00Z",
RatingPlanId: "TEST_RPLAN2",
FallbackSubjects: "subj1;subj2"},
},
}
expectedSlc := [][]string{
[]string{"cgrates.org", "call", "*any", "2014-01-14T00:00:00Z", "TEST_RPLAN1", "subj1;subj2"},
[]string{"cgrates.org", "call", "*any", "2014-01-15T00:00:00Z", "TEST_RPLAN2", "subj1;subj2"},
{"cgrates.org", "call", "*any", "2014-01-14T00:00:00Z", "TEST_RPLAN1", "subj1;subj2"},
{"cgrates.org", "call", "*any", "2014-01-15T00:00:00Z", "TEST_RPLAN2", "subj1;subj2"},
}
ms := APItoModelRatingProfile(tpRpf)
@@ -261,7 +261,7 @@ func TestTPActionsAsExportSlice(t *testing.T) {
TPid: "TEST_TPID",
ID: "TEST_ACTIONS",
Actions: []*utils.TPAction{
&utils.TPAction{
{
Identifier: "*topup_reset",
BalanceType: "*monetary",
Units: "5.0",
@@ -273,7 +273,7 @@ func TestTPActionsAsExportSlice(t *testing.T) {
BalanceWeight: "10.0",
ExtraParameters: "",
Weight: 10.0},
&utils.TPAction{
{
Identifier: "*http_post",
BalanceType: "",
Units: "0.0",
@@ -288,8 +288,8 @@ func TestTPActionsAsExportSlice(t *testing.T) {
},
}
expectedSlc := [][]string{
[]string{"TEST_ACTIONS", "*topup_reset", "", "", "", "*monetary", "call", "*any", "special1", "GROUP1", "*never", "", "5.0", "10.0", "", "", "10"},
[]string{"TEST_ACTIONS", "*http_post", "http://localhost/&param1=value1", "", "", "", "", "", "", "", "", "", "0.0", "0.0", "", "", "20"},
{"TEST_ACTIONS", "*topup_reset", "", "", "", "*monetary", "call", "*any", "special1", "GROUP1", "*never", "", "5.0", "10.0", "", "", "10"},
{"TEST_ACTIONS", "*http_post", "http://localhost/&param1=value1", "", "", "", "", "", "", "", "", "", "0.0", "0.0", "", "", "20"},
}
ms := APItoModelAction(tpActs)
@@ -313,19 +313,19 @@ func TestTPSharedGroupsAsExportSlice(t *testing.T) {
TPid: "TEST_TPID",
ID: "SHARED_GROUP_TEST",
SharedGroups: []*utils.TPSharedGroup{
&utils.TPSharedGroup{
{
Account: "*any",
Strategy: "*highest",
RatingSubject: "special1"},
&utils.TPSharedGroup{
{
Account: "second",
Strategy: "*highest",
RatingSubject: "special2"},
},
}
expectedSlc := [][]string{
[]string{"SHARED_GROUP_TEST", "*any", "*highest", "special1"},
[]string{"SHARED_GROUP_TEST", "second", "*highest", "special2"},
{"SHARED_GROUP_TEST", "*any", "*highest", "special1"},
{"SHARED_GROUP_TEST", "second", "*highest", "special2"},
}
ms := APItoModelSharedGroup(tpSGs)
@@ -347,19 +347,19 @@ func TestTPActionTriggersAsExportSlice(t *testing.T) {
TPid: "TEST_TPID",
ID: "PACKAGE_10",
ActionPlan: []*utils.TPActionTiming{
&utils.TPActionTiming{
{
ActionsId: "TOPUP_RST_10",
TimingId: "ASAP",
Weight: 10.0},
&utils.TPActionTiming{
{
ActionsId: "TOPUP_RST_5",
TimingId: "ASAP",
Weight: 20.0},
},
}
expectedSlc := [][]string{
[]string{"PACKAGE_10", "TOPUP_RST_10", "ASAP", "10"},
[]string{"PACKAGE_10", "TOPUP_RST_5", "ASAP", "20"},
{"PACKAGE_10", "TOPUP_RST_10", "ASAP", "10"},
{"PACKAGE_10", "TOPUP_RST_5", "ASAP", "20"},
}
ms := APItoModelActionPlan(ap)
var slc [][]string
@@ -380,7 +380,7 @@ func TestTPActionPlanAsExportSlice(t *testing.T) {
TPid: "TEST_TPID",
ID: "STANDARD_TRIGGERS",
ActionTriggers: []*utils.TPActionTrigger{
&utils.TPActionTrigger{
{
Id: "STANDARD_TRIGGERS",
UniqueID: "1",
ThresholdType: "*min_balance",
@@ -400,7 +400,7 @@ func TestTPActionPlanAsExportSlice(t *testing.T) {
BalanceDisabled: "false",
ActionsId: "LOG_WARNING",
Weight: 10},
&utils.TPActionTrigger{
{
Id: "STANDARD_TRIGGERS",
UniqueID: "2",
ThresholdType: "*max_event_counter",
@@ -423,8 +423,8 @@ func TestTPActionPlanAsExportSlice(t *testing.T) {
},
}
expectedSlc := [][]string{
[]string{"STANDARD_TRIGGERS", "1", "*min_balance", "2", "false", "0", "", "", "b1", "*monetary", "call", "", "special1", "SHARED_1", "*never", "T1", "0.0", "false", "false", "LOG_WARNING", "10"},
[]string{"STANDARD_TRIGGERS", "2", "*max_event_counter", "5", "false", "0", "", "", "b2", "*monetary", "call", "FS_USERS", "special1", "SHARED_1", "*never", "T1", "0.0", "false", "false", "LOG_WARNING", "10"},
{"STANDARD_TRIGGERS", "1", "*min_balance", "2", "false", "0", "", "", "b1", "*monetary", "call", "", "special1", "SHARED_1", "*never", "T1", "0.0", "false", "false", "LOG_WARNING", "10"},
{"STANDARD_TRIGGERS", "2", "*max_event_counter", "5", "false", "0", "", "", "b2", "*monetary", "call", "FS_USERS", "special1", "SHARED_1", "*never", "T1", "0.0", "false", "false", "LOG_WARNING", "10"},
}
ms := APItoModelActionTrigger(at)
var slc [][]string
@@ -450,7 +450,7 @@ func TestTPAccountActionsAsExportSlice(t *testing.T) {
ActionTriggersId: "STANDARD_TRIGGERS",
}
expectedSlc := [][]string{
[]string{"cgrates.org", "1001", "PACKAGE_10_SHARED_A_5", "STANDARD_TRIGGERS", "false", "false"},
{"cgrates.org", "1001", "PACKAGE_10_SHARED_A_5", "STANDARD_TRIGGERS", "false", "false"},
}
ms := APItoModelAccountAction(aa)
var slc [][]string
@@ -466,7 +466,7 @@ func TestTPAccountActionsAsExportSlice(t *testing.T) {
func TestTpResourcesAsTpResources(t *testing.T) {
tps := []*TpResource{
&TpResource{
{
Tpid: "TEST_TPID",
Tenant: "cgrates.org",
ID: "ResGroup1",
@@ -477,13 +477,13 @@ func TestTpResourcesAsTpResources(t *testing.T) {
Weight: 10.0,
Limit: "45",
ThresholdIDs: "WARN_RES1;WARN_RES1"},
&TpResource{
{
Tpid: "TEST_TPID",
ID: "ResGroup1",
Tenant: "cgrates.org",
FilterIDs: "FLTR_RES_GR1",
ThresholdIDs: "WARN3"},
&TpResource{
{
Tpid: "TEST_TPID",
Tenant: "cgrates.org",
ID: "ResGroup2",
@@ -495,7 +495,7 @@ func TestTpResourcesAsTpResources(t *testing.T) {
Limit: "20"},
}
eTPs := []*utils.TPResourceProfile{
&utils.TPResourceProfile{
{
TPid: tps[0].Tpid,
Tenant: tps[0].Tenant,
ID: tps[0].ID,
@@ -509,7 +509,7 @@ func TestTpResourcesAsTpResources(t *testing.T) {
Limit: tps[0].Limit,
ThresholdIDs: []string{"WARN_RES1", "WARN3"},
},
&utils.TPResourceProfile{
{
TPid: tps[2].Tpid,
Tenant: tps[2].Tenant,
ID: tps[2].ID,
@@ -694,13 +694,13 @@ func TestAPItoTPStats(t *testing.T) {
QueueLength: 100,
TTL: "1s",
Metrics: []*utils.MetricWithFilters{
&utils.MetricWithFilters{
{
MetricID: "*sum#BalanceValue",
},
&utils.MetricWithFilters{
{
MetricID: "*average#BalanceValue",
},
&utils.MetricWithFilters{
{
MetricID: "*tcc",
},
},
@@ -713,13 +713,13 @@ func TestAPItoTPStats(t *testing.T) {
eTPs := &StatQueueProfile{ID: tps.ID,
QueueLength: tps.QueueLength,
Metrics: []*MetricWithFilters{
&MetricWithFilters{
{
MetricID: "*sum#BalanceValue",
},
&MetricWithFilters{
{
MetricID: "*average#BalanceValue",
},
&MetricWithFilters{
{
MetricID: "*tcc",
},
},
@@ -752,13 +752,13 @@ func TestStatQueueProfileToAPI(t *testing.T) {
QueueLength: 100,
TTL: "1s",
Metrics: []*utils.MetricWithFilters{
&utils.MetricWithFilters{
{
MetricID: "*sum#BalanceValue",
},
&utils.MetricWithFilters{
{
MetricID: "*average#BalanceValue",
},
&utils.MetricWithFilters{
{
MetricID: "*tcc",
},
},
@@ -774,13 +774,13 @@ func TestStatQueueProfileToAPI(t *testing.T) {
ActivationTime: time.Date(2014, 7, 29, 15, 0, 0, 0, time.UTC),
},
Metrics: []*MetricWithFilters{
&MetricWithFilters{
{
MetricID: "*sum#BalanceValue",
},
&MetricWithFilters{
{
MetricID: "*average#BalanceValue",
},
&MetricWithFilters{
{
MetricID: "*tcc",
},
},
@@ -809,10 +809,10 @@ func TestAPItoModelStats(t *testing.T) {
QueueLength: 100,
TTL: "1s",
Metrics: []*utils.MetricWithFilters{
&utils.MetricWithFilters{
{
MetricID: "*tcc",
},
&utils.MetricWithFilters{
{
MetricID: "*average#Usage",
},
},
@@ -855,7 +855,7 @@ func TestAPItoModelStats(t *testing.T) {
func TestTPThresholdsAsTPThreshold(t *testing.T) {
tps := []*TpThreshold{
&TpThreshold{
{
Tpid: "TEST_TPID",
ID: "Threhold",
FilterIDs: "FilterID1;FilterID2;FilterID1;FilterID2;FilterID2",
@@ -869,7 +869,7 @@ func TestTPThresholdsAsTPThreshold(t *testing.T) {
},
}
eTPs := []*utils.TPThresholdProfile{
&utils.TPThresholdProfile{
{
TPid: tps[0].Tpid,
ID: tps[0].ID,
FilterIDs: []string{"FilterID1", "FilterID2"},
@@ -883,7 +883,7 @@ func TestTPThresholdsAsTPThreshold(t *testing.T) {
Weight: tps[0].Weight,
ActionIDs: []string{"WARN3"},
},
&utils.TPThresholdProfile{
{
TPid: tps[0].Tpid,
ID: tps[0].ID,
FilterIDs: []string{"FilterID2", "FilterID1"},
@@ -922,7 +922,7 @@ func TestAPItoModelTPThreshold(t *testing.T) {
ActionIDs: []string{"WARN3"},
}
models := TpThresholds{
&TpThreshold{
{
Tpid: "TP1",
Tenant: "cgrates.org",
ID: "TH_1",
@@ -960,7 +960,7 @@ func TestAPItoModelTPThreshold2(t *testing.T) {
ActionIDs: []string{"WARN3"},
}
models := TpThresholds{
&TpThreshold{
{
Tpid: "TP1",
Tenant: "cgrates.org",
ID: "TH_1",
@@ -973,7 +973,7 @@ func TestAPItoModelTPThreshold2(t *testing.T) {
Weight: 20.0,
ActionIDs: "WARN3",
},
&TpThreshold{
{
Tpid: "TP1",
Tenant: "cgrates.org",
ID: "TH_1",
@@ -1004,7 +1004,7 @@ func TestAPItoModelTPThreshold3(t *testing.T) {
ActionIDs: []string{"WARN3", "LOG"},
}
models := TpThresholds{
&TpThreshold{
{
Tpid: "TP1",
Tenant: "cgrates.org",
ID: "TH_1",
@@ -1017,7 +1017,7 @@ func TestAPItoModelTPThreshold3(t *testing.T) {
Weight: 20.0,
ActionIDs: "WARN3",
},
&TpThreshold{
{
Tpid: "TP1",
Tenant: "cgrates.org",
ID: "TH_1",
@@ -1048,7 +1048,7 @@ func TestAPItoModelTPThreshold4(t *testing.T) {
ActionIDs: []string{"WARN3", "LOG"},
}
models := TpThresholds{
&TpThreshold{
{
Tpid: "TP1",
Tenant: "cgrates.org",
ID: "TH_1",
@@ -1060,7 +1060,7 @@ func TestAPItoModelTPThreshold4(t *testing.T) {
Weight: 20.0,
ActionIDs: "WARN3",
},
&TpThreshold{
{
Tpid: "TP1",
Tenant: "cgrates.org",
ID: "TH_1",
@@ -1166,7 +1166,7 @@ func TestThresholdProfileToAPI(t *testing.T) {
func TestTPFilterAsTPFilter(t *testing.T) {
tps := []*TpFilter{
&TpFilter{
{
Tpid: "TEST_TPID",
ID: "Filter1",
Type: utils.MetaPrefix,
@@ -1175,11 +1175,11 @@ func TestTPFilterAsTPFilter(t *testing.T) {
},
}
eTPs := []*utils.TPFilterProfile{
&utils.TPFilterProfile{
{
TPid: tps[0].Tpid,
ID: tps[0].ID,
Filters: []*utils.TPFilter{
&utils.TPFilter{
{
Type: utils.MetaPrefix,
Element: "Account",
Values: []string{"1001", "1002"},
@@ -1196,7 +1196,7 @@ func TestTPFilterAsTPFilter(t *testing.T) {
func TestTPFilterAsTPFilter2(t *testing.T) {
tps := []*TpFilter{
&TpFilter{
{
Tpid: "TEST_TPID",
Tenant: "cgrates.org",
ID: "Filter1",
@@ -1204,7 +1204,7 @@ func TestTPFilterAsTPFilter2(t *testing.T) {
Element: "Account",
Values: "1001;1002",
},
&TpFilter{
{
Tpid: "TEST_TPID",
Tenant: "anotherTenant",
ID: "Filter1",
@@ -1214,24 +1214,24 @@ func TestTPFilterAsTPFilter2(t *testing.T) {
},
}
eTPs := []*utils.TPFilterProfile{
&utils.TPFilterProfile{
{
TPid: tps[0].Tpid,
Tenant: "cgrates.org",
ID: tps[0].ID,
Filters: []*utils.TPFilter{
&utils.TPFilter{
{
Type: utils.MetaPrefix,
Element: "Account",
Values: []string{"1001", "1002"},
},
},
},
&utils.TPFilterProfile{
{
TPid: tps[1].Tpid,
Tenant: "anotherTenant",
ID: tps[1].ID,
Filters: []*utils.TPFilter{
&utils.TPFilter{
{
Type: utils.MetaPrefix,
Element: "Account",
Values: []string{"1010"},
@@ -1252,7 +1252,7 @@ func TestAPItoTPFilter(t *testing.T) {
Tenant: "cgrates.org",
ID: "Filter1",
Filters: []*utils.TPFilter{
&utils.TPFilter{
{
Element: "Account",
Type: utils.MetaString,
Values: []string{"1001", "1002"},
@@ -1264,7 +1264,7 @@ func TestAPItoTPFilter(t *testing.T) {
Tenant: "cgrates.org",
ID: tps.ID,
Rules: []*FilterRule{
&FilterRule{
{
Element: "Account",
Type: utils.MetaString,
Values: []string{"1001", "1002"},
@@ -1287,7 +1287,7 @@ func TestFilterToTPFilter(t *testing.T) {
ExpiryTime: time.Date(2014, 1, 14, 0, 0, 0, 0, time.UTC),
},
Rules: []*FilterRule{
&FilterRule{
{
Element: "Account",
Type: utils.MetaString,
Values: []string{"1001", "1002"},
@@ -1302,7 +1302,7 @@ func TestFilterToTPFilter(t *testing.T) {
ExpiryTime: "2014-01-14T00:00:00Z",
},
Filters: []*utils.TPFilter{
&utils.TPFilter{
{
Element: "Account",
Type: utils.MetaString,
Values: []string{"1001", "1002"},
@@ -1327,7 +1327,7 @@ func TestAPItoAttributeProfile(t *testing.T) {
ExpiryTime: "",
},
Attributes: []*utils.TPAttribute{
&utils.TPAttribute{
{
Path: utils.MetaReq + utils.NestingSep + "FL1",
Value: "Al1",
},
@@ -1343,7 +1343,7 @@ func TestAPItoAttributeProfile(t *testing.T) {
ActivationTime: time.Date(2014, 7, 14, 14, 35, 0, 0, time.UTC),
},
Attributes: []*Attribute{
&Attribute{
{
Path: utils.MetaReq + utils.NestingSep + "FL1",
Value: config.NewRSRParsersMustCompile("Al1", true, utils.INFIELD_SEP),
},
@@ -1369,7 +1369,7 @@ func TestAttributeProfileToAPI(t *testing.T) {
ExpiryTime: "",
},
Attributes: []*utils.TPAttribute{
&utils.TPAttribute{
{
Path: utils.MetaReq + utils.NestingSep + "FL1",
Value: "Al1",
},
@@ -1385,7 +1385,7 @@ func TestAttributeProfileToAPI(t *testing.T) {
ActivationTime: time.Date(2014, 7, 14, 14, 35, 0, 0, time.UTC),
},
Attributes: []*Attribute{
&Attribute{
{
Path: utils.MetaReq + utils.NestingSep + "FL1",
Value: config.NewRSRParsersMustCompile("Al1", true, utils.INFIELD_SEP),
},
@@ -1409,11 +1409,11 @@ func TestAttributeProfileToAPI2(t *testing.T) {
ExpiryTime: "",
},
Attributes: []*utils.TPAttribute{
&utils.TPAttribute{
{
Path: utils.MetaReq + utils.NestingSep + "FL1",
Value: "Al1",
},
&utils.TPAttribute{
{
Path: utils.MetaReq + utils.NestingSep + "Test",
Value: "~*req.Account",
},
@@ -1429,11 +1429,11 @@ func TestAttributeProfileToAPI2(t *testing.T) {
ActivationTime: time.Date(2014, 7, 14, 14, 35, 0, 0, time.UTC),
},
Attributes: []*Attribute{
&Attribute{
{
Path: utils.MetaReq + utils.NestingSep + "FL1",
Value: config.NewRSRParsersMustCompile("Al1", true, utils.INFIELD_SEP),
},
&Attribute{
{
Path: utils.MetaReq + utils.NestingSep + "Test",
Value: config.NewRSRParsersMustCompile("~*req.Account", true, utils.INFIELD_SEP),
},
@@ -1457,7 +1457,7 @@ func TestAPItoModelTPAttribute(t *testing.T) {
ExpiryTime: "",
},
Attributes: []*utils.TPAttribute{
&utils.TPAttribute{
{
Path: utils.MetaReq + utils.NestingSep + "FL1",
Value: "Al1",
},
@@ -1495,11 +1495,11 @@ func TestCsvDumpForAttributeModels(t *testing.T) {
ExpiryTime: "",
},
Attributes: []*utils.TPAttribute{
&utils.TPAttribute{
{
Path: utils.MetaReq + utils.NestingSep + "FL1",
Value: "Al1",
},
&utils.TPAttribute{
{
Path: utils.MetaReq + utils.NestingSep + "FL2",
Value: "Al2",
},
@@ -1567,7 +1567,7 @@ func TestModelAsTPAttribute(t *testing.T) {
ExpiryTime: "",
},
Attributes: []*utils.TPAttribute{
&utils.TPAttribute{
{
FilterIDs: []string{},
Path: utils.MetaReq + utils.NestingSep + "FL1",
Value: "Al1",
@@ -1586,7 +1586,7 @@ func TestModelAsTPAttribute(t *testing.T) {
ExpiryTime: "",
},
Attributes: []*utils.TPAttribute{
&utils.TPAttribute{
{
FilterIDs: []string{},
Path: utils.MetaReq + utils.NestingSep + "FL1",
Value: "Al1",
@@ -1936,7 +1936,7 @@ func TestAPItoDispatcherProfile(t *testing.T) {
StrategyParams: []interface{}{},
Weight: 20,
Hosts: []*utils.TPDispatcherHostProfile{
&utils.TPDispatcherHostProfile{
{
ID: "C1",
FilterIDs: []string{},
Weight: 10,
@@ -1988,7 +1988,7 @@ func TestDispatcherProfileToAPI(t *testing.T) {
StrategyParams: []interface{}{},
Weight: 20,
Hosts: []*utils.TPDispatcherHostProfile{
&utils.TPDispatcherHostProfile{
{
ID: "C1",
FilterIDs: []string{},
Weight: 10,
@@ -2010,7 +2010,7 @@ func TestDispatcherProfileToAPI(t *testing.T) {
StrategyParams: []interface{}{},
Weight: 20,
Hosts: []*utils.TPDispatcherHostProfile{
&utils.TPDispatcherHostProfile{
{
ID: "C1",
FilterIDs: []string{},
Weight: 10,
@@ -2063,14 +2063,14 @@ func TestAPItoModelTPDispatcher(t *testing.T) {
StrategyParams: []interface{}{},
Weight: 20,
Hosts: []*utils.TPDispatcherHostProfile{
&utils.TPDispatcherHostProfile{
{
ID: "C1",
FilterIDs: []string{},
Weight: 10,
Params: []interface{}{"192.168.54.203"},
Blocker: false,
},
&utils.TPDispatcherHostProfile{
{
ID: "C2",
FilterIDs: []string{},
Weight: 10,
@@ -2141,11 +2141,11 @@ func TestTPDispatcherHostsAsTPDispatcherHosts(t *testing.T) {
Transport: utils.EmptyString,
}}
eOut := []*utils.TPDispatcherHost{
&utils.TPDispatcherHost{
{
Tenant: "Tenant1",
ID: "ID1",
Conns: []*utils.TPDispatcherHostConn{
&utils.TPDispatcherHostConn{
{
Address: "Address1",
Transport: "*json",
},
@@ -2164,11 +2164,11 @@ func TestTPDispatcherHostsAsTPDispatcherHosts(t *testing.T) {
Transport: "*gob",
}}
eOut = []*utils.TPDispatcherHost{
&utils.TPDispatcherHost{
{
Tenant: "Tenant2",
ID: "ID2",
Conns: []*utils.TPDispatcherHostConn{
&utils.TPDispatcherHostConn{
{
Address: "Address2",
Transport: "*gob",
},
@@ -2194,15 +2194,15 @@ func TestTPDispatcherHostsAsTPDispatcherHosts(t *testing.T) {
},
}
eOut = []*utils.TPDispatcherHost{
&utils.TPDispatcherHost{
{
Tenant: "Tenant3",
ID: "ID3",
Conns: []*utils.TPDispatcherHostConn{
&utils.TPDispatcherHostConn{
{
Address: "Address3",
Transport: "*gob",
},
&utils.TPDispatcherHostConn{
{
Address: "Address4",
Transport: "*json",
},
@@ -2228,21 +2228,21 @@ func TestTPDispatcherHostsAsTPDispatcherHosts(t *testing.T) {
},
}
eOut = []*utils.TPDispatcherHost{
&utils.TPDispatcherHost{
{
Tenant: "Tenant4",
ID: "ID4",
Conns: []*utils.TPDispatcherHostConn{
&utils.TPDispatcherHostConn{
{
Address: "Address4",
Transport: "*gob",
},
},
},
&utils.TPDispatcherHost{
{
Tenant: "Tenant5",
ID: "ID5",
Conns: []*utils.TPDispatcherHostConn{
&utils.TPDispatcherHostConn{
{
Address: "Address5",
Transport: "*json",
},
@@ -2274,11 +2274,11 @@ func TestAPItoModelTPDispatcherHost(t *testing.T) {
Tenant: "Tenant",
ID: "ID",
Conns: []*utils.TPDispatcherHostConn{
&utils.TPDispatcherHostConn{
{
Address: "Address1",
Transport: "*json",
},
&utils.TPDispatcherHostConn{
{
Address: "Address2",
Transport: "*gob",
},
@@ -2314,11 +2314,11 @@ func TestAPItoDispatcherHost(t *testing.T) {
Tenant: "Tenant1",
ID: "ID1",
Conns: []*utils.TPDispatcherHostConn{
&utils.TPDispatcherHostConn{
{
Address: "Address1",
Transport: "*json",
},
&utils.TPDispatcherHostConn{
{
Address: "Address2",
Transport: "*gob",
},
@@ -2329,11 +2329,11 @@ func TestAPItoDispatcherHost(t *testing.T) {
Tenant: "Tenant1",
ID: "ID1",
Conns: []*config.RemoteHost{
&config.RemoteHost{
{
Address: "Address1",
Transport: "*json",
},
&config.RemoteHost{
{
Address: "Address2",
Transport: "*gob",
},
@@ -2347,7 +2347,7 @@ func TestAPItoDispatcherHost(t *testing.T) {
Tenant: "Tenant2",
ID: "ID2",
Conns: []*utils.TPDispatcherHostConn{
&utils.TPDispatcherHostConn{
{
Address: "Address1",
Transport: "*json",
TLS: true,
@@ -2358,7 +2358,7 @@ func TestAPItoDispatcherHost(t *testing.T) {
Tenant: "Tenant2",
ID: "ID2",
Conns: []*config.RemoteHost{
&config.RemoteHost{
{
Address: "Address1",
Transport: "*json",
TLS: true,
@@ -2375,7 +2375,7 @@ func TestDispatcherHostToAPI(t *testing.T) {
Tenant: "Tenant1",
ID: "ID1",
Conns: []*config.RemoteHost{
&config.RemoteHost{
{
Address: "Address1",
Transport: "*json",
TLS: true,
@@ -2386,7 +2386,7 @@ func TestDispatcherHostToAPI(t *testing.T) {
Tenant: "Tenant1",
ID: "ID1",
Conns: []*utils.TPDispatcherHostConn{
&utils.TPDispatcherHostConn{
{
Address: "Address1",
Transport: "*json",
TLS: true,
@@ -2400,12 +2400,12 @@ func TestDispatcherHostToAPI(t *testing.T) {
Tenant: "Tenant1",
ID: "ID1",
Conns: []*config.RemoteHost{
&config.RemoteHost{
{
Address: "Address1",
Transport: "*json",
TLS: false,
},
&config.RemoteHost{
{
Address: "Address2",
Transport: "*gob",
TLS: true,
@@ -2416,12 +2416,12 @@ func TestDispatcherHostToAPI(t *testing.T) {
Tenant: "Tenant1",
ID: "ID1",
Conns: []*utils.TPDispatcherHostConn{
&utils.TPDispatcherHostConn{
{
Address: "Address1",
Transport: "*json",
TLS: false,
},
&utils.TPDispatcherHostConn{
{
Address: "Address2",
Transport: "*gob",
TLS: true,
@@ -2479,7 +2479,7 @@ func TestTPRoutesAsTPRouteProfile(t *testing.T) {
},
}
expPrf := []*utils.TPRouteProfile{
&utils.TPRouteProfile{
{
TPid: "TP",
Tenant: "cgrates.org",
ID: "RoutePrf",
@@ -2491,11 +2491,11 @@ func TestTPRoutesAsTPRouteProfile(t *testing.T) {
ExpiryTime: "",
},
Routes: []*utils.TPRoute{
&utils.TPRoute{
{
ID: "route1",
Weight: 10.0,
},
&utils.TPRoute{
{
ID: "route2",
Weight: 20.0,
},
@@ -2556,7 +2556,7 @@ func TestTPRoutesAsTPRouteProfile(t *testing.T) {
},
}
expPrfRev := []*utils.TPRouteProfile{
&utils.TPRouteProfile{
{
TPid: "TP",
Tenant: "cgrates.org",
ID: "RoutePrf",
@@ -2568,11 +2568,11 @@ func TestTPRoutesAsTPRouteProfile(t *testing.T) {
ExpiryTime: "",
},
Routes: []*utils.TPRoute{
&utils.TPRoute{
{
ID: "route1",
Weight: 10.0,
},
&utils.TPRoute{
{
ID: "route2",
Weight: 20.0,
},

View File

@@ -62,6 +62,7 @@ cgrates (0.11.0~dev) UNRELEASED; urgency=medium
* [AgentS] Added SIPAgent for SIP redirection
* [AgentS] Added *constant: prefix to do not proccess the value
with RSRParsers
* [AgentS] Added DynamicDataProvider to AgentRequest
-- DanB <danb@cgrates.org> Wed, 19 Feb 2020 13:25:52 +0200

View File

@@ -20,6 +20,7 @@ package utils
import (
"net"
"strconv"
"strings"
)
@@ -93,7 +94,7 @@ func AppendNavMapVal(nm navMap, fldPath *FullPath, val NMInterface) (err error)
} else {
indx = prevItm.Len()
}
fldPath.PathItems[len(fldPath.PathItems)-1].Index = &indx
fldPath.PathItems[len(fldPath.PathItems)-1].Index = StringPointer(strconv.Itoa(indx))
_, err = nm.Set(fldPath, val)
return
}
@@ -109,7 +110,7 @@ func ComposeNavMapVal(nm navMap, fldPath *FullPath, val NMInterface) (err error)
} else {
indx = prevItmSlice.Len() - 1
var prevItm NMInterface
if prevItm, err = prevItmSlice.Field(PathItems{{Index: &indx}}); err != nil {
if prevItm, err = prevItmSlice.Field(PathItems{{Index: StringPointer(strconv.Itoa(indx))}}); err != nil {
if err != ErrNotFound {
return
}
@@ -117,7 +118,7 @@ func ComposeNavMapVal(nm navMap, fldPath *FullPath, val NMInterface) (err error)
return
}
}
fldPath.PathItems[len(fldPath.PathItems)-1].Index = &indx
fldPath.PathItems[len(fldPath.PathItems)-1].Index = StringPointer(strconv.Itoa(indx))
_, err = nm.Set(fldPath, val)
return
}

View File

@@ -189,12 +189,12 @@ func TestNavMapFieldAsInterface(t *testing.T) {
nM := MapStorage{
"FirstLevel": map[string]interface{}{
"SecondLevel": []map[string]interface{}{
map[string]interface{}{
{
"ThirdLevel": map[string]interface{}{
"Fld1": "Val1",
},
},
map[string]interface{}{
{
"Count": 10,
"ThirdLevel2": map[string]interface{}{
"Fld2": []string{"Val1", "Val2", "Val3"},
@@ -297,9 +297,10 @@ func TestNavMapGetKeys(t *testing.T) {
func TestNavMapFieldAsInterface2(t *testing.T) {
nM := MapStorage{
"Slice": &[]struct{}{{}},
"SliceString": []string{"1", "2"},
"SliceInterface": []interface{}{1, "2"},
"AnotherFirstLevel": "ValAnotherFirstLevel",
"Slice": &[]struct{}{{}},
"SliceString": []string{"1", "2"},
"SliceInterface": []interface{}{1, "2"},
}
path := []string{"Slice[1]"}
@@ -379,12 +380,12 @@ func TestNavMapGetField2(t *testing.T) {
},
"FirstLevel2": MapStorage{
"SecondLevel2": []MapStorage{
MapStorage{
{
"ThirdLevel2": MapStorage{
"Fld1": "Val1",
},
},
MapStorage{
{
"Count": 10,
"ThirdLevel2": MapStorage{
"Fld2": []string{"Val1", "Val2", "Val3"},

View File

@@ -58,7 +58,9 @@ func (nm NavigableMap2) Field(path PathItems) (val NMInterface, err error) {
return nil, ErrNotFound
case NMMapType:
if path[0].Index != nil {
return nil, ErrNotFound
path[0].Field = *path[0].Index
path[0].Index = nil
return el.Field(path)
}
return el.Field(path[1:])
case NMSliceType:

View File

@@ -68,15 +68,15 @@ func TestNavigableMap2Field(t *testing.T) {
t.Errorf("Expected %q ,received: %q", "1001", val.Interface())
}
if _, err := nm.Field(PathItems{{Field: "Field1", Index: IntPointer(0)}}); err != ErrNotFound {
if _, err := nm.Field(PathItems{{Field: "Field1", Index: StringPointer("0")}}); err != ErrNotFound {
t.Error(err)
}
if val, err := nm.Field(PathItems{{Field: "Field5", Index: IntPointer(0)}}); err != nil {
if val, err := nm.Field(PathItems{{Field: "Field5", Index: StringPointer("0")}}); err != nil {
t.Error(err)
} else if val.Interface() != 10 {
t.Errorf("Expected %q ,received: %q", 10, val.Interface())
}
if _, err := nm.Field(PathItems{{Field: "Field3", Index: IntPointer(0)}}); err != ErrNotFound {
if _, err := nm.Field(PathItems{{Field: "Field3", Index: StringPointer("0")}}); err != ErrNotFound {
t.Error(err)
}
if val, err := nm.Field(PathItems{{Field: "Field3"}, {Field: "Field4"}}); err != nil {
@@ -91,11 +91,11 @@ func TestNavigableMap2Set(t *testing.T) {
if _, err := nm.Set(nil, nil); err != ErrWrongPath {
t.Error(err)
}
if _, err := nm.Set(PathItems{{Field: "Field1", Index: IntPointer(10)}}, NewNMData("1001")); err != ErrWrongPath {
if _, err := nm.Set(PathItems{{Field: "Field1", Index: StringPointer("10")}}, NewNMData("1001")); err != ErrWrongPath {
t.Error(err)
}
expected := NavigableMap2{"Field1": &NMSlice{NewNMData("1001")}}
if _, err := nm.Set(PathItems{{Field: "Field1", Index: IntPointer(0)}}, NewNMData("1001")); err != nil {
if _, err := nm.Set(PathItems{{Field: "Field1", Index: StringPointer("0")}}, NewNMData("1001")); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(nm, expected) {
t.Errorf("Expected %s ,received: %s", expected, nm)
@@ -109,14 +109,14 @@ func TestNavigableMap2Set(t *testing.T) {
} else if !reflect.DeepEqual(nm, expected) {
t.Errorf("Expected %s ,received: %s", expected, nm)
}
if _, err := nm.Set(PathItems{{Field: "Field2", Index: IntPointer(1)}}, NewNMData("1003")); err != ErrWrongPath {
if _, err := nm.Set(PathItems{{Field: "Field2", Index: StringPointer("1")}}, NewNMData("1003")); err != ErrWrongPath {
t.Error(err)
}
expected = NavigableMap2{
"Field1": &NMSlice{NewNMData("1001"), NewNMData("1003")},
"Field2": NewNMData("1002"),
}
if _, err := nm.Set(PathItems{{Field: "Field1", Index: IntPointer(1)}}, NewNMData("1003")); err != nil {
if _, err := nm.Set(PathItems{{Field: "Field1", Index: StringPointer("1")}}, NewNMData("1003")); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(nm, expected) {
t.Errorf("Expected %s ,received: %s", expected, nm)
@@ -131,7 +131,7 @@ func TestNavigableMap2Set(t *testing.T) {
t.Errorf("Expected %s ,received: %s", expected, nm)
}
if _, err := nm.Set(PathItems{{Field: "Field3", Index: IntPointer(10)}, {}}, NewNMData("1001")); err != ErrWrongPath {
if _, err := nm.Set(PathItems{{Field: "Field3", Index: StringPointer("10")}, {}}, NewNMData("1001")); err != ErrWrongPath {
t.Error(err)
}
expected = NavigableMap2{
@@ -139,13 +139,13 @@ func TestNavigableMap2Set(t *testing.T) {
"Field2": NewNMData("1004"),
"Field3": &NMSlice{NavigableMap2{"Field4": NewNMData("1005")}},
}
if _, err := nm.Set(PathItems{{Field: "Field3", Index: IntPointer(0)}, {Field: "Field4"}}, NewNMData("1005")); err != nil {
if _, err := nm.Set(PathItems{{Field: "Field3", Index: StringPointer("0")}, {Field: "Field4"}}, NewNMData("1005")); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(nm, expected) {
t.Errorf("Expected %s ,received: %s", expected, nm)
}
if _, err := nm.Set(PathItems{{Field: "Field5"}, {Field: "Field6", Index: IntPointer(10)}}, NewNMData("1006")); err != ErrWrongPath {
if _, err := nm.Set(PathItems{{Field: "Field5"}, {Field: "Field6", Index: StringPointer("10")}}, NewNMData("1006")); err != ErrWrongPath {
t.Error(err)
}
@@ -161,7 +161,7 @@ func TestNavigableMap2Set(t *testing.T) {
t.Errorf("Expected %s ,received: %s", expected, nm)
}
if _, err := nm.Set(PathItems{{Field: "Field2", Index: IntPointer(0)}, {}}, NewNMData("1006")); err != ErrWrongPath {
if _, err := nm.Set(PathItems{{Field: "Field2", Index: StringPointer("0")}, {}}, NewNMData("1006")); err != ErrWrongPath {
t.Error(err)
}
expected = NavigableMap2{
@@ -170,7 +170,7 @@ func TestNavigableMap2Set(t *testing.T) {
"Field3": &NMSlice{NavigableMap2{"Field4": NewNMData("1005")}},
"Field5": NavigableMap2{"Field6": NewNMData("1006")},
}
if _, err := nm.Set(PathItems{{Field: "Field1", Index: IntPointer(2)}, {Field: "Field6"}}, NewNMData("1006")); err != nil {
if _, err := nm.Set(PathItems{{Field: "Field1", Index: StringPointer("2")}, {Field: "Field6"}}, NewNMData("1006")); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(nm, expected) {
t.Errorf("Expected %s ,received: %s", expected, nm)
@@ -238,7 +238,7 @@ func TestNavigableMap2Remove(t *testing.T) {
t.Error(err)
}
if err := nm.Remove(PathItems{{Index: IntPointer(-1)}, {}}); err != nil {
if err := nm.Remove(PathItems{{Index: StringPointer("-1")}, {}}); err != nil {
t.Error(err)
}
expected := NavigableMap2{
@@ -269,13 +269,13 @@ func TestNavigableMap2Remove(t *testing.T) {
"Field5": &NMSlice{NewNMData(101)},
}
if err := nm.Remove(PathItems{{Field: "Field5", Index: IntPointer(0)}}); err != nil {
if err := nm.Remove(PathItems{{Field: "Field5", Index: StringPointer("0")}}); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(nm, expected) {
t.Errorf("Expected %s ,received: %s", expected, nm)
}
if err := nm.Remove(PathItems{{Field: "Field1", Index: IntPointer(0)}, {}}); err != ErrWrongPath {
if err := nm.Remove(PathItems{{Field: "Field1", Index: StringPointer("0")}, {}}); err != ErrWrongPath {
t.Error(err)
}
@@ -284,7 +284,7 @@ func TestNavigableMap2Remove(t *testing.T) {
"Field3": NavigableMap2{"Field4": NewNMData("Val")},
}
if err := nm.Remove(PathItems{{Field: "Field5", Index: IntPointer(0)}}); err != nil {
if err := nm.Remove(PathItems{{Field: "Field5", Index: StringPointer("0")}}); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(nm, expected) {
t.Errorf("Expected %s ,received: %s", expected, nm)
@@ -295,7 +295,7 @@ func TestNavigableMap2Remove(t *testing.T) {
"Field3": NavigableMap2{"Field4": NewNMData("Val")},
"Field5": &NMSlice{NavigableMap2{"Field42": NewNMData("Val2")}},
}
if err := nm.Remove(PathItems{{Field: "Field5", Index: IntPointer(0)}, {Field: "Field42", Index: IntPointer(0)}}); err != ErrWrongPath {
if err := nm.Remove(PathItems{{Field: "Field5", Index: StringPointer("0")}, {Field: "Field42", Index: StringPointer("0")}}); err != ErrWrongPath {
t.Error(err)
}
@@ -305,7 +305,7 @@ func TestNavigableMap2Remove(t *testing.T) {
"Field3": NavigableMap2{"Field4": NewNMData("Val")},
}
if err := nm.Remove(PathItems{{Field: "Field5", Index: IntPointer(0)}, {Field: "Field42"}}); err != nil {
if err := nm.Remove(PathItems{{Field: "Field5", Index: StringPointer("0")}, {Field: "Field42"}}); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(nm, expected) {
t.Errorf("Expected %s ,received: %s", expected, nm)
@@ -314,7 +314,7 @@ func TestNavigableMap2Remove(t *testing.T) {
if err := nm.Remove(PathItems{{Field: "Field1"}, {}}); err != ErrWrongPath {
t.Error(err)
}
if err := nm.Remove(PathItems{{Field: "Field3"}, {Field: "Field4", Index: IntPointer(0)}}); err != ErrWrongPath {
if err := nm.Remove(PathItems{{Field: "Field3"}, {Field: "Field4", Index: StringPointer("0")}}); err != ErrWrongPath {
t.Error(err)
}
expected = NavigableMap2{
@@ -357,7 +357,7 @@ func TestNavigableMap2GetSet(t *testing.T) {
t.Errorf("Expected %q ,received: %q", 5, val.Interface())
}
path = PathItems{{Field: "Field2", Index: IntPointer(2)}}
path = PathItems{{Field: "Field2", Index: StringPointer("2")}}
if _, err := nm.Set(path, NewNMData("500")); err != nil {
t.Error(err)
}
@@ -367,17 +367,17 @@ func TestNavigableMap2GetSet(t *testing.T) {
t.Errorf("Expected %q ,received: %q", "500", val.Interface())
}
path = PathItems{{Field: "Field2", Index: IntPointer(1)}, {Field: "Account"}}
path = PathItems{{Field: "Field2", Index: StringPointer("1")}, {Field: "Account"}}
if _, err := nm.Set(path, NewNMData("5")); err != nil {
t.Error(err)
}
path = PathItems{{Field: "Field2", Index: IntPointer(1)}, {Field: "Account"}}
path = PathItems{{Field: "Field2", Index: StringPointer("1")}, {Field: "Account"}}
if val, err := nm.Field(path); err != nil {
t.Error(err)
} else if val.Interface() != "5" {
t.Errorf("Expected %q ,received: %q", "5", val.Interface())
}
path = PathItems{{Field: "Field2", Index: IntPointer(1)}, {Field: "Account", Index: IntPointer(0)}}
path = PathItems{{Field: "Field2", Index: StringPointer("1")}, {Field: "Account", Index: StringPointer("0")}}
if _, err := nm.Field(path); err != ErrNotFound {
t.Error(err)
}

View File

@@ -18,6 +18,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
package utils
import "strconv"
// NMSlice is the basic slice of NM interface
type NMSlice []NMInterface
@@ -46,7 +48,10 @@ func (nms *NMSlice) Field(path PathItems) (val NMInterface, err error) {
if nms.Empty() || path[0].Index == nil {
return nil, ErrNotFound
}
idx := *path[0].Index
var idx int
if idx, err = strconv.Atoi(*path[0].Index); err != nil {
return
}
if idx < 0 {
idx = len(*nms) + idx
}
@@ -64,7 +69,10 @@ func (nms *NMSlice) Set(path PathItems, val NMInterface) (addedNew bool, err err
if len(path) == 0 || path[0].Index == nil {
return false, ErrWrongPath
}
idx := *path[0].Index
var idx int
if idx, err = strconv.Atoi(*path[0].Index); err != nil {
return
}
if idx == len(*nms) { // append element
addedNew = true
if len(path) == 1 {
@@ -84,7 +92,7 @@ func (nms *NMSlice) Set(path PathItems, val NMInterface) (addedNew bool, err err
if idx < 0 || idx >= len(*nms) {
return false, ErrWrongPath
}
path[0].Index = &idx
path[0].Index = StringPointer(strconv.Itoa(idx))
if len(path) == 1 {
(*nms)[idx] = val
return
@@ -100,14 +108,17 @@ func (nms *NMSlice) Remove(path PathItems) (err error) {
if len(path) == 0 || path[0].Index == nil {
return ErrWrongPath
}
idx := *path[0].Index
var idx int
if idx, err = strconv.Atoi(*path[0].Index); err != nil {
return
}
if idx < 0 {
idx = len(*nms) + idx
}
if idx < 0 || idx >= len(*nms) { // already removed
return
}
path[0].Index = &idx
path[0].Index = StringPointer(strconv.Itoa(idx))
if len(path) == 1 {
*nms = append((*nms)[:idx], (*nms)[idx+1:]...)
return

View File

@@ -57,18 +57,18 @@ func TestNMSliceField(t *testing.T) {
if _, err := nm.Field(PathItems{{}}); err != ErrNotFound {
t.Error(err)
}
if _, err := nm.Field(PathItems{{Index: IntPointer(4)}}); err != ErrNotFound {
if _, err := nm.Field(PathItems{{Index: StringPointer("4")}}); err != ErrNotFound {
t.Error(err)
}
if _, err := nm.Field(nil); err != ErrWrongPath {
t.Error(err)
}
if val, err := nm.Field(PathItems{{Field: "None", Index: IntPointer(-1)}, {Field: "Field1"}}); err != nil {
if val, err := nm.Field(PathItems{{Field: "None", Index: StringPointer("-1")}, {Field: "Field1"}}); err != nil {
t.Error(err)
} else if val.Interface() != "Val" {
t.Errorf("Expected %q ,received: %q", "Val", val.Interface())
}
if val, err := nm.Field(PathItems{{Field: "1234", Index: IntPointer(1)}}); err != nil {
if val, err := nm.Field(PathItems{{Field: "1234", Index: StringPointer("1")}}); err != nil {
t.Error(err)
} else if val.Interface() != "1003" {
t.Errorf("Expected %q ,received: %q", "Val", val.Interface())
@@ -81,31 +81,31 @@ func TestNMSliceSet(t *testing.T) {
t.Error(err)
}
expected := &NMSlice{NewNMData("1001")}
if _, err := nm.Set(PathItems{{Field: "1234", Index: IntPointer(0)}}, NewNMData("1001")); err != nil {
if _, err := nm.Set(PathItems{{Field: "1234", Index: StringPointer("0")}}, NewNMData("1001")); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(nm, expected) {
t.Errorf("Expected %s ,received: %s", expected, nm)
}
if _, err := nm.Set(PathItems{{Field: "1234", Index: IntPointer(1)}, {Field: "Field1", Index: IntPointer(1)}},
if _, err := nm.Set(PathItems{{Field: "1234", Index: StringPointer("1")}, {Field: "Field1", Index: StringPointer("1")}},
NewNMData("1001")); err != ErrWrongPath {
t.Error(err)
}
expected = &NMSlice{NewNMData("1001"), NavigableMap2{"Field1": NewNMData("1001")}}
if _, err := nm.Set(PathItems{{Field: "1234", Index: IntPointer(1)}, {Field: "Field1"}},
if _, err := nm.Set(PathItems{{Field: "1234", Index: StringPointer("1")}, {Field: "Field1"}},
NewNMData("1001")); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(nm, expected) {
t.Errorf("Expected %s ,received: %s", expected, nm)
}
expected = &NMSlice{NewNMData("1001"), NewNMData("1001")}
if _, err := nm.Set(PathItems{{Field: "1234", Index: IntPointer(-1)}}, NewNMData("1001")); err != nil {
if _, err := nm.Set(PathItems{{Field: "1234", Index: StringPointer("-1")}}, NewNMData("1001")); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(nm, expected) {
t.Errorf("Expected %s ,received: %s", expected, nm)
}
nm = &NMSlice{&NMSlice{}}
if _, err := nm.Set(PathItems{{Field: "1234", Index: IntPointer(0)}, {}}, NewNMData("1001")); err != ErrWrongPath {
if _, err := nm.Set(PathItems{{Field: "1234", Index: StringPointer("0")}, {}}, NewNMData("1001")); err != ErrWrongPath {
t.Error(err)
}
}
@@ -156,7 +156,7 @@ func TestNMSliceRemove(t *testing.T) {
t.Error(err)
}
if err := nm.Remove(PathItems{{Index: IntPointer(-1)}, {}}); err != ErrWrongPath {
if err := nm.Remove(PathItems{{Index: StringPointer("-1")}, {}}); err != ErrWrongPath {
t.Error(err)
}
expected := &NMSlice{
@@ -165,13 +165,13 @@ func TestNMSliceRemove(t *testing.T) {
&NavigableMap2{"Field1": NewNMData("Val")},
}
if err := nm.Remove(PathItems{{Index: IntPointer(-1)}}); err != nil {
if err := nm.Remove(PathItems{{Index: StringPointer("-1")}}); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(nm, expected) {
t.Errorf("Expected %s ,received: %s", expected, nm)
}
if err := nm.Remove(PathItems{{Index: IntPointer(1)}, {}}); err != ErrWrongPath {
if err := nm.Remove(PathItems{{Index: StringPointer("1")}, {}}); err != ErrWrongPath {
t.Error(err)
}
@@ -179,25 +179,25 @@ func TestNMSliceRemove(t *testing.T) {
NewNMData("1001"),
&NavigableMap2{"Field1": NewNMData("Val")},
}
if err := nm.Remove(PathItems{{Index: IntPointer(1)}}); err != nil {
if err := nm.Remove(PathItems{{Index: StringPointer("1")}}); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(nm, expected) {
t.Errorf("Expected %s ,received: %s", expected, nm)
}
if err := nm.Remove(PathItems{{Index: IntPointer(10)}}); err != nil {
if err := nm.Remove(PathItems{{Index: StringPointer("10")}}); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(nm, expected) {
t.Errorf("Expected %s ,received: %s", expected, nm)
}
if err := nm.Remove(PathItems{{Index: IntPointer(1)}, {Field: "Field1", Index: IntPointer(1)}}); err != ErrWrongPath {
if err := nm.Remove(PathItems{{Index: StringPointer("1")}, {Field: "Field1", Index: StringPointer("1")}}); err != ErrWrongPath {
t.Error(err)
}
expected = &NMSlice{
NewNMData("1001"),
}
if err := nm.Remove(PathItems{{Index: IntPointer(1)}, {Field: "Field1"}}); err != nil {
if err := nm.Remove(PathItems{{Index: StringPointer("1")}, {Field: "Field1"}}); err != nil {
t.Error(err)
} else if !reflect.DeepEqual(nm, expected) {
t.Errorf("Expected %s ,received: %s", expected, nm)

View File

@@ -20,6 +20,7 @@ package utils
import (
"net"
"strconv"
"strings"
)
@@ -108,7 +109,7 @@ func (onm *OrderedNavigableMap) Set(fullPath *FullPath, val NMInterface) (addedN
pathItmsSet = make([]PathItems, len(*val.(*NMSlice)))
for i := 0; i < val.Len(); i++ {
pathItms := fullPath.PathItems.Clone()
pathItms[len(pathItms)-1].Index = IntPointer(i)
pathItms[len(pathItms)-1].Index = StringPointer(strconv.Itoa(i))
pathItmsSet[i] = pathItms
}
} else {

View File

@@ -38,11 +38,11 @@ func TestOrderedNavigableMap(t *testing.T) {
onm.Set(&FullPath{
Path: "Field2[0]",
PathItems: PathItems{{Field: "Field2", Index: IntPointer(0)}},
PathItems: PathItems{{Field: "Field2", Index: StringPointer("0")}},
}, NewNMData("1001"))
expOrder = []PathItems{
PathItems{{Field: "Field1"}},
PathItems{{Field: "Field2", Index: IntPointer(0)}},
PathItems{{Field: "Field2", Index: StringPointer("0")}},
}
if !reflect.DeepEqual(expOrder, onm.GetOrder()) {
t.Errorf("Expected %s ,received: %s", expOrder, ToJSON(onm.GetOrder()))
@@ -51,15 +51,15 @@ func TestOrderedNavigableMap(t *testing.T) {
onm.Set(&FullPath{
Path: "Field2[1].Account[0]",
PathItems: PathItems{
{Field: "Field2", Index: IntPointer(1)},
{Field: "Account", Index: IntPointer(0)}},
{Field: "Field2", Index: StringPointer("1")},
{Field: "Account", Index: StringPointer("0")}},
}, NewNMData(10))
expOrder = []PathItems{
PathItems{{Field: "Field1"}},
PathItems{{Field: "Field2", Index: IntPointer(0)}},
PathItems{{Field: "Field2", Index: StringPointer("0")}},
PathItems{
{Field: "Field2", Index: IntPointer(1)},
{Field: "Account", Index: IntPointer(0)}},
{Field: "Field2", Index: StringPointer("1")},
{Field: "Account", Index: StringPointer("0")}},
}
if !reflect.DeepEqual(expOrder, onm.GetOrder()) {
t.Errorf("Expected %s ,received: %s", expOrder, ToJSON(onm.GetOrder()))
@@ -68,18 +68,18 @@ func TestOrderedNavigableMap(t *testing.T) {
onm.Set(&FullPath{
Path: "Field2[1].Account[1]",
PathItems: PathItems{
{Field: "Field2", Index: IntPointer(1)},
{Field: "Account", Index: IntPointer(1)}},
{Field: "Field2", Index: StringPointer("1")},
{Field: "Account", Index: StringPointer("1")}},
}, NewNMData(11))
expOrder = []PathItems{
PathItems{{Field: "Field1"}},
PathItems{{Field: "Field2", Index: IntPointer(0)}},
PathItems{{Field: "Field2", Index: StringPointer("0")}},
PathItems{
{Field: "Field2", Index: IntPointer(1)},
{Field: "Account", Index: IntPointer(0)}},
{Field: "Field2", Index: StringPointer("1")},
{Field: "Account", Index: StringPointer("0")}},
PathItems{
{Field: "Field2", Index: IntPointer(1)},
{Field: "Account", Index: IntPointer(1)}},
{Field: "Field2", Index: StringPointer("1")},
{Field: "Account", Index: StringPointer("1")}},
}
if !reflect.DeepEqual(expOrder, onm.GetOrder()) {
t.Errorf("Expected %s ,received: %s", expOrder, ToJSON(onm.GetOrder()))
@@ -87,18 +87,18 @@ func TestOrderedNavigableMap(t *testing.T) {
onm.Set(&FullPath{
Path: "Field2[2]",
PathItems: PathItems{{Field: "Field2", Index: IntPointer(2)}},
PathItems: PathItems{{Field: "Field2", Index: StringPointer("2")}},
}, NewNMData(111))
expOrder = []PathItems{
PathItems{{Field: "Field1"}},
PathItems{{Field: "Field2", Index: IntPointer(0)}},
PathItems{{Field: "Field2", Index: StringPointer("0")}},
PathItems{
{Field: "Field2", Index: IntPointer(1)},
{Field: "Account", Index: IntPointer(0)}},
{Field: "Field2", Index: StringPointer("1")},
{Field: "Account", Index: StringPointer("0")}},
PathItems{
{Field: "Field2", Index: IntPointer(1)},
{Field: "Account", Index: IntPointer(1)}},
PathItems{{Field: "Field2", Index: IntPointer(2)}},
{Field: "Field2", Index: StringPointer("1")},
{Field: "Account", Index: StringPointer("1")}},
PathItems{{Field: "Field2", Index: StringPointer("2")}},
}
if !reflect.DeepEqual(expOrder, onm.GetOrder()) {
t.Errorf("Expected %s ,received: %s", expOrder, ToJSON(onm.GetOrder()))
@@ -113,14 +113,14 @@ func TestOrderedNavigableMap(t *testing.T) {
}, NewNMData(5))
expOrder = []PathItems{
PathItems{{Field: "Field1"}},
PathItems{{Field: "Field2", Index: IntPointer(0)}},
PathItems{{Field: "Field2", Index: StringPointer("0")}},
PathItems{
{Field: "Field2", Index: IntPointer(1)},
{Field: "Account", Index: IntPointer(0)}},
{Field: "Field2", Index: StringPointer("1")},
{Field: "Account", Index: StringPointer("0")}},
PathItems{
{Field: "Field2", Index: IntPointer(1)},
{Field: "Account", Index: IntPointer(1)}},
PathItems{{Field: "Field2", Index: IntPointer(2)}},
{Field: "Field2", Index: StringPointer("1")},
{Field: "Account", Index: StringPointer("1")}},
PathItems{{Field: "Field2", Index: StringPointer("2")}},
PathItems{
{Field: "Field3"},
{Field: "Field4"},
@@ -173,14 +173,14 @@ func TestOrderedNavigableMap(t *testing.T) {
{Field: "Field3"},
{Field: "Field4"},
{Field: "Field5"}},
PathItems{{Field: "Field2", Index: IntPointer(0)}},
PathItems{{Field: "Field2", Index: IntPointer(1)}},
PathItems{{Field: "Field2", Index: StringPointer("0")}},
PathItems{{Field: "Field2", Index: StringPointer("1")}},
}
if !reflect.DeepEqual(expOrder, onm.GetOrder()) {
t.Errorf("Expected %s ,received: %s", expOrder, onm.GetOrder())
}
path = PathItems{{Field: "Field2", Index: IntPointer(0)}}
path = PathItems{{Field: "Field2", Index: StringPointer("0")}}
if val, err := onm.Field(path); err != nil {
t.Error(err)
} else if val.Interface() != "500" {
@@ -248,15 +248,15 @@ func TestOrderedNavigableMapField(t *testing.T) {
t.Errorf("Expected %q ,received: %q", "1001", val.Interface())
}
if _, err := nm.Field(PathItems{{Field: "Field1", Index: IntPointer(0)}}); err != ErrNotFound {
if _, err := nm.Field(PathItems{{Field: "Field1", Index: StringPointer("0")}}); err != ErrNotFound {
t.Error(err)
}
if val, err := nm.Field(PathItems{{Field: "Field5", Index: IntPointer(0)}}); err != nil {
if val, err := nm.Field(PathItems{{Field: "Field5", Index: StringPointer("0")}}); err != nil {
t.Error(err)
} else if val.Interface() != 10 {
t.Errorf("Expected %q ,received: %q", 10, val.Interface())
}
if _, err := nm.Field(PathItems{{Field: "Field3", Index: IntPointer(0)}}); err != ErrNotFound {
if _, err := nm.Field(PathItems{{Field: "Field3", Index: StringPointer("0")}}); err != ErrNotFound {
t.Error(err)
}
if val, err := nm.Field(PathItems{{Field: "Field3"}, {Field: "Field4"}}); err != nil {
@@ -298,17 +298,17 @@ func TestOrderedNavigableMapLen(t *testing.T) {
func TestOrderedNavigableMapGetSet(t *testing.T) {
nm := NewOrderedNavigableMap()
nm.Set(&FullPath{
PathItems: PathItems{{Field: "Account", Index: IntPointer(0)}},
PathItems: PathItems{{Field: "Account", Index: StringPointer("0")}},
Path: "Account",
}, NewNMData(1001))
nm.Set(&FullPath{
PathItems: PathItems{{Field: "Account", Index: IntPointer(1)}},
PathItems: PathItems{{Field: "Account", Index: StringPointer("1")}},
Path: "Account",
}, NewNMData("account_on_new_branch"))
expectedOrder := []PathItems{
{{Field: "Account", Index: IntPointer(0)}},
{{Field: "Account", Index: IntPointer(1)}},
{{Field: "Account", Index: StringPointer("0")}},
{{Field: "Account", Index: StringPointer("1")}},
}
if recivedOrder := nm.GetOrder(); !reflect.DeepEqual(expectedOrder, recivedOrder) {
@@ -346,7 +346,7 @@ func TestOrderedNavigableMapGetSet(t *testing.T) {
t.Errorf("Expected %q ,received: %q", 5, val.Interface())
}
path = PathItems{{Field: "Field2", Index: IntPointer(2)}}
path = PathItems{{Field: "Field2", Index: StringPointer("2")}}
if _, err := nm.Set(&FullPath{Path: path.String(), PathItems: path}, NewNMData("500")); err != nil {
t.Error(err)
}
@@ -356,17 +356,17 @@ func TestOrderedNavigableMapGetSet(t *testing.T) {
t.Errorf("Expected %q ,received: %q", "500", val.Interface())
}
path = PathItems{{Field: "Field2", Index: IntPointer(1)}, {Field: "Account"}}
path = PathItems{{Field: "Field2", Index: StringPointer("1")}, {Field: "Account"}}
if _, err := nm.Set(&FullPath{Path: path.String(), PathItems: path}, NewNMData("5")); err != nil {
t.Error(err)
}
path = PathItems{{Field: "Field2", Index: IntPointer(1)}, {Field: "Account"}}
path = PathItems{{Field: "Field2", Index: StringPointer("1")}, {Field: "Account"}}
if val, err := nm.Field(path); err != nil {
t.Error(err)
} else if val.Interface() != "5" {
t.Errorf("Expected %q ,received: %q", "5", val.Interface())
}
path = PathItems{{Field: "Field2", Index: IntPointer(1)}, {Field: "Account", Index: IntPointer(0)}}
path = PathItems{{Field: "Field2", Index: StringPointer("1")}, {Field: "Account", Index: StringPointer("0")}}
if _, err := nm.Field(path); err != ErrNotFound {
t.Error(err)
}
@@ -423,26 +423,26 @@ func TestOrderedNavigableMapFieldAsString(t *testing.T) {
func TestOrderedNavigableMapGetOrder(t *testing.T) {
nm := NewOrderedNavigableMap()
nm.Set(&FullPath{
PathItems: PathItems{{Field: "Field1"}, {Field: "Field2", Index: IntPointer(0)}},
PathItems: PathItems{{Field: "Field1"}, {Field: "Field2", Index: StringPointer("0")}},
Path: "Field1.Field2[0]",
}, NewNMData("1003"))
nm.Set(&FullPath{
PathItems: PathItems{{Field: "Field1"}, {Field: "Field2", Index: IntPointer(1)}},
PathItems: PathItems{{Field: "Field1"}, {Field: "Field2", Index: StringPointer("1")}},
Path: "Field1.Field2[1]",
}, NewNMData("Val"))
nm.Set(&FullPath{
PathItems: PathItems{{Field: "Field3"}, {Field: "Field4"}, {Field: "Field5", Index: IntPointer(0)}},
PathItems: PathItems{{Field: "Field3"}, {Field: "Field4"}, {Field: "Field5", Index: StringPointer("0")}},
Path: "Field3.Field4.Field5",
}, NewNMData("1001"))
nm.Set(&FullPath{
PathItems: PathItems{{Field: "Field1"}, {Field: "Field2", Index: IntPointer(2)}},
PathItems: PathItems{{Field: "Field1"}, {Field: "Field2", Index: StringPointer("2")}},
Path: "Field1.Field2[2]",
}, NewNMData(101))
expected := []PathItems{
{{Field: "Field1"}, {Field: "Field2", Index: IntPointer(0)}},
{{Field: "Field1"}, {Field: "Field2", Index: IntPointer(1)}},
{{Field: "Field3"}, {Field: "Field4"}, {Field: "Field5", Index: IntPointer(0)}},
{{Field: "Field1"}, {Field: "Field2", Index: IntPointer(2)}},
{{Field: "Field1"}, {Field: "Field2", Index: StringPointer("0")}},
{{Field: "Field1"}, {Field: "Field2", Index: StringPointer("1")}},
{{Field: "Field3"}, {Field: "Field4"}, {Field: "Field5", Index: StringPointer("0")}},
{{Field: "Field1"}, {Field: "Field2", Index: StringPointer("2")}},
}
if rply := nm.GetOrder(); !reflect.DeepEqual(rply, expected) {
t.Errorf("Expected %s ,received: %s", expected, rply)
@@ -457,18 +457,18 @@ func TestOrderedNavigableMapSet(t *testing.T) {
t.Error(err)
}
if _, err := nm.Set(&FullPath{
PathItems: PathItems{{Field: "Field1", Index: IntPointer(10)}},
PathItems: PathItems{{Field: "Field1", Index: StringPointer("10")}},
Path: "Field1[10]",
}, NewNMData("1001")); err != ErrWrongPath {
t.Error(err)
}
if _, err := nm.Set(&FullPath{
PathItems: PathItems{{Field: "Field1", Index: IntPointer(10)}, {Field: "Field2"}},
PathItems: PathItems{{Field: "Field1", Index: StringPointer("10")}, {Field: "Field2"}},
Path: "Field1[10].Field2",
}, NewNMData("1001")); err != ErrWrongPath {
t.Error(err)
}
path := PathItems{{Field: "Field1", Index: IntPointer(0)}}
path := PathItems{{Field: "Field1", Index: StringPointer("0")}}
if addedNew, err := nm.Set(&FullPath{
PathItems: path,
Path: path.String(),
@@ -486,26 +486,26 @@ func TestOrderedNavigableMapSet(t *testing.T) {
t.Errorf("Expected %s ,received: %s", order, nm.GetOrder())
}
if _, err := nm.Set(&FullPath{
PathItems: PathItems{{Field: "Field1", Index: IntPointer(0)}, {}},
PathItems: PathItems{{Field: "Field1", Index: StringPointer("0")}, {}},
Path: "Field1[0]",
}, NewNMData("1001")); err != ErrWrongPath {
t.Error(err)
}
if _, err := nm.Set(&FullPath{
PathItems: PathItems{{Field: "Field1", Index: IntPointer(10)}},
PathItems: PathItems{{Field: "Field1", Index: StringPointer("10")}},
Path: "Field1[10]",
}, NewNMData("1001")); err != ErrWrongPath {
t.Error(err)
}
if _, err := nm.Set(&FullPath{
PathItems: PathItems{{Field: "Field1", Index: IntPointer(0)}, {}},
PathItems: PathItems{{Field: "Field1", Index: StringPointer("0")}, {}},
Path: "Field1[0]",
}, &NMSlice{}); err != ErrWrongPath {
t.Error(err)
}
if _, err := nm.Set(&FullPath{
PathItems: PathItems{{Field: "Field1", Index: IntPointer(10)}},
PathItems: PathItems{{Field: "Field1", Index: StringPointer("10")}},
Path: "Field[10]",
}, &NMSlice{}); err != ErrWrongPath {
t.Error(err)
@@ -547,7 +547,7 @@ func TestOrderedNavigableMapSet(t *testing.T) {
if !reflect.DeepEqual(nm.GetOrder(), order) {
t.Errorf("Expected %s ,received: %s", order, nm.GetOrder())
}
path = PathItems{{Field: "Field1", Index: IntPointer(1)}}
path = PathItems{{Field: "Field1", Index: StringPointer("1")}}
nMap = NavigableMap2{
"Field1": &NMSlice{NewNMData("1002"), NewNMData("1003")},
"Field2": NewNMData("1002"),
@@ -574,7 +574,7 @@ func TestOrderedNavigableMapSet(t *testing.T) {
"Field2": NewNMData("1002"),
"Field3": obj,
}
order = append(order, PathItems{{Field: "Field3", Index: IntPointer(0)}}, PathItems{{Field: "Field3", Index: IntPointer(1)}})
order = append(order, PathItems{{Field: "Field3", Index: StringPointer("0")}}, PathItems{{Field: "Field3", Index: StringPointer("1")}})
if addedNew, err := nm.Set(&FullPath{
PathItems: path,
Path: path.String(),
@@ -597,10 +597,10 @@ func TestOrderedNavigableMapSet(t *testing.T) {
}
order = []PathItems{
{{Field: "Field2"}},
{{Field: "Field3", Index: IntPointer(0)}},
{{Field: "Field3", Index: IntPointer(1)}},
{{Field: "Field1", Index: IntPointer(0)}},
{{Field: "Field1", Index: IntPointer(1)}},
{{Field: "Field3", Index: StringPointer("0")}},
{{Field: "Field3", Index: StringPointer("1")}},
{{Field: "Field1", Index: StringPointer("0")}},
{{Field: "Field1", Index: StringPointer("1")}},
}
if addedNew, err := nm.Set(&FullPath{
PathItems: PathItems{{Field: "Field1"}},
@@ -624,13 +624,13 @@ func TestOrderedNavigableMapSet(t *testing.T) {
}
order = []PathItems{
{{Field: "Field2"}},
{{Field: "Field3", Index: IntPointer(0)}},
{{Field: "Field1", Index: IntPointer(0)}},
{{Field: "Field1", Index: IntPointer(1)}},
{{Field: "Field3", Index: IntPointer(1)}},
{{Field: "Field3", Index: StringPointer("0")}},
{{Field: "Field1", Index: StringPointer("0")}},
{{Field: "Field1", Index: StringPointer("1")}},
{{Field: "Field3", Index: StringPointer("1")}},
}
if addedNew, err := nm.Set(&FullPath{
PathItems: PathItems{{Field: "Field3", Index: IntPointer(-1)}},
PathItems: PathItems{{Field: "Field3", Index: StringPointer("-1")}},
Path: "Field3[-1]",
}, NewNMData("1007")); err != nil {
t.Error(err)
@@ -673,7 +673,7 @@ func TestOrderedNavigableMapRemove(t *testing.T) {
t.Error(err)
}
if err := nm.Remove(&FullPath{PathItems: PathItems{{Index: IntPointer(-1)}, {}}}); err != ErrWrongPath {
if err := nm.Remove(&FullPath{PathItems: PathItems{{Index: StringPointer("-1")}, {}}}); err != ErrWrongPath {
t.Error(err)
}
nMap := NavigableMap2{
@@ -686,8 +686,8 @@ func TestOrderedNavigableMapRemove(t *testing.T) {
{{Field: "Field2"}},
{{Field: "Field3"}, {Field: "Field4"}},
{{Field: "Field1"}},
{{Field: "Field5", Index: IntPointer(0)}},
{{Field: "Field5", Index: IntPointer(1)}},
{{Field: "Field5", Index: StringPointer("0")}},
{{Field: "Field5", Index: StringPointer("1")}},
}
if !reflect.DeepEqual(nm.nm, nMap) {
t.Errorf("Expected %s ,received: %s", nMap, nm)
@@ -703,8 +703,8 @@ func TestOrderedNavigableMapRemove(t *testing.T) {
order = []PathItems{
{{Field: "Field3"}, {Field: "Field4"}},
{{Field: "Field1"}},
{{Field: "Field5", Index: IntPointer(0)}},
{{Field: "Field5", Index: IntPointer(1)}},
{{Field: "Field5", Index: StringPointer("0")}},
{{Field: "Field5", Index: StringPointer("1")}},
}
if err := nm.Remove(&FullPath{PathItems: PathItems{{Field: "Field2"}}, Path: "Field2"}); err != nil {
@@ -734,7 +734,7 @@ func TestOrderedNavigableMapRemove(t *testing.T) {
if !reflect.DeepEqual(nm.GetOrder(), order) {
t.Errorf("Expected %s ,received: %s", order, nm.GetOrder())
}
if err := nm.Remove(&FullPath{PathItems: PathItems{{Field: "Field1", Index: IntPointer(0)}, {}}}); err != ErrWrongPath {
if err := nm.Remove(&FullPath{PathItems: PathItems{{Field: "Field1", Index: StringPointer("0")}, {}}}); err != ErrWrongPath {
t.Error(err)
}
}

View File

@@ -44,7 +44,7 @@ type FullPath struct {
func NewPathItems(path []string) (pItms PathItems) {
pItms = make(PathItems, len(path))
for i, v := range path {
field, indx := GetPathIndex(v)
field, indx := GetPathIndexString(v)
pItms[i] = PathItem{
Field: field,
Index: indx,
@@ -82,7 +82,7 @@ func (path PathItems) String() (out string) {
// PathItem used by the NM interface to store the path information
type PathItem struct {
Field string
Index *int
Index *string
}
// Equal returns true if p==p2
@@ -102,7 +102,7 @@ func (p PathItem) Equal(p2 PathItem) bool {
func (p PathItem) String() (out string) {
out = p.Field
if p.Index != nil {
out += IdxStart + strconv.Itoa(*p.Index) + IdxEnd
out += IdxStart + *p.Index + IdxEnd
}
return
}
@@ -114,7 +114,7 @@ func (p PathItem) Clone() (c PathItem) {
// }
c.Field = p.Field
if p.Index != nil {
c.Index = IntPointer(*p.Index)
c.Index = StringPointer(*p.Index)
}
return
}
@@ -148,6 +148,9 @@ func GetPathWithoutIndex(spath string) (opath string) {
return
}
// GetPathIndexString returns the path and index as string if index present
// path[index]=>path,index
// path=>path,nil
func GetPathIndexString(spath string) (opath string, idx *string) {
idxStart := strings.Index(spath, IdxStart)
if idxStart == -1 || !strings.HasSuffix(spath, IdxEnd) {

View File

@@ -56,7 +56,7 @@ func TestStripIdxFromLastPathElm(t *testing.T) {
func TestNewPathItems(t *testing.T) {
pathSlice := strings.Split("*req.Field1[0].Account", NestingSep)
expected := PathItems{{Field: MetaReq}, {Field: "Field1", Index: IntPointer(0)}, {Field: Account}}
expected := PathItems{{Field: MetaReq}, {Field: "Field1", Index: StringPointer("0")}, {Field: Account}}
if rply := NewPathItems(pathSlice); !reflect.DeepEqual(expected, rply) {
t.Errorf("Expected: %s, received: %s", ToJSON(expected), ToJSON(rply))
}
@@ -73,7 +73,7 @@ func TestPathItemString(t *testing.T) {
if rply := path.String(); expected != rply {
t.Errorf("Expected: %q, received: %q", expected, rply)
}
path = PathItem{Field: MetaReq, Index: IntPointer(10)}
path = PathItem{Field: MetaReq, Index: StringPointer("10")}
expected = MetaReq + "[10]"
if rply := path.String(); expected != rply {
t.Errorf("Expected: %q, received: %q", expected, rply)
@@ -90,21 +90,21 @@ func TestPathItemEqual(t *testing.T) {
if path.Equal(p1) {
t.Errorf("Expected %s to not be equal to %s", ToJSON(path), ToJSON(p1))
}
p1 = PathItem{Field: MetaReq, Index: IntPointer(0)}
p1 = PathItem{Field: MetaReq, Index: StringPointer("0")}
if path.Equal(p1) {
t.Errorf("Expected %s to not be equal to %s", ToJSON(path), ToJSON(p1))
}
path = PathItem{Field: MetaReq, Index: IntPointer(0)}
path = PathItem{Field: MetaReq, Index: StringPointer("0")}
if !path.Equal(p1) {
t.Errorf("Expected %s to be equal to %s", ToJSON(path), ToJSON(p1))
}
}
func TestPathItemClone(t *testing.T) {
path := PathItem{Field: MetaReq, Index: IntPointer(0)}
expected := PathItem{Field: MetaReq, Index: IntPointer(0)}
path := PathItem{Field: MetaReq, Index: StringPointer("0")}
expected := PathItem{Field: MetaReq, Index: StringPointer("0")}
rply := path.Clone()
*path.Index = 1
*path.Index = "1"
if !reflect.DeepEqual(expected, rply) {
t.Errorf("Expected: %s, received: %s", ToJSON(expected), ToJSON(rply))
}