blob: 75a42a312ff0f5da10cad992735acf2dce7640e7 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package goetchtest
import . "etch"
import "fmt"
import "time"
type dummyValueFactory struct {
ValueFactory
Mf_f1 *Field
Mf_f2 *Field
}
func NewDummyValueFactory() *dummyValueFactory {
ret := &dummyValueFactory{NewDefaultValueFactory(), nil, nil}
var ty *Type = NewTypeByName("type1")
var rty *Type = NewTypeByName("returntype1")
ret.Mf_f1 = NewField("field1")
ret.Mf_f2 = NewField("field2")
dv2 := new(dummyVal)
ty.PutValidator(ret.Mf_f1, dv2)
ty.PutValidator(ret.Mf_f2, dv2)
ty.PutValidator(ret.GetDefaultMessageIdField(), dv2)
ty.RType = rty
rty.ResponseField = ret.GetDefaultResponseField()
rty.PutValidator(ret.GetDefaultResponseField(), dv2)
rty.PutValidator(ret.GetDefaultInReplyToField(), dv2)
rty.PutValidator(ret.GetDefaultMessageIdField(), dv2)
ret.AddType(ty)
ret.AddType(rty)
return ret
}
//*****************************************************************************************
type dummyServerFactory struct {
session Session
transport Transport
}
func NewDummyServerFactory(transport Transport) *dummyServerFactory {
val := &dummyServerFactory{nil, transport}
return val
}
func (dsf *dummyServerFactory) NewServer(connection *TcpConnection) {
Log("dummyServerFactory: newServer\n")
ptzr := NewPacketizer(connection, 10*1024)
connection.SetSession(ptzr)
dvf := NewDummyValueFactory()
msgzr := NewMessagizer(dvf, ptzr)
ptzr.SetSession(msgzr)
mbm := NewPlainMailboxManager(nil, msgzr)
msgzr.SetSession(mbm)
dsvc := NewDefaultDeliveryService(mbm, nil)
mbm.SetSession(dsvc)
stub := NewEtchStub(dsvc, nil)
dsvc.SetSession(stub)
stub.Impl = new(dummyImpl)
dvf.GetTypeByName("type1").StubHelper = new(dummyHelper)
Log("dummyServerFactory: STARTING TRANSPORT CONTROL\n")
//no wait up on server
dsvc.TransportControl(START, 4000)
}
func (dsf *dummyServerFactory) SessionQuery(obj interface{}) interface{} {
return nil
}
func (dsf *dummyServerFactory) SessionControl(ctrl interface{}, value interface{}) interface{} {
return nil
}
func (dsf *dummyServerFactory) SessionNotify(obj interface{}) {
Log("dummyServerFactory sessionnotify\n")
}
func (dsf *dummyServerFactory) GetSession() Session {
return nil
}
func (dsf *dummyServerFactory) SetSession(sess Session) {
}
func (dsf *dummyServerFactory) TransportQuery(obj interface{}) interface{} {
return nil
}
func (dsf *dummyServerFactory) TransportControl(ctrl interface{}, value interface{}) {
Log("dummyServerFactory transportcontrol\n")
dsf.transport.TransportControl(ctrl, value)
}
func (dsf *dummyServerFactory) TransportNotify(value interface{}) {
}
//****************************************************
func toInteger(val interface{}) int32 {
switch val.(type) {
case int:
return int32(val.(int))
case int8:
return int32(val.(int8))
case int16:
return int32(val.(int16))
case int32:
return int32(val.(int32))
case int64:
return int32(val.(int64))
}
return 0
}
type dummyHelper struct{}
func (dh *dummyHelper) Run(svc DeliveryService, impl interface{}, sender interface{}, msg *Message) {
Log("dummyHelper got message: " + fmt.Sprint(msg) + "\n")
rmsg := msg.Reply()
di := impl.(*dummyImpl)
f1 := msg.Vf.(*dummyValueFactory).Mf_f1
f2 := msg.Vf.(*dummyValueFactory).Mf_f2
ret := di.dummyFunc(toInteger(msg.Fields[f1]), toInteger(msg.Fields[f2]))
rmsg.Put(msg.Vf.GetDefaultResponseField(), ret)
svc.TransportMessage(sender, rmsg)
}
type dummyImpl struct{}
func (di *dummyImpl) dummyFunc(param1 int32, param2 int32) int32 {
Log("HEUREKA, this is the call\n")
return param1 + param2
}
func TestIntegration() {
//start server
Log("****************************************************** STARTING SERVER\n")
tl := NewTcpListener("127.0.0.1:4001")
dsl := NewDefaultSessionListener(tl)
tl.SetSession(dsl)
sf := NewDummyServerFactory(dsl)
dsl.SetSession(sf)
sf.TransportControl(START_AND_WAIT_UP, 4000)
Log("****************************************************** STARTING SERVER DONE\n")
Log("****************************************************** INITIALIZING CLIENT\n")
//start client
tcpClientConn := NewTcpConnection("127.0.0.1:4001", false, nil, nil)
_, cdvf, cdsvc := buildStack(tcpClientConn)
Log("****************************************************** STARTING CLIENT TRANSPORT CONTROL WAITUP\n")
cdsvc.TransportControl(START_AND_WAIT_UP, 4000)
Log("****************************************************** STARTING CLIENT TRANSPORT CONTROL WAITUP DONE\n")
msg := NewMessage(cdvf.GetTypeByName("type1"), cdvf, 2)
msg.Put(cdvf.(*dummyValueFactory).Mf_f1, int8(55))
msg.Put(cdvf.(*dummyValueFactory).Mf_f2, int8(56))
start := time.Nanoseconds()
for i := 0; i < 10; i++ {
doCall(msg, cdsvc, cdvf.GetTypeByName("returntype1"), i)
}
end := time.Nanoseconds()
fmt.Printf("10 calls took " + fmt.Sprint((end-start)/1e6) + " ms\n")
Log("Integration Test done\n")
}
func doCall(msg *Message, cdsvc DeliveryService, rty *Type, i int) {
Log("****************************************************** " + fmt.Sprint(i) + " CLIENT BEGIN CALL\n")
mb := cdsvc.BeginCall(msg)
if mb == nil {
Error("IntegrationTest: BeginCall gives null mailbox\n")
}
Log("****************************************************** " + fmt.Sprint(i) + " CLIENT END CALL\n")
retVal := cdsvc.EndCall(mb, rty)
Log("****************************************************** " + fmt.Sprint(i) + " CLIENT END CALL DONE\n")
if retVal != int8(111) {
Error("IntegrationTest: Answer was wrong " + fmt.Sprint(retVal) + "\n")
} else {
Log("****************************************************** " + fmt.Sprint(i) + " CALL SUCCESS\n")
}
}
func buildStack(conn *TcpConnection) (*EtchStub, ValueFactory, DeliveryService) {
ptzr := NewPacketizer(conn, 10*1024)
conn.SetSession(ptzr)
dvf := NewDummyValueFactory()
msgzr := NewMessagizer(dvf, ptzr)
ptzr.SetSession(msgzr)
mbm := NewPlainMailboxManager(nil, msgzr)
msgzr.SetSession(mbm)
dsvc := NewDefaultDeliveryService(mbm, nil)
mbm.SetSession(dsvc)
stub := NewEtchStub(dsvc, nil)
dsvc.SetSession(stub)
return stub, dvf, dsvc
}