Bug fixes

1. Modify and cancel booking requests to match what is sent in reality (eg no merhant_id, service_id, etc)
2. Consider ListBookingsSuccess in cancel booking flow
3. Exit status matches status of tests (totalErrors)
diff --git a/api/api.go b/api/api.go
index 0ae2130..1c7caea 100644
--- a/api/api.go
+++ b/api/api.go
@@ -289,7 +289,7 @@
 
 	gB := Bookings(resp.GetBookings())
 	if len(gB) != len(tB) {
-		return out, fmt.Errorf("number of bookings differ, ListBookings invalid. Got: %d, Want: %d. Abandoning all bookings from this flow", len(gB), len(tB))
+		return nil, fmt.Errorf("number of bookings differ, ListBookings invalid. Got: %d, Want: %d. Abandoning all bookings from this flow", len(gB), len(tB))
 	}
 
 	sort.Sort(gB)
@@ -332,10 +332,12 @@
 }
 
 // CancelBooking is a clean up method that cancels all supplied bookings.
-func CancelBooking(b *mpb.Booking, conn *HTTPConnection) error {
-	b.Status = mpb.BookingStatus_CANCELED
+func CancelBooking(bookingID string, conn *HTTPConnection) error {
 	reqPB := &mpb.UpdateBookingRequest{
-		Booking: b,
+		Booking: &mpb.Booking{
+			BookingId: bookingID,
+			Status:    mpb.BookingStatus_CANCELED,
+		},
 	}
 	req, err := conn.marshaler.MarshalToString(reqPB)
 	if err != nil {
@@ -376,15 +378,18 @@
 	if err != nil {
 		return fmt.Errorf("could not complete booking, abandoning rescheduling flow: %v", err)
 	}
-	slot := newBooking.GetSlot()
 
 	// New slot.
 	lastAvailability := slots[len(slots)-1]
-	slot.StartSec = lastAvailability.GetStartSec()
-	slot.DurationSec = lastAvailability.GetDurationSec()
 
 	reqPB := &mpb.UpdateBookingRequest{
-		Booking: newBooking,
+		Booking: &mpb.Booking{
+			BookingId: newBooking.GetBookingId(),
+			Slot: &mpb.Slot{
+				StartSec:    lastAvailability.GetStartSec(),
+				DurationSec: lastAvailability.GetDurationSec(),
+			},
+		},
 	}
 	req, err := conn.marshaler.MarshalToString(reqPB)
 	if err != nil {
@@ -399,7 +404,7 @@
 	if iE := utils.ValidateBooking(resp.GetBooking(), newBooking); iE != nil {
 		return fmt.Errorf("invalid response. UpdateBooking: %s, abandoning slot 1/1", iE.Error())
 	}
-	return CancelBooking(resp.GetBooking(), conn)
+	return CancelBooking(resp.GetBooking().GetBookingId(), conn)
 }
 
 // CheckOrderFulfillability attempts to send a CheckOrderFulfillabilityRequest
diff --git a/testclient/bookingClient.go b/testclient/bookingClient.go
index c85de5f..e77546c 100644
--- a/testclient/bookingClient.go
+++ b/testclient/bookingClient.go
@@ -48,6 +48,7 @@
 	outputDir         = flag.String("output_dir", "", "Absolute path of dir to dump log file.")
 	caFile            = flag.String("ca_file", "", "Absolute path to your server's Certificate Authority root cert. Downloading all roots currently recommended by the Google Internet Authority is a suitable alternative https://pki.google.com/roots.pem. Leave blank to connect using http rather than https.")
 	fullServerName    = flag.String("full_server_name", "", "Fully qualified domain name. Same name used to sign CN. Only necessary if ca_file is specified and the base URL differs from the server address.")
+	outputToTerminal  = flag.Bool("output_to_terminal", false, "Output to terminal rather than a file.")
 )
 
 type counters struct {
@@ -129,7 +130,7 @@
 		totalErrors += stats.CreateBookingErrors
 		log.Printf("CreateBooking Errors: %d/%d", stats.CreateBookingErrors, stats.CreateBookingErrors+stats.CreateBookingSuccess)
 	}
-	if *listFlow || *allFlows {
+	if *listFlow || *allFlows || *cancelAllBookings {
 		if stats.ListBookingsSuccess {
 			log.Println("ListBookings Succeeded")
 		} else {
@@ -158,20 +159,22 @@
 	}
 
 	log.Println("\n************* End Stats *************\n")
-	os.Exit(0)
+	os.Exit(totalErrors)
 }
 
 func main() {
 	flag.Parse()
 	var stats counters
 
-	// Set up logging before continuing with flows
-	f, err := createLogFile()
-	if err != nil {
-		log.Fatalf("Failed to create log file %v", err)
+	if !*outputToTerminal {
+		// Set up logging before continuing with flows
+		f, err := createLogFile()
+		if err != nil {
+			log.Fatalf("Failed to create log file %v", err)
+		}
+		defer f.Close()
+		log.SetOutput(f)
 	}
-	defer f.Close()
-	log.SetOutput(f)
 
 	conn, err := api.InitHTTPConnection(*serverAddr, *credentialsFile, *caFile, *fullServerName)
 	if err != nil {
@@ -287,7 +290,7 @@
 	if len(b) > 0 {
 		utils.LogFlow("Cancel Booking", "Start")
 		for i, booking := range b {
-			if err = api.CancelBooking(booking, conn); err != nil {
+			if err = api.CancelBooking(booking.GetBookingId(), conn); err != nil {
 				log.Printf("%s. abandoning booking %d/%d", err.Error(), i, len(b))
 				stats.CancelBookingsErrors++
 				continue
diff --git a/testclient/orderClient.go b/testclient/orderClient.go
index 02125eb..718ff23 100644
--- a/testclient/orderClient.go
+++ b/testclient/orderClient.go
@@ -44,6 +44,7 @@
 	outputDir        = flag.String("output_dir", "", "Absolute path of dir to dump log file.")
 	caFile           = flag.String("ca_file", "", "Absolute path to your server's Certificate Authority root cert. Downloading all roots currently recommended by the Google Internet Authority is a suitable alternative https://pki.google.com/roots.pem. Leave blank to connect using http rather than https.")
 	fullServerName   = flag.String("full_server_name", "", "Fully qualified domain name. Same name used to sign CN. Only necessary if ca_file is specified and the base URL differs from the server address.")
+	outputToTerminal = flag.Bool("output_to_terminal", false, "Output to terminal rather than a file.")
 )
 
 type counters struct {
@@ -112,20 +113,22 @@
 	}
 
 	log.Println("\n************* End Stats *************\n")
-	os.Exit(0)
+	os.Exit(totalErrors)
 }
 
 func main() {
 	flag.Parse()
 	var stats counters
 
-	// Set up logging before continuing with flows
-	f, err := createLogFile()
-	if err != nil {
-		log.Fatalf("Failed to create log file %v", err)
+	if !*outputToTerminal {
+		// Set up logging before continuing with flows
+		f, err := createLogFile()
+		if err != nil {
+			log.Fatalf("Failed to create log file %v", err)
+		}
+		defer f.Close()
+		log.SetOutput(f)
 	}
-	defer f.Close()
-	log.SetOutput(f)
 
 	conn, err := api.InitHTTPConnection(*serverAddr, *credentialsFile, *caFile, *fullServerName)
 	if err != nil {