Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Open sidebar
TST
ATS
Commits
656c88af
Commit
656c88af
authored
Oct 16, 2017
by
Pramod Kulkarni
Browse files
Merge branch 'Release1' of
https://git.onem2m.org/TST/ATS
into Release1
parents
0c24b5cc
ac99d137
Changes
9
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
5112 additions
and
2813 deletions
+5112
-2813
LibOneM2M/OneM2M_Functions.ttcn
LibOneM2M/OneM2M_Functions.ttcn
+920
-354
LibOneM2M/OneM2M_Pixits.ttcn
LibOneM2M/OneM2M_Pixits.ttcn
+89
-65
LibOneM2M/OneM2M_Ports.ttcn
LibOneM2M/OneM2M_Ports.ttcn
+10
-0
LibOneM2M/OneM2M_Templates.ttcn
LibOneM2M/OneM2M_Templates.ttcn
+92
-54
LibOneM2M/OneM2M_TestSystem.ttcn
LibOneM2M/OneM2M_TestSystem.ttcn
+33
-14
LibOneM2M/OneM2M_Types.ttcn
LibOneM2M/OneM2M_Types.ttcn
+57
-22
LibOneM2M/XSD.ttcn
LibOneM2M/XSD.ttcn
+3
-3
OneM2M_TestControl.ttcn
OneM2M_TestControl.ttcn
+3
-2
OneM2M_Testcases.ttcn
OneM2M_Testcases.ttcn
+3905
-2299
No files found.
LibOneM2M/OneM2M_Functions.ttcn
View file @
656c88af
This diff is collapsed.
Click to expand it.
LibOneM2M/OneM2M_Pixits.ttcn
View file @
656c88af
...
@@ -18,21 +18,14 @@ module OneM2M_Pixits {
...
@@ -18,21 +18,14 @@ module OneM2M_Pixits {
group
TestAdapterParameters
{}
group
TestAdapterParameters
{}
modulepar
boolean
PX_DELETE_CREATED_RESOURCES
:=
true
;
modulepar
XSD
.
AnyURI
PX_RESOURCE_TO_BE_DELETED
:=
"/ae_test"
;
modulepar
XSD
.
IDREFS
PX_RESOURCES_TO_BE_DELETED
:=
{
"MyAe"
};
modulepar
charstring
PX_SUT_ADDRESS
:=
"127.0.0.1:8080"
;
group
IutParameters
{
modulepar
charstring
PX_AE1_ADDRESS
:=
"127.0.0.1:3131"
;
modulepar
boolean
PX_MN_CSE
:=
true
;
modulepar
charstring
PX_AE2_ADDRESS
:=
"127.0.0.1:3132"
;
modulepar
boolean
PX_IN_CSE
:=
false
;
modulepar
charstring
PX_CSE1_ADDRESS
:=
"127.0.0.1:3141"
;
modulepar
charstring
PX_
XML_NAMESPACE
:=
"m2m=""http://www.onem2m.org/xml/protocols""
"
;
modulepar
charstring
PX_
SUT_ADDRESS
:=
"127.0.0.1:8080
"
;
/**
/**
* @desc IUT CSE Name
* @desc IUT CSE Name
...
@@ -45,56 +38,86 @@ module OneM2M_Pixits {
...
@@ -45,56 +38,86 @@ module OneM2M_Pixits {
modulepar
XSD
.
ID
PX_CSE_ID
:=
"/cseId"
;
modulepar
XSD
.
ID
PX_CSE_ID
:=
"/cseId"
;
/**
/**
* @desc IUT
M2M-SP-ID with M2M-SP-ID format (absolute) according to TS-0001-7.2-1 Unstructured-CSE-relative -Resource-ID
* @desc IUT
CSE resource ID with Unstructured-CSE-relative-Resource-ID (relative) format according to TS-0001-7.2-1
*/
*/
modulepar
XSD
.
ID
PX_
SP_ID
:=
"//om2m.org
"
;
modulepar
XSD
.
ID
PX_
CSE_RESOURCE_ID
:=
"cseResourceId
"
;
/**
/**
* @desc
Test System CSE1-ID with SP-relative-CSE
-ID format (
relativ
e) according to TS-0001-7.2-1
* @desc
IUT M2M-SP-ID with M2M-SP
-ID format (
absolut
e) according to TS-0001-7.2-1
Unstructured-CSE-relative -Resource-ID
*/
*/
modulepar
XSD
.
ID
PX_
CSE1_ID
:=
"/MyCSEId
"
;
modulepar
XSD
.
ID
PX_
SP_ID
:=
"//om2m.org
"
;
/**
/**
* @desc
IUT CSE resource ID with Unstructured-CSE-relative-Resource-ID
(relative)
format
according to TS-0001-7.2-1
* @desc
AE-ID with privileges to CREATE at the IUT CSEBase with AE-ID-Stem format
(relative) according to TS-0001-7.2-1
*/
*/
modulepar
XSD
.
ID
PX_
CSE_RESOURC
E_ID
:=
"
cseResourceId
"
;
modulepar
XSD
.
ID
PX_
SUPER_A
E_ID
:=
"
admin:admin
"
;
/**
/**
* @desc
Test System AE1-ID with AE-ID-Stem
format (relative) according to TS-0001-7.2-1
* @desc
CSE-ID with privileges to CREATE at the IUT CSEBase with SP-relative-CSE-ID
format (relative) according to TS-0001-7.2-1
*/
*/
modulepar
XSD
.
ID
PX_AE1_ID_STEM
:=
""
;
modulepar
XSD
.
ID
PX_SUPER_CSE_ID
:=
"/admin:admin"
;
modulepar
AddressingMethod
PX_ADDRESSING_METHOD
:=
e_hierarchical
;
modulepar
PrimitiveScope
PX_PRIMITIVE_SCOPE
:=
e_cseRelative
;
modulepar
charstring
PX_SERIALIZATION
:=
"XML"
;
modulepar
charstring
PX_PROTOCOL_BINDING
:=
"HTTP"
;
modulepar
charstring
PX_XML_NAMESPACE
:=
"m2m=""http://www.onem2m.org/xml/protocols"""
;
modulepar
ListOfURIs
PX_ACOR
:=
{
"*"
};
}
group
TesterParameters
{
modulepar
charstring
PX_AE1_ADDRESS
:=
"127.0.0.1:3131"
;
modulepar
charstring
PX_AE2_ADDRESS
:=
"127.0.0.1:3132"
;
modulepar
charstring
PX_CSE1_ADDRESS
:=
"127.0.0.1:3141"
;
/**
/**
* @desc Test System
AE2
-ID with
AE-ID-Stem
format (relative) according to TS-0001-7.2-1
* @desc Test System
CSE1
-ID with
SP-relative-CSE-ID
format (relative) according to TS-0001-7.2-1
*/
*/
modulepar
XSD
.
ID
PX_
AE2_ID_STEM
:=
"
"
;
modulepar
XSD
.
ID
PX_
CSE1_ID
:=
"/MyCSEId
"
;
/**
/**
* @desc
AE-ID with privileges to CREATE at the IUT CSEBase
with AE-ID-Stem format (relative) according to TS-0001-7.2-1
* @desc
Test System AE1-ID
with AE-ID-Stem format (relative) according to TS-0001-7.2-1
*/
*/
modulepar
XSD
.
ID
PX_
SUPER_
AE_ID
:=
"
admin:admin
"
;
modulepar
XSD
.
ID
PX_AE
1
_ID
_STEM
:=
""
;
/**
/**
* @desc
CSE-ID with privileges to CREATE at the IUT CSEBase with SP-relative-CSE-ID
format (relative) according to TS-0001-7.2-1
* @desc
Test System AE2-ID with AE-ID-Stem
format (relative) according to TS-0001-7.2-1
*/
*/
modulepar
XSD
.
ID
PX_
SUPER_CSE_ID
:=
"/admin:admin
"
;
modulepar
XSD
.
ID
PX_
AE2_ID_STEM
:=
"
"
;
/**
/**
* @desc Test System APP-ID with App-ID format according to TS-0001-7.2-1
* @desc Test System APP-ID with App-ID format according to TS-0001-7.2-1
*/
*/
modulepar
XSD
.
ID
PX_APP_ID
:=
"NMyAppId"
;
modulepar
XSD
.
ID
PX_APP_ID
:=
"NMyAppId"
;
}
group
ExecutionParameters
{
modulepar
boolean
PX_DELETE_CREATED_RESOURCES
:=
true
;
modulepar
XSD
.
AnyURI
PX_RESOURCE_TO_BE_DELETED
:=
"/ae_test"
;
modulepar
XSD
.
IDREFS
PX_RESOURCES_TO_BE_DELETED
:=
{
"MyAe"
};
modulepar
boolean
PX_RUN_POSTAMBLE
:=
true
;
modulepar
boolean
PX_RUN_POSTAMBLE
:=
true
;
modulepar
ListOfURIs
PX_ACOR
:=
{
"*"
};
modulepar
AddressingMethod
PX_ADDRESSING_METHOD
:=
e_hierarchical
;
}
modulepar
PrimitiveScope
PX_PRIMITIVE_SCOPE
:=
e_cseRelative
;
modulepar
charstring
PX_SERIALIZATION
:=
"XML"
;
modulepar
charstring
PX_PROTOCOL_BINDING
:=
"HTTP"
;
modulepar
boolean
PX_USE_RESOURCE_ID_AS_ORIGINATOR
:=
true
;
modulepar
boolean
PX_USE_RESOURCE_ID_AS_ORIGINATOR
:=
true
;
...
@@ -102,6 +125,7 @@ module OneM2M_Pixits {
...
@@ -102,6 +125,7 @@ module OneM2M_Pixits {
//NOTE: Apply to Device-based location request, and this requires Test System (TS) to activate ASN-AE mode to test IUT
//NOTE: Apply to Device-based location request, and this requires Test System (TS) to activate ASN-AE mode to test IUT
modulepar
boolean
PX_IUT_IS_ASN_CSE
:=
false
;
//default //set it to true when running Device-based location testcases
modulepar
boolean
PX_IUT_IS_ASN_CSE
:=
false
;
//default //set it to true when running Device-based location testcases
modulepar
boolean
PX_IUT_IS_MN_CSE
:=
false
;
//default //set it to true when running Share-based location testcases
modulepar
boolean
PX_IUT_IS_MN_CSE
:=
false
;
//default //set it to true when running Share-based location testcases
modulepar
boolean
PX_IUT_IS_IN_CSE
:=
false
;
//default //set it to true when running Share-based location testcases
//constant parameters for LOC
//constant parameters for LOC
modulepar
XSD
.
Token
PX_LOCATION_TARGET_ID
:=
"{LOCATION-TARGET-ID}"
;
//SUPPOSE TO BE RECEIVED FROM LOCATION SERVER
modulepar
XSD
.
Token
PX_LOCATION_TARGET_ID
:=
"{LOCATION-TARGET-ID}"
;
//SUPPOSE TO BE RECEIVED FROM LOCATION SERVER
...
...
LibOneM2M/OneM2M_Ports.ttcn
View file @
656c88af
...
@@ -42,4 +42,14 @@ module OneM2M_Ports {
...
@@ -42,4 +42,14 @@ module OneM2M_Ports {
AcRequestPrimitive
;
AcRequestPrimitive
;
}
}
/**
* @desc Port to exchange information between components
*/
type
port
InfoPort
message
{
in
RequestPrimitive
,
ResponsePrimitive
,
PrimitiveContent
,
MyResource
;
out
RequestPrimitive
,
ResponsePrimitive
,
PrimitiveContent
,
MyResource
;
}
}
//end module
}
//end module
LibOneM2M/OneM2M_Templates.ttcn
View file @
656c88af
This diff is collapsed.
Click to expand it.
LibOneM2M/OneM2M_TestSystem.ttcn
View file @
656c88af
...
@@ -24,6 +24,7 @@ module OneM2M_TestSystem {
...
@@ -24,6 +24,7 @@ module OneM2M_TestSystem {
*/
*/
type
component
Tester
{
type
component
Tester
{
port
AdapterControlPort
acPort
;
port
AdapterControlPort
acPort
;
port
InfoPort
infoPort
;
//timers
//timers
timer
tc_ac
:=
PX_TAC
;
timer
tc_ac
:=
PX_TAC
;
timer
tc_wait
;
timer
tc_wait
;
...
@@ -31,30 +32,48 @@ module OneM2M_TestSystem {
...
@@ -31,30 +32,48 @@ module OneM2M_TestSystem {
var
Configurations
vc_config
;
var
Configurations
vc_config
;
var
MyResourcesList
vc_resourcesList
;
var
MyResourcesList
vc_resourcesList
;
var
IntegerList
vc_resourcesIndexToBeDeleted
:=
{};
var
IntegerList
vc_resourcesIndexToBeDeleted
:=
{};
var
PrimitiveScope
vc_primitiveScope
:=
PX_PRIMITIVE_SCOPE
;
//var PrimitiveScope vc_primitiveScope := PX_PRIMITIVE_SCOPE;
var
AddressingMethod
vc_addressingMethod
:=
PX_ADDRESSING_METHOD
;
//var AddressingMethod vc_addressingMethod := PX_ADDRESSING_METHOD;
}
var
integer
vc_aeAuxIndex
;
//TODO To be removed
var
integer
vc_acpAuxIndex
;
var
AccessControlPolicy_optional
vc_acpAux
;
};
type
component
CseTester
extends
Tester
{
type
component
AeSimu
extends
Tester
{
var
AeSimu
vc_ae2
;
port
OneM2MPort
mcaPort
;
port
OneM2MPort
mcaPort
;
port
OneM2MPort
mc
c
Port
;
port
OneM2MPort
mc
a
Port
In
;
//global variables
//global variables
var
integer
vc_aeAuxIndex
;
//TODO To be removed
var
PrimitiveContent
vc_primitiveContentRetrievedResource
;
var
RemoteCSE_optional
vc_remoteCSEAux
;
//TODO To be removed
var
AccessControlPolicy_optional
vc_acpAux
;
var
integer
vc_acpAuxIndex
:=
-
1
;
}
var
MsgIn
vc_request
;
var
MsgIn
vc_response
;
var
CseSimu
vc_cseSimu
;
//For CF02 when AeSimu is master
var
boolean
vc_auxiliaryAe2Up
:=
false
;
//var AeSimu vc_ae2;
};
type
component
AeTester
extends
Tester
{
type
component
CseSimu
extends
Tester
{
port
OneM2MPort
mcaPort
;
port
OneM2MPort
mcaPort
;
port
OneM2MPort
mccPort
;
port
OneM2MPort
mccPortIn
;
//global variables
//global variables
}
var
AeSimu
vc_aeSimu
;
//For CF02 when CseSimu is master
var
integer
vc_remoteCseIndex
;
var
MsgIn
vc_request
;
var
MsgIn
vc_response
;
};
type
component
InCseSimu
extends
CseSimu
{}
type
component
MnCseSimu
extends
CseSimu
{}
type
component
CseSystem
{
type
component
CseSystem
{
port
OneM2MPort
mcaPort
;
port
OneM2MPort
mcaPort
;
port
OneM2MPort
mcaPortIn
;
port
OneM2MPort
mccPort
;
port
OneM2MPort
mccPort
;
port
AdapterControlPort
acPort
;
port
AdapterControlPort
acPort
;
}
}
...
...
LibOneM2M/OneM2M_Types.ttcn
View file @
656c88af
...
@@ -3242,10 +3242,12 @@ module OneM2M_Types {
...
@@ -3242,10 +3242,12 @@ module OneM2M_Types {
// TODO To be added
// TODO To be added
type
union
Representation
{
type
union
Representation
{
Resource_2
resource
,
Resource_2
resource
,
ResponsePrimitive
responsePrimitive
ResponsePrimitive
responsePrimitive
,
XSD
.
AnyURI
uRI
}
}
with
{
with
{
variant
"name as 'representation'"
;
variant
"name as 'representation'"
;
variant
(
uRI
)
"name as capitalized"
;
}
}
type
record
Notification_1
type
record
Notification_1
...
@@ -3618,12 +3620,12 @@ module OneM2M_Types {
...
@@ -3618,12 +3620,12 @@ module OneM2M_Types {
};
};
type
record
ResourceWrapper
type
record
ResourceWrapper
//Make of union elements type _optional
{
{
union
{
union
{
AccessControlPolicy
accessControlPolicy
,
AccessControlPolicy
_optional
accessControlPolicy
,
ActiveCmdhPolicy
activeCmdhPolicy
,
ActiveCmdhPolicy
activeCmdhPolicy
,
AE
aE
,
AE
_optional
aE
,
AreaNwkDeviceInfo
areaNwkDeviceInfo
,
AreaNwkDeviceInfo
areaNwkDeviceInfo
,
AreaNwkInfo
areaNwkInfo
,
AreaNwkInfo
areaNwkInfo
,
Battery
battery
,
Battery
battery
,
...
@@ -3635,36 +3637,36 @@ module OneM2M_Types {
...
@@ -3635,36 +3637,36 @@ module OneM2M_Types {
CmdhNetworkAccessRules
cmdhNetworkAccessRules
,
CmdhNetworkAccessRules
cmdhNetworkAccessRules
,
CmdhNwAccessRule
cmdhNwAccessRule
,
CmdhNwAccessRule
cmdhNwAccessRule
,
CmdhPolicy
cmdhPolicy
,
CmdhPolicy
cmdhPolicy
,
Container
container
,
Container
_optional
container
,
ContentInstance
contentInstance
,
ContentInstance
_optional
contentInstance
,
CSEBase
cSEBase
,
CSEBase
_optional
cSEBase
,
Delivery
delivery
,
Delivery
_optional
delivery
,
DeviceCapability
deviceCapability
,
DeviceCapability
deviceCapability
,
DeviceInfo
deviceInfo
,
DeviceInfo
deviceInfo
,
EventConfig
eventConfig
,
EventConfig
eventConfig
,
EventLog
eventLog
,
EventLog
eventLog
,
ExecInstance
execInstance
,
ExecInstance
execInstance
,
Firmware
firmware
,
Firmware
firmware
,
Group
group_
,
Group
_optional
group_
,
LocationPolicy
locationPolicy
,
LocationPolicy
_optional
locationPolicy
,
M2mServiceSubscriptionProfile
m2mServiceSubscriptionProfile
,
M2mServiceSubscriptionProfile
_optional
m2mServiceSubscriptionProfile
,
Memory
memory
,
Memory
memory
,
MgmtCmd
mgmtCmd
,
MgmtCmd
_optional
mgmtCmd
,
Node
node
,
Node
_optional
node
,
Notification
notification
,
Notification
notification
,
PollingChannel
pollingChannel
,
PollingChannel
_optional
pollingChannel
,
Reboot
reboot
,
Reboot
reboot
,
RemoteCSE
remoteCSE
,
RemoteCSE
_optional
remoteCSE
,
Request
request
,
Request
_optional
request
,
RequestPrimitive
requestPrimitive
,
RequestPrimitive
requestPrimitive
,
ResponsePrimitive
responsePrimitive
,
ResponsePrimitive
responsePrimitive
,
Schedule
schedule
,
Schedule
_optional
schedule
,
ServiceSubscribedAppRule
serviceSubscribedAppRule
,
ServiceSubscribedAppRule
_optional
serviceSubscribedAppRule
,
ServiceSubscribedNode
serviceSubscribedNode
,
ServiceSubscribedNode
_optional
serviceSubscribedNode
,
Software
software
,
Software
software
,
StatsCollect
statsCollect
,
StatsCollect
_optional
statsCollect
,
StatsConfig
statsConfig
,
StatsConfig
_optional
statsConfig
,
Subscription
subscription
Subscription
_optional
subscription
}
choice
,
}
choice
,
XSD
.
AnyURI
uRI
XSD
.
AnyURI
uRI
}
}
...
@@ -5124,6 +5126,39 @@ group optionalResourceTypes {
...
@@ -5124,6 +5126,39 @@ group optionalResourceTypes {
variant
(
choice
.
subscription_list
[
-
])
"name as 'subscription'"
;
variant
(
choice
.
subscription_list
[
-
])
"name as 'subscription'"
;
};
};
type
record
ServiceSubscribedNode_optional
{
ResourceName
resourceName
optional
,
ResourceType
resourceType
optional
,
XSD
.
ID
resourceID
optional
,
NhURI
parentID
optional
,
Timestamp
creationTime
optional
,
Timestamp
lastModifiedTime
optional
,
Labels
labels
optional
,
AcpType
accessControlPolicyIDs
optional
,
Timestamp
expirationTime
optional
,
NodeID
nodeID
optional
,
XSD
.
ID
cSE_ID
optional
,
record
of
DeviceID
deviceIdentifier
optional
,
ListOfURIs
ruleLinks
optional
,
union
{
record
length
(
1
..
infinity
)
of
ChildResourceRef
childResource_list
,
record
length
(
1
..
infinity
)
of
Subscription
subscription_list
}
choice
optional
}
with
{
variant
"name as uncapitalized"
;
variant
"element"
;
variant
(
resourceName
)
"attribute"
;
variant
(
cSE_ID
)
"name as 'CSE-ID'"
;
variant
(
deviceIdentifier
)
"list"
;
variant
(
choice
)
"untagged"
;
variant
(
choice
.
childResource_list
)
"untagged"
;
variant
(
choice
.
childResource_list
[
-
])
"name as 'childResource'"
;
variant
(
choice
.
subscription_list
)
"untagged"
;
variant
(
choice
.
subscription_list
[
-
])
"name as 'subscription'"
;
};
type
record
StatsCollect_optional
type
record
StatsCollect_optional
{
{
ResourceName
resourceName
optional
,
ResourceName
resourceName
optional
,
...
...
LibOneM2M/XSD.ttcn
View file @
656c88af
...
@@ -209,9 +209,9 @@ variant "XSD:double";
...
@@ -209,9 +209,9 @@ variant "XSD:double";
// Time types
// Time types
type
charstring
Duration
(
pattern
type
charstring
Duration
//
(pattern
TODO Check the pattern "PT5S" not matching
"{dash}#(,1)P({nums}(Y({nums}(M({nums}D{durTime}#(,1)|{durTime}#(,1))|D{durTime}#(,1))|"
&
//
"{dash}#(,1)P({nums}(Y({nums}(M({nums}D{durTime}#(,1)|{durTime}#(,1))|D{durTime}#(,1))|" &
"{durTime}#(,1))|M({nums}D{durTime}#(,1)|{durTime}#(,1))|D{durTime}#(,1))|{durTime})"
)
//
"{durTime}#(,1))|M({nums}D{durTime}#(,1)|{durTime}#(,1))|D{durTime}#(,1))|{durTime})")
with
{
with
{
variant
"XSD:duration"
;
variant
"XSD:duration"
;
};
};
...
...
OneM2M_TestControl.ttcn
View file @
656c88af
...
@@ -40,11 +40,12 @@ module OneM2M_TestControl {
...
@@ -40,11 +40,12 @@ module OneM2M_TestControl {
execute
(
TC_CSE_REG_CRE_016_CST
());
execute
(
TC_CSE_REG_CRE_016_CST
());
execute
(
TC_CSE_REG_CRE_016_POA
());
execute
(
TC_CSE_REG_CRE_016_POA
());
execute
(
TC_CSE_REG_CRE_016_NL
());
execute
(
TC_CSE_REG_CRE_016_NL
());
execute
(
TC_CSE_REG_CRE_01
8
());
execute
(
TC_CSE_REG_CRE_01
9
());
execute
(
TC_CSE_REG_CRE_022
());
execute
(
TC_CSE_REG_CRE_022
());
execute
(
TC_CSE_REG_CRE_023
());
execute
(
TC_CSE_REG_CRE_023
());
execute
(
TC_CSE_REG_CRE_025
());
execute
(
TC_CSE_REG_CRE_025
());
execute
(
TC_CSE_REG_CRE_026
());
execute
(
TC_CSE_REG_CRE_028
());
execute
(
TC_CSE_REG_CRE_029
());
execute
(
TC_CSE_REG_RET_001
());
execute
(
TC_CSE_REG_RET_001
());
execute
(
TC_CSE_REG_RET_005
());
execute
(
TC_CSE_REG_RET_005
());
execute
(
TC_CSE_REG_RET_008
());
execute
(
TC_CSE_REG_RET_008
());
...
...
OneM2M_Testcases.ttcn
View file @
656c88af
This diff is collapsed.
Click to expand it.
Keebum Kim
@givme
mentioned in issue
#8 (closed)
·
Nov 23, 2017
mentioned in issue
#8 (closed)
mentioned in issue #8
Toggle commit list
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment