@@ -8,24 +8,35 @@ package test
88
99import (
1010 "bytes"
11+ "cmp"
12+ "context"
1113 "fmt"
1214 "io"
1315 "net/http"
16+ "os"
17+ "strconv"
1418 "testing"
15- "time"
1619
17- "github.com/hyperledger/fabric-private-chaincode/samples/demos/irb/pkg/container "
20+ "github.com/docker/go-connections/nat "
1821 "github.com/hyperledger/fabric-private-chaincode/samples/demos/irb/pkg/crypto"
1922 pb "github.com/hyperledger/fabric-private-chaincode/samples/demos/irb/pkg/protos"
2023 "github.com/hyperledger/fabric-private-chaincode/samples/demos/irb/pkg/storage"
21- "github.com/hyperledger/fabric-private-chaincode/samples/demos/irb/pkg/utils"
2224 "github.com/pkg/errors"
25+ "github.com/stretchr/testify/require"
26+ "github.com/testcontainers/testcontainers-go"
27+ "github.com/testcontainers/testcontainers-go/network"
28+ "github.com/testcontainers/testcontainers-go/wait"
2329 "google.golang.org/protobuf/proto"
2430)
2531
26- func requestAttestation () ([]byte , error ) {
32+ func experimentEndpoint (ep string ) string {
33+ host := os .Getenv ("EXPERIMENT_HOST" )
34+ port := os .Getenv ("EXPERIMENT_PORT" )
35+ return fmt .Sprintf ("http://%s:%s/%s" , host , port , ep )
36+ }
2737
28- resp , err := http .Get ("http://localhost:5000/attestation" )
38+ func requestAttestation () ([]byte , error ) {
39+ resp , err := http .Get (experimentEndpoint ("attestation" ))
2940 if err != nil {
3041 return nil , err
3142 }
@@ -57,7 +68,6 @@ func requestAttestation() ([]byte, error) {
5768}
5869
5970func submitEvaluationPack (pk []byte , req * pb.RegisterDataRequest ) error {
60-
6171 epm := & pb.EvaluationPackMessage {}
6272 epm .RegisteredData = []* pb.RegisterDataRequest {req }
6373
@@ -92,7 +102,7 @@ func submitEvaluationPack(pk []byte, req *pb.RegisterDataRequest) error {
92102 return err
93103 }
94104
95- resp , err := http .Post ("http://localhost:5000/ execute-evaluationpack" , "" , bytes .NewBuffer (evalPackBytes ))
105+ resp , err := http .Post (experimentEndpoint ( " execute-evaluationpack") , "" , bytes .NewBuffer (evalPackBytes ))
96106 if err != nil {
97107 return err
98108 }
@@ -122,8 +132,15 @@ func upload() (*pb.RegisterDataRequest, error) {
122132 return nil , errors .Wrap (err , "cannot encrypt message" )
123133 }
124134
135+ host := cmp .Or (os .Getenv ("REDIS_HOST" ), "localhost" )
136+ port , err := strconv .Atoi (cmp .Or (os .Getenv ("REDIS_PORT" ), strconv .Itoa (storage .DefaultRedisPort )))
137+ if err != nil {
138+ return nil , errors .Wrap (err , "invalid redis port" )
139+ }
140+ password := cmp .Or (os .Getenv ("REDIS_PASSWORD" ))
141+
125142 // upload encrypted data
126- kvs := storage .NewClient ()
143+ kvs := storage .NewClient (storage . WithHost ( host ), storage . WithPort ( port ), storage . WithPassword ( password ) )
127144 handle , err := kvs .Upload (encryptedData )
128145 if err != nil {
129146 return nil , errors .Wrap (err , "cannot upload data to kvs" )
@@ -134,7 +151,7 @@ func upload() (*pb.RegisterDataRequest, error) {
134151 PublicKey : []byte ("some verification key" ),
135152 }
136153
137- //build request
154+ // build request
138155 registerDataRequest := & pb.RegisterDataRequest {
139156 Participant : & userIdentity ,
140157 DecryptionKey : sk ,
@@ -148,70 +165,85 @@ func upload() (*pb.RegisterDataRequest, error) {
148165const networkID = "mytestnetwork"
149166
150167func TestWorker (t * testing.T ) {
151-
152- network := & container.Network {Name : networkID }
153- err := network .Create ()
154- defer network .Remove ()
155- if err != nil {
156- panic (err )
157- }
158-
159- // setup redis
160- redis := & container.Container {
161- Image : "redis" ,
162- Name : "redis-container" ,
163- HostIP : "localhost" ,
164- HostPort : "6379" ,
165- Network : networkID ,
166- }
167- err = redis .Start ()
168- defer redis .Stop ()
169- if err != nil {
170- panic (err )
171- }
172-
173- // setup experiment container
174- experiment := & container.Container {
175- Image : "irb-experimenter-worker" ,
176- Name : "experiment-container" ,
177- HostIP : "localhost" ,
178- HostPort : "5000" ,
179- Env : []string {"REDIS_HOST=redis-container" },
180- Network : networkID ,
181- }
182- err = experiment .Start ()
183- defer experiment .Stop ()
184- if err != nil {
185- panic (err )
186- }
187-
188- // let's wait until experiment service is up an running
189- err = utils .Retry (func () bool {
190- resp , err := http .Get ("http://localhost:5000/info" )
191- if err != nil {
192- return false
193- }
194- return resp .StatusCode == 200
195- }, 5 , 60 * time .Second , 2 * time .Second )
196- if err != nil {
197- panic (err )
198- }
168+ ctx := context .Background ()
169+
170+ // network
171+ net , err := network .New (ctx )
172+ require .NoError (t , err )
173+ defer func () {
174+ err := net .Remove (ctx )
175+ require .NoError (t , err )
176+ }()
177+ networkName := net .Name
178+
179+ // redis
180+ redisImageName := "redis"
181+ redisExportedPort := fmt .Sprintf ("%d/tcp" , storage .DefaultRedisPort )
182+ redis , err := testcontainers .GenericContainer (ctx , testcontainers.GenericContainerRequest {
183+ ContainerRequest : testcontainers.ContainerRequest {
184+ Image : redisImageName ,
185+ ExposedPorts : []string {redisExportedPort },
186+ Networks : []string {networkName },
187+ // WaitingFor: wait.ForLog("* Ready to accept connections"),
188+ WaitingFor : wait .ForExposedPort (),
189+ },
190+ Started : true ,
191+ })
192+ require .NoError (t , err )
193+ defer func () {
194+ err := redis .Terminate (ctx )
195+ require .NoError (t , err )
196+ }()
197+
198+ redisHost , err := redis .Host (ctx )
199+ require .NoError (t , err )
200+ redisPort , err := redis .MappedPort (ctx , nat .Port (redisExportedPort ))
201+ require .NoError (t , err )
202+ t .Logf ("redisHost: %s:%s" , redisHost , redisPort .Port ())
203+
204+ os .Setenv ("REDIS_HOST" , redisHost )
205+ os .Setenv ("REDIS_PORT" , redisPort .Port ())
206+
207+ // experiment
208+ experimentImageName := "irb-experimenter-worker"
209+ experiment , err := testcontainers .GenericContainer (ctx , testcontainers.GenericContainerRequest {
210+ ContainerRequest : testcontainers.ContainerRequest {
211+ Image : experimentImageName ,
212+ ExposedPorts : []string {"5000/tcp" },
213+ Networks : []string {networkName },
214+ Env : map [string ]string {
215+ "REDIS_HOST" : redisHost ,
216+ "REDIS_PORT" : redisPort .Port (),
217+ },
218+ WaitingFor : wait .ForExposedPort (),
219+ },
220+ Started : true ,
221+ })
222+ require .NoError (t , err )
223+ defer func () {
224+ err := experiment .Terminate (ctx )
225+ require .NoError (t , err )
226+ }()
227+
228+ experimentHost , err := experiment .Host (ctx )
229+ require .NoError (t , err )
230+ experimentPort , err := experiment .MappedPort (ctx , "5000/tcp" )
231+ require .NoError (t , err )
232+ t .Logf ("experimentHost: %s:%s" , experimentHost , experimentPort .Port ())
233+
234+ os .Setenv ("EXPERIMENT_HOST" , experimentHost )
235+ os .Setenv ("EXPERIMENT_PORT" , experimentPort .Port ())
199236
200237 req , err := upload ()
201- if err != nil {
202- panic (err )
203- }
238+ require .NoError (t , err )
204239
205240 fmt .Println ("Testing attestation..." )
206241 pk , err := requestAttestation ()
207- if err != nil {
208- panic (err )
209- }
242+ require .NoError (t , err )
210243
211244 fmt .Println ("Testing evaluation pack..." )
212- if err := submitEvaluationPack (pk , req ); err != nil {
213- panic (err )
214- }
245+ err = submitEvaluationPack (pk , req )
246+ require .NoError (t , err )
215247
216248 fmt .Println ("Test done." )
217249}
0 commit comments